From ef3c449ec0fa04d362f28a6974ec9b5c51b928b3 Mon Sep 17 00:00:00 2001 From: Andrew Thoelke Date: Thu, 11 Jun 2026 10:44:07 +0100 Subject: [PATCH 1/9] Add in-repository build tools Signed-off-by: Andrew Thoelke --- tools/atg-sphinx-conf.py | 18 + tools/docs/psa-api-tool-notes.md | 2516 ++++++++++++++++ .../docs/specification-lifecycle-workflows.md | 83 + tools/docs/using-psa-api-tool.md | 239 ++ tools/images.mk | 89 + .../license/arm_psa_certified_api_license.rst | 40 + tools/license/missing.rst | 8 + tools/license/psa_certified_api_license.rst | 38 + tools/make | 267 ++ tools/psa-api-conf.py | 618 ++++ tools/psa-api-tool.py | 2628 +++++++++++++++++ tools/puml/psa-dataflow.pumh | 29 + tools/puml/psa-lifecycle.pumh | 21 + tools/puml/psa-spec.pumh | 191 ++ tools/rewrite-html-for-jekyll.py | 22 + .../psa-api-2022/Arm_logo_blue_RGB.pdf | Bin 0 -> 1690 bytes .../Arm_logo_blue_RGB.pdf.license | 2 + .../psa-api-2022/Arm_logo_blue_RGB.svg | 52 + .../Arm_logo_blue_RGB.svg.license | 2 + .../templates/psa-api-2022/about-chapter.rst | 133 + .../psa-api-2022/html-static/custom.css | 451 +++ tools/templates/psa-api-2022/psa-api-tool.sty | 492 +++ .../sphinx-templates/indextoc.html | 8 + .../psa-api-2022/sphinx-templates/toc.html | 11 + tools/templates/psa-api-2022/template-conf.py | 97 + tools/templates/psa-api-2022/title-page.rst | 42 + .../psa-api-2025/ARM_LOGO-2025_INK_RGB.pdf | Bin 0 -> 1734 bytes .../ARM_LOGO-2025_INK_RGB.pdf.license | 2 + .../psa-api-2025/ARM_LOGO-2025_INK_RGB.svg | 21 + .../ARM_LOGO-2025_INK_RGB.svg.license | 2 + .../templates/psa-api-2025/about-chapter.rst | 147 + .../psa-api-2025/html-static/custom.css | 520 ++++ tools/templates/psa-api-2025/psa-api-tool.sty | 530 ++++ .../sphinx-templates/indextoc.html | 8 + .../psa-api-2025/sphinx-templates/toc.html | 11 + tools/templates/psa-api-2025/template-conf.py | 106 + tools/templates/psa-api-2025/title-page.rst | 47 + 37 files changed, 9491 insertions(+) create mode 100644 tools/atg-sphinx-conf.py create mode 100644 tools/docs/psa-api-tool-notes.md create mode 100644 tools/docs/specification-lifecycle-workflows.md create mode 100644 tools/docs/using-psa-api-tool.md create mode 100644 tools/images.mk create mode 100644 tools/license/arm_psa_certified_api_license.rst create mode 100644 tools/license/missing.rst create mode 100644 tools/license/psa_certified_api_license.rst create mode 100644 tools/make create mode 100644 tools/psa-api-conf.py create mode 100644 tools/psa-api-tool.py create mode 100644 tools/puml/psa-dataflow.pumh create mode 100644 tools/puml/psa-lifecycle.pumh create mode 100644 tools/puml/psa-spec.pumh create mode 100644 tools/rewrite-html-for-jekyll.py create mode 100644 tools/templates/psa-api-2022/Arm_logo_blue_RGB.pdf create mode 100644 tools/templates/psa-api-2022/Arm_logo_blue_RGB.pdf.license create mode 100644 tools/templates/psa-api-2022/Arm_logo_blue_RGB.svg create mode 100644 tools/templates/psa-api-2022/Arm_logo_blue_RGB.svg.license create mode 100644 tools/templates/psa-api-2022/about-chapter.rst create mode 100644 tools/templates/psa-api-2022/html-static/custom.css create mode 100644 tools/templates/psa-api-2022/psa-api-tool.sty create mode 100644 tools/templates/psa-api-2022/sphinx-templates/indextoc.html create mode 100644 tools/templates/psa-api-2022/sphinx-templates/toc.html create mode 100644 tools/templates/psa-api-2022/template-conf.py create mode 100644 tools/templates/psa-api-2022/title-page.rst create mode 100644 tools/templates/psa-api-2025/ARM_LOGO-2025_INK_RGB.pdf create mode 100644 tools/templates/psa-api-2025/ARM_LOGO-2025_INK_RGB.pdf.license create mode 100644 tools/templates/psa-api-2025/ARM_LOGO-2025_INK_RGB.svg create mode 100644 tools/templates/psa-api-2025/ARM_LOGO-2025_INK_RGB.svg.license create mode 100644 tools/templates/psa-api-2025/about-chapter.rst create mode 100644 tools/templates/psa-api-2025/html-static/custom.css create mode 100644 tools/templates/psa-api-2025/psa-api-tool.sty create mode 100644 tools/templates/psa-api-2025/sphinx-templates/indextoc.html create mode 100644 tools/templates/psa-api-2025/sphinx-templates/toc.html create mode 100644 tools/templates/psa-api-2025/template-conf.py create mode 100644 tools/templates/psa-api-2025/title-page.rst diff --git a/tools/atg-sphinx-conf.py b/tools/atg-sphinx-conf.py new file mode 100644 index 00000000..f3086d8b --- /dev/null +++ b/tools/atg-sphinx-conf.py @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +# SPDX-License-Identifier: Apache-2.0 + +# Compatibility wrapper for older specification sources that still execute +# atg-sphinx-conf.py from the former atg-sphinx-spec tool. + +import os + +psa_api_tool_path = (os.environ.get('PSA_API_TOOL') or + os.environ.get('ATG_SPHINX_SPEC') or + globals().get('atg_sphinx_spec_dir')) + +if not psa_api_tool_path: + raise RuntimeError('PSA_API_TOOL or ATG_SPHINX_SPEC must point to psa-api-tool') + +exec(compile(open(os.path.join(psa_api_tool_path, 'psa-api-conf.py'), + encoding='utf-8').read(), + 'psa-api-conf.py', 'exec')) diff --git a/tools/docs/psa-api-tool-notes.md b/tools/docs/psa-api-tool-notes.md new file mode 100644 index 00000000..0d0d7478 --- /dev/null +++ b/tools/docs/psa-api-tool-notes.md @@ -0,0 +1,2516 @@ + + +# psa-api-tool Notes + +This note is a lightweight contributor and editor guide for the `psa-api-tool` Sphinx +extension and build support. + +It is intended to capture the practical behavior of the tool as used in PSA +specification sources. It is written for both human editors and automated editing +agents, so headings, directive names, role names, and examples should remain explicit +and easy to search. + +This is not a full implementation reference. When behavior is unclear, verify against +`psa-api-tool.py`, `psa-api-conf.py`, the shared `make` file, and the template files. + +## Audience and Scope + +These notes describe: + +- what each custom directive or role is for +- the important arguments and options +- where it can be used +- shared PSA API source conventions +- known limitations or gotchas +- minimal working examples + +This note currently focuses on the parts of `psa-api-tool` that are needed to edit and +extend specification source text effectively, especially: + +- API and manifest definition directives +- release metadata inputs +- terms/glossary definitions +- references and citation roles + +It also records shared source conventions used across PSA API specifications. Individual +specification repositories can add narrower local rules where needed. + +Broader setup and build instructions are in `using-psa-api-tool.md`. This includes +dependency notes, repository layout, configuring document metadata in `conf.py`, and +running common build targets. + +## Guide Map + +Use these sections as the usual entry points: + +- `Shared Source Editing Conventions` for punctuation, wrapping, recommendation wording, + graphics, API definition layout, generated headers, admonitions, and inline code + style. +- `Directive Reference` for custom and modified directives, grouped by typical authoring + context. +- `Role Reference` for custom roles and modified reference behavior. +- `Security Risk Assessment Directives and Roles` for SRA-specific structured threat + content. + +## Shared Source Editing Conventions + +These conventions are intended for PSA API specifications that use `psa-api-tool`. They +should be treated as shared conventions unless a consuming repository explicitly says +otherwise. + +### Plain source punctuation + +Use plain ASCII single and double quote characters in specification sources. Sphinx +converts quotes and apostrophes to the appropriate typographic characters when rendering +HTML and LaTeX output, so source files should not use Unicode curly quotation marks such +as `‘`, `’`, `“`, or `”`. + +Use ASCII source forms for dashes when typographic dashes are intended in the rendered +output. Sphinx converts `--` to an en-dash and `---` to an em-dash. Use these source +forms instead of Unicode dash characters. For example, use an em-dash for an explanatory +aside: + +```rst +The value is private to the caller --- it cannot be read by another component. +``` + +Use normal ASCII hyphens for hyphenated terms and ASCII minus signs in code, numeric +ranges, and literal values. + +### American English spelling + +Use American English spelling in specification sources. For example, use `behavior`, +`initialize`, `optimization`, and `synchronization`. + +### Source line wrapping and indentation + +These conventions apply to all reStructuredText specification sources, including `.rst` +files and extensionless included source fragments such as `terms`, `references`, and +`releases`. + +Use one logical paragraph per source line. Let the editor wrap long source lines for +display. This keeps the source structure aligned with the document structure, avoids +inconsistent wrapping in files edited with different window widths, and matches the +current style used in other PSA API specifications. + +Keep block indentation consistent within a source file. Use three spaces for directive +bodies, nested directive content, list continuation text, and other indented +reStructuredText blocks. + +Use the same three-space convention for `.. list-table::` directives. The directive +options and outer row list are indented by three spaces, nested cell list items are +indented by six spaces, and table cell continuation text is indented by nine spaces. + +Use bullet-list markers with two spaces after the marker, for example `* List item`. +This means the text starts after three source characters and aligns naturally with +continuation lines that use the three-space indentation convention. Enumerated list +markers already occupy three source characters when they use a single-digit number, an +alphabetic marker, or automatic numbering, for example `1. List item`, `a. List item`, +or `#. List item`. + +For nested bullet lists, use `-` as the inner list marker under an outer `*` list. +Indent the nested marker by three spaces and keep the same two spaces after the marker, +for example ` - Nested item`. The same marker convention is used in `.. list-table::` +row and cell lists. + +When making semantic changes, do not reformat unrelated paragraphs or indentation in the +same patch. If a source file has mixed wrapping or indentation conventions, clean it up +in a separate mechanical formatting pass so that review can distinguish formatting churn +from specification changes. + +### Recommendation wording + +When documenting recommended behavior or design choices, use neutral specification +wording rather than organization-voiced wording. + +Prefer: + +- `It is recommended that ...` +- `The following behavior is recommended:` + +Avoid: + +- `Arm recommends that ...` +- `We recommend that ...` + +This keeps advisory specification text independent of a motivated speaker, while still +distinguishing recommendations from normative requirements such as `must`, `must not`, +`shall`, and `shall not`. + +### Rendered graphics + +Rendered graphics are normally checked in to specification repositories. This means that +editors who only modify text can build the documents without installing every graphics +rendering tool. + +When modifying graphics sources, update the rendered assets at the same time. For +example, changes to `.svg` figures must keep the corresponding `.pdf` rendering up to +date for PDF builds. The `images` make target regenerates graphics derived from `.json`, +`.puml`, and `.svg` sources when the required tools are available. + +### C API element definitions + +The `.. macro::`, `.. typedef::`, `.. struct::`, `.. function::`, and `.. enum::` +directives are top-level directives that define C API elements. This section describes +common aspects of these directives, and best practices for using them. + +Details for each directive are provided in the Directive Reference. + +#### Rendering + +In the current tooling, each API element directive forms a section node within the +document model, and the API element name forms the title for the section. As a result, +an API element defined within a heading level 3 section will be a level 4 section, an +API element defined within a heading level 2 section will be a level 3 section. The +effect is that the heading format for an API element depends on the enclosing section +level. + +For consistency in a specification, it is important to have every API element defined at +the same level in the document hierarchy. Existing PSA API specifications commonly use +level 4, the first level that does not include a section number in the heading. This +occasionally requires creative chapter structuring so that this is achieved. + +#### Standard options + +These options are available for all C API element directives, but are used rarely, only +when required for the individual API element. + +- `:header:` (optional) - see the header file section below for details. +- `:guard:` (optional) - this adds an optional #ifdef guard around the API element + definition in the header file. +- `:comment:` (optional) - specify a comment text to include in the generated header + before the API element definition. +- `:naked:` (optional) - do not include this API element in any header file. + +#### Typical layout of element definitions + +After the element directive and any options, which can include a definition for macros, +the following is a recommended ordering for API definitions: + +- Summary directive. +- Sub-element directives, such as parameters for a function or macro-like function; + fields for a structure; or values for an enumeration. +- Return directive. +- Return value directives for a function or macro-like function. +- Description, as text within the element directive. + +If a specification or a set of related API elements has shared subsections in the +description, add them as `.. subsection::` directives. Place them consistently in the +source to aid maintenance. Examples include the 'Key format' sections in the Crypto API +key type definitions and the 'Compatible key types' sections in the Crypto API algorithm +definitions. + +When rendered, the tool fixes the ordering of the API definition (to match the list +above), then any subsections labeled `:top:`, then the general description, and finally +any subsections not labeled `:top:`. The recommended layout here matches that to +facilitate easier editing. + +Optional: it is possible to specify a document-wide ordering of return values (typically +for error codes) in the `doc_info` dictionary, to force consistency in the output +without demanding the same in the source material. This is used for the larger API +specifications, such as the Crypto API. + +#### Using `summary` directives + +Each C API element directive should have a `.. summary::` directive with a short +description of the API. The first sentence of the summary is used when generating +Doxygen-enhanced reference header file output with the `headers` make format. + +#### Placement of `.. versionadded::` directives + +After testing, the best placement for these in API element descriptions is at the end of +the `summary` directive. For example: + +```rst +.. macro:: EXAMPLE + + .. summary:: An example macro definition. + + .. versionadded:: 2.3 + + More content. +``` + +The same is true for the `.. versionchanged::`, `.. deprecated::`, and `.. +versionremoved::` directives. + +Shared PSA API convention for API definitions: + +- Use `.. versionadded::` only for new API elements. +- Use `.. versionchanged::` for existing API elements whose behavior, constraints, or + meaning changed materially. +- Use `.. deprecated::` for existing API elements that remain specified but are + deprecated. +- Omit the directive body when the marker is self-explanatory. +- If a body is useful, use at most one short sentence. +- Keep rationale, migration guidance, and fuller explanation in the normal API prose + rather than in the version directive body. +- Do not use version markup just because a version-valued macro or function now reports + the newer document version. Reserve it for API evolution that a reader needs called + out explicitly. + +### Generated header files + +The tooling builds API element definitions from the directive-based descriptions in the +source specification. This ensures that element definitions are always consistent +between the detailed description, the API signature, and the content of any generated +embedded or external header file. + +#### Associating an API element with a named header file + +The tooling supports different types of specification project. + +- If a `header` attribute is specified in the `conf.py` `doc_info` dictionary, this is + the default header for an API element. + +- If a documentation source file uses a `.. header::` directive, this defines the header + to associate with any element definitions that follow it. This directive can be used + multiple times in a single source file for different headers. + +- A single instance of the `.. header::` directive for each header file can also be used + to specify additional information about a header file, such as inclusion of a license + or copyright preamble and header guard inclusion. See the description of the `.. + header::` directive for details. + +- If an API element uses the `:header:` option, this overrides any default or directive + setting. + +Guidance: + +- For a single header project, use the `doc_info['header']` attribute. +- For a multi-header project, use the `.. header::` directive as required. +- For the odd API element that lives in a different file, use the `:header:` option. + +#### Use of generated headers + +Generated headers are used in three ways: + +1. Included inline in the specification output. This uses the `.. insert-header::` + directive, and produces an in-sequence, unannotated, cross-referenced source listing + of the canonical header. + +2. Output using the `api-db` build format, which is used by the `api-db`, `api-diff`, + and `api-update` make formats to create, review, and maintain a baseline API + definition to enable checks that changes to the specification sources only introduce + expected changes to the API. This format has the elements alphabetically sorted and + unannotated. + + By default, the `api-*` make targets use or update a set of headers in the document's + `api.db/` folder. + +3. Output using the `headers` build format, which can be used to create + Doxygen-annotated, in-sequence, copyright-commented canonical header files for + inclusion in a project repository. This output is useful for implementation + developers because IDEs can use the annotations for API tooltips and code completion. + The level of Doxygen annotation is controlled by the `header_doxygen` configuration + attribute in `doc_info`. + +#### API element sequencing within header files + +For the `.. insert-header::` directive and the `headers` build format, the API elements +appear in the header file in the order that they are defined in the source files. When +multiple source files provide definitions for the same header file, the `:seq:` option +should be used in a `.. header::` directive to ensure that the definitions from +different source files appear in the intended order in the header file. + +In contrast, the `api-db` build format used by `api-diff` and `api-update` normalizes +the output by API element identity, so it is resistant to documentation refactoring and +to incidental variation in Sphinx partial-build ordering. This is why changes to source +ordering often affect the inserted header listings and `headers` output, but do not +affect the `api.db` baseline. + +The main practical use of `:seq:` is therefore for generated header listings and +`headers` output when a single header is assembled from multiple source files. In +specifications where each standard header has a single source location, `:seq:` is +generally not needed. In larger APIs such as the Crypto API, where many source files +contribute to one header, `:seq:` is important to keep the generated header order stable +and intentional. + +### Using callouts/admonitions + +Many of the docutils/Sphinx admonitions are used within the specifications. Here are the +typical uses: + +- `.. note::` - informative material for a developer that is related to the current + text, but is not necessary for normal use of it. +- `.. admonition:: Implementation note` - informative material for an implementer of the + specification, often providing options or recommendations. This is just a titled + generic admonition element. +- `.. warning::` - call out an issue that presents a risk for the implementer or user of + an API. Use sparingly. +- `.. todo::` - identify unfinished work in the specification. These should be resolved + prior to publishing a specification. By default, these are rendered when the document + has a non-zero draft revision, but can be enabled explicitly by adding `'todo'` to the + `doc_info['include_content']` attribute. +- `.. rationale::` - provide justification for a design decision. By default, these are + rendered when the document has a non-zero draft revision, but can be enabled + explicitly by adding `'rationale'` to the `doc_info['include_content']` attribute. +- `.. comment::` - provide commentary related to documentation content. Most useful for + including notes for reviewers of the rendered documents. By default, these are not + rendered in a build, but can be overridden by adding `'comment'` to the + `doc_info['include_content']` attribute. + +Admonitions can also be included in the bodies of API element directives, subsection +directives, or sub-element directives. Use them sparingly inside API entries so they +don't overwhelm the normative flow. + +### Formatting inline code/monospace text + +Quick rules-of-thumb: + +- Use ``text`` for plain literal monospace +- Use `text` for the default reference role +- Use the `:code:` role for code-like text that should hyperlink defined identifiers + when possible + +In more detail: + +- For plain literal monospace text or code fragments, use the standard reStructuredText + double backticks: ``monospace text``. +- For single API elements or manifest attributes that are defined anywhere in the Sphinx + document, use the default reference role: `MACRO` or `function()`. This renders as + monospace code, hyperlinked to the definition of the element/attribute. PSA + documentation convention includes the function parentheses, but these are optional. +- For code that should link to API elements or manifest identifiers when possible, use + the `:code:` role: :code:`foo(MACRO,1)` or :code:`<= MAX_VAL`. This renders as + monospace code, hyperlinking every identifier or attribute that is present in the + text. +- The `:code:` role is also useful for identifiers that are moving to or from another + specification, as these will render as links when possible, otherwise as plain code. + +## Directive Reference + +Documentation conventions for this reference: + +- document the practical use of the directive as seen in these spec sources, rather than + trying to reverse engineer every implementation detail +- prefer minimal examples copied or adapted from real specification usage +- group document assembly directives by authoring context, so editors can find the + directives relevant to the file they are editing + +Use one section per directive. Keep examples minimal. + +Recommended format: + +- Purpose +- Syntax +- Common options +- Placement rules +- Output/effect +- Example +- Gotchas + +### API documentation directives + +#### `.. header::` + +Purpose: + +Specify the header file to associate the following API elements with. + +Syntax: + +The header file name is the directive argument. The directive body (optional) provides +additional content (e.g. comments) to include after any copyright or license text. + +```rst +.. header:: psa/example + :copyright: Copyright notice + :license: Source license + :c++: + :guard: + :system-include: stddef.h stdint.h + :include: psa/error.h + + /* Optional comment block + */ +``` + +Common options: + +All options are optional. + +- `:copyright:` - a copyright notice, included in the `headers` format build. +- `:license:` - an SPDX license identifier, included in the `headers` format build. +- `:c++:` - add preprocessing directives to be able to include the header in a C++ + project. +- `:guard:` - add preprocessing directives to guard against double-inclusion of the + header file. +- `:system-include:` - list of system-include files to add to the header. +- `:include:` - list of project include files to add to the header. +- `:seq:` - a numerical sequence number for the set of API elements that follow. This + enables definitions across multiple sources to be output in a defined order. + +Apart from `:seq:`, these options can only be provided on a single instance of the `.. +header::` directive for each header file within the document sources. + +Placement rules: + +Anywhere in a .rst source, outside of an API element definition. + +Output/effect: + +Associates all following API definitions with the named header, unless they provide a +`:header:` override option. Defines the order in which API elements are included in a +header file. Specifies additional material to be used when generating the header file. + +Example: + +```rst +.. header:: psa/crypto + :seq: 10 + :copyright: Copyright 2026 Example Publisher + :license: Apache-2.0 + :c++: + :guard: + :system-include: stddef.h stdint.h + :include: psa/error.h + + /* This file is a reference template for implementation of the + * PSA Certified Crypto API v1.5 + */ +``` + +Gotchas: + +When using the copyright option, license option, or including a version in the comments; +these are not affected by changing the document configuration and must be edited to +match the document setup. + +#### `.. insert-header::` + +Purpose: + +Insert the named header into the document. + +Syntax: + +```rst +.. insert-header:: psa/example +``` + +Placement rules: + +None. Current practice is to use this in an appendix. + +This directive is processed after all document sources have been parsed - ensuring that +the inserted header is always consistent with the API definitions in the document. + +Output/effect: + +The named header is generated as a source listing, and automatically cross-references +all defined API elements. + +Example: + +```rst +.. insert-header:: psa/client +``` + +#### `.. macro::` + +Purpose: + +Define a macro API element. + +For function-like macros, include one or more parameter definitions, and an optional +return description as part of the directive body. + +Syntax: + +```rst +.. macro:: PSA_EXAMPLE + :definition: (0u) + + .. summary:: Summary text. + + .. param:: parameter_name + Parameter description. + .. return:: + Return value description. + + Macro description. +``` + +The `.. macro::` directive argument is the name of the macro. The optional macro +definition is provided in the `:definition:` option. For a function-like macro: + +- The parameter names are taken from `.. param::` directives in the body, in the order + in the .rst file. +- Optionally, `.. return::` and `.. retval::` directives can be used to describe the + expected output. + +Common options: + +- `:definition:` (optional) - provide the macro definition. +- `:api-version: ` (optional) - define the macro using the document version + (from conf.py). `type` is one of `major`, `minor`, or `hex` which results in the + macro definition being the major version, minor version, or a 16-bit + `(major << 8) | minor` value respectively. This option cannot be used at the same + time as `:definition:`. + +Also, see the standard API element options. + +Placement rules: + +Anywhere in a document section, but see the note about Rendering of C API element +definitions above. + +Output/effect: + +Creates a macro definition section in the document, and adds the macro to the generated +API declarations. + +If no definition is provided, the default comment definition of `/* ... */` is used. + +Example: + +```rst +.. macro:: PSA_VERSION_NONE + :definition: (0u) + + .. summary:: This is the return value from `psa_version()` if the requested RoT + Service is not present. +``` + +Gotchas: + +The tool still permits legacy use of having the macro definition as additional lines in +the directive argument. Current best practice is to have only the name in the directive +argument, and include any definition in the `:definition:` option. + +To force an empty definition for the macro, use a `:definition:` option with no content. + +#### `.. function::` + +Purpose: + +Define a function or function-pointer API element. + +Provide the parameter definitions, return type, and important return values as part of +the directive body. + +Syntax: + +```rst +.. function:: psa_example + + .. summary:: Summary text. + + .. param:: param_type param_name + Parameter description. + .. return:: return_type + Short description of returned value. + .. retval:: value or value description + Details on specific error code, or return values. + + Function description. +``` + +The `.. function::` directive argument is only the name of the function. The function +parameter types and names are taken from `.. param::` directives in the body, in the +order in the .rst file. The function return type is taken from the `.. return::` +directive in the body. + +Common options: + +- `:type:` - define a function pointer type. Use this for defining callback or + function-pointer types instead of ordinary functions. + +Also, see the standard API element options. + +Placement rules: + +Anywhere in a document section, but see the note about Rendering of C API element +definitions above. + +Output/effect: + +Creates a function or function-type definition section in the document, and adds the +function or function-type to the generated API declarations. + +Example: + +```rst +.. function:: psa_framework_version + + .. summary:: This function retrieves the version of the PSA Framework API that is implemented. + + .. return:: uint32_t +``` + +Gotchas: + +For a void-returning function, the `.. return:: void` directive must be included in the +body, to avoid a warning about a missing return type. + +#### `.. typedef::` + +Purpose: + +Define a type alias. + +This directive can also be used to define incomplete types and incomplete structure +types. + +Syntax: + +```rst +.. typedef:: uint32_t psa_example_t + + .. summary:: Summary text. +``` + +The directive argument is the type definition. It can optionally include the `typedef` +prefix and a trailing `;`. + +To define an incomplete type, which an implementation of the API must fully define, a +comment can be used in the definition. For example: + +```rst +.. typedef:: /* implementation-defined type */ psa_example_t + + .. summary:: Summary text. +``` + +Common options: + +See the standard API element options. + +Placement rules: + +Anywhere in a document section, but see the note about Rendering of C API element +definitions above. + +Output/effect: + +Creates a typedef definition section in the document, and adds the type definition to +the generated API declarations. + +Example: + +```rst +.. typedef:: int32_t psa_handle_t + + .. summary:: This type is used for handles. +``` + +Gotchas: + +Use a `.. function::` directive with the `:type:` option to define a pointer-to-function +type. + +#### `.. struct::` + +Purpose: + +Define a structure or structure type API element. + +Provide the member definitions as part of the directive body. + +Syntax: + +```rst +.. struct:: psa_example + :type: + + .. summary:: Summary text. + + .. field:: uint32_t member + Field description. +``` + +Structure members are declared using the `.. field::` directives in the body, and appear +in the order of definition in the source .rst file. + +Common options: + +- `:type:` - define a typedef for the structure identifier, not just the named `struct`. + +Also, see the standard API element options. + +Placement rules: + +Anywhere in a document section, but see the note about Rendering of C API element +definitions above. + +Output/effect: + +Creates a structure definition section in the document, and adds the definition to the +generated API declarations. + +Example: + +```rst +.. struct:: psa_msg_t + :type: +``` + +Gotchas: + +To define an incomplete structure type, use a `.. typedef::` directive with a commented +structure body. For example: + +```rst +.. typedef:: struct { /* implementation-defined */ } psa_example + + Type description. +``` + +#### `.. enum::` + +Purpose: + +Define an enumeration or enumeration type API element. + +Syntax: + +```rst +.. enum:: psa_example + :type: + + .. summary:: Summary text. + + .. value:: VALUE_1 = 42 + Enumeration value description. +``` + +Enumeration values are declared using the `.. value::` directives in the body, and +appear in the order of definition in the source .rst file. + +Common options: + +- `:type:` - define a typedef for the enumeration identifier, not just the named `enum`. + +Also, see the standard API element options. + +Placement rules: + +Anywhere in a document section, but see the note about Rendering of C API element +definitions above. + +Output/effect: + +Creates an enumeration definition section in the document, and adds the definition to +the generated API declarations. + +Example: + +```rst +.. enum:: psa_operation_mode_t + :type: + + .. value:: sync = 1 + .. value:: async = 2 +``` + +#### `.. attribute::` + +Purpose: + +Define a JSON schema element. + +Syntax: + +```rst +.. attribute:: example_attribute + + Properties: Required. + + Description text. +``` + +Placement rules: + +Anywhere in a document section, but see the note about Rendering of C API element +definitions above. + +Output/effect: + +Generate a JSON attribute definition section in the document. + +JSON attributes do not appear in any generated C header file. However, JSON attributes +can be cross-referenced, as for API identifiers, and will be automatically linked in +inline code and code blocks that specify the `xref` language. + +Example: + +```rst +.. attribute:: psa_framework_version + + Properties: Required. +``` + +Gotchas: + +Although JSON attributes do not share a programming namespace with C API identifiers, +the psa-api-tool currently does not separate these domains when resolving +cross-references. If a C identifier and a JSON attribute have the same name, this will +result in build warnings and can result in incorrect cross reference linkage. + +Shared PSA convention for nested JSON objects: + +When documenting nested manifest objects such as `service`, `irq`, or MMIO region +objects, do not use nested `.. attribute::` directives for the sub-attributes unless the +tooling has been extended to support scoped names. Today, repeated attribute names such +as `name` and `description` would collide. + +Instead: + +- keep the top-level JSON attribute, such as `services` or `irqs`, as the single `.. + attribute::` definition +- structure the body using `.. rubric::` titles for internal grouping +- use `.. container:: apisubitem` with definition-list style content to document nested + object attributes in a compact, API-like layout + +This is a source convention rather than a formal feature of the extension, but it is +stable in practice because `apisubitem` is the same styling hook used internally for API +sub-elements. + +#### `.. summary::` + +Purpose: + +Provide a brief summary of the API element. This is typically a single sentence. + +Syntax: + +```rst +.. summary:: Summary sentence. +``` + +Placement rules: + +Must be nested under an API element directive. + +Output/effect: + +This is the first text within an API element definition section, before the prototype of +the API element. + +The first sentence of the summary is used as the Doxygen `@brief` text in generated +header files, typically used by IDEs for code completion support. + +Example: + +```rst +.. macro:: PSA_FRAMEWORK_VERSION + + .. summary:: The version of the PSA Framework API provided by the included header file. +``` + +Gotchas: + +The preferred place to provide `.. versionadded::` directives is as the last part of the +body of the API element's `.. summary::` directive. + +#### `.. param::` + +Purpose: + +Document a parameter to a function or macro. + +Syntax: + +```rst +.. param:: + Parameter description. +``` + +The type and name should be valid C syntax for a parameter declaration. + +Additional paragraphs and lists can be used in the description to describe more complex +requirements when required for the parameter. + +Placement rules: + +Must be nested within a `.. function::` or `.. macro::` directive. + +Output/effect: + +The parameters to the function or macro are rendered in a list immediately after the API +element signature, in the order declared in the .rst file. + +The first sentence of the description is used as the Doxygen `@param` text in generated +header files, typically used by IDEs for code completion support. + +Example: + +```rst +.. param:: size_t buf_len + Length of buffer ``buf``. +``` + +#### `.. output::` + +Purpose: + +Document an additional output from a function. + +Additional outputs are those written into objects or buffers that are passed by +non-const pointer to the function. + +Syntax: + +```rst +.. output:: + Output description. +``` + +The output-location is typically written as `*p`, where `p` is a buffer or output +parameter that is passed by pointer. + +Placement rules: + +Must be nested within a `.. function::` or `.. macro::` directive. In the source file, +these can be placed alongside the related `.. param::` directive, or grouped elsewhere +in the API element directive. + +Output/effect: + +The output descriptions are rendered in a list following the parameter definitions, in +the order declared in the .rst file. + +Example: + +```rst +.. output:: *buf + On success, the data is written to the buffer pointed to by `buf`. +``` + +Gotchas: + +These are used rarely in the PSA API specifications. At present, they currently only +appear in the Attestation API. + +Most of the API specifications describe the values output in such parameters as part of +the parameter description, instead of using both a `.. param::` and `.. output::` +directive. For example: + +```rst +.. param:: uint8_t * nonce + Buffer where the generated nonce is to be written. +.. param:: size_t * nonce_length + On success, the number of bytes of the generated nonce. +``` + +#### `.. return::` + +Purpose: + +Document the return from a function, or function-like macro. + +Syntax: + +```rst +.. return:: [] + Return description. +``` + +For function-like macros, the type should be omitted. + +For functions that return a status code, such as `psa_status_t`, the description is +usually omitted if the return values are described using `.. retval::` directives. + +For simple functions or macros, the computation or evaluation that is performed can be +documented here. + +Placement rules: + +Must be nested within a `.. function::` or `.. macro::` directive. + +Output/effect: + +The type forms part of the function signature. + +The return value is described after the parameters and outputs. + +The first sentence of the description is used as the Doxygen `@returns` text in +generated header files, typically used by IDEs for code completion support. + +Examples: + +```rst +.. return:: size_t + The number of bytes read from the message parameter. +``` + +Gotchas: + +Technically, this is required for a function that has a `void` return. If none is +provided, a warning is used during the build, and `void` is assumed. + +This directive is not required for `.. macro::` API elements. + +#### `.. retval::` + +Purpose: + +Document a specific return value, or range of return values from a function. + +Syntax: + +```rst +.. retval:: + Return value description. +``` + +The directive argument can be a status code, such as `PSA_ERROR_INVALID_ARGUMENT`, or +can be an expression, such as `> 0`. When rendered, any API elements are hyperlinked to +their definition. + +Placement rules: + +Must be nested within a `.. function::` or `.. macro::` directive. + +Output/effect: + +The return values are described after the return type. Return values are listed in the +same order as the source, except when the `'error_order'` attribute is set in `doc_info` +in `conf.py`. + +Examples: + +```rst +.. retval:: PSA_SUCCESS + The operation completed successfully. +``` + +#### `.. field::` + +Purpose: + +Document a member field in a structure. + +Syntax: + +```rst +.. field:: + Field member description. +``` + +The type and name should be valid C syntax for a structure member declaration. + +Placement rules: + +Must be nested within a `.. struct::` directive. + +Output/effect: + +The members of a structure are rendered in a list immediately after the API structure +signature, in the order declared in the .rst file. + +The first sentence of the description is used as the Doxygen `@brief` text in generated +header files, typically used by IDEs for code completion support. + +Example: + +```rst +.. field:: uint8_t major + Major version number. +``` + +#### `.. value::` + +Purpose: + +Document an enumeration member value. + +Syntax: + +```rst +.. value:: {|} + Value member description. +``` + +The directive argument must be a valid C declaration of an enumeration member. + +Placement rules: + +Must be nested within a `.. enum::` directive. + +Output/effect: + +The members of an enumeration are rendered in a list immediately after the API +enumeration signature, in the order declared in the .rst file. + +The first sentence of the description is used as the Doxygen `@brief` text in generated +header files, typically used by IDEs for code completion support. + +Example: + +```rst +.. value:: block = 0 + Wait for a result. +.. value:: no_block = 1 + Return current status immediately. +``` + +#### `.. subsection::` + +Purpose: + +Provide an additional sub-titled section of the API element documentation. + +This is useful for providing additional information about API elements in a consistent +manner throughout a specification. For example, the 'Key format' sections in the Crypto +API key type definitions and the 'Compatible key types' sections in the Crypto API +algorithm definitions. + +Syntax: + +```rst +.. subsection:: + + Subsection content. +``` + +Common options: + +- `:top:` (optional) - a flag to indicate that this subsection should precede the API + element Description. If not provided, the default placement is after the API element + Description. + +Placement rules: + +Must be nested within an API element directive. + +Output/effect: + +A new subsection of the API definition is output, either immediately before or +immediately after, the Description for the API element. The placement depends on the use +of the `:top:` option, but is otherwise in the same order as in the .rst source. +Subsection headings are similar to the subheadings for Parameters, Outputs, Returns, and +Description. + +Example: + +```rst +.. subsection:: Availability + + This API is optional. Use `PSA_FRAMEWORK_HAS_MM_IOVEC` to determine availability of this function. +``` + +Repository convention: + +- Prefer `Availability` for describing which framework features, service models, or + execution models an API can be used with. +- Keep the `.. summary::` focused on what the API is or does. +- Do not overload version-markup bodies with availability rules or feature + applicability. +- The use of `Availability` is established, but its canonical placement within an API + entry is still deferred. Keep placement consistent within a local edit pass, and + normalize it later once the integrated API text is more complete. + +### Document assembly directives + +The directives in this section are grouped by where editors normally use them. This +means that related producer/consumer directives are not always adjacent. For example, +`.. reference::` entries are normally authored in front-matter inputs, while `.. +reference-table::` is normally used by a template or by an appendix that chooses to +render the collected references elsewhere. + +A document can override or ignore the configured document template source. For example, +a document can avoid `.. title::` and write its title page directly, or avoid `.. +about::` and write the front matter directly. More commonly, a document uses +front-matter section directives such as `.. references::` with `:hide:`, `:replace:`, or +`:extend:` to adjust selected template sections. + +The current `psa-api-*` templates use an unnumbered front-matter chapter called "About +this document", normally listed under `.. front-matter::`, followed by a numbered +chapter 1 introduction in the main document. + +One non-standard arrangement is a bibliography appendix. In that pattern, the document +writes the front matter directly using template construction directives instead of using +`.. about::`, omits the front-matter References section, and renders the references from +an appendix source that contains the `.. reference::` entries followed by `.. +reference-table::`. + +### Directives Used in `index.rst` + +These directives are normally used in the top-level `index.rst` source. + +The `.. front-matter::`, `.. maintoc::`, and `.. appendix::` directives are based on +Sphinx `.. toctree::`, with additional output controls for the document section. They +support these common options: + +- `:numbered:` - override the section numbering depth. +- `:maxdepth:` - override the table-of-contents depth. + +For HTML output, `:numbered:` is only applied by `.. maintoc::` and `.. appendix::`; +front-matter headings are not numbered in HTML. For LaTeX/PDF output, the +table-of-contents depth is controlled by the configured document template, not per +document section. + +PDF page numbering style is also controlled by the configured document template. The +current `psa-api-*` templates use roman page numbers for front matter and Arabic page +numbers for main content and appendices. + +#### `.. title::` + +Purpose: + +Insert the template title page for the document. + +Syntax: + +```rst +.. title:: + + .. abstract:: + + This document defines ... +``` + +Placement rules: + +This should be the first directive in the top-level `index.rst` file. Any content in the +directive body is parsed before the template title page is included, so it can provide +`.. abstract::` and `.. banner::` inputs. For compatibility with older sources, ordinary +parsed content that remains after processing collector directives is treated as the +`abstract` front-matter section when the selected template defines one. + +Output/effect: + +The directive includes `title-page.rst` from the selected template directory. Templates +that use an `abstract` front-section insert the collected abstract at the +template-defined title page location. + +Gotchas: + +The directive itself has no argument. The document title and metadata come from +`doc_info` in `conf.py` and from the selected template. + +#### `.. abstract::` + +Purpose: + +Provide the content for the title page document abstract. + +Syntax: + +```rst +.. title:: + + .. abstract:: + + This document is ... +``` + +Placement rules: + +If used, this must appear in the body of the `.. title::` directive in the document +index.rst file. + +Output/effect: + +Places an abstract on the title page of the document. + +#### `.. banner::` + +Purpose: + +Provide the content for a highlighted box that is placed on the front page of a +document. + +Syntax: + +```rst +.. title:: + + .. banner:: BETA RELEASE + + Status description. +``` + +Placement rules: + +If used, this must appear in the body of the `.. title::` directive in the document +index.rst file. + +Output/effect: + +By default, the banner is only output when the document has a non-zero draft revision, +but this can be overridden by adding `'banner'` to the `doc_info['include_content']` +configuration attribute. + +#### `.. front-matter::` + +Purpose: + +A toc-like directive used in the top-level `index.rst` file to define the front-matter +content of the document. + +Syntax: + +```rst +.. front-matter:: + :maxdepth: 2 + + about/about +``` + +Common options: + +- `:numbered:` - accepted, but ignored for HTML output. The default value is `0`, which + gives unnumbered front-matter headings in PDF output. +- `:maxdepth:` - defaults to `2`. + +Gotchas: + +- Like the `.. toctree::` directive, the contents are treated as a list of content + files, and must not be reflowed as a paragraph if modifying indentation and source + layout. +- This is normally used by Arm-style `psa-api-*` templates for the unnumbered "About + this document" chapter. GP-style documents normally put `about/about` at the start of + `.. maintoc::` instead. + +#### `.. maintoc::` + +Purpose: + +A toc-like directive used in the top-level `index.rst` file to define the main body +content of the document. + +Syntax: + +```rst +.. maintoc:: + :numbered: 3 + :maxdepth: 3 + + intro + architecture +``` + +Common options: + +- `:numbered:` - defaults to `3`. +- `:maxdepth:` - defaults to `3`. + +Gotchas: + +- Like the `.. toctree::` directive, the contents are treated as a list of content + files, and must not be reflowed as a paragraph if modifying indentation and source + layout. +- In GP-style documents, include `about/about` as the first entry so the + template-provided Introduction chapter is numbered as chapter 1. + +#### `.. appendix::` + +Purpose: + +A toc-like directive used in the top-level `index.rst` file to define the appendix +content of the document. + +Syntax: + +```rst +.. appendix:: + :numbered: 3 + :maxdepth: 3 + + appendix/reference-headers +``` + +Common options: + +- `:numbered:` - defaults to `3`. +- `:maxdepth:` - defaults to `3`. + +Gotchas: + +- Like the `.. toctree::` directive, the contents are treated as a list of content + files, and must not be reflowed as a paragraph if modifying indentation and source + layout. +- Appendix chapters use alphabetic numbering in HTML and PDF output. +- The current templates use Arabic appendix page numbers in PDF output, but this is a + template convention rather than a directive behavior. + +### Directives Used in the Front-Matter Chapter + +These directives are normally used in the source that provides template front-section +content, typically `about.rst`, or in files included by that source such as `releases`, +`references`, and `terms`. In Arm-style documents, that source is normally listed by `.. +front-matter::`. In GP-style documents, that source is normally the first entry under +`.. maintoc::`. + +The common pattern is: + +1. Include or define releases, references, and terms. +2. Add front-matter section directives to hide, replace, or extend template sections. +3. End the source with `.. about::`, which includes the configured document template's + `about-chapter.rst` and consumes the previously collected content. + +Placement rule for collected front-matter content: + +The content-providing directives must appear before the directive that renders that +content, in the same source document after includes have been expanded. + +For example: + +- Include or define `.. release::` entries before `.. release-table::`. +- Include or define `.. reference::` entries before `.. reference-table::`. +- Include or define `.. term::`, `.. scterm::`, and `.. abbr::` entries before `.. + term-table::`. +- Place front-matter section directives before `.. about::` or `.. insert-section::`. +- Place `.. banner::` before `.. insert-banner::`. + +The usual pattern is to define `releases`, `references`, and `terms` in extensionless +include files, include those files from `about.rst`, apply any front-matter section +controls such as `.. introduction::`, `.. audience::`, or `.. api-status::`, and then +end `about.rst` with `.. about::`. + +#### `.. release::` + +Purpose: + +Define a release entry for the document releases table. + +Syntax: + +```rst +.. release:: + :date: + + Release summary +``` + +Placement rules: + +See the placement rule for collected front-matter content above. + +The most common pattern is to have all releases defined in a `releases` source file that +is included in the `about.rst` source. The definitions can also just be inline within +the `about.rst` source file. + +Gotchas: + +- Releases in the table appear in the same order as the `.. release::` directives in + the source .rst file. +- Keep the release text summary concise, as this is part of a table of releases. + Detailed change information is better to maintain in a document appendix, with a + reference to the appendix from the `.. release-info::` section. + + To add a reference to a change-history appendix, the following text can be added to `about.rst`: + + ```rst + .. release-info:: + :extend: + + For a detailed list of changes in each document version, see :secref:`change-history`. + ``` + + Provide a named anchor for the section reference in the appendix source immediately before the heading: + + ```rst + .. _change-history: + + Document changes + ================ + ``` + +#### `.. term::`, `.. scterm::`, and `.. abbr::` + +Purpose: + +Define a glossary entry for the document's Terms and abbreviations table. + +The `.. scterm::` directive defines a small-caps-styled term, used for terminology in +the document that has very specific meaning. The `.. abbr::` directive defines an +abbreviation-only entry. + +Syntax: + +```rst +.. term:: + :abbr: + + Definition + +.. abbr:: + + Meaning +``` + +Common options: + +- `:abbr:` (optional) - an abbreviation of the term. This will automatically include an + additional glossary entry for the abbreviation, referring to the full term definition. + +Placement rules: + +See the placement rule for collected front-matter content above. + +The most common pattern is to have all terms defined in a `terms` source file that is +included in the `about.rst` source. The definitions can also just be inline within the +`about.rst` source file. + +Output/effect: + +- Creates one or two definitions in the terms and abbreviations data. +- Creates a link target for the term, and abbreviation if provided, that can be + referenced with the `:term:` and `:scterm:` roles. + +Gotchas: + +The current PSA API templates usually render a single combined terms and abbreviations +table. + +#### `.. reference::` + +Purpose: + +Define a citation reference entry for the document's References table. + +Syntax: + +```rst +.. reference:: + :title: + :author: <author> + :doc_id: <pub_id> + :kind: normative + :publication: <date|location> + :url: <url> +``` + +The directive argument is the citation identifier used within the document text to refer +to this particular external document or website. + +For an RFC document, `RFC nnnn` is the canonical rendered form. Compact source forms +such as `RFCnnnn` are normalized so the `:rfc:` and `:rfc-title:` roles can correctly +link to the citation. + +Common options: + +- `:title:` (required) - The document title or website name. +- `:author:` (optional) - The person or organization that produced the document. +- `:doc_id:` (optional) - The publisher's own identifier number or label. +- `:kind:` (optional) - The reference classification, either `normative` or + `informative`. The default is `normative`. +- `:publication:` (optional) - The date or location of the published document. +- `:url:` (optional) - A URL to the document or the publishing organization. If the URL + text does not start with 'https://' - this is added to the anchor link automatically, + but not rendered in the anchor text. + +Placement rules: + +See the placement rule for collected front-matter content above. + +The most common pattern is to have all references defined in a `references` source file +that is included in the `about.rst` source. The definitions can also just be inline +within the `about.rst` source file. + +Output/effect: + +- Creates a citation reference in the References table. +- Creates a link target for the citation that can be referenced with the `:cite:`, + `:cite-title:`, `:rfc:`, and `:rfc-title:` roles. + +Gotchas: + +References do not have to be rendered in the front matter. To move references to an +appendix, hide or replace the front-matter `.. references::` section, then place the `.. +reference::` directives and `.. reference-table::` in an appendix source. + +The current PSA API templates render a single combined references table. + +#### Front-matter section directives + +Purpose: + +Customize front-matter sections provided by the configured document template. + +Syntax: + +```rst +.. release-info:: + :extend: + + For a detailed list of changes, see :secref:`change-history`. +``` + +Common options: + +- `:replace:` - replace the template's default content for this section. +- `:extend:` - append this content to the template's default content. +- `:hide:` - suppress this section. + +At most one of these options can be provided in a directive. + +- If no option is provided and the directive has content, the content replaces the + default section content. Prefer using the `:replace:` option explicitly. +- If no option and no content are provided, the section is treated as hidden. This is + deprecated usage, it is recommended to explicitly specify `:hide:`. + +Supported section directives are defined by the selected template. The GP template +currently provides: + +- `.. introduction::` +- `.. api-status::` +- `.. feedback::` +- `.. audience::` +- `.. license::` +- `.. references::` +- `.. terms::` +- `.. abbreviations::` +- `.. release-info::` +- `.. todos::` + +The PSA API 2022 and 2025 templates provide the older Arm-style section set: + +- `.. abstract::` +- `.. release-info::` +- `.. todos::` +- `.. license::` in the 2025 template +- `.. references::` +- `.. terms::` +- `.. potential-for-change::` +- `.. conventions::` +- `.. pseudocode::` +- `.. assembler::` +- `.. current-status::` +- `.. feedback::` +- `.. inclusive-language::` + +Placement rules: + +These directives normally appear in a consuming document's `about.rst` before the final +`.. about::` directive. See the placement rule for collected front-matter content above. + +#### `.. about::` + +Purpose: + +Include the about-chapter source from the configured document template. + +Syntax: + +```rst +.. about:: +``` + +Placement rules: + +This is normally used at the end of the consuming document's `about.rst` source after +any releases, references, terms, and front-matter section overrides have been defined. +See the placement rule for collected front-matter content above. + +Output/effect: + +The directive includes `about-chapter.rst` from the configured document template +directory. The template's `about-chapter.rst` provides the default content and structure +for front matter sections, which is modified according to the preceding directives in +the `about.rst` source file. + +### Directives Used to Construct Template Title Pages and Front Matter + +These directives are primarily used in template sources, such as `title-page.rst` and +`about-chapter.rst`. Specification sources can use them directly when they intentionally +bypass part of the configured document template, but that should be a deliberate +document-structure decision. + +The rendering directives in this section must appear after the corresponding +content-providing directives have been defined or included in the same source document. +See the placement rule for collected front-matter content above. + +#### `.. template-image::` + +Purpose: + +Insert an image from the selected template directory. + +Syntax: + +```rst +.. template-image:: logo.svg + :alt: Logo +``` + +Placement rules: + +This directive is primarily for template sources, such as title pages. It accepts the +same image options as the standard reStructuredText `.. image::` directive. + +Output/effect: + +The image path is resolved relative to the selected template directory instead of +relative to the document source file. + +#### `.. insert-banner::` + +Purpose: + +Insert the title-page banner collected from a `.. banner::` directive. + +Syntax: + +```rst +.. insert-banner:: +``` + +Placement rules: + +This is primarily a title-page template directive. Use this after the corresponding `.. +banner::` directive has been defined or included in the same source document. + +Output/effect: + +The collected banner content is inserted only when banner output is enabled. + +#### `.. insert-section::` + +Purpose: + +Insert a front-matter section. The directive defines the section title and the default +content when used in a template. + +When rendered, the content is modified, extended, or removed as directed by a +corresponding front-matter directive in the specification's `about.rst` source. + +Syntax: + +```rst +.. insert-section:: Release information + :section: release-info + :break-after: +``` + +Common options: + +- `:section:` - required; the front-matter section key to insert. +- `:break-after:` - insert a page break after the section in PDF output. +- `:class:` - wrap the section content in the named class or environment. +- `:not-in-toc:` - render a styled title without creating a section in the table of + contents. +- `:keep-if-empty:` - keep the section even if no content is available. + +Placement rules: + +This is primarily a template directive. Specification sources normally use the +front-matter section directives instead to control or modify the template content. Use +this after the corresponding front-matter section directive has been defined or included +in the same source document. + +#### `.. release-table::` + +Purpose: + +Render the release entries collected from `.. release::` directives. + +Syntax: + +```rst +.. release-table:: +``` + +Placement rules: + +Use this after the corresponding `.. release::` entries have been defined or included in +the same source document. + +Output/effect: + +Creates a table with Date, Version, and Change columns. + +#### `.. reference-table::` + +Purpose: + +Render the references collected from `.. reference::` directives. + +Syntax: + +```rst +.. reference-table:: Documents referenced by this document + :sorted: + :kind: all + :layout: by-ref +``` + +Common options: + +- `:sorted:` - sort the references alphabetically by their reference identifier. +- `:kind:` - one of `normative`, `informative`, or `all`. The default is `all`. +- `:layout:` - one of `by-ref` or `by-id`. The default is `by-ref`. +- `:filter:` - one of `with-id`, `without-id`, or `none`. The historical names `arm` and + `non-arm` are accepted as aliases for `with-id` and `without-id`, respectively, so + older specification sources continue to build. +- `:class:` - apply a table class. +- `:name:` - set an explicit target name for the table. + +Placement rules: + +Use this after the corresponding `.. reference::` entries have been defined or included +in the same source document. It can be used in another document source, such as an +appendix, if the document chooses to render references outside the front matter. + +Output/effect: + +Creates a References table. When `:filter: without-id` is used, the document-number +column is omitted in the default `by-ref` layout, preserving the table format for +references that do not have publisher document identifiers. + +The `by-ref` layout produces Ref, Document Number, and Title columns. The `by-id` layout +produces Standard/specification, Description, and Reference columns. In the `by-id` +layout, the Standard/specification column uses `:doc_id:` when it is available and falls +back to the citation identifier when a reference has no publisher document identifier. +The Reference column contains the citation form used in the document text, such as +`[PSA-SM]`. + +#### `.. term-table::` + +Purpose: + +Render the terms and abbreviations collected from `.. term::`, `.. scterm::`, and `.. +abbr::` directives. + +Syntax: + +```rst +.. term-table:: + :sorted: + :kind: all +``` + +Common options: + +- `:sorted:` - sort the terms alphabetically by their normalized identifier. +- `:kind:` - one of `terms`, `abbreviations`, or `all`. The default is `all`. + +Placement rules: + +Use this after the corresponding term or abbreviation entries have been defined or +included in the same source document. + +Output/effect: + +Creates a table from the collected terminology data. With `:kind: terms`, the table has +Term and Definition columns. With `:kind: abbreviations`, the table has Abbreviation and +Meaning columns. Each entry also becomes the target for `:term:` and `:scterm:` +references. + +If no matching entries have been collected, no table is rendered. + +#### `.. include-license::` + +Purpose: + +Include the license text selected by the document configuration. + +Syntax: + +```rst +.. include-license:: +``` + +Placement rules: + +This is primarily a front-matter template directive. It specifies where the configured +license should be included in the document. + +Output/effect: + +The directive first looks for a license source matching the configured license value +relative to the document. If none is found, it looks in the `tools/license/` directory, +using a lower-case filename with hyphens converted to underscores and an `.rst` suffix. +If no matching license exists, the built-in missing-license text is included and a build +error is reported. + +This allows a template to support multiple licenses without template changes. Selecting +a different license for a document issue is a configuration change, while the license +wording remains centralized in the license source file. + +### Directives Used in License Source Files + +#### `.. license::` + +Purpose: + +Mark explicitly provided license text as the document's license section. + +Syntax: + +```rst +.. license:: + + License text. +``` + +Placement rules: + +This directive is intended for license source files, such as the standardized license +files in `tools/license/`. A document template normally uses `.. include-license::` to +include the configured license file at the correct place in the front matter. + +A document or template can use `.. license::` directly to embed license text in its own +sources, but this is not recommended. Keeping license text in a separate file reduces +normal editing churn and helps avoid accidental deviation from the approved license +wording. + +Output/effect: + +This behaves like a section insertion helper. The PSA API templates use a dedicated +style class when inserting this section in the document and forces a page break after +the section. + +### Modified Standard Directives + +#### `.. rationale::` + +Purpose: + +Include rationale text that is useful while drafting or reviewing a specification, but +is not part of the normal published flow. + +Syntax: + +```rst +.. rationale:: Optional title + + Rationale text. +``` + +Output/effect: + +The content is rendered as an admonition only when rationale output is enabled. +Rationale output is enabled when the document has a non-zero draft revision and can also +be enabled by adding `'rationale'` to `doc_info['include_content']`. + +#### `.. comment::` + +Purpose: + +Include review commentary in the source. + +Syntax: + +```rst +.. comment:: + + Reviewer-facing comment. +``` + +Output/effect: + +The content is rendered as a Commentary admonition only when comment output is enabled +by adding `'comment'` to `doc_info['include_content']`. + +Gotchas: + +Use comments sparingly. They are intended for review builds, not as a substitute for +source comments or issue tracking. + +#### `.. code-block::` + +This directive supports the additional language `xref`. + +When `xref` is used as the argument to this directive, the code block is not rendered +using the normal highlighting engine, but instead has every API element from the current +specification hyperlinked in the output. + +The `xref` language option supports the standard `:linenos:` and `:lineno-start:` +options. + +#### `.. literalinclude::` + +This directive supports the additional language `xref`. When `xref` is used as the +language option, the code block is not rendered using the normal highlighting engine, +but instead has every API element from the current specification hyperlinked in the +output. + +The `xref` language option supports the standard `:linenos:` and `:lineno-start:` +options. + +## Role Reference + +Use the same lightweight format for roles: + +- Purpose +- Syntax +- Example +- Gotchas + +### The Default Reference Role + +Sphinx has a default reference role that is used for any text within single-backticks +without a preceding role specifier. + +The `psa-api-tool` Sphinx extension extends the capabilities of the default reference +role as follows: + +* If the reference text is of the form `[ref_id]`, this is resolved as a `:cite:` role. +* If the reference text is any of `SG.id`, `DM.id`, `AM.id`, `T.id`, or `M.id`, it is + resolved using the associated Threat model element role. +* If the reference is a single API element, it is resolved as a `:code:` role. + +### `:sc:` + +Purpose: + +Render the role text in small caps. + +This role is configured by `psa-api-conf.py` as a common reStructuredText role, rather +than registered by `psa-api-tool.py` as a domain-specific role. + +Syntax/example: + +```rst +The result is :sc:`implementation defined`. +``` + +### `:issue:` + +Purpose: + +Apply the `issue` CSS/LaTeX role class to inline text, normally for visible open-issue +placeholders. + +Syntax/example: + +```rst +:issue:`<<Document ID>>` +``` + +Output/effect: + +The current templates render the role text inline, in red. + +Gotchas: + +This role is configured by `psa-api-conf.py` as a common reStructuredText role. It does +not create or link to an external issue tracker entry. + +### `:code:` + +Purpose: + +Format text as inline code, hyperlinking any API element identifiers that are defined in +this specification. + +Syntax/example: + +```rst +Use a call to :code:`psa_wait(PSA_WAIT_ANY, PSA_BLOCK)` to wait for the next partition event. +``` + +Output/effect: + +The rendered output is formatted as code, hyperlinking every API element to its +definition. + +Gotchas: + +- Use the `:code:` role instead of the default reference role for linking to API + elements if the API definition might be in another specification. This results in code + formatting without a hyperlink if no matching definition is available. +- Use the `:code:` role instead of reStructuredText double backticks for monospace text + if the code contains API elements. + +### `:secref:` + +Purpose: + +Include a formatted, inline cross-reference to a titled section or object anywhere in +the specification. + +This role is similar to the standard `:ref:` role: the target's title is used as the +link text. It is commonly used for section references, but it can also reference titled +listings, tables, and figures. See also `:numref:`. + +Example: + +```rst +See :secref:`programming-api` for details. +``` + +For a reference to a document section, this requires that `programming-api` is defined +as a link target associated with the section heading by defining an explicit anchor in +the source immediately before the heading itself, for example: + +```rst +.. _programming-api: + +Programming API +--------------- +``` + +Output/effect: + +The target's title is rendered as a hyperlink in the output. In HTML output, the link +text uses the template's title-reference styling. In LaTeX/PDF output, the link is +followed by an additional `on page nnn` link when the target is on a different page. + +Gotchas: + +- Make sure all anchor targets are unique in a document. They do not have to exactly + match the text in the section heading. +- To reference a figure, listing, or table, these have to have a title, and have the + anchor name set using the `:name:` option. +- The former `:title:` alias has been removed. Use `:secref:` for title-text cross + references. + +### `:numref:` + +Purpose: + +Include a formatted, inline cross-reference to a numbered object in the document, such +as a listing, table, figure, or section heading. See also `:secref:`. + +Syntax/example: + +```rst +:numref:`table-error-codes` summarizes the errors produced by this API. See also :numref:`error-codes`. +``` + +For a reference to a document section, this requires that `error-codes` is defined as a +link target associated with the section heading by defining an explicit anchor in the +source immediately before the heading itself. + +Output/effect: + +The target's number is rendered as a hyperlink in the output. In PDF output, the +hyperlink text includes the target page number. + +Gotchas: + +- Make sure all anchor targets are unique in a document. They do not have to exactly + match the text in the section heading. +- To reference a figure, listing, or table, these have to have an anchor name set using + the `:name:` option. + +### `:term:` + +Purpose: + +Include a formatted cross-reference to a term or abbreviation that is defined in the +document glossary. + +Syntax/example: + +```rst +The RoT Service runs within a :term:`Secure Partition`. +``` + +The capitalization of the term in the role text does not have to match the +capitalization in the glossary. + +Output/effect: + +The rendered output is a formatted hyperlink, the capitalization of the text is taken +from the role text. + +Gotchas: + +- The term or abbreviation must be defined in a `.. term::` directive. +- To pluralize a term, an escaped-space can be used in the .rst source. For example, + `The :term:``RoT Service``\ s` will render as "The RoT Services", with "RoT Service" + hyperlinked to the glossary. + +### `:scterm:` + +Purpose: + +Include a formatted cross-reference to a smallcaps term or abbreviation that is defined +in the document glossary. + +Syntax/example: + +```rst +Providing a zero-length name is a :scterm:`Programmer error`. +``` + +The capitalization of the term in the role text does not have to match the +capitalization in the glossary. + +Output/effect: + +The rendered output is a smallcaps-formatted hyperlink. + +Gotchas: + +- The term or abbreviation must be defined in an `.. scterm::` directive. + +### `:cite-title:` + +Purpose: + +Include a formatted reference to the title of a cited work. + +Syntax/example: + +```rst +The security model is defined in :cite-title:`PSA_SM`. +``` + +The role text is the citation `ref_id`. + +Output/effect: + +The rendered output is a hyperlink containing the title of the cited work followed by +'[ref_id]'. + +Gotchas: + +- The citation must be defined in a `.. reference:: ref_id` directive. + +### `:cite:` + +Purpose: + +Include an untitled citation reference. + +Syntax/example: + +```rst +:cite:`PSA_SM` also defines the security goals. +``` + +The role text is the citation `ref_id`. + +Output/effect: + +The rendered output is a hyperlink containing '[ref_id]'. + +Gotchas: + +- The citation must be defined in a `.. reference:: ref_id` directive. + +### `:rfc-title:` + +Purpose: + +Include a formatted reference to the title of a published RFC. + +Syntax/example: + +```rst +The algorithm is defined in :rfc-title:`9910`. +``` + +The role text is the RFC number, optionally followed by a '#' and section number. + +Output/effect: + +The rendered output is a hyperlink containing the title of the cited RFC followed by +`[RFC nnnn]`. + +If a section number or appendix letter is included in the role text, a second hyperlink +follows which contains the formatted section number and links directly to that section +of the RFC document. + +Gotchas: + +- The citation must be defined in a `.. reference:: RFC nnnn` directive, or a compact + `RFCnnnn` source form that normalizes to the same citation. + +### `:rfc:` + +Purpose: + +Include an untitled RFC reference. + +Syntax/example: + +```rst +:rfc:`9910#B` discusses the security analysis of the algorithm. +``` + +The role text is the RFC number, optionally followed by a '#' and section number. + +Output/effect: + +The rendered output is a hyperlink containing `[RFC nnnn]`. + +If a section number or appendix letter is included in the role text, a second hyperlink +follows which contains the formatted section number and links directly to that section +of the RFC document. + +Gotchas: + +- The citation must be defined in a `.. reference:: RFC nnnn` directive, or a compact + `RFCnnnn` source form that normalizes to the same citation. + +### `:url:` + +Purpose: + +Render an external URL as a hyperlink. + +Syntax/example: + +```rst +See :url:`example.com/specification`. +``` + +Output/effect: + +If the role text does not include `//`, the link target is prefixed with `https://`. The +visible text is the role text as written. + +## Security Risk Assessment Directives and Roles + +The Sphinx extension includes directives and roles that support structured security risk +assessment content. + +### `.. threat::` + +Purpose: + +Define a structured threat entry. + +Syntax: + +```rst +.. threat:: Threat title + :id: T.example + :deployment-models: DM.PROTECTED, DM.EXPOSED + + .. description:: + + Threat description. + + .. adversarial-model:: + + Relevant adversarial model. + + .. security-goal:: + + Security goal affected by this threat. + + .. unmitigated:: DM.PROTECTED + :impact: H + :likelihood: M + + .. unmitigated:: DM.EXPOSED + :impact: VH + :likelihood: M + + .. mitigations:: + + Mitigations. + + .. residual:: DM.PROTECTED + :impact: L + :likelihood: L + + .. residual:: DM.EXPOSED + :impact: M + :likelihood: L +``` + +Common options: + +- `:id:` - explicit threat identifier. +- `:deployment-models:` - optional comma-separated list of deployment models for which + risk values can be provided. This also defines the order in which deployment-model + columns are rendered. + +Placement rules: + +The sub-directives are parsed inside the `.. threat::` directive body. + +Output/effect: + +The directive renders a section for the threat. The section title contains the threat +identifier, when provided, followed by the threat title. + +If no deployment-model distinction is used, the risk values are rendered as a single +evaluation for the threat. If named deployment models are used, the deployment model row +is rendered before the unmitigated risk rows, and the unmitigated and residual risk rows +use a consistent column layout so each evaluation appears under the relevant +deployment-model title. + +### Threat sub-directives + +The following sub-directives collect prose fields for a threat: + +- `.. description::` +- `.. adversarial-model::` +- `.. security-goal::` +- `.. mitigations::` + +The following sub-directives collect risk values: + +- `.. unmitigated::` +- `.. residual::` + +Risk directives support: + +- An optional directive argument - the deployment-model scope for these risk values. +- `:impact:` - required impact value. +- `:likelihood:` - required likelihood value. +- `:risk:` - optional explicit risk value. If omitted, the tool derives the risk from + the impact and likelihood matrix. + +Accepted abbreviated risk values are `VL`, `L`, `M`, `H`, and `VH`. + +If the optional argument is omitted, the risk values apply to the threat as a whole. If +a deployment-model argument is provided, the risk values apply only to that deployment +model. + +When a threat uses multiple deployment models, use `:deployment-models:` on the `.. +threat::` directive to list the expected deployment models and their presentation order, +and provide matching `.. unmitigated:: <DM>` and `.. residual:: <DM>` entries for each +deployment model. + +Example: + +```rst +.. threat:: Eavesdropping + :deployment-models: DM.PROTECTED, DM.EXPOSED + + .. unmitigated:: DM.PROTECTED + :impact: M + :likelihood: L + + .. residual:: DM.PROTECTED + :impact: M + :likelihood: VL + + .. unmitigated:: DM.EXPOSED + :impact: H + :likelihood: M + + .. residual:: DM.EXPOSED + :impact: M + :likelihood: L +``` + +### SRA definition and reference roles + +Definition roles create a definition target and render a canonical identifier: + +- `:deployment-model:` +- `:adversarial-model:` +- `:security-goal:` +- `:threat:` +- `:mitigation:` + +Reference roles link to those definitions: + +- `:dm:` +- `:am:` +- `:sg:` +- `:t:` +- `:m:` + +The long definition roles and the short reference roles use canonical prefixes: `DM.`, +`AM.`, `SG.`, `T.`, and `M.`. If the prefix is omitted in the role text, the tool adds +it. + +Example: + +```rst +:security-goal:`SG.confidentiality` + +The mitigation is described in :m:`isolate-components`. +``` + +---- + +*Copyright 2018-2026 Arm Limited* diff --git a/tools/docs/specification-lifecycle-workflows.md b/tools/docs/specification-lifecycle-workflows.md new file mode 100644 index 00000000..ae03a703 --- /dev/null +++ b/tools/docs/specification-lifecycle-workflows.md @@ -0,0 +1,83 @@ +<!-- +SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +SPDX-License-Identifier: Apache-2.0 +--> + +# Specification Lifecycle Workflows + +This guide records occasional workflows for maintaining a PSA API specification that is +built with `psa-api-tool`. + +These workflows are separate from the basic setup and build instructions in +`using-psa-api-tool.md`, and from the source editing reference in +`psa-api-tool-notes.md`. They are intended for release managers, specification editors, +and agents doing lifecycle maintenance work. + +The sections below are placeholders to be filled in once the publication process and +repository transfer expectations are settled. + +## Before Starting Work on a New Issue or Version + +Use this workflow after a specification issue or version has been published, and before +the first source changes for the next issue or version are introduced. + +Expected topics: + +- Decide whether the next work is a new issue of the current version, a release + candidate, or a new minor/major version. +- Update `doc_info` publication metadata in `conf.py`. +- Update release-history source entries. +- Reset or update draft, quality, issue, and release-candidate metadata. +- Review filename and document identifier expectations. +- Establish the expected API database baseline before semantic changes begin. +- Check whether generated headers, rendered images, or publication artifacts need to be + reset or regenerated. +- Build the clean starting point and record expected warnings. + +TODO: fill in the exact fields and commands once the publication model is confirmed. + +## Preparing a Release Candidate + +Use this workflow when preparing a candidate build for review before final publication. + +Expected topics: + +- Set release-candidate metadata in `conf.py`. +- Confirm draft and optional-content settings for the candidate review build. +- Update release notes, current status, potential-for-change, and change-history + content. +- Run HTML, PDF, API database, generated-header, and image validation as appropriate. +- Review generated filenames and visible title-page/footer metadata. +- Confirm that intentional API changes are reflected in the checked-in API database. +- Record known and accepted warnings. +- Package or tag review artifacts according to the consuming specification repository + process. + +TODO: define exact validation commands and artifact expectations for PSA API +specifications. + +## Finalizing an Issue or Version for Publication + +Use this workflow when converting an approved release candidate into the final published +issue or version. + +Expected topics: + +- Remove release-candidate metadata and set final quality/status metadata. +- Confirm draft, watermark, license, copyright, owner, and feedback metadata. +- Finalize release-history, current-status, and potential-for-change sections. +- Verify there are no unresolved rendered TODO, rationale, or comment sections unless + intentionally published. +- Run final HTML and PDF builds. +- Run final API database comparison and update generated references when required. +- Regenerate rendered image assets when graphics sources changed. +- Review generated filenames, document identifiers, version strings, and title-page + metadata. +- Create publication artifacts and tags according to the consuming specification + repository process. + +TODO: fill in the exact publication checklist after the release process is agreed. + +---- + +*Copyright 2018-2026 Arm Limited* diff --git a/tools/docs/using-psa-api-tool.md b/tools/docs/using-psa-api-tool.md new file mode 100644 index 00000000..b818b7a7 --- /dev/null +++ b/tools/docs/using-psa-api-tool.md @@ -0,0 +1,239 @@ +<!-- +SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +SPDX-License-Identifier: Apache-2.0 +--> + +# Building PSA API Specifications + +This guide explains how the PSA API specifications in this repository are built with the +integrated `psa-api-tool` copy in `tools/`. + +For source editing conventions, custom directives, roles, and API documentation +conventions, see `psa-api-tool-notes.md`. + +For occasional lifecycle tasks, such as starting work on a new issue or version, +preparing a release candidate, or finalizing a publication, see +`specification-lifecycle-workflows.md`. That guide intentionally contains placeholders +until the publication process is settled after the repository transfer. + +## Tool Layout + +The repository has a small top-level `Makefile`: + +```make +PSA_API_TOOL ?= tools + +ifeq ($(wildcard $(PSA_API_TOOL)/make),) + $(error The 'PSA_API_TOOL' variable is not set, or does not point to a suitable installation of psa-api-tool) +endif + +include $(PSA_API_TOOL)/make +``` + +By default, builds use the checked-in tool under `tools/`. Editors can override +`PSA_API_TOOL` to test another compatible copy: + +```sh +make PSA_API_TOOL=/path/to/psa-api-tool doc/crypto/html +``` + +Each specification has its own `conf.py` under `doc/<spec>/`. The document configuration +sets `psa_api_tool_path` to the repository `tools/` directory, allows the `PSA_API_TOOL` +environment variable to override that path, then executes `psa-api-conf.py` from the +selected tool copy. + +Older PSA API source revisions used the former `atg-sphinx-spec` name. The +shared makefile exports `ATG_SPHINX_SPEC` as an alias for `PSA_API_TOOL`, and +the tool provides `atg-sphinx-conf.py` as a compatibility wrapper around +`psa-api-conf.py`. This allows older source trees to be built with the newer +tool by invoking: + +```sh +make -f /path/to/psa-api-tool/make doc/crypto/html +``` + +## Requirements + +The core HTML and structured-output build path requires: + +- Python 3. +- Sphinx. +- A POSIX-like shell and `make`. + +PDF output also requires a LaTeX toolchain that provides `pdflatex`. + +The `images` target may require additional tools, depending on the figure sources used +by the specification: + +- `wavedrompy` for `.json` bitfield diagrams. +- Java and PlantUML for `.puml` diagrams. +- `rsvg-convert` for SVG-to-PDF conversion. + +Graphviz is only required for documents that use Sphinx Graphviz directives. + +Most rendered graphics are checked in, so a text-only edit normally does not require the +full graphics toolchain. + +The PDF target uses `qpdf` to optimize generated PDF files when it is available. This is +optional. + +### Version and Platform Guidance + +The build tooling is not currently defined by a pinned requirements file or a repeatable +CI environment. Contributors should report the tool and platform versions used when +diagnosing build differences. + +The integrated tool introduction branch has been tested on macOS arm64 with Python +3.13.7, Sphinx 8.1.0, GNU Make 3.81, MiKTeX-pdfTeX 4.10, OpenJDK 21.0.2, PlantUML +1.2025.2, Graphviz 12.2.1, `rsvg-convert` 2.60.0, and `qpdf` 12.3.2. The precursor +tooling was also used successfully with Git Bash on Windows 11, and the tooling is +expected to work on Linux with the equivalent packages installed. These platforms are +descriptive, not a formal support matrix. + +The tools are maintained against recent Sphinx releases. Sphinx 8.1.0 is the current +known-good version; Sphinx 5.3 is the oldest version expected to be plausible, but it is +not currently validated. When setting up a new environment, start with the newest stable +versions available from the platform package manager, then validate with the specific +targets needed for the change under review. + +## Common Builds + +From the repository root, build one output format for one specification: + +```sh +make doc/crypto/html +make doc/crypto/pdf +make doc/crypto/headers +make doc/crypto/api-diff +``` + +The same pattern works for the other specification directories: + +- `doc/attestation` +- `doc/crypto` +- `doc/crypto-driver` +- `doc/fwu` +- `doc/status-code` +- `doc/storage` + +Build one output format for every specification: + +```sh +make html +make pdf +``` + +Build all default outputs for one specification: + +```sh +make doc/crypto +``` + +Generated output is written under `build/`, mirroring the document path. For example, +`make doc/crypto/html` writes HTML under `build/doc/crypto/html`. + +## Targets + +| Target | Purpose | +| --- | --- | +| `html` | Build HTML output and rewrite it for the repository website layout. | +| `latex` | Generate LaTeX output. | +| `pdf` | Generate LaTeX output, run `pdflatex`, and optimize the PDF with `qpdf` when available. | +| `xml` | Build XML structured document output. | +| `headers` | Generate reference C header files from API directives. | +| `api-db` | Generate normalized API database headers. | +| `api-diff` | Compare generated API database headers with the checked-in `api.db/` reference. | +| `api-update` | Update the checked-in `api.db/` reference after an intentional API change. | +| `images` | Regenerate converted or generated image assets when required tools are installed. | +| `clean` | Remove generated build output for the selected document or documents. | + +Use `INTERNAL=1` to build an internal-tagged output variant when a document uses +internal-only content. + +## Recommended Validation + +For a source-only documentation change, build the affected HTML output first: + +```sh +make doc/<spec>/html +``` + +For a change that affects API directives, generated C declarations, manifest +definitions, or reference API headers, run: + +```sh +make doc/<spec>/api-diff +``` + +If the API change is intentional, review the diff and update the checked-in API +database: + +```sh +make doc/<spec>/api-update +``` + +When publishing a new revision, the reference headers are updated using the output +from the build: + +```sh +make doc/<spec>/headers +``` + +For changes that affect title pages, front matter, page breaks, LaTeX styling, or +publication-ready layout, build: + +```sh +make doc/<spec>/pdf +``` + +For changes to graphics sources, run: + +```sh +make doc/<spec>/images +``` + +The XML output can be useful when reviewing generated document structure, resolved +references, table structure, glossary entries, and API sections: + +```sh +make doc/<spec>/xml +``` + +Treat XML as supplementary validation. It does not replace rendered HTML/PDF inspection +or API database checks. It can be helpful when diagnosing why some source content is +not rendering as expected. + +## Document Configuration + +Each document `conf.py` defines a `doc_info` dictionary and then executes the shared +tool configuration. Keep document configuration focused on document metadata and +document-specific choices. Avoid setting Sphinx configuration variables directly in +`conf.py` unless the shared configuration cannot support the required behavior. + +The current PSA API documents use the Arm-style `psa-api-2022` and `psa-api-2025` +templates. These templates preserve the existing front matter and release metadata model +while allowing the repository to build without an external `atg-sphinx-spec` checkout. + +Important `doc_info` keys used by these specifications include: + +| Key | Purpose | +| --- | --- | +| `template` | Template directory under `tools/templates/`. | +| `title` | Document title used by Sphinx and the title page. | +| `version` | Base API version, normally `X.Y`. | +| `issue_no` | Document issue or maintenance revision. | +| `draft` | Draft flag or draft revision, depending on the selected publication model. | +| `release_candidate` | Release-candidate number for existing Arm-style documents. | +| `quality` | API maturity code such as `ALP`, `BET`, or `REL`. | +| `header` | Default generated C header path for API directives. | +| `header_doxygen` | Generated header annotation level. | +| `error_order` | Document-wide order for generated return values. | +| `identifier_index` | Controls the generated C identifier index. | +| `prolog_files` | Shared substitution files included in the Sphinx prolog. | + +For detailed directive and role behavior, use `psa-api-tool-notes.md` as the editing +reference. + +---- + +*Copyright 2018-2026 Arm Limited* diff --git a/tools/images.mk b/tools/images.mk new file mode 100644 index 00000000..ff569606 --- /dev/null +++ b/tools/images.mk @@ -0,0 +1,89 @@ +# SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +# SPDX-License-Identifier: Apache-2.0 + +# Makefile for building image files (SVG and PDF) from sources + +# The parameter $(IMAGE) must have the location of the image files +IMAGE = . + +# This makefile +MAKEFILE = $(lastword $(MAKEFILE_LIST)) +# The location of this makefile, relative to the current directory +MAKEFILEDIR := $(patsubst %/,%,$(dir $(MAKEFILE))) +# The location of the psa-api-tool tools, containing the PlantUML configuration +SPEC = $(MAKEFILEDIR) + +# Bitfield image generation, command to run to wavedrompy +WAVEDROM = wavedrompy + +# UML image generation, command to run plantuml +JAVA = java +PLANTUML_IPATH = $(SPEC)/puml +PLANTUML = $(JAVA) -Dplantuml.include.path="$(PLANTUML_IPATH)" -jar ~/jar/plantuml.jar +PLANTUML_FLAGS = -nometadata -tsvg -charset utf-8 + +# SVG to PDF conversion +SVG2PDF = rsvg-convert +SVG2PDF_FLAGS = --format=pdf + +OSTYPE = $(shell echo $${OSTYPE}) +ifneq (,$(filter darwin%,$(OSTYPE))) + SED_FLAG = -i '' +else ifneq (,$(filter bsd%,$(OSTYPE))) + SED_FLAG = -i '' +else + SED_FLAG = -i'' +endif + +FIX_SVG_FONTS = sed $(SED_FLAG) -e 's/"roboto mono"/"Roboto Mono,monospace"/gi;s/"roboto"/"Roboto,sans-serif"/gi;s/lato/Lato,sans-serif/gi;s/inconsolata/Inconsolata,monospace/gi' + +# Images can be in sub-directories of those listed in $IMAGE +IMAGES := $(shell find $(IMAGE) -type d -print) + +# List of UML diagrams to render +UML_IMAGES := $(wildcard $(addsuffix /*.puml,$(IMAGES))) +# List of bitfield descriptions to render +BIT_IMAGES := $(wildcard $(addsuffix /*.json,$(IMAGES))) +# Build a list of source SVG image files to convert +SVG_IMAGES := $(sort $(patsubst %.json,%.svg,$(BIT_IMAGES)) \ + $(patsubst %.puml,%.svg,$(UML_IMAGES)) \ + $(wildcard $(addsuffix /*.svg,$(IMAGES))) \ + ) +# Build a list of generated PDF files +PDF_IMAGES := $(patsubst %.svg,%.pdf,$(SVG_IMAGES)) + +PUML_INCLUDES := $(wildcard $(PLANTUML_IPATH)/*) + +# Pattern rule for identifying UML files to rebuild +%.svg : %.puml $(MAKEFILE) $(PUML_INCLUDES) + @echo "Rendering $<"; \ + $(PLANTUML) $(PLANTUML_FLAGS) $< ; \ + $(FIX_SVG_FONTS) $@ + +# Pattern rule for converting JSON to SVG +%.svg : %.json $(MAKEFILE) + @echo "Rendering $<"; \ + $(WAVEDROM) -i $< -s $@; \ + $(FIX_SVG_FONTS) $@ + +# Pattern rule for identifying SVG files to convert +%.pdf : %.svg + @echo "Converting $<"; \ + $(SVG2PDF) $(SVG2PDF_FLAGS) -o $@ $< + +.PHONY: all +all: svg pdf + +.PHONY: svg +svg: $(SVG_IMAGES) + +.PHONY: pdf +pdf: $(PDF_IMAGES) + +.PHONY: help +help: + @echo "To build the graphics, please use \`make <target>' where <target> is one of"; \ + echo " svg to make the SVG image files"; \ + echo " pdf to make the PDF image files"; \ + echo ""; \ + echo " all to make all image files" diff --git a/tools/license/arm_psa_certified_api_license.rst b/tools/license/arm_psa_certified_api_license.rst new file mode 100644 index 00000000..2216685b --- /dev/null +++ b/tools/license/arm_psa_certified_api_license.rst @@ -0,0 +1,40 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license AND Apache-2.0 + +.. + The license for the text and illustrations is CC BY-SA 4.0 with and additional patent clause derived from Apache License 2.0. + The license for source code within the document is Apache License 2.0. + + CC BY-SA 4.0 is at https://creativecommons.org/licenses/by/4.0 + Apache 2.0 is at https://www.apache.org/licenses/LICENSE-2.0 + +.. license:: + + .. insert-section:: Text and illustrations + :not-in-toc: + + Text and illustrations in this work are licensed under Attribution-ShareAlike 4.0 International (CC BY-SA 4.0). To view a copy of the license, visit :url:`creativecommons.org/licenses/by-sa/4.0`. + + **Grant of patent license**. Subject to the terms and conditions of this license (both the CC BY-SA 4.0 Public License and this Patent License), each Licensor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Licensed Material, where such license applies only to those patent claims licensable by such Licensor that are necessarily infringed by their contribution(s) alone or by combination of their contribution(s) with the Licensed Material to which such contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Licensed Material or a contribution incorporated within the Licensed Material constitutes direct or contributory patent infringement, then any licenses granted to You under this license for that Licensed Material shall terminate as of the date such litigation is filed. + + The Arm trademarks featured here are registered trademarks or trademarks of Arm Limited (or its subsidiaries) in the US and/or elsewhere. All rights reserved. Please visit :url:`arm.com/company/policies/trademarks` for more information about Arm's trademarks. + + .. insert-section:: About the license + :not-in-toc: + + The language in the additional patent license is largely identical to that in section 3 of the Apache License, Version 2.0 (Apache 2.0), with two exceptions: + + 1. Changes are made related to the defined terms, to align those defined terms with the terminology in CC BY-SA 4.0 rather than Apache 2.0 (for example, changing "Work" to "Licensed Material"). + + 2. The scope of the defensive termination clause is changed from "any patent licenses granted to You" to "any licenses granted to You". This change is intended to help maintain a healthy ecosystem by providing additional protection to the community against patent litigation claims. + + To view the full text of the Apache 2.0 license, visit :url:`apache.org/licenses/LICENSE-2.0`. + + .. insert-section:: Source code + :not-in-toc: + + Source code samples in this work are licensed under the Apache License, Version 2.0 (the "License"); you may not use such samples except in compliance with the License. You may obtain a copy of the License at :url:`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. diff --git a/tools/license/missing.rst b/tools/license/missing.rst new file mode 100644 index 00000000..66689649 --- /dev/null +++ b/tools/license/missing.rst @@ -0,0 +1,8 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. The license is missing from the document information + +.. license:: <<Missing license>> + + :issue:`<<Missing license text>>` diff --git a/tools/license/psa_certified_api_license.rst b/tools/license/psa_certified_api_license.rst new file mode 100644 index 00000000..863d7c57 --- /dev/null +++ b/tools/license/psa_certified_api_license.rst @@ -0,0 +1,38 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license AND Apache-2.0 + +.. + The license for the text and illustrations is CC BY-SA 4.0 with and additional patent clause derived from Apache License 2.0. + The license for source code within the document is Apache License 2.0. + + CC BY-SA 4.0 is at https://creativecommons.org/licenses/by/4.0 + Apache 2.0 is at https://www.apache.org/licenses/LICENSE-2.0 + +.. license:: + + .. insert-section:: Text and illustrations + :not-in-toc: + + Text and illustrations in this work are licensed under Attribution-ShareAlike 4.0 International (CC BY-SA 4.0). To view a copy of the license, visit :url:`creativecommons.org/licenses/by-sa/4.0`. + + **Grant of patent license**. Subject to the terms and conditions of this license (both the CC BY-SA 4.0 Public License and this Patent License), each Licensor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Licensed Material, where such license applies only to those patent claims licensable by such Licensor that are necessarily infringed by their contribution(s) alone or by combination of their contribution(s) with the Licensed Material to which such contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Licensed Material or a contribution incorporated within the Licensed Material constitutes direct or contributory patent infringement, then any licenses granted to You under this license for that Licensed Material shall terminate as of the date such litigation is filed. + + .. insert-section:: About the license + :not-in-toc: + + The language in the additional patent license is largely identical to that in section 3 of the Apache License, Version 2.0 (Apache 2.0), with two exceptions: + + 1. Changes are made related to the defined terms, to align those defined terms with the terminology in CC BY-SA 4.0 rather than Apache 2.0 (for example, changing "Work" to "Licensed Material"). + + 2. The scope of the defensive termination clause is changed from "any patent licenses granted to You" to "any licenses granted to You". This change is intended to help maintain a healthy ecosystem by providing additional protection to the community against patent litigation claims. + + To view the full text of the Apache 2.0 license, visit :url:`apache.org/licenses/LICENSE-2.0`. + + .. insert-section:: Source code + :not-in-toc: + + Source code samples in this work are licensed under the Apache License, Version 2.0 (the "License"); you may not use such samples except in compliance with the License. You may obtain a copy of the License at :url:`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. diff --git a/tools/make b/tools/make new file mode 100644 index 00000000..5fdc3644 --- /dev/null +++ b/tools/make @@ -0,0 +1,267 @@ +# SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +# SPDX-License-Identifier: Apache-2.0 + +# Common top level include-makefile for building a suite of documents +# +# This should be included from the specification project makefile, +# with the following variables defined: + +# OUTPUT optional - it specifies the output directory, default to 'build' +OUTPUT ?= build +# INTERNAL optional - boolean, if non-empty this sets the 'internal' tag on the documentation build + +# Use the directory containing this makefile for the psa-api-tool tools +override PSA_API_TOOL := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))) +export PSA_API_TOOL +# Compatibility for older specification sources that still load +# atg-sphinx-conf.py using ATG_SPHINX_SPEC. +override ATG_SPHINX_SPEC := $(PSA_API_TOOL) +export ATG_SPHINX_SPEC +# For recursive invokation we need to know which makefile is used +THIS_MAKE := -f $(firstword $(MAKEFILE_LIST)) + +ifeq ($(wildcard conf.py),) + +############################### +# Document project make rules # +############################### + +# There is no conf.py - this is a project directory + +# The set of valid format targets for individual documents +TARGETS := clean html latex pdf xml headers api-db api-diff api-update images +TARGETS_ALL := $(TARGETS) all + +# The set of document Sphinx configuration files +DOCS := $(patsubst ./%/conf.py,%,$(shell find . -name conf.py)) +# compile the set of directories containing documents, and their parents +DOCS2 := $(patsubst %/,%,$(subst ./,,$(dir $(DOCS)))) +DOCS3 := $(patsubst %/,%,$(subst ./,,$(dir $(DOCS2)))) +DOCS4 := $(patsubst %/,%,$(subst ./,,$(dir $(DOCS3)))) +DOCS_ALL := $(sort $(DOCS) $(DOCS2) $(DOCS3) $(DOCS4)) + +# The full combination of all documents and targets +ALL_TARGETS := $(foreach DOC,$(DOCS_ALL),$(addprefix $(DOC)/,$(TARGETS_ALL))) + +MAKE_VARS := INTERNAL=$(INTERNAL) + +.PHONY: all +all: $(addsuffix /all,$(DOCS)) + +# Building all target types for a specific document +.PHONY: $(DOCS_ALL) +$(DOCS_ALL): + @"$(MAKE)" $(THIS_MAKE) $@/all \ + OUTPUT=$(OUTPUT) $(MAKE_VARS) + +# Building a specific target type for each document +.PHONY: $(TARGETS) +$(TARGETS): + @"$(MAKE)" $(THIS_MAKE) $(addsuffix /$@,$(DOCS)) \ + OUTPUT=$(OUTPUT) $(MAKE_VARS) + +# Explicitly using all/* to build a certain target type +.PHONY: all/% +all/%: %; + +# Building a single target type for a single document + +.PHONY: $(ALL_TARGETS) +$(ALL_TARGETS): + @if [ -e $(@D)/Makefile ]; then \ + MAKEFILE="Makefile" ; \ + else \ + MAKEFILE="$(PSA_API_TOOL)/make" ; \ + fi; \ + "$(MAKE)" -C $(@D) $(@F) -f $$MAKEFILE \ + OUTPUT=$(abspath $(OUTPUT))/$(@D) $(MAKE_VARS) + +else + +############################## +# Single document make rules # +############################## + +# There is a conf.py - this is a document directory + +# SOURCE optional - specifies the source directory, default . +SOURCE ?= . + +# FIGURES optional - a set of directories containing images to generate/transform. Default 'figure' +FIGURES ?= figure + +# Support for maintaining API compatibility (optional) +# Can be overriden by a value in the makefile that includes this +API_PATH ?= api.db + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal builds output to the .../internal path and set the "internal" tag +ifneq ($(strip $(INTERNAL)),) +override OUTPUT := $(OUTPUT)/internal +SPHINXOPTS += -t internal +endif + +# Internal variables. +ALLSPHINXOPTS := -d $(OUTPUT)/doctrees $(SPHINXOPTS) -T $(SOURCE) + +.PHONY: all +all: html latex pdf xml headers + +ifneq ($(wildcard $(FIGURES)),) +# Rebuild converted and generated images if graphic sources are modified +.PHONY: images +images: + @"$(MAKE)" -f $(PSA_API_TOOL)/images.mk IMAGE=$(FIGURES) +else +.PHONY: images +images: + @echo "No images in this document" +endif + +# Assume all content under SOURCE and PSA_API_TOOL tooling affects the output +PRUNE := .* __* skeleton guide build docs +PRUNE := $(patsubst %,-name "%" -prune -or,$(PRUNE)) +PSA_API_TOOL_FILES := $(shell find $(PSA_API_TOOL) $(PRUNE) -type f -print) +SPHINX_INPUTS := $(shell find $(SOURCE) -type f -print) $(PSA_API_TOOL_FILES) + +.PHONY: html +html: $(OUTPUT)/html/done +$(OUTPUT)/html/done: $(SPHINX_INPUTS) + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(@D) + @pushd $(@D); python3 $(PSA_API_TOOL)/rewrite-html-for-jekyll.py; popd; \ + touch $@; echo; echo "Build finished. The HTML pages are in $(@D)." + +.PHONY: latex +latex: $(OUTPUT)/latex/done +$(OUTPUT)/latex/done: $(OUTPUT)/latex/donetex + @touch $@; echo; echo "Build finished; the LaTeX files are in $(OUTPUT)/latex."; \ + echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make pdf' here to do that automatically)." +$(OUTPUT)/latex/donetex: $(SPHINX_INPUTS) + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(@D) + @touch $@ + +.PHONY: pdf +pdf: $(OUTPUT)/latex/donepdf +$(OUTPUT)/latex/donepdf : $(OUTPUT)/latex/donetex + @echo "Running LaTeX files through pdflatex..."; \ + "$(MAKE)" -C $(OUTPUT)/latex all-pdf; \ + if command -v qpdf >/dev/null 2>&1; then \ + for pdf in "$(@D)"/*.pdf; do \ + [ -e "$$pdf" ] || continue; \ + qpdf --linearize --object-streams=generate --compress-streams=y --replace-input "$$pdf"; \ + done; \ + fi; \ + touch $@; echo ; echo "Build finished; the PDF files are in $(@D)." + +.PHONY: xml +xml: $(OUTPUT)/xml/done +$(OUTPUT)/xml/done: $(SPHINX_INPUTS) + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(@D) + @touch $@; echo; echo "Build finished. The XML files are in $(@D)." + +API_REF_BUILD_PATH = $(OUTPUT)/headers +API_DB_BUILD_PATH = $(OUTPUT)/api.db +API_DIFF = $(OUTPUT)/api.diff + +.PHONY: headers +headers: $(API_REF_BUILD_PATH) +$(API_REF_BUILD_PATH): $(SPHINX_INPUTS) + @rm -rf $@ + $(SPHINXBUILD) -b headers $(ALLSPHINXOPTS) $@ +# Deal with graphviz extension stupidity of copying .css into every target + @rm -rf $@/_static; \ + echo ; echo "Build finished. The reference header files are in $@." + +.PHONY: api-db +api-db: $(API_DB_BUILD_PATH) +$(API_DB_BUILD_PATH): $(SPHINX_INPUTS) + @rm -rf $@ + $(SPHINXBUILD) -b api-db $(ALLSPHINXOPTS) $@ +# Deal with graphviz extension stupidity of copying .css into every target + @rm -rf $@/_static; \ + echo ; echo "Build finished. The reference header files are in $@." + +.PHONY: api-diff +api-diff: $(API_DIFF) + @if [ -s $(API_DIFF) ]; then \ + echo ; \ + echo "WARNING: API changes detected."; \ + echo ""; \ + cat $(API_DIFF); \ + exit 1; \ + else \ + echo "No API changes detected."; \ + fi + +ifeq (,$(wildcard $(API_PATH))) +# Handle the bootstrap case when there is no reference API +# If there is no API, create an empty diff +$(API_DIFF): $(API_DB_BUILD_PATH) + @if [[ 0 -eq `find $(API_DB_BUILD_PATH) -type f | wc -l` ]]; \ + then \ + >$@; \ + else \ + echo "** No reference API **" > $@; \ + fi +else +$(API_DIFF): $(API_DB_BUILD_PATH) $(API_PATH) + @diff --strip-trailing-cr -x .DS_Store -r $(API_PATH) $(API_DB_BUILD_PATH) 1>$@ || exit 0 +endif + +.PHONY: api-update +api-update: $(API_DIFF) + @if [ -s $(API_DIFF) ]; then \ + echo "Copying header files"; \ + mkdir -p $(API_PATH) && cp -r $(API_DB_BUILD_PATH)/* $(API_PATH)/; \ + >$(API_DIFF); \ + fi + +.PHONY: clean +clean:: + rm -rf $(OUTPUT)/* + +endif + +.PHONY: help +help:: +ifeq ($(wildcard conf.py),) + @echo "Please use \`make <document>/<target>' where <document> is one of"; \ + echo " $(DOCS)"; \ + echo "and <target> is one of:" +else + @echo "Please use \`make <target>' where <target> is one of" +endif + @echo " html to make standalone HTML files"; \ + echo " xml to make an XML document structure"; \ + echo " latex to make LaTeX files"; \ + echo " pdf to make LaTeX files and run them through pdflatex"; \ + echo " headers to make the API reference header files"; \ + echo ""; \ + echo " all to make all of the above targets"; \ + echo " clean to remove build output for all targets"; \ + echo ""; \ + echo " api-db to generate the API definition"; \ + echo " api-diff to compare the API definition against a reference"; \ + echo " api-update to update the reference API definition"; \ + echo "" +ifneq ($(wildcard conf.py)$(wildcard $(FIGURES)),conf.py) + @echo " images to update generated and converted image files"; \ + echo "" +endif +ifeq ($(wildcard conf.py),) + @echo "Shortcuts:"; \ + echo " \`make <target>' builds <target> for all documents"; \ + echo " \`make <document>' builds all targets for <document>"; \ + echo "" +endif + @echo "Specifying \`INTERNAL=1' to make will build an internal version"; \ + echo "of the documents" diff --git a/tools/psa-api-conf.py b/tools/psa-api-conf.py new file mode 100644 index 00000000..35dc1e83 --- /dev/null +++ b/tools/psa-api-conf.py @@ -0,0 +1,618 @@ +# SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +# SPDX-License-Identifier: Apache-2.0 + +# -*- coding: utf-8 -*- +# +# This is a common set of configuration options for using Sphinx to build +# PSA Certified API specifications. Project specific definitions are contained in +# the conf.py file that forms the master document directory. +# +# This script is included and executed as part of conf.py, it is not a +# standalone python module or script. +# +# conf.py must have set up: +# * a dictionary doc_info, with project specific information and +# configuration. +# * a string path psa_api_tool_path that defines the the path containing this +# file, either relative to conf.py, or absolute. +# + +import sys, os, re +from datetime import date +import importlib + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +sys.path.insert(0, os.path.abspath(psa_api_tool_path)) + +# When used within the extension, psa_api_tool_path must be a relative path +psa_api_tool_path = os.path.relpath(psa_api_tool_path) + +# Validate the selected document template, or use the default one +def template_path(template): + return os.path.join(psa_api_tool_path, 'templates', template) + +default_template = 'psa-api-2026' + +template = doc_info.get('template', default_template) +psa_api_template_path = template_path(template) +if not os.path.isdir(psa_api_template_path): + print ('WARNING: Document template "{}" not found, falling back to "{}"'.format(template, default_template)) + psa_api_template_path = template_path(default_template) + +# Process any template-specific configuration +# This must provide some required config, such as font info for html/latex +# This can also override, or fill in the doc_info dictionary + +template_info = {} + +template_conf_file = os.path.join(psa_api_template_path,'template-conf.py') +if os.path.exists(template_conf_file): + exec(compile(open(template_conf_file, encoding='utf-8').read(), 'template-conf.py', 'exec')) + +# -- helper functions + +def subst_rst(item): + if type(item) is str: + return re.sub(r'(<<.+>>)',r'\ :issue:`\1`\ ',item) + else: + return item + +def subst_latex(item): + if type(item) is str: + item = item.replace('_',r'\_') + item = re.sub(r'(<<.+>>)',r'\\DUrole{issue}{\1}',item) + return re.sub(r':(.+):`(.+)`',r'\\DUrole{\1}{\2}',item) + else: + return item + +quality_map = { + 'DEV': 'Development', + 'ALP': 'Alpha', + 'BET': 'Beta', + 'REL': 'Final', + } + +def check_quality(quality): + if not quality: + return 'REL' # Default to Final + if quality.upper() in quality_map: + return quality.upper() + for q in quality_map.items(): + if q[1] == quality: + return q[0] + print("error: Invalid doc_info.quality value") + return '<<Quality>>' + +def full_quality(quality): + return quality_map.get(quality, '<<Quality>>') + +status_map = { + 'DFT': 'Draft', + 'CRV': 'Committee Review', + 'CPR': 'Post Committee Review', + 'MRV': 'Member Review', + 'MPR': 'Post Member Review', + 'MRC': 'Member Release Candidate', + 'MEM': 'Member Release', + 'PRV': 'Public Review', + 'PPR': 'Post Public Review', + 'PRC': 'Public Release Candidate', + 'PUB': 'Public Release', + } + +def check_status(status): + if not status: + return None + if status.upper() in status_map: + return status.upper() + for s in status_map.items(): + if s[1] == status: + return s[0] + print("error: Invalid doc_info.status value") + return '<<Status>>' + +def full_status(status): + return status_map.get(status, '<<Status>>') + +def make_release(v, q, i, draft): + release = f'{v}' + release_full = release + if q != 'REL': + release += f'-{q.lower()}' + release_full += f' {full_quality(q)}' + issue = '' + if i > 0 or draft: + issue = f'{i}' + if draft: + issue += f'.{draft}' + if issue: + release += f'.{issue}' + if q == 'REL': + release_full += f'.{issue}' + else: + release_full += f' revision {issue}' + return (release, release_full, issue) + +def split_version(version): + s = [int(x) for x in version.split('.')] + if len(s) == 1: + s.append(0) + return s[0], s[1] + +# -- Build PSA API specification configuration ----------------------------------- + +now = date.today() + +# Extract and build the Sphinx configuration variables and document data +title = doc_info['title'].split('\n') +fulltitle = ' '.join(title) +rsttitle = ' |br| '.join(title) +htmltitle = '<br />'.join(title) +latextitle = '\\par '.join(title) +title = title[-1] + +project = doc_info.get('project', fulltitle) +author = doc_info.get('author', 'Unattributed') +version = doc_info['version'] +owner = doc_info.get('owner') +copyright_date = doc_info.get('copyright_date', now.strftime('%Y')) +doc_id = doc_info.get('doc_id', '<<Document ID>>') +quality = check_quality(doc_info.get('quality')) +quality_full = full_quality(quality) +issue_no = doc_info.get('issue_no', '<<Issue Number>>') +status = check_status(doc_info.get('status')) +draft = doc_info.get('draft') +# Handle old-style draft/rc scheme +release_candidate = None if draft else doc_info.get('release_candidate') +if status: + if type(draft) is bool: + print("error: Mixing old-style doc_info.draft with doc_info.status") + draft = '<<draft>>' if draft else 0 + if release_candidate is not None: + print("error: Mixing old-style doc_info.release_candidate with doc_info.status. Ignoring rc") + draft = '<<rc{}>>'.format(release_candidate) +else: + # no new-style status has been set, determine from draft/rc + if release_candidate: + status = 'PRC' + draft = release_candidate + elif type(draft) is int: + # Mixing new-style draft sequencing with no status! + print("error: Document status value required") + status = '<<Status>>' + elif draft: + status = 'DFT' + draft = 1 + else: + status = 'PUB' + draft = 0 +# Enforce draft revision provided when required by status +if status in ('MEM','PUB'): + if type(draft) is int and draft > 0: + print("error: Release status must not have draft revision number") + draft = '<<{}>>'.format(draft) +else: + if not draft: + print("error: Non-release status must have draft revision number") + draft = '<<draft>>' + +status_full = full_status(status) + +status_watermark = { + 'DFT': 'DRAFT', + 'CRV': 'Review', + 'CPR': 'Review', + 'MRV': 'Review', + 'MPR': 'Review', + 'MRC': 'Candidate', + 'PRV': 'Review', + 'PPR': 'Review', + 'PRC': 'Candidate', +} +quality_watermark = { + 'DEV': 'Development', + 'ALP': 'ALPHA', + 'BET': 'BETA' +} +watermark = doc_info.get('watermark', + status_watermark.get(status, + quality_watermark.get(quality))) + +feedback = doc_info.get('feedback') +nowdate = now.strftime('%B %Y' if status == 'MEM' or status == 'PUB' else '%d/%m/%Y') +docdate = nowdate if status == 'DFT' else doc_info.get('date', nowdate) + +c_index = doc_info.get('identifier_index', True) +page_break = doc_info.get('page_break', template_info.get('page_break','appendix')) + +majorversion, minorversion = split_version(version) +extension = doc_info.get('extension_doc', None) +if extension: + if extension == True: + # Support previous syntax for this config item + extension = 'Extension' + version = '{} {}'.format(version, extension) + +# The full version, including alpha/beta/rc tags. +release, release_full, issue = make_release(version, quality, issue_no, draft) + +# Document filename +build_file = template_info.get('make_filename') +docname = build_file(doc_info, doc_id, fulltitle, release, status_full) if build_file else None +if not docname: + docname = project.lower() +docname = docname.replace(' ','_') + +# Build filename +filename = doc_info.get('filename', docname) + +# Copyright notice, default to author +copyright_text = doc_info.get('copyright', author) +copyright = ' {} {}'.format(copyright_date, copyright_text) + +# Create tags based on the content inclusion configuration + +include_content = set(doc_info.get('include_content',[])) + +if status == 'DFT': + include_content.update(['rationale', 'todo', 'banner', 'comment']) +elif status in ('CRV','CPR','MRV','MPR','PRV','PPR'): + include_content.update(['rationale', 'banner']) +elif status in ('MRC','PRC'): + include_content.update(['banner']) + +for option in include_content: + tags.add('include_{}'.format(option)) + +# Substitutions for use in source and latex documents + +doc_terms = { + 'docid': doc_id, # FPG + 'docfulltitle': fulltitle, # PG + 'docrsttitle': rsttitle, # P + 'dochtmltitle': htmltitle, # PG + 'doclatextitle': latextitle, # P + 'doctitle': title, # FPG + 'API': title, #AF + 'APIversion': version, #A P + 'docversion': version, # legacy usage + 'majorversion' : '``{}``'.format(majorversion), # F + 'minorversion' : '``{}``'.format(minorversion), # F + 'hexversion' : '``0x{:02X}{:02X}``'.format(majorversion, minorversion), # F + 'docquality': quality_full, # P + 'docissue': issue or str(issue_no), # P + 'docstatus': status_full, # G + 'docauthor': author, # PG + 'docdate': docdate, # P + 'docrelease': release, # G + 'docreleasefull': release_full, # FP + 'doccopyright': copyright, # PG + 'docowner': owner, # P + 'docconfidentiality': 'Non-confidential', + 'docfeedback': feedback, # PG + 'docwatermark': watermark, # PG + 'docchapterbreak': ('1' if page_break == 'chapter' else ''), # PG + 'docappendixbreak': ('1' if page_break == 'appendix' else ''), # PG +} +# Filter out any missing or empty items +doc_terms = dict((k,v) for k,v in doc_terms.items() if v is not None and v != '') +# Add any extra terms from the template +for fd in template_info.get('terms', {}).items(): + doc_terms[fd[0]] = fd[1].format(**doc_terms) +# Add any formatted terms from the template +for fd in template_info.get('formatted_terms', {}).items(): + tag = fd[0] + data = fd[1] + doc_terms[tag] = f':{tag}:`{data}`'.format(**doc_terms) + +logo_file = template_info['logo_file'] + +# -- psa-api-tool extension configuration -------------------------------------- + +primary_domain = 'psa_c' + +psa_api_license = doc_info.get('license', 'missing') + +psa_api_c_header = doc_info.get('header', filename) + +psa_api_retval_order = doc_info.get('error_order',[]) + +psa_api_header_doxygen = doc_info.get('header_doxygen', 0) + +psa_api_front_sections = template_info.get('front_sections',[]) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.todo', + 'sphinx.ext.graphviz', + 'psa-api-tool' +] + +try: + if importlib.util.find_spec('sphinxext.opengraph') is not None: + # Configuration for opengraph metadata + ogp_site_url = '{{ site.url }}/' + ogp_site_name = '{} {}'.format(fulltitle, version) + extensions.append('sphinxext.opengraph') +except ModuleNotFoundError: + pass + +# Add any paths that contain templates here, relative to this directory. +templates_path = [os.path.join(psa_api_template_path,'sphinx-templates')] + +# The suffix(es) of source filenames. +source_suffix = {'.rst': 'restructuredtext'} + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +#language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +#exclude_patterns = [] + +# Custom roles for specifications +roles = ['sc', 'issue'] + [k for k in template_info.get('formatted_terms',{})] +# Additional common substitutions +terms = { + 'impdef': ':sc:`implementation defined`', + } + +prolog = ['.. |br| raw:: html','',' <br />'] +prolog += ['.. role:: {}'.format(r) for r in roles] +prolog += ['.. |{}| replace:: {}'.format(k, v) for k,v in terms.items()] +prolog += ['.. |{}| replace:: {}'.format(k, subst_rst(v)) for k,v in doc_terms.items()] +prolog += ['.. include:: {}'.format(fn) for fn in doc_info.get('prolog_files',[])] +if watermark: + prolog += ['.. only:: html','',' .. container:: watermark','',' |docwatermark|',''] +rst_prolog = '\n'.join(prolog) + '\n\n' + +# The reST default role (used for this markup: `text`) to use for all +# documents. +default_role = 'any' + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, keep warnings as "system message" paragraphs in the built documents. +keep_warnings = True + +# Use a 'todo' in the include_content to indicate if TODOs are processed +todo_include_todos = ('todo' in include_content) + +# Hide the source file name in the 'todolist' +todo_link_only = True + +highlight_language = 'none' + +# Number figures and tables, using the whole document scope +numfig = True +numfig_secnum_depth = template_info.get('numfig_sec_depth', 0) +numfig_format = { + 'figure': 'Figure %s', + 'table': 'Table %s', + 'code-block': 'Listing %s', + 'section': '§%s' +} + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = template_info.get('html_theme', 'alabaster') + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +html_theme_options = { + 'fixed_sidebar': True, +} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. +html_title = '{} {}'.format(fulltitle, version) + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +html_logo = os.path.join(psa_api_template_path,logo_file+'.svg') + +html_css_files = template_info['html_css_files'] + +# The name of an image file (relative to this directory) to use as a favicon of +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = [os.path.join(psa_api_template_path, 'html-static')] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +html_sidebars = { + '**': ['toc.html', 'indextoc.html', 'searchbox.html'], +} + +# A dictionary of values to pass into the template engine’s context for all +# pages. +html_context = doc_terms + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +html_domain_indices = c_index +if not c_index: + html_sidebars['**'].remove('indextoc.html') + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, the reST sources are included in the HTML build as _sources/name. +html_copy_source = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +html_show_sphinx = False + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a <link> tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr' +#html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# Now only 'ja' uses this config value +#html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +#html_search_scorer = 'scorer.js' + +# Suffix for section numbers in HTML output. This removes trailing '.' +html_secnumber_suffix = ' ' + +# -- Options for LaTeX output --------------------------------------------- + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, filename+'.tex', fulltitle, author, 'manual'), +] + +# Appendices are indicated in PSA API specifications using the .. appendix:: toctree +latex_appendices = [] + +latex_additional_files = [os.path.join(psa_api_template_path, 'psa-api-tool.sty')] +if 'latex_files' in template_info: + latex_additional_files += [os.path.join(psa_api_template_path, f) for f in template_info['latex_files']] + +# Construct the latex preamble +# Define all the project info used for the title page and footer +latex_preamble = ['\\def\\{}{{{}}}'.format(k,subst_latex(v)).replace('&','\\&') for k,v in doc_terms.items()] +# Include the PSA API-specific styling and content +latex_preamble += [r'\input{psa-api-tool.sty}'] +# Improve all the code blocks if sphinx version supports it +latex_preamble += [r'\useverbatimfortt'] + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). + 'papersize': 'a4paper', + 'maketitle': r'',#r'\psamaketitle', + 'tableofcontents': r'', + +# The font size ('10pt', '11pt' or '12pt'). + 'pointsize': template_info['latex_pointsize'], + +# font package: use the fonts specified in the template info, this should include any necessary \usepackage commands + 'fontpkg': '\n'.join(template_info['latex_fonts']), + +# Include the PAS API specification definitions and preamble. + 'preamble': '\n'.join(latex_preamble), + +# Latex figure (float) alignment + 'figure_align': '!ht', + +# Other configuration + 'sphinxsetup': ','.join(template_info['latex_sphinxsetup']), + +# Fix issue with mismatched flags when including textcomp package +# See https://github.com/sphinx-doc/sphinx/issues/4727#issuecomment-372096951 +# Underlying issue is fixed in Sphinx 1.7.2, but this is harmless + 'passoptionstopackages': ''' +\\PassOptionsToPackage{warn}{textcomp} +\\PassOptionsToPackage{linktocpage=true}{hyperref} +''', + +# remove blank pages between chapters + 'extraclassoptions': 'openany,oneside', + +# Keep the chapter titles simple + 'fncychap': '', +} + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +latex_logo = os.path.join(psa_api_template_path, logo_file+'.pdf') + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# If false, no module index is generated. +latex_domain_indices = c_index + +# Set the standard table format for specifications. Individual tables can override +latex_table_style = template_info['latex_table_style'] + +#-- Options for graphviz extension ---------------------------------------- + +# Use SVG for html output, not PNG +graphviz_output_format = 'svg' + +# Set the font used for graphviz diagrams +graphviz_dot_args = template_info['graphviz_dot_args'] + +#-- Options for mathjax --------------------------------------------------- + +mathjax3_config = template_info['mathjax3_config'] diff --git a/tools/psa-api-tool.py b/tools/psa-api-tool.py new file mode 100644 index 00000000..f1f6237e --- /dev/null +++ b/tools/psa-api-tool.py @@ -0,0 +1,2628 @@ +# SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +# SPDX-License-Identifier: Apache-2.0 + +import os.path +import re +import string +import textwrap +from collections import namedtuple +from operator import attrgetter +from typing import cast + +import sphinx.builders +import sphinx.directives.code +import sphinx.domains +import sphinx.environment +from docutils import nodes +from docutils.parsers.rst import directives +from sphinx import addnodes +from sphinx.directives.other import Include, TocTree +from docutils.parsers.rst.directives.tables import RSTTable +from sphinx.roles import XRefRole +from sphinx.util.nodes import make_refnode +from sphinx.util.docutils import SphinxRole, SphinxDirective +from sphinx.util.docutils import new_document + +logger = sphinx.util.logging.getLogger(__name__) + +def clean_dir(path): + # Remove all files at the path and in subdirectories + # Does not delete the directories themselves + for the_file in os.listdir(path): + file_path = os.path.join(path, the_file) + if os.path.isfile(file_path): + os.unlink(file_path) + elif os.path.isdir(file_path): + clean_dir(file_path) + +_nested_parentheses_rs = r'(?:[^()]|\((?:[^()]|\([^()]*\))*\))*' +_nested_parentheses_re = re.compile(r'\s*\(({})\)\Z' + .format(_nested_parentheses_rs)) +def c_name_from_prototype(prototype): + """Parse a C prototype and extract the name that it defines. + + This function supports most prototypes, but has a few limitations. + The following features of the C language are not supported: + * More than 3 levels of nested parentheses. + * Arrays. + * Functions or function pointers returning a function or function pointer. + """ + # Strip optional leading "typedef" and trailing ";" + prototype = re.sub(r'\s*;?\s*\Z', r'', prototype) + prototype = re.sub(r'\A\s*(?:typedef)?\s*', r'', prototype) + m = re.search(_nested_parentheses_re, prototype) + if m: + prototype = prototype[:m.start()] + m = re.search(_nested_parentheses_re, prototype) + if m: + prototype = m.group(1) + # Remove array subscript, or bitfield size + m = re.search(r'(\w+)(?:\[.*\]|\s*:\s*\d+)?\Z', prototype) + return m.group(1) + +def nodes_text(nodes): + return ''.join(n.astext() for n in nodes) + +def autolinking_literal(text, element = nodes.literal): + """Literal text with weak references. + + Return a list of inline nodes that together form ``text``. + Isolate each C identifier (or keyword) in ``text`` as its own node, + and make those nodes a weak reference. + + By default use nodes.literal for each element, but allow the caller + to provide an alternate node constructor as ``element``. + """ + parts = [] + cursor = 0 + for m in re.finditer(r'(0[xX][0-9A-Fa-f]*)|([A-Z_a-z][0-9A-Z_a-z]*)|(/\*.*?(?:\*/))|(/\*(?:.|\n|\r\n?)*?(?:\*/)|//.*?$)', text, re.M): + item = m[0] + if m[1]: + continue + elif m[2]: + # An identifier + xref = sphinx.addnodes.pending_xref(rawsource=item, + reftype='weak', + refdomain='psa_c', + reftarget=item) + xref += element(text=item) + elif m[3]: + # A special comment element in the prototype + # Convert to a possible hyperlink if the text of the comment + # is a link target + word = re.sub(r'[ _:;,-.+=#~\/!?*]+','-',item[3:-3]).lower() + rf = sphinx.addnodes.pending_xref(rawsource=word, + reftype='ref', + refdomain='std', + refexplicit=True, + reftarget=word) + rf += element(text=item) + xref = nodes.emphasis() + xref += rf + elif m[4]: + # A regular C comment + xref = nodes.emphasis(text=item) + if cursor < m.start(): + parts.append(element(text=text[cursor:m.start()])) + parts.append(xref) + cursor = m.end() + if cursor < len(text): + parts.append(element(text=text[cursor:])) + return parts + +def autolinking_literal_block(text): + """Literal text block with weak references. + + Return a nodes.literal_block containing auto-linked text. + """ + + # When a literal node is contained within a literal_block node, some + # output formats compose the two formats and result in a messy rendering. + # + # As this is already formatted as a literal_block, we only need to use + # Text blocks for the individual pieces of auto-linked text. + def text_element(text): + return nodes.Text(text) + + # Providing an explicit rawsource that is distinct from the content + # causes the highlighter to bail out and preserve the auto-linking xrefs + # + # The meaningless '<psa-autolink>' is used for this purpose, so that if the + # rawsource is used for debugging, it can still be identified in the + # source document. + block = nodes.literal_block( + rawsource="<psa-autolink>" + text + '</psa-autolink>', + language = "none") + block += autolinking_literal(text, element=text_element) + return block + +def role_autolink(name, rawtext, text, lineno, inliner, + options={}, content=[]): + return autolinking_literal(text), [] + +class PSACodeBlock(sphinx.directives.code.CodeBlock, SphinxDirective): + required_arguments = 0 # Override in case of using Sphinx <2.0 + optional_arguments = 1 # Override in case of using Sphinx <2.0 + + def run(self): + if not self.arguments or self.arguments[0] != 'xref': + # A standard sphinx code-block:: + return super().run() + + code = self.content.data + if 'linenos' in self.options or 'lineno-start' in self.options: + start = self.options.get('lineno-start',1) + nlines = len(code) + just = len(str(start + nlines -1)) + numbers = [str(start + n).rjust(just) for n in range(0, nlines)] + code = [l+' '+r for l,r in zip(numbers,code)] + return [autolinking_literal_block('\n'.join(code))] + +class PSACodeBlockInclude(sphinx.directives.code.LiteralInclude, SphinxDirective): + def run(self): + if 'language' not in self.options or self.options['language'] != 'xref': + # A standard sphinx literal-include:: + return super().run() + + # Use the literalinclude reader to implement the filtering options + + document = self.state.document + if not document.settings.file_insertion_enabled: + return [document.reporter.warning('File insertion disabled', + line=self.lineno)] + # convert options['diff'] to absolute path + if 'diff' in self.options: + raise ValueError('Cannot use "diff" option with "xref" language') + + try: + location = self.state_machine.get_source_and_line(self.lineno) + rel_filename, filename = self.env.relfn2path(self.arguments[0]) + self.env.note_dependency(rel_filename) + + reader = sphinx.directives.code.LiteralIncludeReader(filename, self.options, self.config) + text, lines = reader.read(location=location) + text = text.strip() + + if 'linenos' in self.options or 'lineno-start' in self.options: + code = text.split('\n') + start = reader.lineno_start + nlines = len(code) + just = len(str(start + nlines -1)) + numbers = [str(start + n).rjust(just) for n in range(0, nlines)] + code = [l+' '+r for l,r in zip(numbers,code)] + text = '\n'.join(code) + return [autolinking_literal_block(text)] + except Exception as exc: + return [document.reporter.warning(exc, line=self.lineno)] + + +# some raw latex nodes for document control + +def latexnode(latex, directive=None): + raw_node = nodes.raw('', text=latex, format = 'latex') + if directive: + raw_node.source, raw_node.line = directive.state_machine.get_source_and_line(directive.lineno) + return raw_node + +def latexnewpage(directive): + return latexnode(r'\clearpage', directive) + +def latexpageref(id, directive = None): + return latexnode('\\psapageref{{{}}}'.format(id), directive) + + +# .. rationale:: directive for Information blocks that only appear if the 'include_rationale' +# tag is defined. + +class Rationale(SphinxDirective): + optional_arguments = 1 + final_argument_whitespace = True # used if derived class take an argument + has_content = True + + def run(self): + # build an internal only box using the rationale class/environment + # If provided, the argument is the title, otherwise "Rationale" is used + if not self.arguments: + self.arguments = ['Rationale'] + title, m = self.state.inline_text('\n'.join(self.arguments), self.lineno) + titlebold = nodes.strong() + titlebold += title + titlenode = nodes.paragraph() + titlenode['classes'] += ['admonition-title'] + titlenode += titlebold + content = nodes.container(classes = ['rationale','admonition']) + content += titlenode + content += m + self.state.nested_parse(self.content, self.content_offset, content) + # now wrap this in an ``.. only:: include_rationale`` node + only = sphinx.addnodes.only(expr = 'include_rationale') + only += content + return [only] + +# .. comment:: directive for Information blocks that only appear if the 'include_comment' +# tag is defined. + +class Comment(SphinxDirective): +# optional_arguments = 1 +# final_argument_whitespace = True # used if derived class take an argument + has_content = True + + def run(self): + # build an internal only box using the comment class/environment + title, m = self.state.inline_text('Commentary', self.lineno) + titlebold = nodes.strong() + titlebold += title + titlenode = nodes.paragraph() + titlenode['classes'] += ['admonition-title'] + titlenode += titlebold + content = nodes.container(classes = ['comment','admonition']) + content += titlenode + content += m + self.state.nested_parse(self.content, self.content_offset, content) + # now wrap this in an ``.. only:: include_comment`` node + only = sphinx.addnodes.only(expr = 'include_comment') + only += content + return [only] + +# directives for main document templating and control + +class TemplateImage(directives.images.Image, SphinxDirective): + def run(self): + # locate image relative to the template directory, not the doc source + file = os.path.join(self.config.psa_api_template_path,self.arguments[0]) + # The image:: directive takes a URI, so need to replace OS + # path separators with URI path separators + self.arguments[0] = os.path.normpath(file).replace(os.path.sep, '/') + return super().run() + +class TitlePage(SphinxDirective): + """ The title page directive is the first thing in the main index file + If it has content, this is taken to be the abstract for the document + """ + required_arguments = 0 + has_content = True + option_spec = {} + + def stash_abstract(self, content): + item = { + 'content': content, + 'replace': True, + } + errors = [] + sections = self.env.domaindata['psa_c']['front-matter'] + if 'abstract' in sections: + e = 'Duplicate directive "{}". Also defined in {}.'.format( + 'abstract', sections['abstract'][0]) + errors.append(self.state_machine.reporter.warning(e, line = self.lineno)) + sections['abstract'] = (self.env.docname, item) + return errors + + def run(self): + messages = [] + source = self.state.document.current_source or self.get_source_info()[0] or '' + if self.content: + content = nodes.Element() + self.state.nested_parse(self.content, self.content_offset, content) + system_messages = [n for n in content.children if isinstance(n, nodes.system_message)] + abstract = [n for n in content.children if not isinstance(n, nodes.system_message)] + messages += system_messages + if abstract and 'abstract' in self.config.psa_api_front_sections: + messages += self.stash_abstract(abstract) + title_path = os.path.join(os.sep,self.config.psa_api_template_path,'title-page.rst') + lines = ['.. include:: ' + title_path] + self.state_machine.insert_input(lines, source) + return messages + +class PSATocTree(TocTree): + option_spec = { + 'numbered': directives.nonnegative_int, + 'maxdepth': directives.nonnegative_int, + } + + def run(self): + if self.html_numbered: + num = self.options.setdefault('numbered', self.default_numbered) + else: + num = self.options.pop('numbered', self.default_numbered) + self.options.setdefault('maxdepth', self.default_maxdepth) + numfig_depth = self.env.config.numfig_secnum_depth + fig_prefix = '' + if numfig_depth == 1: + fig_prefix = '\\thechapter-' + elif numfig_depth == 2: + fig_prefix = '\\thesection-' + prefix = [latexnode('\\psa{}{{{}}}{{{}}}'.format(self.kind, num-1, fig_prefix), self)] + toc = super().run() + if self.html_numbered and self.alpha_numbers: + toc[0][0]['alpha_numbers'] = True + return prefix + toc + +class FrontMatter(PSATocTree): + default_numbered = 0 + html_numbered = False # Do not number this in HTML formats, as is not sequential + default_maxdepth = 2 + kind = 'frontmatter' + +class MainToc(PSATocTree): + default_numbered = 3 + html_numbered = True + alpha_numbers = False + default_maxdepth = 3 + kind = 'main' + +class Appendix(PSATocTree): + default_numbered = 3 + html_numbered = True + alpha_numbers = True + default_maxdepth = 3 + kind = 'appendix' + +class About(Include, SphinxDirective): + required_arguments = 0 + final_argument_whitespace = False + option_spec = {} + + def run(self): + self.arguments = [os.path.join(os.sep,self.config.psa_api_template_path,'about-chapter.rst')] + return super().run() + +class IncludeLicense(Include, SphinxDirective): + required_arguments = 0 + final_argument_whitespace = False + option_spec = {} + + def run(self): + license_path = os.path.join(os.sep,self.config.psa_api_tool_path,'license') + license = self.config.psa_api_license + rel_filename, filename = self.env.relfn2path(license) + if not os.path.isfile(filename): + rel_filename = os.path.join(license_path,license.lower().replace('-','_')+'.rst') + _, filename = self.env.relfn2path(rel_filename) + error = [] + if not os.path.isfile(filename): + rel_filename = os.path.join(license_path,'missing.rst') + error = [self.state_machine.reporter.error( + 'Invalid or unknown license name/identifier "{}".'.format(license), + line=self.lineno)] + self.arguments = [rel_filename] + return super().run() + error + +class Collector(SphinxDirective): + """ Collect structured data + options are used for inlinable entries, and content is permitted for + one multi-line item. + When run this data is parsed and the dictionary is added to the + domain data under a key named after the collector. + Only one instance of each collected item allowed in the source + """ + final_argument_whitespace = True # used if derived class take an argument + content_as = 'content' + unparsed_options = () + + def stash(self, item): + error = None + name = self.name.split(":")[-1] + sections = self.env.domaindata['psa_c']['front-matter'] + if name in sections: + e = 'Duplicate directive "{}". Also defined in {}.'.format( + name, sections[name][0]) + error = self.state_machine.reporter.warning(e, line = self.lineno) + sections[name] = (self.env.docname, item) + return error + + def run(self): + data = {} + messages = [] + if len(self.arguments) > 0: + data[self.argument_as], m = self.state.inline_text('\n'.join(self.arguments), self.lineno) + messages += m + for k, v in self.options.items(): + if v is None: + data[k] = True + elif k in self.unparsed_options: + data[k] = v + else: + data[k], m = self.state.inline_text(v, self.lineno) + messages += m + if self.has_content: + content = nodes.Element() + self.state.nested_parse(self.content, self.content_offset, content) + data[self.content_as] = content.children + error = self.stash(data) + if error: + messages[0:0] = error + return messages + +class KeyedCollector(Collector): + """ Collected data is stashed in a dictionary instead of a list. + The data dictionary name is taken from the directive name. + Derived classes can specify a different attribute to use as + the key with id_key. + By default a unique seq number is used as the dictionary key + """ + id_key = None # attribute used as a key + + def stash(self, item): + name = self.name.split(":")[-1] + if self.id_key: + key = canonical_rfc(nodes_text(item[self.id_key])).lower() + item['id'] = nodes.make_id(self.id_key +'-' + key) + else: + # Use a unique key based on source document and line + key = '{}.{}'.format(self.env.docname, self.lineno) + + error = None + data = self.env.domaindata['psa_c'][self.id_key or name] + if key in data: + e = 'Duplicate item "{}" for directive "{}". Also defined in {}.'.format( + key, name, data[key][0]) + error = self.state_machine.reporter.warning(e, line = self.lineno) + data[key] = (self.env.docname, item) + return error + +def option_choice(option, values): + def option_check(argument): + if argument in values: + return argument + raise ValueError(':{}: must be one of ({}).'.format(option, ', '.join(values))) + return option_check + +class FrontSection(Collector): + option_spec = { + 'extend': directives.flag, + 'replace': directives.flag, + 'hide': directives.flag + } + has_content = True + + sections = [] + + @classmethod + def add_directives(cls, app): + cls.sections[0:0] = app.config.psa_api_front_sections + for sect in cls.sections: + app.add_directive(sect, cls) + + def stash(self, item): + name = self.name.split(":")[-1] + errors = [] + n = sum([1 for o in self.option_spec.keys() if o in item]) + if n == 0: + # no option provided + if not item['content']: + # No option provided, and no content. Treat as :hide: + item['hide'] = True + e = 'Empty directive "{}", treating as requesting :hide: option.'.format(name) + errors.append(self.state_machine.reporter.warning(e, line = self.lineno)) + else: + # default to replace + item['replace'] = True + elif n > 1: + e = 'Only specify one of the options (:' + e += ':, :'.join(self.option_spec.keys()) + e += ':) for directive "{}".'.format(name) + errors.append(self.state_machine.reporter.error(e, line = self.lineno)) + + error = super().stash(item) + if error: + errors.append(error) + return errors + + +class InsertFrontSection(SphinxDirective): + """ The argument is the section title + The section id to insert must be provided by the :section: option + The default section content follows. + + If the section is excluded by doc_info, then drop the section. + + If content is provided in the domain data, this replaces the default + content, unless the :extend: flag was set, when it is appended to the + default content. + + If the :break-after: flag is set a page break is made after the section. + + The :class: option wraps all the content in the specified class/environment. + + The :not-in-toc: flag will format this like a section title and content, + but does not use a proper section node and does not result in a TOC entry. + """ + required_arguments = 0 + optional_arguments = 1 # The heading for the section + final_argument_whitespace = True + option_spec = { + 'section': directives.unchanged_required, + 'break-after': directives.flag, + 'class': directives.class_option, + 'not-in-toc': directives.flag, + 'keep-if-empty': directives.flag, + } + has_content = True + + def new_section(self, raw, title): + # Create the container, either a true section or a holding List + # + textnodes, messages = self.state.inline_text(title, self.lineno) + if 'not-in-toc' in self.options: + # use a styled paragraph for the title + i = nodes.inline(title, '', classes = ['sectiontitle']) + i += textnodes + p = nodes.paragraph(title, '') + p += i + n = nodes.Element() + n += p + return n + else: + # Adapted from docutils new_subsection() + section_node = nodes.section(raw_source=raw) + titlenode = nodes.title(title, '', *textnodes) + name = nodes.fully_normalize_name(titlenode.astext()) + section_node['names'].append(name) + section_node += titlenode + section_node += messages + section_node.document = self.state.document + self.state.document.note_implicit_target(section_node, section_node) + return section_node + + def run(self): + result = [] + + name = self.options.get('section') + if name and name not in FrontSection.sections: + result.append(self.state_machine.reporter.error( + 'Section "{}" not recognised for "insert-section::".'.format(name), + line = self.lineno)) + + _, item = self.env.domaindata['psa_c']['front-matter'].get(name, (None, {})) + + if item.get('hide'): + if not 'keep-if-empty' in self.options: + # Hide this section + return result + # Cannot hide a keep-if-empty section + result.append(self.state_machine.reporter.warning( + 'Cannot :hide: mandatory front section "{}".'.format(name), + line = self.lineno)) + + content = nodes.Element() + if not item.get('replace'): + self.state.nested_parse(self.content, self.content_offset, content) + if item.get('replace') or item.get('extend'): + content += item.get('content', []) + content = content.children + + if not content and not 'keep-if-empty' in self.options: + # Section is empty. Do not include it + return result + + if len(self.arguments) == 0: + self.options['not-in-toc'] = True + section_node = nodes.Element() + else: + section_node = self.new_section('\n'.join(self.content), self.arguments[0]) + + if 'class' in self.options: + section_node += nodes.container(nodes_text(content), + classes = self.options['class'], + *content) + else: + section_node += content + + if 'break-after' in self.options: + section_node.append(latexnewpage(self)) + + if 'not-in-toc' in self.options: + result.extend(section_node.children) + else: + result.append(section_node) + return result + +def resolve_references(node, docname, app): + # helper to resolve references in nodes created during deferred processing + document = new_document('') + document += node + app.env.resolve_references(document, docname, app.builder) + document.remove(node) + return node + +# .. banner:: and .. insert-banner:: directive for a title-page Information block +# that only appears if the 'include_banner' tag is defined. + +class banner(nodes.General, nodes.Element): + pass + +class Banner(Collector): + has_content = True + +class InsertBanner(SphinxDirective): + def run(self): + return [banner('')] + +def process_banner_nodes(app, doctree, docname): + _, data = app.env.domaindata['psa_c']['front-matter'].get('banner', (None,{})) + for node in doctree.traverse(banner): + if not app.builder.tags.has('include_banner') or not data.get('content'): + node.parent.remove(node) + continue + + banner_node = nodes.container(classes = ['banner','admonition']) + banner_node += data['content'] + banner_node = resolve_references(banner_node.deepcopy(), docname, app) + # build a box using the banner class/environment + node.replace_self(banner_node) + +class itemgetterornone: + def __init__(self, item): + self.item = item + + def __call__(self, obj): + return obj.get(self.item) + +class InsertTable(RSTTable, SphinxDirective): + # Base class that will consume data from Collector directives + option_spec = { + 'class': directives.class_option, + 'name': directives.unchanged_required, + } + optional_arguments = 1 + final_argument_whitespace = True + + def build_table(self, data, widths, keys=None, headers=None): + # Build a table node and preceeding colspec from the data of dictionary + # rows, given the structure defined. + # Either Headers or keys have to be provided to interpret the dictionary + # as columns. + # If no keys are provided, the headers are used lower-case as keys. + # Keys can either be strings, used directly in the dictionary, or callable + # functions that are invoked on the dictionary. + # Widths must match the number of columns in the headers/Keys + # + assert(keys or headers) + + keys = keys or [h.lower() for h in headers] + ncols = len(keys) + keys = [itemgetterornone(k) if isinstance(k, str) else k for k in keys] + + assert(widths and len(widths) == ncols) + assert(not headers or len(headers) == ncols) + + title_node, _ = self.make_title() + + table = nodes.table('', classes = self.options.get('class',[])) + self.set_source_info(table) + self.add_name(table) + if title_node: + table += title_node + + tgroup = nodes.tgroup(cols=ncols) + table += tgroup + table['classes'].append('colwidths-given') + for width in (widths): + tgroup += nodes.colspec(colwidth=width) + + if headers: + row = nodes.row() + for t in headers: + col = nodes.entry(t, nodes.paragraph(t, nodes.Text(t,t))) + row += col + thead = nodes.thead('', row) + tgroup += thead + + tbody = nodes.tbody() + for r in data: + row = nodes.row() + for k in keys: + v = k(r) + col = nodes.entry() + if v is not None: + if len(v) and isinstance(v[0], nodes.Text): # workaround early sphinx issue + v = nodes.paragraph(nodes_text(v), *v) + col += v + row += col + r['targetdoc'] = self.env.docname + tbody += row + tgroup += tbody + + return [table] if len(tbody) else [] + +class Release(KeyedCollector): + # Capture the information for a single document release, which is + # collated into the Release Information table + # + option_spec = { + 'date': directives.unchanged, + 'confidentiality': option_choice("confidentiality", ("Confidential", "Non-confidential")), + } + optional_arguments = 1 + argument_as = 'version' + content_as = 'change' + has_content = True + +class ReleaseTable(InsertTable): + def run(self): + self.options['class'] = ['longtable'] # splits over pages better if section is not in its own page + + data = (release for _, release in self.env.domaindata['psa_c']['release'].values()) + return self.build_table(data, + headers = ('Date', 'Version', 'Change'), + widths = (4,3,13) + ) + +reference_kinds = ("normative", "informative") + +def canonical_rfc(text): + m = re.match(r'\ARFC([1-9][0-9]*)\Z', text, flags = re.I) + if m: + text = 'RFC ' + m.group(1) + return text + + +class Reference(KeyedCollector): + # Capture the information for a single referenced document, which is + # collated into the References table, and can be referred via the + # :cite: and :cite-ref: roles. + option_spec = { + 'doc_no': directives.unchanged_required, # legacy alias for doc_id + 'doc_id': directives.unchanged_required, + 'author': directives.unchanged_required, + 'title': directives.unchanged_required, + 'publication': directives.unchanged_required, + 'url': directives.uri, + 'kind': option_choice("kind", reference_kinds), + } + required_arguments = 1 + argument_as = 'cite' + has_content = False + id_key = 'cite' + unparsed_options = ('kind',) + default_kind = 'normative' + + def stash(self, item): + errors = [] + # Move legacy 'doc_no' option to the current 'doc_id', without overriding + if 'doc_no' in item: + doc_no = item.pop('doc_no') + if 'doc_id' in item: + e = "Both 'doc_id' and 'doc_no' specified, ignoring 'doc_no'" + errors.append(self.state_machine.reporter.warning(e, line = self.lineno)) + else: + item['doc_id'] = doc_no + item.setdefault('kind', self.default_kind) + error = super().stash(item) + if error: + errors.append(error) + return errors + +class ReferenceTable(InsertTable): + option_spec = InsertTable.option_spec.copy() + option_spec['filter'] = option_choice("filter", ("arm", "non-arm", "with-id", "without-id", "none")) + option_spec['kind'] = option_choice("kind", reference_kinds + ("all",)) + option_spec['layout'] = option_choice("layout", ("by-ref", "by-id")) + option_spec['sorted'] = directives.flag + + @staticmethod + def resolve_ref(env, ref): + # Called during Xref resolution. The Reference table has already been inserted + # so the target document for the citation is known + data = env.domaindata['psa_c']['cite'] + if ref not in data: + return '', '', '' + _, item = data[ref] + return item.get('targetdoc',''), item['id'], item.get('title','') + + @staticmethod + def make_reference_target(reference): + para = nodes.paragraph() + para += nodes.target('', ids = [reference['id']]) + para += nodes.Text('[{}]'.format(nodes_text(reference['cite']))) + return para + + @staticmethod + def make_reference_content(reference): + para = nodes.paragraph() + if 'title' in reference: + if 'author' in reference: + para += reference['author'] + para += nodes.Text(', ') + para += nodes.emphasis('',*reference['title']) + if 'publication' in reference: + para += nodes.Text(', ') + para += reference['publication'] + para += nodes.Text('. ') + if 'url' in reference: + ref = reference['url'][0] + if not isinstance(ref, nodes.reference): + ref = nodes.reference(text=ref, refuri='https://' + ref) + para += [ref] + return para + + @staticmethod + def make_id_reference_specification(reference): + para = nodes.paragraph() + para += reference.get('doc_id', reference['cite']) + return para + + keys3 = [make_reference_target.__func__, 'doc_id', make_reference_content.__func__] + keys2 = [make_reference_target.__func__, make_reference_content.__func__] + keys_by_id = [make_id_reference_specification.__func__, + make_reference_content.__func__, + make_reference_target.__func__] + + def run(self): + self.options['class'] = ['longtable'] # tabulary formats targetted cells badly + + layout = self.options.get('layout', 'by-ref') + if layout == 'by-id': + keys = self.keys_by_id + headers = ['Standard / Specification', 'Description', 'Ref'] + widths = (6,14,4) + else: + keys = self.keys3 + headers = ['Ref', 'Document Number', 'Title'] + widths = (4,4,13) + + filter = self.options.get('filter','none') + if filter == 'arm': + filter = 'with-id' + elif filter == 'non-arm': + filter = 'without-id' + if layout == 'by-ref' and filter == 'without-id': + keys = self.keys2 + headers.pop(1) + widths = (widths[0],sum(widths[1:])) + + kind = self.options.get('kind', 'all') + data = self.env.domaindata['psa_c']['cite'] + def data_iter(): + ids = data.keys() + if 'sorted' in self.options: + ids = sorted(ids) + + for id in ids: + _, item = data[id] + if filter == 'with-id' and not 'doc_id' in item: + continue + if filter == 'without-id' and 'doc_id' in item: + continue + if kind != 'all' and kind != item['kind']: + continue + yield item + + return self.build_table(data_iter(), + headers = headers, + widths = widths, + keys = keys + ) + +def role_cite(name, rawtext, text, lineno, inliner, + options={}, content=[]): + target = text.lower() + ref = sphinx.addnodes.pending_xref(rawsource = rawtext, + refdomain = 'psa_c', + reftype = name, + reftarget = target, + refwarn = True, + support_smartquotes=False + ) + ref += nodes.inline(text, '[{}]'.format(text)) + return [ref], [] + +class Term(KeyedCollector): + # Capture the information for a single glossary term + # + option_spec = { + 'abbr': directives.unchanged_required, + } + required_arguments = 1 + final_argument_whitespace = True + argument_as = 'term' + has_content = True + content_as = 'definition' + id_key = 'term' + + def stash(self, item): + typ = self.name.split(':')[-1] + cls = ['sc'] if typ == 'scterm' else [] + item['cls'] = cls + a_error = None + if typ == 'abbr': + item['isabbr'] = True + elif 'abbr' in item: + # Add extra term for the abbreviation + term = nodes_text(item['term']) + defn = nodes.paragraph(':{}:`{}`'.format(typ, term)) + defn += role_term(typ, ':{}:`{}`'.format(typ, term), term, 0, None)[0] + dabbr = {'term': item['abbr'], 'definition' : [defn], 'cls' : cls, 'isabbr': True } + a_error = super().stash(dabbr) + t_error = super().stash(item) + if not t_error: + return a_error + elif not a_error: + return t_error + else: + return [t_error, a_error] + +term_kinds = ("terms", "abbreviations") + +class TermTable(InsertTable): + option_spec = InsertTable.option_spec.copy() + option_spec['sorted'] = directives.flag + option_spec['kind'] = option_choice("kind", term_kinds + ("all",)) + + @staticmethod + def resolve_ref(env, ref): + # Called during Xref resolution. The Term table has already been inserted + # so the target document for the citation is known + data = env.domaindata['psa_c']['term'] + if ref not in data: + return '', '' + _, item = data[ref] + return item.get('targetdoc',''), item['id'] + + @staticmethod + def make_term_target(term): + para = nodes.paragraph() + para += nodes.target('', ids = [term['id']]) + tnode = nodes.inline(nodes_text(term['term']), classes = term['cls'], *term['term']) + if 'abbr' in term: + tnode += nodes.Text(' (') + tnode += term['abbr'] + tnode += nodes.Text(')') + para += tnode + return para + + keys = [make_term_target.__func__, 'definition'] + + def run(self): + self.options['class'] = ['longtable'] # tabulary formats targetted cells badly + + kind = self.options.get('kind', 'all') + if kind == 'abbreviations': + headers = ('Abbreviation','Meaning') + else: + headers = ('Term','Definition') + + data = self.env.domaindata['psa_c']['term'] + def data_iter(): + ids = data.keys() + if 'sorted' in self.options: + ids = sorted(ids) + + for id in ids: + _, item = data[id] + if kind == 'terms' and 'isabbr' in item: + continue + if kind == 'abbreviations' and not 'isabbr' in item: + continue + yield item + + return self.build_table(data_iter(), + headers = headers, + widths = (1,3), + keys = self.keys + ) + +def role_term(name, rawtext, text, lineno, inliner, + options={}, content=[]): + target = text.lower() + ref = sphinx.addnodes.pending_xref(rawsource = rawtext, + refdomain = 'psa_c', + reftype = name, + reftarget = target, + refwarn = True, + support_smartquotes=False + ) + ref += nodes.inline(text, text) + return [ref], [] + +ref_role = XRefRole(warn_dangling=True, innernodeclass = nodes.inline) + +def role_secref(name, rawtext, text, lineno, inliner, + options={}, content=[]): + return ref_role('psa_c:secref', rawtext, text, lineno, inliner, options, content) + +def role_numref(name, rawtext, text, lineno, inliner, + options={}, content=[]): + return ref_role('psa_c:numref', rawtext, text, lineno, inliner, options, content) + +def role_rfc(role, rawtext, text, lineno, inliner, options={}, content=[]): + # Link this into the citation/references scheme used by PSA template + # :rfc:`nnnn` -> :cite-title:`RFCnnnn` + # The cite-reference would link to an entry for the RFC in the References + # table. + # :rfc:`nnnn#x.y` -> :rfc:`nnnn` >§x.y< + # :rfc:`nnnn#Z` -> :rfc:`nnnn` >Appendix Z< + # The section/appendix link would be a hyperlink to the online copy of + # the RFC section/appendix + # + url_template = inliner.document.settings.rfc_base_url + inliner.rfc_url + m = re.match(r'\A(?P<num>[1-9][0-9]*)(?:#(?P<section>.*))?\Z', text) + if not m: + msg = inliner.reporter.error( + 'RFC number must be a number greater than or equal to 1; ' + f'"{text}" is invalid.', line=lineno) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + + rfc = m.group('num') + ret, _ = role_cite(role.lower().replace('rfc','cite'), rawtext, f'RFC {rfc}', lineno, inliner, **options) + + url = url_template % int(m.group('num')) + section = m.group('section') + if section: + ret.append(nodes.Text(' ')) + if section[0].isdigit(): + url += f'#section-{section}' + title = f'§{section}' + else: + url += f'#appendix-{section}' + title = f'Appendix {section}' + ret.append(nodes.reference(rawtext, title, refuri=url, **options)) + return ret, [] + +def role_url(name, rawtext, text, lineno, inliner, + options={}, content=[]): + target = text + if '//' not in target: + target = f'https://{target}' + ref = nodes.reference(rawtext, text=text, refuri = target) + return [ref], [] + +sra_elements = { + 'deployment-model': 'dm', + 'adversarial-model': 'am', + 'security-goal': 'sg', + 'threat': 't', + 'mitigation': 'm', +} + +def canonical_sra_id(typ, text): + typ = typ.split(':')[-1] + typ = sra_elements.get(typ, typ) + typ = typ.upper() + '.' + if text.upper().startswith(typ): + text = text[len(typ):] + return typ + text + +# role for SRA references +def role_sra_ref(name, rawtext, text, lineno, inliner, + options={}, content=[]): + text = canonical_sra_id(name, text) + ref = sphinx.addnodes.pending_xref(rawsource = rawtext, + refdomain = 'psa_c', + reftype = name, + reftarget = text, + refwarn = True, + support_smartquotes=False + ) + ref += nodes.inline(text, text) + return [ref], [] + +class SRADefinition(SphinxRole): + # role for SRA definitions + @staticmethod + def resolve_ref(env, ref): + # Called during Xref resolution. + # Return document, and definition label, or None if not present + return env.domaindata['psa_c']['sra'].get(ref, (None, None)) + + def run(self): + # canonicalise the text + text = canonical_sra_id(self.name, self.text) + key = nodes.make_id(text) + + data = self.env.domaindata['psa_c']['sra'] + error = [] + if key in data: + e = 'Duplicate SRA item "{}" for directive "{}". Also defined in {}.'.format( + text, self.name, data[key][0]) + error.append(self.inliner.reporter.warning(e, line = self.lineno)) + data[key] = (self.env.docname, text) + + node = [ + nodes.target('', ids = ['sra-' + key]), + nodes.inline(self.rawtext, text, classes=['sradef']) + ] + return node, error + +psa_roles = { + 'code': role_autolink, + 'cite': role_cite, + 'cite-title': role_cite, + 'term': role_term, + 'scterm': role_term, + 'rfc': role_rfc, + 'rfc-title': role_rfc, + 'secref': role_secref, + 'numref': role_numref, + 'url': role_url, + # SRA roles + 'deployment-model': SRADefinition(), + 'dm': role_sra_ref, + 'adversarial-model': SRADefinition(), + 'am': role_sra_ref, + 'security-goal': SRADefinition(), + 'sg': role_sra_ref, + 'threat': SRADefinition(), + 't': role_sra_ref, + 'mitigation': SRADefinition(), + 'm': role_sra_ref, +} +psa_directives = { + 'code-block': PSACodeBlock, + 'literalinclude': PSACodeBlockInclude, + 'rationale': Rationale, + 'comment': Comment, +} + +class ThreatData: + def __init__(self, DMs): + # set of deployment models specified in threat:: option + self.DMs = DMs + # Threat definition + self.data = {} + +class ThreatSubitem(SphinxDirective): + @property + def threat(self): + return self.env.domaindata['psa_threat']['local'] + + @property + def subitem(self): + return self.name.split(':')[-1] + +class ThreatElement(ThreatSubitem): + # Process a general element in a threat definition + has_content = True + + def run(self): + self.assert_has_content() + if self.subitem in self.threat.data: + raise self.warning('Directive "{}" already provided for this threat.'.format(self.subitem)) + container = nodes.Element() + self.state.nested_parse(self.content, self.content_offset, container) + self.threat.data[self.subitem] = container.children + return [] + +class ThreatRisk(ThreatSubitem): + # Process a risk element in a threat definition + optional_arguments = 1 + final_argument_whitespace = True + option_spec = { + 'impact': directives.unchanged_required, + 'likelihood': directives.unchanged_required, + 'risk': directives.unchanged + } + has_content = False + risk_abbr = {'VL': 'Very Low', 'L': 'Low', 'M': 'Medium', 'H': 'High', 'VH': 'Very High'} + risk_ix = {'Very Low': 0, 'Low': 1, 'Medium': 2, 'High': 3, 'Very High': 4} + risk_matrix = ( # by likelihood, then impact + ('Very Low' , 'Very Low' , 'Very Low' , 'Low' , 'Low' ), + ('Very Low' , 'Very Low' , 'Low' , 'Low' , 'Medium' ), + ('Very Low' , 'Low' , 'Medium' , 'Medium' , 'High' ), + ('Low' , 'Low' , 'Medium' , 'High' , 'Very High'), + ('Low' , 'Medium' , 'High' , 'Very High', 'Very High') + ) + + def parse_risk(self, risk): + risk = self.risk_abbr.get(risk, risk) + textnodes, messages = self.state.inline_text(risk, self.lineno) + p = nodes.paragraph(nodes_text(textnodes)) + p += textnodes + p += messages + return risk, p + + @staticmethod + def overall_risk(impact, likelihood): + impact_ix = ThreatRisk.risk_ix.get(impact) + likelihood_ix = ThreatRisk.risk_ix.get(likelihood) + if impact_ix is None or likelihood_ix is None: + return ':issue:`N/A`' + return ThreatRisk.risk_matrix[likelihood_ix][impact_ix] + + def get_element(self, content, n, default=None): + t, content[n] = self.parse_risk(self.options.get(n, default)) + return t + + def run(self): + DM = self.arguments[0].strip() if self.arguments else '' + content = {} + impact = self.get_element(content, 'impact') + likelihood = self.get_element(content, 'likelihood') + self.get_element(content, 'risk', + self.overall_risk(impact, likelihood)) + + if DM not in self.threat.DMs: + self.threat.DMs.append(DM) + for k, v in content.items(): + term = '-'.join((self.subitem, k)) + self.threat.data.setdefault(term, {})[DM] = v + return [] + +class ThreatDomain(sphinx.domains.Domain): + """Description of a Threat in a PSA SRA document.""" + name = 'psa_threat' + label = 'PSA Threat' + directives = { + 'description': ThreatElement, + 'adversarial-model': ThreatElement, + 'security-goal': ThreatElement, + 'unmitigated': ThreatRisk, + 'mitigations': ThreatElement, + 'residual': ThreatRisk, + } + directives.update(psa_directives) + roles = psa_roles + + def __init__(self, env, data): + super().__init__(env) + self.data['local'] = data + +def comma_list(s): + return [x.strip() for x in s.split(',')] + +class Threat(SphinxDirective): + """Process a Threat definition. + + This must have at least one of a Threat Id (specified using :id: option), and/or + a Threat title, specified as the argument to the directive. + + If :deployments: are specified, this is the number of deployments for which + risks are defined. + """ + has_content = True + optional_arguments = 1 + final_argument_whitespace = True + option_spec = { + 'id': directives.unchanged, + 'deployment-models': comma_list, + } + + @staticmethod + def finalize_DMs(threat): + if len(threat.DMs) > 1 or (len(threat.DMs)==1 and threat.DMs[0] != ''): + for dm in threat.DMs: + if len(dm.split())==1: + n, _ = role_sra_ref('psa_threat:dm', dm, dm, None, None) + else: + n = nodes.inline(dm, dm, classes=['sraref']) + p = nodes.paragraph(dm, '') + p += n + threat.data.setdefault('deployment-model',{})[dm] = p + + @staticmethod + def value_or_na(n): + if not n: + na = 'N/A' + n = nodes.paragraph(na, '', nodes.Text(na)) + return n + + @staticmethod + def entry(n): + n = Threat.value_or_na(n) + return nodes.entry(nodes_text(n), n) + + @staticmethod + def std_item(threat, data): + return data + + @staticmethod + def risk_item(threat, data): + n_dm = len(threat.DMs) + if n_dm == 1: + # if we have a single DM, just output the item + return Threat.value_or_na(data.get(threat.DMs[0])) + else: + # if we have more than one DM, build a borderless, unpadded table + wrap = nodes.container('', classes=['riskrow']) + table = nodes.table('', classes = ['borderless', 'colwidths-given']) + #self.set_source_info(table) + tgroup = nodes.tgroup(cols = n_dm) + for _ in range(n_dm): + tgroup += nodes.colspec(colwidth = 1) + tbody = nodes.tbody() + row = nodes.row() + for dm in threat.DMs: + row += Threat.entry(data.get(dm)) + tbody += row + tgroup += tbody + table += tgroup + wrap += table + return wrap + + threat_card = { + 'adversarial-model': (std_item.__func__, 'Adversarial Model'), + 'security-goal': (std_item.__func__, 'Security Goal'), + 'deployment-model': (risk_item.__func__, 'Deployment Model'), + 'unmitigated-impact': (risk_item.__func__, 'Unmitigated Impact'), + 'unmitigated-likelihood': (risk_item.__func__, 'Unmitigated Likelihood'), + 'unmitigated-risk': (risk_item.__func__, 'Unmitigated Risk'), + 'mitigations': (std_item.__func__, 'Mitigating Actions'), + 'residual-impact': (risk_item.__func__, 'Residual Impact'), + 'residual-likelihood': (risk_item.__func__, 'Residual Likelihood'), + 'residual-risk': (risk_item.__func__, 'Residual Risk'), + } + + @staticmethod + def description(threat): + data = threat.data.get('description') + if not data: + return [] + + data[0].insert(0, nodes.inline(text = 'Description: ', classes=['sralabel'])) + return data + + @staticmethod + def item(threat, id): + if not id in threat.data: + return [] + + f, label = Threat.threat_card[id] + t_node = nodes.term(label) + t_node += nodes.paragraph(label, '', nodes.inline(label, label, classes=['sralabel'])) + d_node = nodes.definition() + d_node += f(threat, threat.data[id]) + return nodes.definition_list_item('', t_node, d_node) + + def threat_section(self, title): + # Prepare a section + section = nodes.section(raw_source='\n'.join(self.content)) + section.document = self.state.document + + # Add title, and provide a link target + textnodes, messages = self.state.inline_text(title, self.lineno) + title_node = nodes.title(title, '', *textnodes) + section['names'].append(nodes.fully_normalize_name(title_node.astext())) + section += title_node + section += messages + self.state.document.note_implicit_target(section, section) + return section + + def run(self): + title = [] + if 'id' in self.options: + title.append(':threat:`{}`'.format(self.options['id'])) + if self.arguments: + title.append(self.arguments[0]) + section = self.threat_section(': '.join(title)) + + threat = ThreatData(self.options.get('deployment-models',[])) + + original_domain = self.env.temp_data['default_domain'] + try: + self.env.temp_data['default_domain'] = ThreatDomain(self.env, threat) + self.state.nested_parse(self.content, self.content_offset, section) + finally: + self.env.temp_data['default_domain'] = original_domain + + self.finalize_DMs(threat) + + # Process the threat definition + section += self.description(threat) + + deflist = nodes.definition_list() + for id in self.threat_card: + deflist += self.item(threat, id) + if deflist.children: + section.append(nodes.container(nodes_text(deflist), classes = ['threat'], *[deflist])) + + # Finished: discard ref to content, which is now inside the node tree + threat.data = None + return [section] + +class C_SubItem(SphinxDirective): + """Common base class for subitems. + + A subitem is part of a list of descriptions that apply to a specific + aspect of an object, for example the return values or the parameters + of a function. + + The definition of the item must immediately follow on the directive line. + The description, if provided, can start on the next line if desired. + """ + + has_content = True + final_argument_whitespace = True + + @property + def desc_data(self): + return self.env.domaindata['psa_description']['local'] + + @property + def subitem(self): + return self.name.split(':')[-1] + + def parse_spec(self, spec): + """Parse the argument for a list sub-item directive. + + Return the item list, spec and head nodes for the definition. + """ + raise NotImplementedError + + def add_to_index(self, spec, node): + pass + + def parse_content(self): + """Parse a subitem and return the description nodes. + """ + container = nodes.Element() + self.state.nested_parse(self.content, self.content_offset, container) + return container.children + + def check_content(self, arg_required=True): + """ Check that content has been provided, and that the definition is + present on the directive line. + Trim the definition from the content ViewList and return the definition + text. + """ + self.assert_has_content() + if self.lineno == self.content_offset+1: + line1 = self.content[0].strip() + self.content.trim_start() + return line1 + if arg_required: + raise self.warning('Argument missing for directive "{}"'.format(self.subitem)) + return None + + def check_subitem_permitted(self): + """ + Check that a sub-item is permitted for the API element types + + The subitem must provide a set ``valid_in`` of items that it can be used in + """ + if self.desc_data.element.objtype not in self.valid_in: + raise self.warning('Directive "{}" not valid for API element "{}"'.format( + self.subitem, self.desc_data.element.objtype)) + + def add_target_and_index(self, name, target): + self.desc_data.element.add_target_and_index(name, target) + + def run(self): + """Default run method for list sub-item directives. + + Stash the parsed definition list item in the appropriate list. + """ + self.check_subitem_permitted() + list, spec, head_nodes = self.parse_spec(self.check_content()) + + term_node = nodes.term(nodes_text(head_nodes)) + term_node += nodes.paragraph(nodes_text(head_nodes), '', *head_nodes) + description = nodes.definition(self.block_text) + self.state.nested_parse(self.content, self.content_offset, description) + defn = nodes.definition_list_item(description.astext(), + term_node, description, spec=spec) + self.add_to_index(spec, defn) + list.append(defn) + return [] + +class C_Summary(C_SubItem): + + def run(self): + self.assert_has_content() + if self.desc_data.summary: + raise self.warning('Directive "{}" already provided.'.format(self.subitem)) + self.desc_data.summary = self.parse_content() + return [] + +class C_Subsection(C_SubItem): + option_spec = { 'top': directives.flag } + + def run(self): + title, content = self.state.inline_text(self.check_content(), self.lineno) + content += self.parse_content() + if 'top' in self.options: + self.desc_data.top_sections.append((title, content)) + else: + self.desc_data.bottom_sections.append((title, content)) + return [] + +class C_Output(C_SubItem): + valid_in = {'function'} + + def parse_spec(self, spec): + return self.desc_data.outputs, spec, [nodes.literal(text=spec)] + +class C_Param(C_SubItem): + valid_in = {'function','macro'} + + def parse_spec(self, spec): + name = c_name_from_prototype(spec) + return self.desc_data.parameters, spec, [nodes.literal(text=name)] + +class C_Return(C_SubItem): + valid_in = {'function','macro'} + + def run(self): + self.check_subitem_permitted() + if self.desc_data.returns: + raise self.warning('Directive "{}" already provided.'.format(self.subitem)) + self.desc_data.return_type = self.check_content(False) + self.desc_data.returns = self.parse_content() + return [] + +class C_Retval(C_SubItem): + valid_in = {'function','macro'} + + def parse_spec(self, spec): + return self.desc_data.retvals, spec, autolinking_literal(spec) + +class C_Field(C_SubItem): + valid_in = {'struct'} + + def parse_spec(self, spec): + name = c_name_from_prototype(spec) + return self.desc_data.fields, spec, [nodes.literal(text=name)] + +class C_EnumValue(C_SubItem): + valid_in = {'enum'} + add_to_index = True + + def parse_spec(self, spec): + return self.desc_data.values, spec, [nodes.literal(text=spec)] + + def add_to_index(self, spec, node): + m = re.match(r'(\w+)(?:\s*=\s*(.+?))?\Z', spec) + self.add_target_and_index(m.group(1), node) + +class DescriptionData: + def __init__(self, element): + + # The API element object + self.element = element + + # A summary of the API element + self.summary = None + + # A list of member specifications and definitions for an enum element + self.values = [] + # A list of member specifications and definitions for a struct element + self.fields = [] + # A list of parameter specifications and definitions for an API element + self.parameters = [] + # A list of output specifications and definitions for an API element + self.outputs = [] + + # A description of the return value for an API element + self.returns = [] + # The return type for a function or typedef API element + self.return_type = None + # A list of return values and descriptions for an API element + self.retvals = [] + + # Lists of additional description sections + self.top_sections = [] + self.bottom_sections = [] + + @staticmethod + def make_subtitle(title): + if isinstance(title, str): + return nodes.rubric(title, text=title) + else: + t = nodes.rubric(rawsource = nodes_text(title)) + t += title + return t + + @staticmethod + def make_list(elements): + if not elements: + return [] + deflist = nodes.container(nodes_text(elements), classes = ['apisubitem']) + deflist += nodes.definition_list(nodes_text(elements), *elements) + return [deflist] + + def finish_list(self, title_text, elements): + if not elements: + return [] + title = self.make_subtitle(title_text) + return [title] + self.make_list(elements) + + def sort_retvals(self): + # Use the configured ordering to prioritise the return values: + # 1. Return values that aren't a single identifier and aren't + # listed in the configuration. + # 2. Return values that are listed in the configuration. + # 3. Single identifiers that aren't listed in the configuration. + # + # If there is no configured order then output the list in source order + # + # data.retvals[] is a list of (node,value) tuples + # return a list of nodes + + retvals = self.retvals + if not retvals: + return [] + + order = self.element.env.app.config.psa_api_retval_order + if order: + priority = dict(zip(order,range(len(order)))) + def get_priority(spec): + p = priority.get(spec, -1) + if p < 0 and re.match(r'^[A-Z][A-Z0-9_]*$', spec): + p = len(order) + return p + retvals.sort(key=lambda rv: get_priority(rv['spec'])) + + # extract and return the list of sorted nodes + return retvals + + def finish_returns(self): + if not self.return_type and not self.retvals and not self.returns: + return [] + title = self.make_subtitle('Returns') + if self.return_type: + title += nodes.Text(': ') + title += autolinking_literal(self.return_type) + stuff = [title] + self.returns + stuff += self.make_list(self.sort_retvals()) + return stuff + + def finish_subsections(self, sections): + stuff = [] + if sections: + for (title, subsection) in sections: + stuff += [self.make_subtitle(title)] + stuff += subsection + return stuff + + def finish_top(self): + top = self.finish_list('Fields', self.fields) + top += self.finish_list('Values', self.values) + top += self.finish_list('Parameters', self.parameters) + top += self.finish_list('Outputs', self.outputs) + top += self.finish_returns() + top += self.finish_subsections(self.top_sections) + return top + + def finish_bottom(self): + return self.finish_subsections(self.bottom_sections) + +class DescriptionDomain(sphinx.domains.Domain): + """Description of an object in a PSA API document.""" + name = 'psa_description' + label = 'PSA description' + directives = { + 'field': C_Field, + 'output': C_Output, + 'param': C_Param, + 'return': C_Return, + 'retval': C_Retval, + 'value': C_EnumValue, + 'summary': C_Summary, + 'subsection': C_Subsection, + } + directives.update(psa_directives) + roles = psa_roles + + def __init__(self, env, element=None): + super().__init__(env) + self.data['local'] = DescriptionData(element) + +def make_c_target(name): + return 'c.' + name + +class C_Item(SphinxDirective): + """Base class for PSA C API objects. + + Subclasses must define: + + * A field ``kind`` that provides the typeset description of what kind + of object this is (e.g. type, struct, function, ...). + * A method ``prototype(name, desc_data)`` that returns a pair of + (str, node.Element) for the item, used between the header and the content. + """ + has_content = True + required_arguments = 0 + optional_arguments = 1 + option_spec = { + 'name': directives.unchanged, + 'header': directives.unchanged, + 'definition': directives.unchanged, + 'naked': directives.flag, + 'guard': directives.unchanged, + 'comment': directives.unchanged, + } + final_argument_whitespace = True + naked = False + + @staticmethod + def doxy_brief(nodes): + if not nodes: + return '' + s = nodes_text(nodes).replace('\n',' ') + fin = re.search(r'(\D\.\D|\d\.\D|\D\.\d)', s) # . but not x.y + if fin: + s = s[:fin.start() + 2] + return s + + @staticmethod + def doxy_para(intro, text, indent=3): + if text: + return textwrap.wrap(text, 80 - indent, + initial_indent=intro + ' ', + subsequent_indent=' '*(len(intro)+1)) + return [intro] + + @staticmethod + def doxy_comment(lines): + if lines: + c = '/**' + for l in lines: + c += '\n *' + if l: + c += ' ' + l + return c + '\n */\n' + return '' + + def doxy_summary(self): + if not self.desc_data.summary: + return [] + return self.doxy_para('@brief',self.doxy_brief(self.desc_data.summary)) + + def basic_prototype(self): + # Return an unannotated prototype for the API element + raise NotImplementedError + + def prototype(self, doxygen): + # Return an annotated prototype for the API element + # Default implementation prefixes an undecorated prototype with + # a summary of the API element. + # Override if more complex annotation is required + + proto, error = self.basic_prototype() + # Document the basic summary, input parameters, and return values + if doxygen>0: + doxy = self.doxy_summary() + if doxy and doxygen==2: + # Document parameters of the API + if self.desc_data.parameters: + items = [('@param ' + nodes_text(p[0]).strip(), self.doxy_brief(p[1])) + for p in self.desc_data.parameters] + width = max([len(i[0]) for i in items]) + doxy.append('') + for i in items: + doxy.extend(self.doxy_para(i[0].ljust(width),i[1])) + if self.desc_data.returns: + doxy.append('') + doxy.extend(self.doxy_para('@return',self.doxy_brief(self.desc_data.returns))) + if doxy: + proto = '\n' + self.doxy_comment(doxy) + proto + if self.guard: + proto = '#ifndef {}\n{}\n#endif'.format(self.guard, proto) + if self.comment: + lines = textwrap.wrap(self.comment, 80 - 3, + initial_indent='/* ', subsequent_indent=' ') + proto = '\n'.join(lines) + '\n */\n' + proto + return proto, error + + def annotate_members(self, items, item_sep, final_sep, doxygen): + # Annotated prototypes for structs and enums, documenting each member + begin = '{} {} {{'.format(self.kind, self.item_name) + if 'type' in self.options: + begin = 'typedef ' + begin + end = '}} {};'.format(self.item_name) + else: + end = '};' + if not items: + proto = begin + end + else: + subitems = [] + for item in items: + brief = self.doxy_brief(item[1]) if doxygen==2 else '' + if brief: + brief = '\n /// '.join([''] + self.doxy_para('@brief', brief, 8)) + subitems.append(brief + '\n ' + item['spec']) + proto = begin + item_sep.join(subitems) + final_sep + '\n' + end + + if doxygen>0: + doxy = self.doxy_comment(self.doxy_summary()) + if doxy: + return '\n' + doxy + proto, None + return proto, None + + def parse_arguments(self): + # Either the API name must be the first line of argument, or it is + # provided using the `name` option. + # A macro definition can be provided as the subsequent lines of the + # directive argument body (before options), or using the `definition` + # option. + # The header for the API element can be specified as the `header` + # option, if not provided the current header in force for the source + # file will be used. + # Specific API element classes can extend this if required + argument_trail = None + if 'name' in self.options: + self.item_name = self.options['name'] + if self.arguments: + argument_trail = self.arguments[0] + elif self.arguments: + line_end = self.arguments[0].find('\n') + if line_end <= 0: + self.item_name = self.arguments[0] + else: + self.item_name = self.arguments[0][:line_end].rstrip() + argument_trail = self.arguments[0][line_end+1:] + else: + raise self.warning('API name missing for directive "{}"'.format(self.objtype)) + self.definition = self.options.get('definition', argument_trail) + self.header = self.options.get('header') + if 'naked' in self.options: + self.naked = True + self.guard = self.options.get('guard') + self.comment = self.options.get('comment') + if self.naked and self.definition: + raise self.warning('Naked API element "{}" cannot have a definition'.format(self.item_name)) + if self.naked and self.header: + raise self.warning('Naked API element "{}" cannot be added to a header'.format(self.item_name)) + + def add_target_and_index(self, name, node): + # for C API items we add a prefix since names are usually not qualified + # by a module name and so easily clash with e.g. section titles + targetname = make_c_target(name) + node['names'].append(targetname) + if targetname not in self.state.document.ids: + # If unique, use the exact target name as the id, not the output + # from nodes.make_id(). This maintains anchor name compatibility + node['ids'].append(targetname) + node['first'] = False + self.state.document.note_explicit_target(node) + inv = self.env.domaindata['psa_c']['elements'] + if name in inv: + self.state_machine.reporter.warning( + 'duplicate API definition of {}, other instance in {}.'.format( + name, self.env.doc2path(inv[name][0])), line=self.lineno) + inv[name] = (self.env.docname, self.objtype) + + def make_prototypes(self): + protos = [] + if not self.naked: + # construct the standard and annotated prototypes + proto, err = self.prototype(0) + header_proto, _ = self.prototype(self.config.psa_api_header_doxygen) + if err: + protos.append(err) + protos.append(autolinking_literal_block(proto)) + # Add the prototype to the list of API prototypes + self.env.domains['psa_c'].add_prototype(self.item_name, self.header, self.kind, + proto, header_proto, self.env.docname) + return protos + + def run(self): + env = self.env + + self.kind = self.objtype = self.name.split(':')[-1] + + self.parse_arguments() + # Prepare a section + section = nodes.section(raw_source=self.content) + section.document = self.state.document + section['objtype'] = self.objtype + + title_node = nodes.title() + title_node += nodes.literal(text=self.item_name) + title_node += nodes.Text(' ({})'.format(self.kind)) + section += title_node + + self.add_target_and_index(self.item_name, section) + + original_default_domain = env.temp_data['default_domain'] + section_offset = len(section) + desc_domain = DescriptionDomain(env, self) + self.desc_data = desc_domain.data['local'] + description = nodes.Element() + try: + env.temp_data['default_domain'] = desc_domain + self.state.nested_parse(self.content, self.content_offset, description) + finally: + env.temp_data['default_domain'] = original_default_domain + # Insert optional summary paragraph immediately after the title + if self.desc_data.summary: + section += self.desc_data.summary + # Add prototype + section += self.make_prototypes() + # Compile upper description sections + top = self.desc_data.finish_top() + section += top + # Add description + if description.children: + if top: + section.append(self.desc_data.make_subtitle('Description')) + section += description.children + # Add final subsections + section += self.desc_data.finish_bottom() + + # Finished + del desc_domain.data['local'] + return [section] + +class Attribute(C_Item): + naked = True + +class Typedef(C_Item): + def parse_arguments(self): + super().parse_arguments() + if re.match(r'\w+\Z', self.item_name): + self.definition = None + else: + self.definition = self.item_name + self.item_name = c_name_from_prototype(self.definition) + + def basic_prototype(self): + proto = self.definition + if proto is None: + proto = '/*...*/ ' + self.item_name + if not proto.startswith('typedef '): + proto = 'typedef ' + proto + if not proto.endswith(';'): + proto += ';' + return proto, None + +class Macro(C_Item): + version_opt = 'api-version' + option_spec = C_Item.option_spec + option_spec.update({ version_opt: option_choice(version_opt, ('major','minor','hex')) }) + formats = { + 'major': '{0}', + 'minor': '{1}', + 'hex' : '(0x{0:02X}{1:02X}u)' + } + + def basic_prototype(self): + error = None + definition = self.definition + if self.version_opt in self.options: + if definition: + error = self.state_machine.reporter.error( + 'Cannot provide definition for version macro "{}"'.format(self.item_name), + line=self.lineno) + elif self.desc_data.parameters: + error = self.state_machine.reporter.error( + 'Cannot provide arguments for version macro "{}"'.format(self.item_name), + line=self.lineno) + version = self.env.config.version.split()[0] + v = [int(x) for x in version.split('.')] + if len(v) == 1: + v.append(0) + definition = self.formats[self.options[self.version_opt]].format(*v) + elif definition is None: + definition = '/*...*/' + + if self.desc_data.parameters: + params = [p['spec'] for p in self.desc_data.parameters] + args = '(' + ', '.join(params) + ')' + else: + args = '' + # Very crude heuristic for line splitting. Needs work. + if len(self.item_name) + len(args) + len(definition) > 70: + proto = '#define {}{} \\\n {}'.format(self.item_name, args, definition) + else: + proto = '#define {}{} {}'.format(self.item_name, args, definition) + return proto, error + +class Function(C_Item): + option_spec = C_Item.option_spec + option_spec.update({ 'type': directives.flag }) # for function pointer typedefs + + def parse_arguments(self): + super().parse_arguments() + if 'type' in self.options: + self.kind = 'type' + + def basic_prototype(self): + if self.desc_data.return_type: + proto = self.desc_data.return_type + error = None + else: + proto = 'void' + # Issue a non-fatal error if no return type is specified + error = self.state_machine.reporter.warning( + 'No return type for function "{}", assuming void.'.format(self.item_name), + line=self.lineno) + + if 'type' in self.options: + proto = 'typedef ' + proto + ' (* ' + self.item_name + ')(' + self.kind = 'type' + else: + proto += ' ' + self.item_name + '(' + + if self.desc_data.parameters: + sep = ',\n' + ' ' * len(proto) + params = [p['spec'] for p in self.desc_data.parameters] + proto += sep.join(params) + else: + proto += 'void' + proto += ');' + + return proto, error + +class Struct(C_Item): + option_spec = C_Item.option_spec + option_spec.update({ 'type': directives.flag }) # for struct typedefs + + def prototype(self, doxygen): + return self.annotate_members(self.desc_data.fields, ';', ';', doxygen) + +class Enum(C_Item): + option_spec = C_Item.option_spec + option_spec.update({ 'type': directives.flag }) # for enum typedefs + + def prototype(self, doxygen): + return self.annotate_members(self.desc_data.values, ',', '', doxygen) + + +class PSA_C_Index(sphinx.domains.Index): + name = 'identifiers' + localname = 'Index of API elements' + shortname = 'API identifiers' + + @staticmethod + def entry_from_item(item): + return (item['name'], 0, item['docname'], item['target'], '', '', '') + + @staticmethod + def split_buckets(buckets, max_bucket_size): + """Split a bucket dictionary into smaller buckets. + + ``buckets`` is a dictionary whose keys are strings and whose values + are lists that satisfy the property that for each element ``entry`` in + ``buckets[key]``, ``key`` is a prefix of ``entry[0].upper()``. + + This function looks for keys whose value is a list of more than + ``max_bucket_size`` elements and splits the corresponding list by + moving each element to a key with a longer prefix. + """ + did_something = True + while did_something: + did_something = False + for key, entries in list(buckets.items()): + if len(buckets[key]) <= max_bucket_size: + continue + del buckets[key] + did_something = True + length = len(key) + 1 + for entry in entries: + new_key = entry[0].upper()[:length] + buckets.setdefault(new_key, []).append(entry) + + def collect_buckets(self): + entries = [] + for name, (doc, _) in list(self.domain.data['elements'].items()): + entries.append( (name, 0, doc, make_c_target(name), '', '', '') ) + if not entries: + return {} + + buckets = {'': entries} + if len(entries) >= 10: + self.split_buckets(buckets, len(entries) / 2) + return buckets + + def generate(self, docnames=None): + buckets = self.collect_buckets() + if not buckets: + return [], False + content = [(bucket, sorted(buckets[bucket])) + for bucket in sorted(buckets.keys())] + return content, False + +def option_list(option): + def option_check(argument): + if isinstance(argument, str): + return argument.replace(',',' ').split() + raise ValueError(':{}: must be a list of headers.'.format(option)) + + return option_check + +class Header(SphinxDirective): + required_arguments = 1 + final_argument_whitespace = True + option_spec = { + 'seq': directives.nonnegative_int, + 'guard': directives.unchanged, + 'include': option_list('include'), + 'system-include': option_list('system-include'), + 'c++': directives.flag, + 'copyright': directives.unchanged, + 'license': directives.unchanged, + } + has_content = True + + def run(self): + header = self.arguments[0].strip() + self.env.temp_data['header_file'] = header + self.env.temp_data['header_seq'] = self.options.pop('seq',0) + opt = self.options.copy() + if 'guard' in opt and not opt['guard']: + opt['guard'] = re.sub('[^a-zA-Z0-9]','_',header.upper()) + '_H' + opt['preamble'] = '\n'.join(self.content.data) + + if self.content.data or len(self.options) > 0: + collision = self.env.domains['psa_c'].add_header(header, opt) + if collision: + return [self.state_machine.reporter.error( + 'Duplicate header "{}" defined in source "{}".'.format( + header, collision), line = self.lineno)] + + return [] + +class header_node(nodes.General, nodes.Element): + pass + +class InsertHeader(SphinxDirective): + required_arguments = 1 + final_argument_whitespace = True + + def run(self): + # The generated header will depend on any source files with API elements + # in the header, and a source file that defines any adornments for the + # header. Tracking these does not ensure correct detection of every + # situation where this directive to be re-processed. The simplest + # reliable approach is to force this source file to always be re-read. + self.env.note_reread() + return [header_node('', header=self.arguments[0].strip())] + +def process_header_nodes(app, doctree, docname): + for node in doctree.traverse(header_node): + header = node['header'] + text = app.builder.env.domains['psa_c'].prototype_header(header, notice=False, doxy=False, db=False) + if not text: + logger.warning('Cannot insert header with no content: "%s"', + header, location=node) + inline_error = nodes.inline('', 'Header "{}" has no content'.format(header), + classes = ['issue']) + node.replace_self(inline_error) + else: + h = autolinking_literal_block(text) + node.replace_self(resolve_references(h, docname, app)) + +ApiElement = namedtuple('ApiElement', 'seq name type prototype annotated') + +class PSA_C_Domain(sphinx.domains.Domain): + """C language domain for PSA.""" + name = 'psa_c' + label = 'PSA C' + directives = { + 'enum': Enum, + 'function': Function, + 'macro': Macro, + 'struct': Struct, + 'typedef': Typedef, + 'attribute': Attribute, + 'header': Header, + 'insert-header': InsertHeader, + 'template-image': TemplateImage, + 'title': TitlePage, + 'front-matter': FrontMatter, + 'maintoc': MainToc, + 'appendix': Appendix, + 'about': About, + 'insert-section': InsertFrontSection, + 'banner': Banner, + 'insert-banner': InsertBanner, + 'include-license': IncludeLicense, + 'release': Release, + 'release-table': ReleaseTable, + 'reference': Reference, + 'reference-table': ReferenceTable, + 'term': Term, + 'scterm': Term, + 'abbr': Term, + 'term-table': TermTable, + 'threat': Threat, + } + directives.update(psa_directives) + roles = psa_roles + indices = [PSA_C_Index] + initial_data = { + 'prototypes': {}, # header -> { docname: [ApiElement] } + 'elements': {}, # name -> docname, objtype + 'headers': {}, # header -> docname, options + 'front-matter': {}, # section -> docname, content + 'cite': {}, # citeref -> docname, reference + 'term': {}, # term -> docname, definition + 'release': {}, # seq_id -> docname, release + 'sra': {}, # sra.id -> docname, None + } + + def clear_doc(self, docname): + for set in self.initial_data.keys(): + d = self.data[set] + if set == 'prototypes': + for header, elements in list(d.items()): + if docname in elements: + del elements[docname] + if not elements: + del d[header] + else: + for key, (fn, _) in list(d.items()): + if fn == docname: + del d[key] + + def merge_domaindata(self, docnames, otherdata): + for set in ('elements','headers','front-matter'): + d = self.data[set] + for key, (fn, data) in d.items(): + if fn in docnames: + d[key] = (fn, data) + + #if 'prototypes' in otherdata: + # self.data['prototypes'].update(otherdata['prototypes']) + + def get_objects(self): + for refname, (docname, type) in list(self.data['elements'].items()): + yield (refname, refname, type, docname, make_c_target(refname), 1) + + def add_prototype(self, name, header, type, prototype, annotated, docname): + if header is None: + header = self.env.temp_data.get('header_file', + self.env.config.psa_api_c_header) + seq = self.env.temp_data.get('header_seq',0) + sig = ApiElement(seq, name, type, prototype, annotated) + self.data['prototypes'].setdefault(header,{}).setdefault(docname,[]).append(sig) + + def sequenced_prototypes(self, header): + # Order the prototypes according to source sequence numbers. + # Sphinx partial rebuild results in variation in the order of + # the prototypes in the primary list. + # + p = sum(self.data['prototypes'].get(header,{}).values(),[]) + p.sort(key = attrgetter('seq')) + return p + + def sorted_prototypes(self, header): + # Sort the prototypes to enable accurate diffing of the API between + # versions of the documentation source code. Sphinx partial rebuild + # results in variation in the order of the prototypes in the primary + # list. + # + # The current ordering is by: + # - type, reversed so typedef, then macro, then function + # - API name + # + p = sum(self.data['prototypes'].get(header,{}).values(),[]) + p.sort(key = attrgetter('name')) + p.sort(key = attrgetter('type'), reverse = True) + return p + + def add_header(self, header, options): + # stash the extra header data + headers = self.data['headers'] + if header in headers: + return headers[header][0] + headers[header] = (self.env.docname, options) + return None + + def get_header_options(self, header): + h = self.data['headers'].get(header) + return h[1] if h else {} + + def prototype_header(self, header, notice, doxy, db): + # Output a string with the content for a specific header file + # If the header has no content then return None + if not header in self.data['prototypes']: + return None + + h = self.get_header_options(header) + lines = [] + postamble = [] + if notice: + # REUSE-IgnoreStart + if 'copyright' in h: + lines.append('// SPDX-FileCopyrightText: {}'.format(h['copyright'])) + if 'license' in h: + lines.append('// SPDX-License-Identifier: {}'.format(h['license'])) + # REUSE-IgnoreEnd + if lines: + lines.append('') + if not db: + if 'preamble' in h: + lines.extend([h['preamble'],'']) + guard = h.get('guard') + if guard: + lines.extend( ['#ifndef {}'.format(guard), '#define {}'.format(guard), ''] ) + postamble = ['','#endif // {}'.format(guard)] + includes = h.get('system-include',[]) + if includes: + for inc in includes: + lines.append('#include <{}>'.format(inc)) + lines.append('') + includes = h.get('include',[]) + if includes: + for inc in includes: + lines.append('#include "{}"'.format(inc)) + lines.append('') + if 'c++' in h: + lines.extend( ['#ifdef __cplusplus', 'extern "C" {', '#endif', ''] ) + postamble[0:0] = ['', '#ifdef __cplusplus', '}', '#endif'] + + if db: + apis = self.sorted_prototypes(header) + else: + apis = self.sequenced_prototypes(header) + if doxy and not db: + lines += [api.annotated for api in apis] + else: + lines += [api.prototype for api in apis] + lines.extend(postamble) + + return '\n'.join(lines) + '\n' + + def output_prototypes(self, outdir, format): + # Output the prototypes as C header files into the path at `outdir` + # * for 'api-ref' include annotaton, and use source sequencing + # * for 'api-db' strip annotations, and use identifier order + db = (format == 'api-db') + os.makedirs(outdir, exist_ok=True) + clean_dir(outdir) + for h in self.data['prototypes'].keys(): + fn = os.path.join(outdir, h + '.h') + os.makedirs(os.path.dirname(fn), exist_ok=True) + sig_file = open(fn, 'w', encoding='utf-8') + sig_file.write(self.prototype_header(h, notice=True, doxy=True, db=db)) + + + def resolve_any_xref(self, env, fromdocname, builder, target, + node, contnode): + # Check if this is a citation reference + m = re.match(r'\[([a-zA-Z0-9][-a-zA-Z0-9_. ]+)\]',target) + if m: + refnode = self.resolve_citeref(env, fromdocname, builder, 'cite', m.group(1), contnode) + if refnode: + return [('psa_c:cite', refnode)] + + m = re.match(r'(DM|AM|SG|T|M)\.[-a-zA-Z0-9+_.]+',target) + if m: + refnode = self.resolve_sraref(env, fromdocname, builder, target, contnode) + if refnode: + return [('psa_c:' + m.group(1).lower(), refnode)] + + # strip trailing parens, and check if an API item + refnode = self.resolve_apiref(env, fromdocname, builder, target, node, contnode) + if refnode: + return [('psa_c:ref', refnode)] + return [] + + # Weak reference: turn into a reference if the target is available, + # and keep as-is otherwise. + def resolve_xref(self, env, fromdocname, builder, + typ, target, node, contnode): + type = typ.split(':')[-1] + if type in ('cite', 'cite-title'): + return self.resolve_citeref(env, fromdocname, builder, type, target, contnode) + if type in ('term', 'scterm'): + return self.resolve_termref(env, fromdocname, builder, type, target, contnode) + if type == 'secref': + return self.resolve_secref(env, fromdocname, builder, type, target, node, contnode) + if type in ('numref', '*'): + return self.resolve_numref(env, fromdocname, builder, type, target, node, contnode) + if type in ('am', 'dm', 'sg', 't', 'm'): + return self.resolve_sraref(env, fromdocname, builder, + canonical_sra_id(type, target), contnode) + + return self.resolve_apiref(env, fromdocname, builder, target, node, contnode) + + # Try and resolve an API reference + def resolve_apiref(self, env, fromdocname, builder, + target, node, contnode): + # strip trailing parens + target = target.rstrip('()') + if target not in self.data['elements']: + return None + obj = self.data['elements'][target] + return make_refnode(builder, fromdocname, obj[0], make_c_target(target), + contnode, target) + + def resolve_secref(self, env, fromdocname, builder, + typ, target, node, contnode): + # resolve a section reference - use title for link text + # and add a latex pageref + # use the standard resolver to do the label lookup + e = env.domains['std'].resolve_xref(env, fromdocname, builder, + 'ref', target.lower(), node, contnode) + if not e: + contnode['classes'] = ['issue','secref'] + else: + e[0]['classes'] = ['secref'] + if 'refuri' in e: + id = e['refuri'][1:].replace('#', ':') + else: + id = fromdocname + ':' + e['refid'] + e += latexpageref(id) + return e + + def resolve_numref(self, env, fromdocname, builder, + typ, target, node, contnode): + # resolve a number reference + e = env.domains['std'].resolve_xref(env, fromdocname, builder, + 'numref', target.lower(), node, contnode) + if not (e and isinstance(e, nodes.reference)): + contnode['classes'] = ['issue','numref'] + return e + + # number_reference nodes are stripped in the latex writer + # so need to return a composite node which includes the number_refernence + # followed by the latex page-ref node + e[0]['classes'] = ['numref'] + n = nodes.inline('') + n += e + if 'refuri' in e: + id = e['refuri'][1:].replace('#', ':') + else: + id = fromdocname + ':' + e['refid'] + n += latexpageref(id) + return n + + def resolve_citeref(self, env, fromdocname, builder, + typ, target, contnode): + # resolve a citation reference (with optional title inclusion) + target = canonical_rfc(target) + docname, id, title = ReferenceTable.resolve_ref(env, target.lower()) + if not docname: + # If the xref cannot resolve, Sphinx writes the contnode - so + # make it show up as an issue in the output + contnode['classes'].append('issue') + return None + contnode = nodes.inline('', nodes_text(contnode), classes = ['cite']) + refnode = make_refnode(builder, fromdocname, docname, id, contnode) + if typ == 'cite-title' and title: + n = nodes.inline(nodes_text(contnode)) + n += nodes.emphasis('', *title) + n += nodes.Text(' ') + n += refnode + return n + return refnode + + def resolve_termref(self, env, fromdocname, builder, + typ, target, contnode): + # resolve a term reference + docname, label = TermTable.resolve_ref(env, target.lower()) + contnode['classes'].append(typ) + if not docname: + # If the xref cannot resolve, Sphinx writes the contnode - so + # make it show up as an issue in the output + contnode['classes'].append('issue') + return None + return make_refnode(builder, fromdocname, docname, label, contnode) + + def resolve_sraref(self, env, fromdocname, builder, + target, contnode): + key = nodes.make_id(target) + docname, label = SRADefinition.resolve_ref(env, key) + if not docname: + # If the xref cannot resolve, make it show up as an issue in the output + contnode['classes'].extend(['issue']) + return None + + n = nodes.inline(nodes_text(contnode), label, classes=['sraref']) + return make_refnode(builder, fromdocname, docname, 'sra-' + key, n) + +class BuildAPI(sphinx.builders.Builder): + def get_outdated_docs(self): + return 'api' + + def prepare_writing(self, docnames): + return + + def get_target_uri(self, docname, typ = None): + return docname + + # The API prototype output is independent of the structure of the source + # documents. So no output is generated for each updated source doc, instead + # the entire prototype API is output during the `finish()` method. + def write_doc(self, docname, doctree): + return + + def finish(self): + self.env.domains['psa_c'].output_prototypes(self.app.outdir, self.name) + +class API_db(BuildAPI): + name = 'api-db' + +class API_ref(BuildAPI): + name = 'headers' + +def alpha_section(secnum): + if not secnum or len(secnum) == 0: + return secnum + + secnum = list(secnum) + return tuple([string.ascii_uppercase[secnum[0]-1]] + secnum[1:]) + +def rewrite_section_numbers(env): + # This relies on the callbacks running _after_ the built-in + # TocTreeCollector has run, rewriting the section numbers to + # use Alphabetic section numbers for chapters in the Appendix + + def _walk_toc(node, alpha_sec=False): + for subnode in node.children: + if isinstance(subnode, (nodes.bullet_list, nodes.list_item, addnodes.only)): + _walk_toc(subnode, alpha_sec) + elif isinstance(subnode, addnodes.compact_paragraph) and alpha_sec: + reference = cast(nodes.reference, subnode[0]) + reference['secnumber'] = alpha_section(reference['secnumber']) + elif isinstance(subnode, addnodes.toctree): + _walk_toctree(subnode) + + def _walk_toctree(toctreenode: addnodes.toctree, alpha_sec=False) -> None: + for (_, ref) in toctreenode['entries']: + if ref in env.tocs: + _walk_toc(env.tocs[ref], alpha_sec) + + if alpha_sec: + env.toc_secnumbers[ref] = {k: alpha_section(v) + for k, v in env.toc_secnumbers[ref].items()} + + for docname in env.numbered_toctrees: + doctree = env.get_doctree(docname) + for toctreenode in doctree.traverse(addnodes.toctree): + alpha_sec = toctreenode.get('alpha_numbers', False) + _walk_toctree(toctreenode, alpha_sec) + + return [] + +def assign_figure_numbers(env): + # Rassign a figure number to each figure under a numbered toctree. + # But using the alpha section labels for appendices + # Each doc either has alpha chapters or number chapters (maintoc vs appendix) + # For each alpha-docs, accumulate the minimum fig index per fig-section + # Then rewrite the fignumbers using an alpha chapter, and reducing the index as required. + + if env.config.numfig and env.config.numfig_secnum_depth > 0: + alphadocs = [] + figoffset = {} + for docname, secnums in env.toc_secnumbers.items(): + if type(secnums[""][0]) is not int and docname in env.toc_fignumbers: + # This document is in an alpha-sectioned chapter + alphadocs.append(docname) + for kind, fignums in env.toc_fignumbers[docname].items(): + offsets = figoffset.setdefault(kind,{}) + for fignum in fignums.values(): + offsets[fignum[:-1]] = min(offsets.get(fignum[:-1],999), fignum[-1] - 1) + for docname in alphadocs: + for kind, fignums in env.toc_fignumbers[docname].items(): + for id, fignum in fignums.items(): + figbase = fignum[:-1] + fignums[id] = alpha_section(figbase) + (fignum[-1] - figoffset[kind][figbase],) + + return [] + +def apply_alpha_sections(app, env): + return rewrite_section_numbers(env) + assign_figure_numbers(env) + +def note_dependency(app, doctree): + # Rebuild everything when this extension's code changes. + app.env.note_dependency(__file__) + +def process_doctree_resolved(app, doctree, docname): + process_banner_nodes(app, doctree, docname) + process_header_nodes(app, doctree, docname) + +def setup(app): + # This version of the extension depends on table support only added in v5.3 + app.require_sphinx('5.3') + + app.add_config_value('psa_api_c_header', 'prototypes', 'env') + app.add_config_value('psa_api_tool_path', '', 'env') + app.add_config_value('psa_api_template_path', '', 'env') + app.add_config_value('psa_api_license', 'missing', 'env') + app.add_config_value('psa_api_retval_order', [], 'env') + app.add_config_value('psa_api_header_doxygen', 0, 'env') + app.add_config_value('psa_api_front_sections', [], 'env') + # This should be triggered on 'config-inited', but that event doesn't + # exist before Sphinx 1.8. + app.add_node(banner) + app.add_node(header_node) + app.connect('doctree-read', note_dependency) + app.connect('doctree-resolved', process_doctree_resolved) + app.connect('env-get-updated', apply_alpha_sections, 600) + + app.add_domain(PSA_C_Domain) + app.add_domain(DescriptionDomain) + app.add_builder(API_db) + app.add_builder(API_ref) + FrontSection.add_directives(app) + + return { + 'version': '1.0', + 'env_version': 14, + 'parallel_read_safe': False, # Can only verify this on Linux, not supported on MacOS or Windows + 'parallel_write_safe': True, + } diff --git a/tools/puml/psa-dataflow.pumh b/tools/puml/psa-dataflow.pumh new file mode 100644 index 00000000..33c32c26 --- /dev/null +++ b/tools/puml/psa-dataflow.pumh @@ -0,0 +1,29 @@ +' SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +!define dfd_process storage +!define dfd_store database +!define dfd_agent rectangle +!procedure dfd_tb($type = "trust boundary", $label="") + skinparam rectangle { + backgroundColor<<$type>> #FFFFFF90 + borderColor<<$type>> darkred + borderstyle<<$type>> dashed + borderThickness<<$type>> 1 + fontColor<<$type>> black + } + !if ($label == "") + rectangle <<$type>> + !else + rectangle "$label" <<$type>> + !endif +!endprocedure +!procedure dfd_align($type = "i b") + skinparam rectangle { + backgroundColor<<$type>> none + borderColor<<$type>> none + borderThickness<<$type>> 1 + fontColor<<$type>> none + } + rectangle <<$type>> +!endprocedure diff --git a/tools/puml/psa-lifecycle.pumh b/tools/puml/psa-lifecycle.pumh new file mode 100644 index 00000000..fcc20ac8 --- /dev/null +++ b/tools/puml/psa-lifecycle.pumh @@ -0,0 +1,21 @@ +' SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +skinparam rectangle { + backgroundColor #PSAMidBlue + borderThickness 0 + fontColor white +} + +skinparam card { + backgroundColor #0091BD20 + borderThickness 0 + fontColor black +} + +!define lifecycle_phase card +!define lifecycle_state rectangle +!define stakeholder note +!define stakeholder_skip label " " + +left to right direction diff --git a/tools/puml/psa-spec.pumh b/tools/puml/psa-spec.pumh new file mode 100644 index 00000000..42e6298e --- /dev/null +++ b/tools/puml/psa-spec.pumh @@ -0,0 +1,191 @@ +' SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +hide footbox +hide empty description +skinparam { + style strictuml + + defaultFontName roboto + defaultFontSize 12 + defaultMonospacedFontName roboto mono + + ArrowColor Black + + BackgroundColor ffffff55 + + RoundCorner 8 +} + +!define PSAGreen 95D600 +!define PSAMidBlue 0091BD +!define PSADarkBlue 002B49 +!define PSAMidGray 7D868C +!define PSALightGray E5ECEB + +skinparam legend { + backgroundColor e8e8e8 + fontSize 12 +} + +skinparam sequenceLifeLine { + backgroundColor White + borderColor Gray + borderThickness 1 +} + +skinparam sequenceGroup { + bodyBackgroundColor #ffffff80 + borderColor Gray + borderThickness 1 + backgroundColor #f0f0f0 + headerFontStyle normal + fontSize 11 +} + +skinparam sequenceBox { + borderColor none + backgroundColor #e0e0e0c0 + borderThickness 1 +} + +skinparam note { + backgroundColor #e8e8e8 + borderColor PSAMidGray + borderThickness 1 +} + +skinparam participant { + backgroundColor White + borderColor Black + borderThickness 1 +} + +skinparam actor { + backgroundColor White + borderColor Black + borderThickness 1 +} + +skinparam boundary { + backgroundColor White + borderColor Black + borderThickness 1 +} + +skinparam control { + backgroundColor White + borderColor Black + borderThickness 1 +} + +skinparam database { + backgroundColor White + borderColor Black + borderThickness 1 +} + +skinparam entity{ + backgroundColor White + borderColor Black + borderThickness 1 +} + +skinparam collections { + backgroundColor White + borderColor Black + borderThickness 1 +} + +skinparam queue { + backgroundColor White + borderColor Black + borderThickness 1 +} + +skinparam storage { + backgroundColor White + borderColor Black + borderThickness 1 +} + +skinparam rectangle { + backgroundColor White + borderColor Black + borderThickness 1 +} + +skinparam interface { + backgroundColor White + borderColor Black + borderThickness 1 +} + +skinparam condition { + backgroundColor White + borderColor Black + borderThickness 1 +} + +skinparam state { + backgroundColor White + borderColor Black + borderThickness 1 +} + +skinparam usecase { + backgroundColor White + borderColor Black + borderThickness 1 +} + +skinparam cloud { + backgroundColor #White + borderColor PSAMidGray + borderThickness 1 +} + +skinparam component { + backgroundColor #White + borderColor Black + borderThickness 1 +} + +skinparam node { + backgroundColor #White + borderColor PSAMidGray + borderThickness 1 +} + +skinparam frame { + backgroundColor #White + borderColor PSAMidGray + borderThickness 1 +} + +skinparam folder { + backgroundColor #White + borderColor PSAMidGray + borderThickness 1 +} + +skinparam ConditionEndStyle hline + +skinparam partition { + borderThickness 0 + borderColor f0f0f0 + backgroundColor #f0f0f0 + fontSize 11 +} + +skinparam activity { + backgroundColor White + borderColor Black + borderThickness 1 +} + +skinparam card { + backgroundColor White + borderColor Black + borderThickness 1 +} diff --git a/tools/rewrite-html-for-jekyll.py b/tools/rewrite-html-for-jekyll.py new file mode 100644 index 00000000..3b2e7b27 --- /dev/null +++ b/tools/rewrite-html-for-jekyll.py @@ -0,0 +1,22 @@ +# SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +# SPDX-License-Identifier: Apache-2.0 + +import glob, re + +files = [] +for f in glob.glob('**/*.html', recursive=True): + files.append(f) + +url_property = r'meta property="og:url" content="{{ site.url }}[^"]*"\s*/>' +url_replace = r'meta property="og:url" content="{{ page.url | absolute_url }}" />\n<link rel="canonical" href="{{ page.url | absolute_url }}" />' + +url_re = re.compile(url_property) + +for file in files: + with open(file, encoding='utf-8') as f: + text = f.read() + if re.search(url_re, text): + text = "---\n---\n\n" +re.sub(url_re, url_replace, text) + print("{}: update for Jekyll processing".format(file)) + with open(file, "w", encoding='utf-8') as f: + f.write(text) diff --git a/tools/templates/psa-api-2022/Arm_logo_blue_RGB.pdf b/tools/templates/psa-api-2022/Arm_logo_blue_RGB.pdf new file mode 100644 index 0000000000000000000000000000000000000000..15fb0b556d4cebe6914d0c3284d0e71d6bd85134 GIT binary patch literal 1690 zcmah~4NwzD6t19UJkhD5mP)OQ8VeoG{p2nI8l?OMQLC9?bu>~r!X+GFF1@=@A~KGm z=rp2I1s#jDqSdJNXRK7G_*ZLFTdfX*Qz#-uZAd$<0#e1QmF@<Dv~|Xv+k3m;zW4UM zci-+Q^hvsDq>{lDHMb8v!e~GMAu|WlY5_i*vs&bAz(B}=0RV6vpC@x7lzFVoC2=Mp zi^HZ*$0S+g*rixOB{y%@hVkLS%@U@3DJblcH#9oos$q)L;hfyP)$qm6!YOq#x*~}D z@^sp}>I}YqMUyLd+M2F=GtZ2=pZe$z>PTp*<Il&Brmgt<-MiO5zKV_UT)Mj3yI}qv z#$D1Lw0~2;?Zzvv;R){5rA^t@uKA;WpkmiZ{K9d=V_U!feX5gNxRedwF;=;ISgvyN zF0*-m?y7rpNWr%7Ny~`Oaum@I1|N)nM-kp($qd)If_ogE(%dUr*Wq%b{ZNMf)A6!r z5kEcDu~X@ZskFT{Ytg~FAnElN$JAm+PZm$?)HNtSy6kTIy1r()Irnkl#^Ts&vb{6o zx44Vv+uCY3?<hNQG;&S_f8mIE_C5F5{h{B!x;tRg%S}t~9Qke@?mTse$C&0N&SfKi zIriS-$iwELs!5^AEnTDDxY?CsySSK+x6BpXpQr<d$gaxzEfxjSvvT6Pl_$v?=Bk8_ zQ0oV=drJpDNsJp|*u1SOqfzx`eca)>^%?7^b9kM;&EuJK_N(j0K~w8Sk4Vd;Las|* zwuIR>VF~q^eHb8xbO-KXhZwuObY)!THSD$RAqSRSI^E#>x%TsOf$Ez@F^yFrC)Vr6 z&)&P0Htl1=0!1$slUeMpl(qVE#e?YWL(9{Pe(bSME_CE~tUkN1qUQKEsr&RR^40@h z=5lS`b#IHyb}D_ru^TTW-Ey|pd1d3w>gtk_Y;f*}HCA`vTBbSfY)kfrweM%_eY3e^ z(xLqBJ3r0nzPu}6$g6qaZVZdc8B{d-c+<GM^<~CymNe8Ax0f&9GVEHFuxf&{_SXw* zg74$!4>o9d&+)~Zw%;l%Y%Qzp46?I-8GBZ2Y)yGs@g!g(Mi*h6HLH(_aD+IFh>Iko zu38n1*3nGW&u|~7lMCdOG#T<4XtfA{4QB~B0eE6OAOUV-;Ty6XF2FZ@`utG+egHnt zVdDU<XDu910Mh4I&x)K?hNk|*^EQ{ovk5{0FhYm`q(-AuX&AuJN<zaB1PRi8c8P*j zhK3SAC$aa~rHF#vHXyv--F&D&;xrh8$XX>E+STOn!>K?P?VNv>2(^;9eBQ(vQW6l@ zn-y;0B*8A4I0>NI7zX5sqW9khPji%zEk29Sl3*^V42J&L?I`5|4%7o2=tUvRZi4qm zgo))v0gy^ktt3E1wk+GE7#tQFq85?0W%DLUDTtQHNZ&?@@OF^}5omSEIvqjK(FCDR zhCP8GG%6@jC*hcY5*CtzQU&J})PYOA63x*#3hKbFq5C?-kPlTnT!X$*S3l1`+8gR= zphGp>l#2Fo1NVi=3)UpWrHG^$ilE>_&?HT(Db=FL0aeiqs7h~H6Iq$f6D+=b5sjoi z;yk5WfykLL0z_dj<h};f45MOz8T4T!!N3oQ8nF5?B8q~?;6Iq=8F~cy3_TSjz`t!t zl8pKvrizB&*{>&yET6}TzCTDBzl?(+Bf1y_K?W%CUQVZ4%>qE|@X<|@SyA?72&)x^ KDHO?bb=W^qGeG75 literal 0 HcmV?d00001 diff --git a/tools/templates/psa-api-2022/Arm_logo_blue_RGB.pdf.license b/tools/templates/psa-api-2022/Arm_logo_blue_RGB.pdf.license new file mode 100644 index 00000000..8c3078e2 --- /dev/null +++ b/tools/templates/psa-api-2022/Arm_logo_blue_RGB.pdf.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license diff --git a/tools/templates/psa-api-2022/Arm_logo_blue_RGB.svg b/tools/templates/psa-api-2022/Arm_logo_blue_RGB.svg new file mode 100644 index 00000000..4cdf634c --- /dev/null +++ b/tools/templates/psa-api-2022/Arm_logo_blue_RGB.svg @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Layer_1" + x="0px" + y="0px" + viewBox="0 0 236.5 72.099998" + xml:space="preserve" + sodipodi:docname="Arm_logo_blue_RGB.svg" + width="236.5" + height="72.099998" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata + id="metadata11"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs + id="defs9" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1022" + inkscape:window-height="690" + id="namedview7" + showgrid="false" + inkscape:zoom="1.3156566" + inkscape:cx="118" + inkscape:cy="36.1" + inkscape:window-x="0" + inkscape:window-y="1102" + inkscape:window-maximized="0" + inkscape:current-layer="Layer_1" /> +<style + type="text/css" + id="style2"> + .st0{fill:#0091BD;} +</style> +<path + class="st0" + d="M 53.4,1.9 H 69.3 V 70 H 53.4 V 62.9 C 46.4,71 37.9,72.1 33,72.1 12,72.1 0,54.6 0,35.9 0,13.7 15.2,0.1 33.2,0.1 c 5,0 13.8,1.3 20.2,9.7 z M 16.2,36.2 c 0,11.8 7.4,21.7 18.9,21.7 10,0 19.3,-7.3 19.3,-21.5 0,-14.9 -9.2,-22 -19.3,-22 -11.5,0 -18.9,9.7 -18.9,21.8 z M 88.1,1.9 H 104 V 8 c 1.8,-2.1 4.4,-4.4 6.6,-5.7 3.1,-1.8 6.1,-2.3 9.7,-2.3 3.9,0 8.1,0.6 12.5,3.2 l -6.5,14.4 c -3.6,-2.3 -6.5,-2.4 -8.1,-2.4 -3.4,0 -6.8,0.5 -9.9,3.7 -4.4,4.7 -4.4,11.2 -4.4,15.7 V 69.9 H 88 v -68 z m 54.9,0 h 15.9 v 6.3 c 5.3,-6.5 11.6,-8.1 16.8,-8.1 7.1,0 13.8,3.4 17.6,10 5.7,-8.1 14.2,-10 20.2,-10 8.3,0 15.5,3.9 19.4,10.7 1.3,2.3 3.6,7.3 3.6,17.2 V 70.1 H 220.6 V 32.6 c 0,-7.6 -0.8,-10.7 -1.5,-12.1 -1,-2.6 -3.4,-6 -9.1,-6 -3.9,0 -7.3,2.1 -9.4,5 -2.8,3.9 -3.1,9.7 -3.1,15.5 V 70.1 H 181.6 V 32.6 c 0,-7.6 -0.8,-10.7 -1.5,-12.1 -1,-2.6 -3.4,-6 -9.1,-6 -3.9,0 -7.3,2.1 -9.4,5 -2.8,3.9 -3.1,9.7 -3.1,15.5 V 70.1 H 143 Z" + id="path4" /> +</svg> diff --git a/tools/templates/psa-api-2022/Arm_logo_blue_RGB.svg.license b/tools/templates/psa-api-2022/Arm_logo_blue_RGB.svg.license new file mode 100644 index 00000000..8c3078e2 --- /dev/null +++ b/tools/templates/psa-api-2022/Arm_logo_blue_RGB.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license diff --git a/tools/templates/psa-api-2022/about-chapter.rst b/tools/templates/psa-api-2022/about-chapter.rst new file mode 100644 index 00000000..e2592aa8 --- /dev/null +++ b/tools/templates/psa-api-2022/about-chapter.rst @@ -0,0 +1,133 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. role:: anchor + +.. _about-this-document: + +=================== +About this document +=================== + +.. insert-section:: Release information + :section: release-info + :break-after: + + The change history table lists the changes that have been made to this document. + + .. release-table:: Document revision history + +.. only:: include_todo + + .. insert-section:: TODO items + :section: todos + :break-after: + :not-in-toc: + + The following items are marked up as TODO in the document source: + + .. todolist:: + +.. insert-section:: |docfulltitle| + :not-in-toc: + + Copyright © |doccopyright|. The copyright statement reflects the fact that some + draft issues of this document have been released, to a limited circulation. + +.. include-license:: + +.. _license: + +.. insert-section:: License + :section: license + :class: license + :break-after: + +.. insert-section:: References + :section: references + + This document refers to the following documents. + + .. reference-table:: Documents referenced by this document + + +.. insert-section:: Terms and abbreviations + :section: terms + + This document uses the following terms and abbreviations. + + .. term-table:: Terms and abbreviations + :sorted: + +.. insert-section:: Potential for change + :section: potential-for-change + + The contents of this specification are subject to change. + + In particular, the following may change: + + * Feature addition, modification, or removal + * Parameter addition, modification, or removal + * Numerical values, encodings, bit maps + +.. insert-section:: Conventions + :section: conventions + + .. insert-section:: Typographical conventions + + The typographical conventions are: + + *italic* + Introduces special terminology, and denotes citations. + + ``monospace`` + Used for assembler syntax descriptions, pseudocode, and source code examples. + + Also used in the main text for instruction mnemonics and for references to + other items appearing in assembler syntax descriptions, pseudocode, and + source code examples. + + :sc:`small capitals` + Used for some common terms such as :sc:`implementation defined`. + + Used for a few terms that have specific technical meanings, and are included + in the *Terms and abbreviations*. + + :issue:`Red text` + Indicates an open issue. + + :anchor:`Blue text` + Indicates a link. This can be + + * A cross-reference to another location within the document + * A URL, for example :url:`example.com` + + .. insert-section:: Numbers + + Numbers are normally written in decimal. Binary numbers are preceded by 0b, and + hexadecimal numbers by ``0x``. + + In both cases, the prefix and the associated value are written in a monospace + font, for example ``0xFFFF0000``. To improve readability, long numbers can be + written with an underscore separator between every four characters, for example + ``0xFFFF_0000_0000_0000``. Ignore any underscores when interpreting the value of + a number. + +.. insert-section:: Current status and anticipated changes + :section: current-status + +.. _feedback: + +.. insert-section:: Feedback + :section: feedback + + We welcome feedback on the PSA Certified API documentation. + + If you have comments on the content of this book, visit :url:`github.com/arm-software/psa-api/issues` to create a new issue at the PSA Certified API GitHub project. Give: + + * The title (|docfulltitle|). + * The number and issue (|docid| |docrelease|). + * The location in the document to which your comments apply. + * A concise explanation of your comments. + + We also welcome general suggestions for additions and improvements. diff --git a/tools/templates/psa-api-2022/html-static/custom.css b/tools/templates/psa-api-2022/html-static/custom.css new file mode 100644 index 00000000..9b3d5ac1 --- /dev/null +++ b/tools/templates/psa-api-2022/html-static/custom.css @@ -0,0 +1,451 @@ +/* SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited */ +/* SPDX-License-Identifier: Apache-2.0 */ + +/* CSS overrides for the html output */ + +body { + font-family: Lato, sans-serif; + font-size: 15px; + color: #1F2123; +} + +div.document { + width: 965px; +} + +div.bodywrapper { + margin: 0 0 0 270px; +} + +div.body { + background-color: unset; + color: #1F2123; + padding: 0; +} + +div.sphinxsidebar { + width: 240px; + font-size: 12.5px; + margin-top: -30px; +} + +div.sphinxsidebarwrapper { + padding: 0; +} + +div.sphinxsidebarwrapper p.logo { + margin: 0; +} + +div.footer { + width: 965px; +} + +div.watermark { + position: fixed; + width: 660px; + height: 100%; + z-index: -999; + pointer-events: none; + } + +div.watermark p { + color: #EEE; + font-size: 160px; + pointer-events: none; + user-select: none; + margin: 0px; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%) rotate(-45deg); + } + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Lato, sans-serif; + font-weight: bold; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Lato, sans-serif; + font-size: 20px; +} + +div.body input, div.sphinxsidebar input { + font-family: Lato, sans-serif; + font-size: 15px; +} + +a { + color: #0091BD; + text-decoration: none; +} + +a.reference { + border-bottom: none; +} + +a.reference:hover { + color: #00617E; + border-bottom: 1px solid #00617E; + background: unset; +} + +tt, code { + font-family: Inconsolata, monospace; + font-size: 93%; + background-color: unset; + color: #101010; +} + +code.xref, a code { + font-weight: normal; + color: #0091BD; + background-color: unset; + border-bottom: unset; +} + +pre { + font-family: Inconsolata, monospace; + font-size: 93%; + color: #101010; + background: rgba(187,187,187,0.12); + padding: 5px; + margin: 10px -6px; + line-height: 1.3em; + border-style: solid; + border-width: 1px; + border-radius: 5px; + border-color: rgba(187,187,187,0.3); +} + +/* Fix the specific overrides in basic.css and alabaster.css for code blocks */ +div.highlight pre, dl pre, blockquote pre, li pre { + padding: 5px; + margin: 10px -6px; +} + +sub { + font-size: 70%; + vertical-align: -10%; + font-weight: bold; +} + +sup { + font-size: 70%; + vertical-align: 25%; + font-weight: bold; +} + +/* Default table formatting is like 'booktabs', 'standard' formatting can + can be specified explicitly. + */ + + table.docutils { + font-size: unset; + box-shadow: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + /*width: 100%;*/ + border: 0; + border-top: 1px solid #AAA; + border-bottom: 1px solid #AAA; + margin-bottom: 1em; +} + +table.docutils.align-left { + margin-left: 0; + margin-right: auto; +} + +table.docutils.align-right { + margin-left: auto; + margin-right: 0; +} + +table.docutils.standard { + border: 1px solid #AAA; +} + +table.docutils.borderless { + border: 0; +} + +table.docutils.borderless.titletable { + margin-top: 40px; + width: 70%; + margin-right: 0px; + margin-left: auto; +} + +table.docutils caption, div.figure p.caption, figcaption { + font-size: 90%; + text-align: right; + margin-right: -13px; /* move permalink into margin */ +} + +table.docutils caption span.caption-number, div.figure p.caption span.caption-number, figcaption span.caption-number { + font-weight: bold; + font-style: normal; +} + +table.docutils td, table.docutils th { + border: 0; + padding: 0.3em 0.5em 0.3em 0.5em; + text-align: left; + vertical-align: top; +} + +/* Add all rules for standard table formatting */ +table.docutils.standard td, table.docutils.standard th { + border: 1px solid #AAA; +} + +table.docutils td p, table.docutils th p { + margin-block-start: .3em; + margin-block-end: .3em; +} + +table.docutils th > p:first-child, table.docutils td > p:first-child { + margin-top: 0px; +} + +table.docutils th { + font-weight: bold; + font-size: 90%; +} + +/* rule below stub rows */ +table.docutils th.stub { + border-bottom: none; +} + +table.docutils.standard th.stub { + border-bottom: 1px solid #AAA; +} + +/* rule below header rows */ +table.docutils th.head { + border-bottom: 0; +} + +table.docutils tr:last-child > th.head { + border-bottom: 1px solid #AAA; +} + +table.docutils.borderless tr:last-child > th.head { + border-bottom: 0; +} + +table.docutils.standard th.head { + border-bottom: 1px solid #AAA; +} + +table.docutils.borderless th.head { + border-bottom: 0; +} + +figure { + margin-inline-start: 0px; + margin-inline-end: 0px; +} + +div.figure div.legend, figcaption div.legend { + font-size: 90%; /* adds to the figcaption scaling */ + text-align: center; +} + +div.figure p.caption, div.figure div.legend p, figcaption p, figcaption div.legend { + margin-block-start: 0.2em; + margin-block-end: 0.5em; +} + +div.admonition { + margin: 5px 15px; + padding: 5px 15px; + background-color: unset; + border: 0; + border-left: 6px solid #DDD; +} + +div.admonition p.admonition-title { + font-family: Lato, sans-serif; + font-weight: bold; + font-size: 90%; +} + +p.admonition-title:after { + content: ""; +} + +div.admonition p { + margin-top: 0; + margin-bottom: 5px; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: unset; +} + +div.highlight { + background-color: unset; +} + +div.admonition div.highlight pre { + background-color: unset; +} + +div.warning { + border-left: 6px solid #FBB; +} + +div.warning p.admonition-title { + color: darkred; +} + +div.banner { + border: 2px solid #CC0; + background-color: rgba(255,255,0,0.25); +} + +div.rationale { + border-left: 6px solid #BFB; + background-color: rgba(127,255,127,0.125); +} + +div.rationale p.admonition-title { + color: darkgreen; +} + +div.admonition-todo { + border-left: 6px solid #CC0; + background-color: rgba(255,255,0,0.25); +} + +div.admonition-todo p.admonition-title { + color: #660; +} + +.scterm, .sc { + font-variant: small-caps; + text-transform: lowercase; +} + +.license{ + font-size: 80%; +} + +div.license p.sectiontitle { + display: block; + margin-top: 24px; + font-weight: bold; + font-size: 144%; +} + +.anchor { + color: #0091BD; +} + +.issue { + color: red; +} + +.term { + font-style: italic; +} + +.secref { + font-style: italic; +} + +.sectiontitle { + display: block; + margin-top: 30px; + font-weight: bold; + font-size: 180%; +} + +.sralabel { + font-weight: bold; +} + +.sradef { + font-weight: bold; + font-size: 90%; +} + +.sraref { + font-size: 90%; +} + +img.titlelogo { + float: left; + margin-top: 0.7em; + margin-bottom: 8em; + margin-right: 5%; + width: 25%; +} + +img.logo { + display: block; + margin: 1em auto; + width: 40%; +} + +div.sphinxsidebar hr { + width: 100%; +} + +dl dd { + margin-left: 3em; + margin-top: 0.2em; + margin-bottom: 0.8em; +} + +dl p { + margin-block-start: 0.6em; + margin-block-end: 0.6em; +} + +div.apisubitem dt > :first-child { + margin-top: 0; +} + +div.apisubitem dt > :last-child { + margin-bottom: 0; +} + +div.threat dt { + float: left; + clear: left; + width: 22ex; +} + +div.threat dt > :first-child { + margin-top: 0; +} + +div.threat dd { + margin-left:22ex; + padding-left: 1ex; +} + +div.riskrow table.docutils.borderless { + width: 100%; + margin-top: 0; + margin-bottom: 0.6em; +} + +div.riskrow table.docutils td { + padding: 0; +} + +div.riskrow table.docutils td p { + margin: 0; +} diff --git a/tools/templates/psa-api-2022/psa-api-tool.sty b/tools/templates/psa-api-2022/psa-api-tool.sty new file mode 100644 index 00000000..0660fa6f --- /dev/null +++ b/tools/templates/psa-api-2022/psa-api-tool.sty @@ -0,0 +1,492 @@ +% SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +% SPDX-License-Identifier: Apache-2.0 + +% Hide the warning when multiple inkscape-generated PDF [image] files are +% rendered on the same page +\pdfsuppresswarningpagegroup=1 + +% Set the ToC depth to include sub-section headings +\setcounter{tocdepth}{2} + +% Set the PDF bookmark depth to include sub-sub-section headings (API elements) +% The final level is not in the TOC +\def\psabookmarkdepth{3} + +\usepackage{apptools} +\usepackage{titletoc} +\usepackage{enumitem} +\usepackage[depth=\psabookmarkdepth, numbered]{bookmark} +\usepackage{caption} +\usepackage{ifthen} +\usepackage{xstring} +\usepackage[section]{placeins} +\usepackage{scalefnt} + +% The Sphinx DUrole command fails when multiple classes are defined +% This version splits the roles, and creates a nested set of calls to +% the sphinx command, +\let\sphinxDUrole\DUrole +\renewcommand{\DUrole}[2]{% + \IfSubStr{\detokenize{#1}}{,}{% + \StrBefore[1]{\detokenize{#1}}{,}[\myhead]% + \StrBehind[1]{\detokenize{#1}}{,}[\mytail]% + \expandafter\sphinxDUrole\expandafter{\myhead}{\expandafter\DUrole\expandafter{\mytail}{#2}}% + }{\sphinxDUrole{#1}{#2}}% +} +\MakeRobust\DUrole + +% PSA document styling +\def\psah {\normalfont\fontsize{20pt}{24pt}\selectfont\bfseries} +\def\psahh {\normalfont\fontsize{16pt}{19.2pt}\selectfont\bfseries} +\def\psahhh {\normalfont\fontsize{14pt}{16.8pt}\selectfont\bfseries} +\def\psahhhh {\normalfont\fontsize{12pt}{14.4pt}\selectfont\bfseries} +\def\psabody {\normalfont\fontsize{11pt}{13.2pt}\selectfont} +\def\psalicense {\normalfont\fontsize{9pt}{10.8pt}\selectfont} +\def\psasubtext {\normalfont\fontsize{8pt}{9.6pt}\selectfont} +\def\psasc {\scalefont{0.75}} +\def\psacitation {\itshape} +\def\psasubtitle {\normalfont\fontsize{10pt}{12pt}\selectfont\bfseries} +\def\psacaption {\psasubtitle} +\def\psathead {\psasubtitle} +\def\psalegend {\normalfont\fontsize{9pt}{10.8pt}\selectfont} + +\definecolor{psaissue}{rgb}{1,0,0} + +% Set up PSA style spacing rules +\frenchspacing +% remove justification on main text +\raggedright +% the line leading already gives us 2pt (in LaTeX spacing model) +\setlength{\parskip}{6pt plus 2pt minus 1pt} + + +% Define the heading styles for level 1-4 +\ifdefined\docchapterbreak + \titleclass{\chapter}{top} +\else + \titleclass{\chapter}{straight} +\fi +\titleformat{\chapter} + {\psah} + {\IfAppendix{\appendixname\ \thechapter:}{\thechapter}} + {0.5em}{}{} +\titlespacing{\chapter}{0pt}{*6}{*1} + +\titleformat{\section} + {\psahh} + {\thesection} + {0.5em}{}{} +\titlespacing{\section}{0pt}{*4.5}{*1} + +\titleformat{\subsection} + {\psahhh} + {\thesubsection} + {0.5em}{}{} +\titlespacing{\subsection}{0pt}{*4}{*1} + +\titleformat{\subsubsection} + {\psahhhh} + {\thesubsubsection} + {0.5em}{}{} +\titlespacing{\subsubsection}{0pt}{*3}{*1} + +% Add a watermark if requested +\ifdefined\docwatermark + \usepackage{draftwatermark} + \SetWatermarkText{\docwatermark} + \SetWatermarkScale{1} + \SetWatermarkColor[gray]{0.8} +\fi + +% remove emphasis on cross references +\def\sphinxcrossref#1{#1} + +% define a macro to provide a hyperlinked page reference, if on another page +% this is used for Section, Figure and Table references +\newcounter{testpagecount} +\DeclareRobustCommand\ifrefthispage[3]{% + \refstepcounter{testpagecount}\label{tpc\thetestpagecount}% + \ifthenelse{\equal{\pageref{#1}}{\pageref{tpc\thetestpagecount}}}{#2}{#3}% +} + +\newcommand\psapageref[1]{\ifrefthispage{#1}{}{\hyperref[#1]{{} on page~\pageref{#1}}}} + +% Define the format for the index sub-headings +\def\sphinxstyleindexlettergroup #1{{\psahhhh#1}\nopagebreak\vspace{4pt}} + +% set the size of API element names in subsubsection titles +\def\sphinxstyleliteralintitle#1{\texttt{\Large{#1}}} + +\raggedright + +% define the specification rule color +\definecolor{psarulecolor}{gray}{0.75} +\def\psarulewidth{.8pt} + +% Layout and style for tables + +\arrayrulecolor{psarulecolor} +\heavyrulewidth=.8pt + +% Set the table header rows font style +\def\sphinxstyletheadfamily {\psathead} + +% Set the table continuation style +\def\sphinxtablecontinued{\psacaption} + +% Table row spacing +\renewcommand{\arraystretch}{1.4} + +% Table captions +\captionsetup[table]{position=top} +\captionsetup{% + margin={2cm,0cm}, justification=raggedleft, singlelinecheck=false, + font=small, labelfont=bf, labelsep=space +} + +% Formatting for table cells +% * default paragraph spacing is 0pt, use a smaller (non-zero) spacing +% * reduced item spacing +% * left aligned text +\def\psacellformat{% + \setlength\parskip{3pt plus 1pt minus 1pt}% + \setlist[1]{topsep=2pt, partopsep=0pt, itemsep=1pt, parsep=2pt minus 1pt}% + \raggedright\arraybackslash% + } + +% redefine sphinx column types to be left aligned, with adjusted spacing +\makeatletter +\newcolumntype{\X}[2]{>{\psacellformat}p{\dimexpr + (\linewidth-\spx@arrayrulewidth)*#1/#2-\tw@\tabcolsep-\spx@arrayrulewidth\relax}} +\newcolumntype{\Y}[1]{>{\psacellformat}p{\dimexpr + #1\dimexpr\linewidth-\spx@arrayrulewidth\relax-\tw@\tabcolsep-\spx@arrayrulewidth\relax}} +\newcolumntype{T}{>{\psacellformat}L}% +\makeatother + +% Figure legend formatting comes after caption and may contain arbitrary body elements +\renewenvironment{sphinxlegend}{\par\medskip\psalegend}{\par} + +% format Notes to have a wider left margin +\renewenvironment{sphinxnote}[1] + {\list{}{\leftmargin1cm}\item[]\begin{sphinxlightbox}\sphinxstrong{#1}\par }{\end{sphinxlightbox}\endlist} + +% format for banner box. Use the environment defined for attention admonitions +\makeatletter +\newenvironment{sphinxclassbanner} + {% set parameters of heavybox + \def\spx@noticetype {attention}% + \sphinxcolorlet{spx@notice@bordercolor}{sphinxattentionBorderColor}% + \sphinxcolorlet{spx@notice@bgcolor}{sphinxattentionBgColor}% + \spx@notice@border \dimexpr1pt\relax + \begin{sphinxheavybox} + } + {\end{sphinxheavybox}} +\makeatother + +% format for internal-only rationale boxes. Use the environment defined for error admonitions +\makeatletter +\newenvironment{sphinxclassrationale} + {% set parameters of heavybox + \def\spx@noticetype {error}% + \sphinxcolorlet{spx@notice@bordercolor}{sphinxerrorBorderColor}% + \sphinxcolorlet{spx@notice@bgcolor}{sphinxerrorBgColor}% + \spx@notice@border \dimexpr1pt\relax + \begin{sphinxheavybox} + } + {\end{sphinxheavybox}} +\makeatother + +% Set up the PSA specification header/footer +\usepackage{fancyhdr} + \pagestyle{fancy} + \fancyhf{} + \fancyfoot[L]{\footnotesize{\docid\\{}\docreleasefull}} + \fancyfoot[C]{\footnotesize{\textit{Copyright \textcopyright \doccopyright}}} + \fancyfoot[R]{\footnotesize{Page \thepage}} + \renewcommand{\headrulewidth}{0pt} + \renewcommand{\footrulewidth}{\psarulewidth} + \renewcommand{\footrule}{{\color{psarulecolor} \rule{\headwidth}{\footrulewidth} \vskip -\footrulewidth}} + +\fancypagestyle{normal}{} +\fancypagestyle{plain}{} + +% Prevent the change of page number style from resetting the page number itself +\newcounter{savepage} +\let\oldpagenumbering\pagenumbering +\renewcommand{\pagenumbering}[1]{\setcounter{savepage}{\value{page}} \oldpagenumbering{#1} \setcounter{page}{\value{savepage}}} + +% A frontmatter environment, which continues roman page numbers, +% does not number titles, but includes them in the TOC. +\newcommand{\psafrontmatter}[1]% + {\pagenumbering{roman}% + \setcounter{secnumdepth}{#1} + } + +\newcommand{\psamain}[1] + {\clearpage% + \pagenumbering{arabic}% + \setcounter{secnumdepth}{#1} + } + +\newcommand{\psaappendix}[1] + {\ifdefined\docappendixbreak \clearpage\fi% + \setcounter{secnumdepth}{#1} + \appendix% + } + +\setcounter{secnumdepth}{2} +\setcounter{tocdepth}{2} + +% The title page command +\newenvironment{psatitle}% +{ + \pagestyle{empty} + \begin{titlepage} + + \setlength{\parindent}{0pt} + \begingroup % for PDF information dictionary + \def\endgraf{ }\def\and{\& }% + \pdfstringdefDisableCommands{\def\\{, }}% overwrite hyperref setup + \hypersetup{pdfauthor={\docauthor}, pdftitle={\docfulltitle{} \docversion}}% + \endgroup + + \noindent\begin{minipage}[t]{5.2cm} + \vspace{0pt}% required to get top-alignment of image and text + \sphinxlogo + \end{minipage} + \hfill\begin{minipage}[t]{0.67\textwidth}\raggedleft% + \vspace{0pt}% required to get top-alignment of image and text + {\psah \doclatextitle{} \docversion\par} + \ifdefined\docowner \medskip\psahhh\docowner\par \fi + \end{minipage} + + \bigskip\bigskip\bigskip + + \begin{table}[hbt!] + \begin{tabular}{ll} + Document number: & \docid \\ + Release Quality: & \docquality \\ + Issue Number: & \docissue \\ + Date of Issue: & \docdate + \end{tabular} + \end{table} + + \medskip + + \begingroup\raggedleft + \scriptsize{Copyright \textcopyright \doccopyright}\\\par + \endgroup + + \bigskip\bigskip\bigskip\bigskip +} +{ + \end{titlepage} + \pagestyle{plain} + \sphinxtableofcontents + \pagestyle{normal} +} + +% emulate small-caps: +\newcommand{\DUrolesc}[1] + {{\psasc\uppercase{#1}}} + +% small caps for special term references +\newcommand{\DUrolescterm}[1] + {{\psasc\uppercase{#1}}} + +% Other glossary term references are emphasized +\newcommand{\DUroleterm}[1] + {{\sphinxstyleemphasis{#1}}} + +% Define issue role as red color +\newcommand{\DUroleissue}[1] + {\textcolor{psaissue}{#1}} + +% Emphasise section and title-text references +\newcommand{\DUrolesecref}[1] + {{\sphinxstyleemphasis{#1}}} + +% SRA definition style +\newcommand{\DUrolesradef}[1] + {{\scalefont{.9}\sphinxstylestrong{#1}}} + +% SRA reference style +\newcommand{\DUrolesraref}[1] + {{\scalefont{.9}#1}} + +% SRA threat card label style +\newcommand{\DUrolesralabel}[1] + {{\sphinxstylestrong{#1}}} + +% associate anchor role with the InnerlinkColor +\newcommand{\DUroleanchor}[1] + {\textcolor{InnerLinkColor}{#1}} + +% Provide sectiontitle role for frontmatter titles that are not in TOC +\newcommand{\DUrolesectiontitle}[1] + {{\psahh #1}} + +\newcommand{\DUroleversionmodified}[1] + {{\sphinxstyleemphasis{#1}}} + +% define class environment for the license text (much smaller font) +\newenvironment{sphinxclasslicense} + {\psalicense\setlist[enumerate,1]{label=\bfseries(\roman*)}% + \renewcommand{\DUrolesectiontitle}[1] + {{\psahhh ##1}}% + } + {} + +% If running in a high enough version of sphinx, also +% Divert use of the sphinxalltt environment to use Verbatim. This requires +% setting a default config for Verbatim, which does not work in some earlier +% versions of Sphinx. +% +% This ensures that all literal blocks are rendered using the Verbatim +% configuration below, whether or not sphinx runs the highlighting engine on +% the block. +\newcommand{\useverbatimfortt}{% + \let\sphinxalltt\sphinxVerbatim% + \let\endsphinxalltt\endsphinxVerbatim% + \fvset{commandchars=\\\{\}}% + } + +% Set up the style for the Table of Contents + +\renewcommand{\contentsname}{\psahh Contents} +\contentsmargin{1cm} +\titlecontents{chapter}[1cm] + {\addvspace{16pt}} + {\psahhh\contentslabel{1cm}} + {\psahhh} + {\titlerule[0pt]\contentspage} +\titlecontents{section}[2cm] + {\addvspace{8pt}} + {\psahhhh\contentslabel{2cm}} + {\psahhhh} + {\titlerule[0pt]\contentspage} +\titlecontents{subsection}[2cm] + {} + {\psabody\contentslabel{1.5cm}} + {\psabody} + {\titlerule[0pt]\contentspage} + +% and remove sphinx's ToC overrides +\let\sphinxtableofcontentshook\relax + + +% This is something of a hack to get consistent, and differentiated API element +% subtitles in the specification. Simple specs might have API elements at +% level 3 headings (subsections), and complex ones at level 4 (subsubsection). +% So using a section level for the subtitles will yield inconsistent results. +% +% psa-api-tool.py uses `rubric` nodes for these sections (so don't use rubric in +% API reference for other things?). Unfortunately, Sphinx does not copy +% docutils and emit a \rubric{} command, it just emits \subsubsection*{}. +% +% As that [starred] command is not used for other elements, we replaced the +% \subsubsection command to intercept these uses and divert them to \rubric{}. +% We can then define \rubric{} as we wish - A bold 10pt runin for the main +% document text, and the original \subsubsection*{} in the appendix. +% +% Older versions of Sphinx directly use \paragraph{} for rubric, so +% also intercept level 5 headings and treat as rubric +% +% Heading 5 is used for all api subtitles +\newcommand{\subtitlett}[1]{{\normalfont\ttfamily #1}} +\newcommand{\apisubtitle}[1]{{\let\sphinxstyleliteralintitle\subtitlett #1}} +\titleformat{\paragraph} + {\psasubtitle} + {} + {0.5em}{\apisubtitle}{} +\titlespacing{\paragraph}{0pt}{*2}{4pt} + +\makeatletter +\let\oldsubsubsection\subsubsection +\renewcommand{\subsubsection} + % Only intercept rubrics in the main section + {\@ifstar{\IfAppendix{\oldsubsubsection*}{\paragraph*}}{\oldsubsubsection}} +\makeatother + + +% Set up item lists, enumerations and definition lists +% PSA current styleguide is incompatible with AIG. Will keep AIG at present +% [nb/ PSA guide is inconsistent with PSA examples] + +% Define spacing for lists +\setlist[1]{topsep=4pt, partopsep=0pt, itemsep=3pt, parsep=3pt plus 1pt minus 1pt} +\setlist[2]{topsep=2pt, partopsep=0pt, itemsep=1pt, parsep=1pt} +\setlist[3]{topsep=2pt, partopsep=0pt, itemsep=1pt, parsep=1pt} + +% Do not use multicols environment for hlist directive, but keep the compactness +\renewenvironment{multicols}[1]{\begingroup}{\endgroup} + +% AIG styleguide uses arabic, alpha for level 1 and 2 +% New versions of sphinx ignore this and set the formatting based on the +% source text +\setlist[enumerate,1]{label=\arabic*.} +\setlist[enumerate,2]{label=\alph*.} +\setlist[enumerate,3]{label=\roman*.} + +% AIG styleguide uses bullet and em-dash for level 1 and 2 +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=---} +\setlist[itemize,3]{label=$\circ$} + +% Remove Sphinx hack for formatting multiple terms in definition list +% It forces the list formatting, and breaks the styling done with enumitem +\renewcommand\sphinxlineitem[2]{\item[#1]\leavevmode#2}% + +% Define standard definition list format +\def\termmargin {13ex} +\def\termindent {2ex} +\def\termspace {1ex} + +\setlist[description]{% + style=nextline,% + labelindent=\termindent, labelwidth=!, labelsep=\termspace,% + itemindent=0ex, leftmargin=\termmargin,% + font=\normalfont,% + topsep=3pt, partopsep=0pt, itemsep=2pt, parsep=3pt% +} + +% Define API subitem definition list format +% psa-api-tool.py wraps the subitem lists in a apisubitem environment - so +% we can define that environment to set the description format +\def\apiitemwidth {29ex} +\def\apiitemindent { 2ex} +\def\apiitemspace { 1ex} + +\newenvironment{sphinxclassapisubitem} + {\setlist[description]{% + style=nextline,% + labelindent=\apiitemindent, labelwidth=\apiitemwidth,% + labelsep=\apiitemspace, itemindent=0ex, leftmargin=!,% + font=\normalfont,% + topsep=3pt, partopsep=0pt, itemsep=2pt, parsep=3pt% + }} + {} + +% Define Threat card definition list format +\def\threatlabelwidth {22ex} +\def\threatlabelindent { 0ex} +\def\threatlabelspace { 1ex} + +\newenvironment{sphinxclassthreat} + {\setlist[description]{% + style=nextline,% + labelindent=\threatlabelindent, labelwidth=\threatlabelwidth,% + labelsep=\threatlabelspace, itemindent=0ex, leftmargin=!,% + font=\sphinxstylestrong,% + topsep=6pt plus 2pt minus 1pt, partopsep=0pt,% + itemsep=2pt, parsep=6pt plus 2pt minus 1pt% + }} + {} + +\newenvironment{sphinxclassriskrow} + {\renewcommand{\arraystretch}{1.2}% + \setlength\tabcolsep{0pt}% + \def\sphinxattableend{}% + \vskip\dimexpr-\parskip-\baselineskip\relax% + } + {} diff --git a/tools/templates/psa-api-2022/sphinx-templates/indextoc.html b/tools/templates/psa-api-2022/sphinx-templates/indextoc.html new file mode 100644 index 00000000..549e3123 --- /dev/null +++ b/tools/templates/psa-api-2022/sphinx-templates/indextoc.html @@ -0,0 +1,8 @@ +<!-- +SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +SPDX-License-Identifier: Apache-2.0 +--> + +<ul> +<li class="toctree-l1"><a class="reference internal" href="{{ pathto("psa_c-identifiers.html", 1) }}">Index of API elements</a></li> +</ul> diff --git a/tools/templates/psa-api-2022/sphinx-templates/toc.html b/tools/templates/psa-api-2022/sphinx-templates/toc.html new file mode 100644 index 00000000..d11a6126 --- /dev/null +++ b/tools/templates/psa-api-2022/sphinx-templates/toc.html @@ -0,0 +1,11 @@ +<!-- +SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +SPDX-License-Identifier: Apache-2.0 +--> + +<hr /> +<h3><a href="{{ pathto(master_doc) }}"><b>{{ dochtmltitle }}</b></a></h3> +{{ docid }}<br/> +Version {{ docreleasefull }} +<hr /> +{{ toctree() }} diff --git a/tools/templates/psa-api-2022/template-conf.py b/tools/templates/psa-api-2022/template-conf.py new file mode 100644 index 00000000..8c6b80cd --- /dev/null +++ b/tools/templates/psa-api-2022/template-conf.py @@ -0,0 +1,97 @@ +# SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +# SPDX-License-Identifier: Apache-2.0 + +# -*- coding: utf-8 -*- +# +# Adjust or reset the template_info dictionary with customized +# sphinx configurations for this template + +template_info['logo_file'] = 'Arm_logo_blue_RGB' +template_info['html_theme'] = 'alabaster' +template_info['html_css_files'] = [ + ('https://fonts.googleapis.com', { 'rel': 'preconnect' }), + ('https://fonts.gstatic.com', { 'rel': 'preconnect', 'crossorigin': None }), + ('https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;1,400&display=swap', { 'rel': 'stylesheet' }), + ('https://fonts.googleapis.com/css2?family=Inconsolata:wght400;700&display=swap', { 'rel': 'stylesheet' }) +] +template_info['mathjax3_config'] = { + 'chtml': { + 'mtextInheritFont': True + } +} +template_info['latex_pointsize'] = '11pt' +template_info['latex_fonts'] = [ + r'\usepackage[default]{lato}', + r'\usepackage[scaled=0.91]{inconsolata}' + ] +template_info['latex_sphinxsetup'] = [ + # Use black for titles + 'TitleColor={rgb}{0,0,0}', + # Reduce margins + 'hmargin={1.9cm,1.25cm}', + 'vmargin={3.5cm, 3cm}', + 'marginpar=1.27cm', + # Format the verbatim blocks + 'verbatimwithframe=true', + 'verbatimsep=3pt', + 'VerbatimBorderColor={rgb}{0.9,0.9,0.9}', + 'verbatimborder=0.5pt', + 'VerbatimColor={rgb}{0.97,0.97,0.97}', + # format hyperlink color + 'InnerLinkColor={rgb}{0,0.569,0.741}', + 'OuterLinkColor={rgb}{0,0.569,0.741}', + # format admonitions + 'noteBorderColor={rgb}{0.667,0.667,0.667}', + 'warningBorderColor={rgb}{.75,0.5,0.5}', + 'warningborder=2pt', + # Use attention admonition for the front page banner + 'attentionBorderColor={rgb}{.8,.8,0}', + 'attentionBgColor={rgb}{1,1,.7}', + 'attentionborder=1pt', + # Use error admonition for rationale boxes + 'errorBorderColor={rgb}{.5,.75,.5}', + 'errorBgColor={rgb}{.9,.95,.9}', + 'errorborder=1pt', + # Use the normal font for headings + 'HeaderFamily=\\normalfont\\bfseries', + ] +template_info['latex_table_style'] = ['booktabs','nocolorrows'] +template_info['graphviz_dot_args'] = [ + '-Gfontname=Lato', + '-Gfontsize=12', + '-Nfontname=Lato', + '-Nfontsize=12', + '-Efontname=Lato', + '-Efontsize=12' +] + +def make_doc_filename(info, id, title, version, status): + if all((k in info for k in ('doc_id','quality','issue_no'))): + return '-'.join([id.replace(' ',''), title, version]) + return None + +template_info['make_filename'] = make_doc_filename + +template_info['front_sections'] = [ + 'abstract', + 'release-info', + 'todos', + 'license', + 'references', + 'terms', + 'potential-for-change', + 'conventions', + 'pseudocode', + 'assembler', + 'current-status', + 'feedback', + 'inclusive-language', + ] + +if 'author' not in doc_info: + doc_info['author'] = 'Arm Limited' +doc_info.setdefault('feedback', 'visit :url:`github.com/arm-software/psa-api/issues`' + + ' to create a new issue at the PSA Certified API GitHub project') +# force use of Arm copyright notice and OSS license +doc_info['copyright'] = 'Arm Limited and/or its affiliates' +doc_info['license'] = 'arm-psa-certified-api-license' diff --git a/tools/templates/psa-api-2022/title-page.rst b/tools/templates/psa-api-2022/title-page.rst new file mode 100644 index 00000000..211eba49 --- /dev/null +++ b/tools/templates/psa-api-2022/title-page.rst @@ -0,0 +1,42 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. only:: html + + .. template-image:: Arm_logo_blue_RGB.svg + :alt: Arm + :class: titlelogo + +========================== +|docrsttitle| |docversion| +========================== + +.. only:: html + + .. csv-table:: + :class: titletable borderless + + Document number:, |docid| + Release Quality:, |docquality| + Issue Number:, |docissue| + Date of Issue:, |docdate| + +.. raw:: latex + + \begin{psatitle} + +.. insert-banner:: + +.. insert-section:: Abstract + :section: abstract + :not-in-toc: + +.. raw:: latex + + \end{psatitle} + +.. only:: html + + .. insert-section:: Contents + :not-in-toc: + :keep-if-empty: diff --git a/tools/templates/psa-api-2025/ARM_LOGO-2025_INK_RGB.pdf b/tools/templates/psa-api-2025/ARM_LOGO-2025_INK_RGB.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4b9affc9d64345773138f860083bd11a96d8b5c7 GIT binary patch literal 1734 zcmY!laB<T$)HCN&-THRjZ!QxB1BLvgEG`=x1%02?y!4U`1yi6<5SN02g1%d3PDyGJ zkj_agNp(q0&QD3@va{nVE-6Y)%;l<>lN%bHC#%TwH(fMGLB#&Rh8~@TyMiwFKUw_t z-%`29jXQl8d(3>;v$4NletOZ-``i!j%WMw0c2m{f?$Y`YZ&9Jg(>{jfu9)y>>XxgP zpWbi(^S1hIe*L6Qk*D(_PaS!zeBQ0~rrC$OhMQ?GKYX9}eeVAWQ{0yuMKG3bG+OgC zGltE{jBTQuf|b|lTT43XW0$)xTjzRqU9s=YlD#Q&x0c8nteolQ&ZJx{d-|)lZZGS; zTZ;;1<vErvRSaR!EbldrY`mG~f2jMF@_(N*dy1~y^fGPbk$!o$E94Z@{8h%cdrC?^ z6qU)!@2swq%XMD1_lsrm@tafcq|g1Z<56DAU$##>V^X-pGTC>Y+p#e+CuOsUT;Ngv z%8I-rEV6ehrq2+0w(j4`kB%#jU0x{m>xPS>!tY-X<{a8E@p03ukZ(+8A@^c7getuf z-FNVd7FX%_Yd=IZ7fOk4yVl=XdbWV?<%!2x77f{x!#J!qxN%H)ozZ%A=@t%^`~~l# zD)ZO8D)Z-)-O9K;W8t5Tnc}r-EC)WHn{@G3E@#D(kF%dIIMRKWH=>|sS3$3P(Z1bm z-%l(s5cYlF9xUPZ==|j$b;?gV*L9zHQEq&2`=+cFZx&D9))(Lzw#JzMPKVgy+{QVz zY}G4nJv`5Pd{+Uhu-=azoy0{>HXE4d94#~W`}^|=&(`hBtCDXwOuSxm)^Dxq6YlzZ zCrq4*tUsGBUL+-3!XP;>z3bil`C$_iPS@UYWe>XgeDR5%QiZ9_eCM^xN^38aze$<3 z-T1uawOya)eU`b=ood*f&CXl$pyZ}`llS4&kMHignN1K#yS9AR+E~4Znr)MLeH@}T z%oLE%O&8fJ5D?wFfia}Q_uu2Tuu~E88JwltItm?MN^(n{`#6cQLH&WEo@m5ddDbht zgXdnE#;{-U^<z)}4M%TpW@vJ%ZtQ2>-RjOQI4NJFH@9T<gX+7|za}Zpy2mUlYE}^9 zVP1B61KTO_zv35Wu2}!<oqLsUJ>%i?Ss`4hc`48Y4`hL|3MhYoXkZR8H!%XqgLua9 zj0Da)t`#Nj!6m?KqhMnL5IL<1m4LEqU?!B9azIT1(#GZRn(NCFYm9CNri3i=_H z1*r=9{z+NECAnZzp*hq7o<sc<48am^nMK7V3MNoC{#<JuZ1AA#S=Uo01~v=ESWN$c zOo#f<&<y4*OCp?QXoTc0m|H;ZGBPI0VWATbW*s&VaC!f)Yv&X-ksQx$!PYZm9yw?% z6_|9-i{DAGZ()SnB=67PV=Xs&U(A%Zo+UZ0*>#R$`b38Fl}9WuE$Ugtb@KPt>mGcY zF6uE&*t0FYou9)%=A-4JTRd~w`^{zt7H)WEqmjEYVAEDMn`f?b5(_`>D}SvbnVFng zpE<R=H+S0U+vZ{3_h;p)?>&~ZUCif+&T@;@Uo4aTd+d$2&GGq{^ssSF^FM{Pe3nj| z1oylw*53ZC{gF}C$`hv|I@X*pp5iKLJS+U=orRy5l$}WXd2iN2_s~|wGv=o!`n_<u za_ZdIgHf^Sf0**wZGBC1-+n1y{iSd}?*uKDx+~{+!ZO=SzS&F+_!%wi?*8-owrO#7 zGoQsx<12da<-K3hx9}-uM1jK_8dF9V7O<!?L?lI65{d{)O+!vVrj|G(1e8#NGpkY+ z3?VTXt`KdgV5DFa3)T^opI@S2Xb6vI&%CsJ1w#WcAGu~oPDuFie|~4<<VHpp14AQs z0|Nu256qlt>JucaJGL@-Y|v=rDDJRw6F7M0M3t1rv0ojHj11Q!S=V6tvbZF%sHCC@ R=mA4h12ZmFRabvEE&vW7&Ts$# literal 0 HcmV?d00001 diff --git a/tools/templates/psa-api-2025/ARM_LOGO-2025_INK_RGB.pdf.license b/tools/templates/psa-api-2025/ARM_LOGO-2025_INK_RGB.pdf.license new file mode 100644 index 00000000..8c3078e2 --- /dev/null +++ b/tools/templates/psa-api-2025/ARM_LOGO-2025_INK_RGB.pdf.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license diff --git a/tools/templates/psa-api-2025/ARM_LOGO-2025_INK_RGB.svg b/tools/templates/psa-api-2025/ARM_LOGO-2025_INK_RGB.svg new file mode 100644 index 00000000..84df36bb --- /dev/null +++ b/tools/templates/psa-api-2025/ARM_LOGO-2025_INK_RGB.svg @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 28.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="4332.3px" height="1318.7px" viewBox="0 0 4332.3 1318.7" style="enable-background:new 0 0 4332.3 1318.7;" + xml:space="preserve"> +<style type="text/css"> + .st0{fill:#080225;} +</style> +<g> + <path class="st0" d="M977.9,31.9h290.4v1247.6H977.9v-130.4C850.5,1297.2,693.4,1318,604.5,1318C219.3,1318,0,998,0,654.2 + C0,248.2,278.5-0.7,607.5-0.7c91.9,0,251.9,23.7,370.4,177.8V31.9z M296.3,660.1c0,216.3,136.3,397.1,346.7,397.1 + c183.7,0,352.6-133.3,352.6-394.1c0-272.6-168.9-403-352.6-403C432.6,260.1,296.3,437.9,296.3,660.1z M1614.1,31.9h290.4v112.6 + c32.6-38.5,80-80,121.5-103.7c56.3-32.6,112.6-41.5,177.8-41.5c71.1,0,148.2,11.9,228.2,59.3l-118.5,263.7 + c-65.2-41.5-118.5-44.4-148.2-44.4c-62.2,0-124.5,8.9-180.8,68.2c-80,85.9-80,204.5-80,287.4v646h-290.4V31.9z M2619.5,31.9h290.4 + v115.6C3007.7,29,3123.3-0.7,3218.1-0.7c130.4,0,251.9,62.2,323,183.7C3644.8,34.9,3801.9-0.7,3911.5-0.7 + c151.1,0,284.5,71.1,355.6,195.6c23.7,41.5,65.2,133.3,65.2,314.1v770.5h-290.4V592c0-139.3-14.8-195.6-26.7-222.2 + c-17.8-47.4-62.2-109.6-165.9-109.6c-71.1,0-133.3,38.5-171.9,91.9c-50.4,71.1-56.3,177.8-56.3,284.5v643h-290.4V592 + c0-139.3-14.8-195.6-26.7-222.2c-17.8-47.4-62.2-109.6-166-109.6c-71.1,0-133.3,38.5-171.9,91.9c-50.4,71.1-56.3,177.8-56.3,284.5 + v643h-290.4V31.9z"/> +</g> +</svg> diff --git a/tools/templates/psa-api-2025/ARM_LOGO-2025_INK_RGB.svg.license b/tools/templates/psa-api-2025/ARM_LOGO-2025_INK_RGB.svg.license new file mode 100644 index 00000000..8c3078e2 --- /dev/null +++ b/tools/templates/psa-api-2025/ARM_LOGO-2025_INK_RGB.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license diff --git a/tools/templates/psa-api-2025/about-chapter.rst b/tools/templates/psa-api-2025/about-chapter.rst new file mode 100644 index 00000000..3e09491a --- /dev/null +++ b/tools/templates/psa-api-2025/about-chapter.rst @@ -0,0 +1,147 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. role:: anchor + +.. _about-this-document: + +=================== +About this document +=================== + +.. _release-info: + +.. insert-section:: Release information + :section: release-info + :break-after: + + The change history table lists the changes that have been made to this document. + + .. release-table:: Document revision history + +.. only:: include_todo + + .. insert-section:: TODO items + :section: todos + :break-after: + :not-in-toc: + + The following items are marked up as TODO in the document source: + + .. todolist:: + +.. insert-section:: |docfulltitle| + :not-in-toc: + + Copyright © |doccopyright|. The copyright statement reflects the fact that some + draft issues of this document have been released, to a limited circulation. + +.. include-license:: + +.. _license: + +.. insert-section:: License + :section: license + :class: license + :break-after: + +.. _references: + +.. insert-section:: References + :section: references + + This document refers to the following documents. + + .. reference-table:: Documents referenced by this document + +.. _terms: + +.. insert-section:: Terms and abbreviations + :section: terms + + This document uses the following terms and abbreviations. + + .. term-table:: Terms and abbreviations + :sorted: + +.. _potential-for-change: + +.. insert-section:: Potential for change + :section: potential-for-change + + The contents of this specification are stable for |API| version |APIversion|. + + The following may change in |APIversion|.x maintenance updates to this specification: + + * Defect fixes + * Clarifications + * Editorial improvements + + Functionality additions, or any changes that affect the compatibility of the interfaces defined in this specification will only be included in a new major or minor version of the specification. + + +.. _conventions: + +.. insert-section:: Conventions + :section: conventions + + .. insert-section:: Typographical conventions + + The typographical conventions are: + + *italic* + Introduces special terminology, and denotes citations. + + ``monospace`` + Used for assembler syntax descriptions, pseudocode, and source code examples. + + Also used in the main text for instruction mnemonics and for references to + other items appearing in assembler syntax descriptions, pseudocode, and + source code examples. + + :sc:`small capitals` + Used for some common terms such as :sc:`implementation defined`. + + Used for a few terms that have specific technical meanings, and are included + in the *Terms and abbreviations*. + + :issue:`Red text` + Indicates an open issue. + + :anchor:`Blue text` + Indicates a link. This can be + + * A cross-reference to another location within the document + * A URL, for example :url:`example.com` + + .. insert-section:: Numbers + + Numbers are normally written in decimal. Binary numbers are preceded by 0b, and + hexadecimal numbers by ``0x``. + + In both cases, the prefix and the associated value are written in a monospace + font, for example ``0xFFFF0000``. To improve readability, long numbers can be + written with an underscore separator between every four characters, for example + ``0xFFFF_0000_0000_0000``. Ignore any underscores when interpreting the value of + a number. + +.. _current-status: + +.. insert-section:: Current status and anticipated changes + :section: current-status + +.. _feedback: + +.. insert-section:: Feedback + :section: feedback + + We welcome feedback on the |docfulltitle|. + + If you have comments on the content of this specification, |docfeedback|. Give: + + * The title (|docfulltitle|). + * The number and issue (|docid| |docrelease|). + * The location in the document to which your comments apply. + * A concise explanation of your comments. + + We also welcome general suggestions for additions and improvements. diff --git a/tools/templates/psa-api-2025/html-static/custom.css b/tools/templates/psa-api-2025/html-static/custom.css new file mode 100644 index 00000000..73985f7f --- /dev/null +++ b/tools/templates/psa-api-2025/html-static/custom.css @@ -0,0 +1,520 @@ +/* SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited */ +/* SPDX-License-Identifier: Apache-2.0 */ + +/* CSS overrides for the html output */ + +body { + font-family: Lato, sans-serif; + font-size: 15px; + font-weight: 300; + color: #080225; +} + +div.document { + width: 965px; +} + +div.bodywrapper { + margin: 0 0 0 270px; +} + +div.body { + background-color: unset; + color: #080225; + padding: 0; +} + +div.sphinxsidebar { + width: 240px; + font-size: 12.5px; + margin-top: -30px; +} + +div.sphinxsidebarwrapper { + padding: 0; +} + +div.sphinxsidebarwrapper p.logo { + margin: 0; +} + +div.footer { + width: 965px; +} + +div.watermark { + position: fixed; + width: 660px; + height: 100%; + z-index: -999; + pointer-events: none; + } + +div.watermark p { + color: #EEE; + font-size: 160px; + font-weight: 400; + pointer-events: none; + user-select: none; + margin: 0px; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%) rotate(-45deg); + } + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Lato, sans-serif; + font-weight: 400; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Lato, sans-serif; + font-size: 20px; +} + +p.rubric { + font-weight: 400; +} + +div.body input, div.sphinxsidebar input { + font-family: Lato, sans-serif; + font-size: 15px; +} + +div.line { + line-height: 1.4em; +} + +a, a:visited { + color: #0042c0; + text-decoration: none; +} + +a.reference, div.sphinxsidebar a.reference { + border-bottom: none; +} + +a.reference:hover, div.sphinxsidebar a.reference:hover, a:hover code, a:hover tt { + color: #561bc6; + border-bottom: 1px dotted #561bc6; + background: unset; +} + +pre a:hover, a:hover code, a:hover tt { + font-weight: 400; +} + +mjx-math { + color: #5b566d +} + +tt, code { + font-family: "Noto Sans Mono", monospace; + font-size: 80%; + background-color: unset; + color: #080225; +} + +h3 code, h4 code { + font-size: 88%; +} + +code.xref, a code { + font-weight: 300; + color: #0042c0; + background-color: unset; + border-bottom: unset; +} + +pre { + font-family: "Noto Sans Mono", monospace; + font-size: 76%; + color: #080225; + background: rgba(187,187,187,0.12); + padding: 5px; + margin: 10px -6px; + line-height: 1.3em; + border-style: solid; + border-width: 1px; + border-radius: 5px; + border-color: rgba(187,187,187,0.3); +} + +/* Fix the specific overrides in basic.css and alabaster.css for code blocks */ +div.highlight pre, dl pre, blockquote pre, li pre { + padding: 5px; + margin: 10px -6px; +} + +sub { + font-size: 70%; + vertical-align: -10%; + font-weight: 400; + color: #5b566d; +} + +sup { + font-size: 70%; + line-height: normal; + vertical-align: 25%; + font-weight: 400; + color: #5b566d; +} + +/* Default table formatting is like 'booktabs', 'standard' formatting can + can be specified explicitly. + */ + +table { + font-weight: 300; +} + +table.docutils { + font-size: unset; + box-shadow: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + /*width: 100%;*/ + border: 0; + border-top: 1px solid #AAA; + border-bottom: 1px solid #AAA; + margin-bottom: 1em; +} + +table.docutils.align-left { + margin-left: 0; + margin-right: auto; +} + +table.docutils.align-right { + margin-left: auto; + margin-right: 0; +} + +table.docutils.standard { + border: 1px solid #AAA; +} + +table.docutils.borderless { + border: 0; +} + +table.docutils.borderless.titletable { + margin-top: 40px; + width: 70%; + margin-right: 0px; + margin-left: auto; +} + +table.docutils caption, div.figure p.caption, figcaption { + font-size: 90%; + text-align: right; + margin-right: -13px; /* move permalink into margin */ +} + +table.docutils caption span.caption-number, div.figure p.caption span.caption-number, figcaption span.caption-number { + font-weight: 400; + font-style: normal; +} + +table.docutils td, table.docutils th { + border: 0; + padding: 0.15em 0.5em 0.15em 0.5em; + text-align: left; + vertical-align: baseline; +} + +table.docutils tr:first-child th, table.docutils tr:first-child td { + padding-top: 0.4em; +} + +/* Add all rules for standard table formatting */ +table.docutils.standard td, table.docutils.standard th { + border: 1px solid #AAA; +} + +table.docutils td p, table.docutils th p, table.docutils td .line-block { + margin-block-start: .3em; + margin-block-end: .3em; +} + +table.docutils th > p:first-child, table.docutils td > p:first-child { + margin-top: 0px; +} + +table.docutils th { + font-weight: 400; + font-size: 90%; +} + +/* rule below stub rows */ +table.docutils th.stub { + border-bottom: none; +} + +table.docutils.standard th.stub { + border-bottom: 1px solid #AAA; +} + +/* rule below header rows */ +table.docutils th.head { + border-bottom: 0; +} + +table.docutils tr:last-child > th.head { + border-bottom: 1px solid #AAA; +} + +table.docutils.borderless tr:last-child > th.head { + border-bottom: 0; +} + +table.docutils.standard th.head { + border-bottom: 1px solid #AAA; +} + +table.docutils.borderless th.head { + border-bottom: 0; +} + +figure { + margin-inline-start: 0px; + margin-inline-end: 0px; +} + +div.figure div.legend, figcaption div.legend { + font-size: 90%; /* adds to the figcaption scaling */ + text-align: center; +} + +div.figure p.caption, div.figure div.legend p, figcaption p, figcaption div.legend { + margin-block-start: 0.2em; + margin-block-end: 0.5em; +} + +table.docutils caption { + margin-bottom: 0.25em; +} + +div.admonition { + margin: 5px 15px; + padding: 5px 15px; + background-color: unset; + border: 0; + border-left: 6px solid #DDD; +} + +div.admonition p.admonition-title { + font-family: Lato, sans-serif; + font-weight: 400; + font-size: 90%; +} + +p.admonition-title:after { + content: ""; +} + +div.admonition p { + margin-top: 0; + margin-bottom: 5px; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: unset; +} + +div.highlight { + background-color: unset; +} + +div.admonition div.highlight pre { + background-color: unset; +} + +div.warning { + border-left: 6px solid #FBB; +} + +div.warning p.admonition-title { + color: darkred; +} + +div.banner { + border: 2px solid #CC0; + background-color: rgba(255,255,0,0.25); +} + +div.rationale { + border-left: 6px solid #BFB; + background-color: rgba(127,255,127,0.125); +} + +div.rationale p.admonition-title { + color: darkgreen; +} + +div.comment p.admonition-title { + color: #555; +} + +div.comment { + border-left: 6px solid #ccc; + background-color: #f8f8f8; + color: #555; + font-size: 95%; +} + +div.admonition-todo { + border-left: 6px solid #CC0; + background-color: rgba(255,255,0,0.25); +} + +div.admonition-todo p.admonition-title { + color: #660; +} + +.scterm, .sc { + font-variant: small-caps; + text-transform: lowercase; +} + +.license{ + font-size: 80%; +} + +div.license p.sectiontitle { + display: block; + margin-top: 24px; + font-weight: 400; + font-size: 144%; +} + +.anchor { + color: #0042c0; +} + +.issue { + color: red; +} + +.term { + font-style: italic; +} + +.secref { + font-style: italic; +} + +.sectiontitle { + display: block; + margin-top: 30px; + font-weight: 400; + font-size: 180%; +} + +.sralabel { + font-weight: 400; + font-size: 90%; +} + +.sradef { + font-weight: 400; + font-size: 90%; +} + +.sraref { + font-size: 90%; +} + +img.titlelogo { + float: left; + margin-top: 0.7em; + margin-bottom: 8em; + margin-right: 5%; + width: 25%; +} + +img.logo { + display: block; + margin: 1em auto; + width: 40%; +} + +div.sphinxsidebar hr { + width: 100%; +} + +dl dd { + margin-left: 3em; + margin-top: 0.2em; + margin-bottom: 0.8em; +} + +dl p { + margin-block-start: 0.6em; + margin-block-end: 0.6em; +} + +div.apisubitem dl { + display: grid; + grid-template-columns: 30ex 1fr; /* term column + description column */ + gap: 0 0.5ex; /* row gap, column gap */ + align-items: start; +} + +div.apisubitem dt p { + margin-block-start: 0; + margin-block-end: 0; +} + +div.apisubitem dd { + margin: 0; +} + +div.threat dl { + display: grid; + grid-template-columns: 20ex 1fr; /* term column + description column */ + gap: 0 0.5ex; /* row gap, column gap */ + align-items: start; +} + +div.threat dt p { + margin-block-start: 0; +} + +div.threat dd { + margin: 0; +} + +div.riskrow table.docutils.borderless { + width: 100%; + margin-top: 0; + margin-bottom: 0.6em; +} + +div.riskrow table.docutils td { + padding: 0; +} + +div.riskrow table.docutils td p { + margin: 0; +} + +ol { + list-style-type: decimal; /* 1, 2, 3 */ +} + +ol ol { + list-style-type: lower-alpha; /* a, b, c */ +} + +ol ol ol { + list-style-type: lower-roman; /* i, ii, iii */ +} diff --git a/tools/templates/psa-api-2025/psa-api-tool.sty b/tools/templates/psa-api-2025/psa-api-tool.sty new file mode 100644 index 00000000..a6516e2c --- /dev/null +++ b/tools/templates/psa-api-2025/psa-api-tool.sty @@ -0,0 +1,530 @@ +% SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +% SPDX-License-Identifier: Apache-2.0 + +% Hide the warning when multiple inkscape-generated PDF [image] files are +% rendered on the same page +\pdfsuppresswarningpagegroup=1 + +% Set the ToC depth to include sub-section headings +\setcounter{tocdepth}{2} + +% Set the PDF bookmark depth to include sub-sub-section headings (API elements) +% The final level is not in the TOC +\def\psabookmarkdepth{3} + +\usepackage{apptools} +\usepackage{titletoc} +\usepackage{enumitem} +\usepackage[depth=\psabookmarkdepth, numbered]{bookmark} +\usepackage{caption} +\usepackage{ifthen} +\usepackage{xstring} +\usepackage[section]{placeins} +\usepackage{scalefnt} + +% The Sphinx DUrole command fails when multiple classes are defined +% This version splits the roles, and creates a nested set of calls to +% the sphinx command, +\let\sphinxDUrole\DUrole +\renewcommand{\DUrole}[2]{% + \IfSubStr{\detokenize{#1}}{,}{% + \StrBefore[1]{\detokenize{#1}}{,}[\myhead]% + \StrBehind[1]{\detokenize{#1}}{,}[\mytail]% + \expandafter\sphinxDUrole\expandafter{\myhead}{\expandafter\DUrole\expandafter{\mytail}{#2}}% + }{\sphinxDUrole{#1}{#2}}% +} +\MakeRobust\DUrole + +% PSA document styling +\def\psah {\normalfont\fontsize{20pt}{24pt}\fontseries{m}\selectfont} +\def\psahh {\normalfont\fontsize{16pt}{19.2pt}\fontseries{m}\selectfont} +\def\psahhh {\normalfont\fontsize{14pt}{16.8pt}\fontseries{m}\selectfont} +\def\psahhhh {\normalfont\fontsize{12.5pt}{15pt}\fontseries{m}\selectfont} +\def\psabody {\normalfont\fontsize{11pt}{13.2pt}\fontseries{l}\selectfont} +\def\psasmall {\normalfont\fontsize{10pt}{12pt}\fontseries{l}\selectfont} +\def\psafootnote {\normalfont\fontsize{9pt}{10.8pt}\fontseries{l}\selectfont} +\def\psascript {\normalfont\fontsize{8pt}{9.6pt}\fontseries{l}\selectfont} +\def\psasc {\scalefont{0.75}} +\def\psacitation {\itshape} +\def\psalicense {\psafootnote} +\def\psasubtext {\psascript} +\def\psasubtitle {\psabody\mdseries} +\def\psathead {\psasmall\mdseries} +\def\psalabel {\psasmall\mdseries} +\def\psacaption {\psasmall} +\def\psalegend {\psafootnote} +\def\psacontd {\psafootnote\mdseries} + +\definecolor{psaissue}{rgb}{1,0,0} +\definecolor{psaink}{rgb}{0.03,0.01,0.145} + +% Set up PSA style spacing rules +\frenchspacing +% remove justification on main text +\raggedright +% the line leading already gives us 2pt (in LaTeX spacing model) +\setlength{\parskip}{6pt plus 2pt minus 1pt} + + +% Define the heading styles for level 1-4 +\ifdefined\docchapterbreak + \titleclass{\chapter}{top} +\else + \titleclass{\chapter}{straight} +\fi +\titleformat{\chapter} + {\psah} + {\IfAppendix{\appendixname\ \thechapter:}{\thechapter}} + {0.5em}{}{} +\titlespacing{\chapter}{0pt}{*6}{*1} + +\titleformat{\section} + {\psahh} + {\thesection} + {0.5em}{}{} +\titlespacing{\section}{0pt}{*4.5}{*1} + +\titleformat{\subsection} + {\psahhh} + {\thesubsection} + {0.5em}{}{} +\titlespacing{\subsection}{0pt}{*4}{*1} + +\titleformat{\subsubsection} + {\psahhhh} + {\thesubsubsection} + {0.5em}{}{} +\titlespacing{\subsubsection}{0pt}{*3}{*1} + +% Add a watermark if requested +\ifdefined\docwatermark + \usepackage{draftwatermark} + \SetWatermarkText{\mdseries\docwatermark} + \SetWatermarkScale{0.8} + \SetWatermarkColor[gray]{0.93} +\fi + +% remove emphasis on cross references +\def\sphinxcrossref#1{#1} + +% define a macro to provide a hyperlinked page reference, if on another page +% this is used for Section, Figure and Table references +\newcounter{testpagecount} +\DeclareRobustCommand\ifrefthispage[3]{% + \refstepcounter{testpagecount}\label{tpc\thetestpagecount}% + \ifthenelse{\equal{\pageref{#1}}{\pageref{tpc\thetestpagecount}}}{#2}{#3}% +} + +\newcommand\psapageref[1]{\ifrefthispage{#1}{}{\hyperref[#1]{{} on page~\pageref{#1}}}} + +% Define the format for the index sub-headings +\def\sphinxstyleindexlettergroup #1{{\psahhhh#1}\nopagebreak\vspace{4pt}} + +% set the size of API element names in subsubsection titles +\def\sphinxstyleliteralintitle#1{{\scalefont{1.1}\texttt{#1}}} + +\def\sphinxstylestrong#1{{\fontseries{m}\selectfont{#1}}} +\def\sphinxstrong#1{{\fontseries{m}\selectfont{#1}}} + +\raggedright + +% define the specification rule color +\definecolor{psarulecolor}{gray}{0.75} +\def\psarulewidth{.8pt} + +% Layout and style for tables + +\arrayrulecolor{psarulecolor} +\heavyrulewidth=.8pt + +% Set the table header rows font style +\def\sphinxstyletheadfamily {\psathead} + +% Set the table continuation style +\def\sphinxtablecontinued{\psacontd} + +% Table row spacing +\renewcommand{\arraystretch}{1.4} + +% Table captions +\captionsetup[table]{position=top} +\DeclareCaptionFormat{custom} +{% + \psalabel{#1#2}\psacaption{#3} +} +\captionsetup{% + format=custom, + margin={2cm,0cm}, justification=raggedleft, singlelinecheck=false, + labelsep=space +} + +% Formatting for table cells +% * default paragraph spacing is 0pt, use a smaller (non-zero) spacing +% * reduced item spacing +% * left aligned text +\def\psacellformat{% + \setlength\parskip{3pt plus 1pt minus 1pt}% + \setlist[1]{topsep=2pt, partopsep=0pt, itemsep=1pt, parsep=2pt minus 1pt}% + \raggedright\arraybackslash% + } + +% redefine sphinx column types to be left aligned, with adjusted spacing +\makeatletter +\newcolumntype{\X}[2]{>{\psacellformat}p{\dimexpr + (\linewidth-\spx@arrayrulewidth)*#1/#2-\tw@\tabcolsep-\spx@arrayrulewidth\relax}} +\newcolumntype{\Y}[1]{>{\psacellformat}p{\dimexpr + #1\dimexpr\linewidth-\spx@arrayrulewidth\relax-\tw@\tabcolsep-\spx@arrayrulewidth\relax}} +\newcolumntype{T}{>{\psacellformat}L}% +\makeatother + +% Figure legend formatting comes after caption and may contain arbitrary body elements +\renewenvironment{sphinxlegend}{\par\medskip\psalegend}{\par} + +% format Notes to have a wider left margin +\renewenvironment{sphinxnote}[1] + {\list{}{\leftmargin1cm}\item[]\begin{sphinxlightbox}\sphinxstrong{#1}\par }{\end{sphinxlightbox}\endlist} + +% format for banner box. Use the environment defined for attention admonitions +\makeatletter +\newenvironment{sphinxclassbanner} + {% set parameters of heavybox + \def\spx@noticetype {attention}% + \sphinxcolorlet{spx@notice@bordercolor}{sphinxattentionBorderColor}% + \sphinxcolorlet{spx@notice@bgcolor}{sphinxattentionBgColor}% + \spx@notice@border \dimexpr1pt\relax + \begin{sphinxheavybox} + } + {\end{sphinxheavybox}} +\makeatother + +% format for rationale boxes. Use the environment defined for error admonitions +\makeatletter +\newenvironment{sphinxclassrationale} + {% set parameters of heavybox + \def\spx@noticetype {error}% + \sphinxcolorlet{spx@notice@bordercolor}{sphinxerrorBorderColor}% + \sphinxcolorlet{spx@notice@bgcolor}{sphinxerrorBgColor}% + \spx@notice@border \dimexpr1pt\relax + \begin{sphinxheavybox} + } + {\end{sphinxheavybox}} +\makeatother + +% format for comment boxes. Use the environment defined for error admonitions +\makeatletter +\newenvironment{sphinxclasscomment} + {% set parameters of heavybox + \def\spx@noticetype {hint}% + \sphinxcolorlet{spx@notice@bordercolor}{sphinxhintBorderColor}% + \sphinxcolorlet{spx@notice@bgcolor}{sphinxhintBgColor}% + \spx@notice@border \dimexpr0pt\relax + \begin{sphinxheavybox}% + \color{sphinxhintTextColor}% + \psasmall + } + {\end{sphinxheavybox}} +\makeatother + +% Set up the PSA specification header/footer +\usepackage{fancyhdr} + \pagestyle{fancy} + \fancyhf{} + \fancyfoot[L]{\footnotesize\fontseries{l}\selectfont{\docid\\{}\docreleasefull}} + \fancyfoot[C]{\footnotesize\fontseries{l}\selectfont{\textit{Copyright \textcopyright \doccopyright}}} + \fancyfoot[R]{\footnotesize\fontseries{l}\selectfont{Page \thepage}} + \renewcommand{\headrulewidth}{0pt} + \renewcommand{\footrulewidth}{\psarulewidth} + \renewcommand{\footrule}{{\color{psarulecolor} \rule{\headwidth}{\footrulewidth} \vskip -\footrulewidth}} + +\fancypagestyle{normal}{} +\fancypagestyle{plain}{} + +% Prevent the change of page number style from resetting the page number itself +\newcounter{savepage} +\let\oldpagenumbering\pagenumbering +\renewcommand{\pagenumbering}[1]{\setcounter{savepage}{\value{page}} \oldpagenumbering{#1} \setcounter{page}{\value{savepage}}} + +% A frontmatter environment, which continues roman page numbers, +% does not number titles, but includes them in the TOC. +\newcommand{\psafrontmatter}[1]% + {\pagenumbering{roman}% + \setcounter{secnumdepth}{#1} + } + +\newcommand{\psamain}[1] + {\clearpage% + \pagenumbering{arabic}% + \setcounter{secnumdepth}{#1} + } + +\newcommand{\psaappendix}[1] + {\ifdefined\docappendixbreak \clearpage\fi% + \setcounter{secnumdepth}{#1} + \appendix% + } + +\setcounter{secnumdepth}{2} +\setcounter{tocdepth}{2} + +% The title page command +\newenvironment{psatitle}% +{ + \pagestyle{empty} + \begin{titlepage} + + \setlength{\parindent}{0pt} + \begingroup % for PDF information dictionary + \def\endgraf{ }\def\and{\& }% + \pdfstringdefDisableCommands{\def\\{, }}% overwrite hyperref setup + \hypersetup{pdfauthor={\docauthor}, pdftitle={\docfulltitle{} \docversion}}% + \endgroup + + \noindent\begin{minipage}[t]{5.2cm} + \vspace{0pt}% required to get top-alignment of image and text + \sphinxlogo + \end{minipage} + \hfill\begin{minipage}[t]{0.67\textwidth}\raggedleft% + \vspace{0pt}% required to get top-alignment of image and text + {\psah \doclatextitle{} \docversion\par} + \ifdefined\docowner \medskip\psahhh\docowner\par \fi + \end{minipage} + + \bigskip\bigskip\bigskip + + \newcommand{\psatitlecopyright}{ + \medskip + + \begingroup\raggedleft + \scriptsize{Copyright \textcopyright \doccopyright}\\\par + \endgroup + + \bigskip\bigskip\bigskip\bigskip + } +} +{ + \end{titlepage} + \pagestyle{plain} + \sphinxtableofcontents + \pagestyle{normal} +} + +% emulate small-caps: +\newcommand{\DUrolesc}[1] + {{\psasc\uppercase{#1}}} + +% small caps for special term references +\newcommand{\DUrolescterm}[1] + {{\psasc\uppercase{#1}}} + +% Other glossary term references are emphasized +\newcommand{\DUroleterm}[1] + {{\sphinxstyleemphasis{#1}}} + +% Define issue role as red color +\newcommand{\DUroleissue}[1] + {\textcolor{psaissue}{#1}} + +% Emphasise section and title-text references +\newcommand{\DUrolesecref}[1] + {{\sphinxstyleemphasis{#1}}} + +% SRA definition style +\newcommand{\DUrolesradef}[1] + {{\scalefont{.9}\sphinxstylestrong{#1}}} + +% SRA reference style +\newcommand{\DUrolesraref}[1] + {{\scalefont{.9}#1}} + +% SRA threat card label style +\newcommand{\DUrolesralabel}[1] + {{\psathead{#1}}} + +% associate anchor role with the InnerlinkColor +\newcommand{\DUroleanchor}[1] + {\textcolor{InnerLinkColor}{#1}} + +% Provide sectiontitle role for frontmatter titles that are not in TOC +\newcommand{\DUrolesectiontitle}[1] + {{\psahh #1}} + +\newcommand{\DUroleversionmodified}[1] + {{\psasmall\sphinxstyleemphasis{#1}}} + +% define class environment for the license text (much smaller font) +\newenvironment{sphinxclasslicense} + {\psalicense\setlist[enumerate,1]{label=\bfseries(\roman*)}% + \renewcommand{\DUrolesectiontitle}[1] + {{\psahhh ##1}}% + } + {} + +% If running in a high enough version of sphinx, also +% Divert use of the sphinxalltt environment to use Verbatim. This requires +% setting a default config for Verbatim, which does not work in some earlier +% versions of Sphinx. +% +% This ensures that all literal blocks are rendered using the Verbatim +% configuration below, whether or not sphinx runs the highlighting engine on +% the block. +\newcommand{\useverbatimfortt}{% + \let\sphinxalltt\sphinxVerbatim% + \let\endsphinxalltt\endsphinxVerbatim% + \fvset{commandchars=\\\{\}}% + } + +% Set up the style for the Table of Contents + +\renewcommand{\contentsname}{\psahh Contents} +\contentsmargin{1cm} +\titlecontents{chapter}[1cm] + {\addvspace{16pt}} + {\psahhh\contentslabel{1cm}} + {\psahhh} + {\titlerule[0pt]\contentspage} +\titlecontents{section}[2cm] + {\addvspace{8pt}} + {\psahhhh\contentslabel{2cm}} + {\psahhhh} + {\titlerule[0pt]\contentspage} +\titlecontents{subsection}[2cm] + {} + {\psabody\contentslabel{1.5cm}} + {\psabody} + {\titlerule[0pt]\contentspage} + +% and remove sphinx's ToC overrides +\let\sphinxtableofcontentshook\relax + +% Sphinx/pdflatex does not pick up the chpater title format from titlesec +% So hook the environment to insert formatting in the index title +\renewenvironment{sphinxtheindex}{% + \clearpage + \let\ixtitle\indexname% + \renewcommand{\indexname}{\psahh \ixtitle}% + \phantomsection % needed as no chapter, section, ... created + \begin{theindex}% + \addcontentsline{toc}{chapter}{\ixtitle}% + }{\end{theindex}} + +% This is something of a hack to get consistent, and differentiated API element +% subtitles in the specification. Simple specs might have API elements at +% level 3 headings (subsections), and complex ones at level 4 (subsubsection). +% So using a section level for the subtitles will yield inconsistent results. +% +% psa-api-tool.py uses `rubric` nodes for these sections (so don't use rubric in +% API reference for other things?). Unfortunately, Sphinx does not copy +% docutils and emit a \rubric{} command, it just emits \subsubsection*{}. +% +% As that [starred] command is not used for other elements, we replaced the +% \subsubsection command to intercept these uses and divert them to \rubric{}. +% We can then define \rubric{} as we wish - A bold 10pt runin for the main +% document text, and the original \subsubsection*{} in the appendix. +% +% Older versions of Sphinx directly use \paragraph{} for rubric, so +% also intercept level 5 headings and treat as rubric +% +% Heading 5 is used for all api subtitles +\newcommand{\subtitlett}[1]{{\normalfont\ttfamily #1}} +\newcommand{\apisubtitle}[1]{{\let\sphinxstyleliteralintitle\subtitlett #1}} +\titleformat{\paragraph} + {\psasubtitle} + {} + {0.5em}{\apisubtitle}{} +\titlespacing{\paragraph}{0pt}{*2}{4pt} + +\makeatletter +\let\oldsubsubsection\subsubsection +\renewcommand{\subsubsection} + % Only intercept rubrics in the main section + {\@ifstar{\IfAppendix{\oldsubsubsection*}{\paragraph*}}{\oldsubsubsection}} +\makeatother + +% Format lineblock text (consecutive lines prefixed with |) as a paragraph +% with forced line breaks +\renewenvironment{DUlineblock}[1]{% + \renewcommand{\item}[1][]{\par \renewcommand{\item}[1][]{\\}}% + \setlength{\leftmargin}{#1}% + \raggedright% +}{} + +% Set up item lists, enumerations and definition lists + +% Define spacing for lists +\setlist[1]{topsep=4pt, partopsep=0pt, itemsep=2pt, parsep=3pt plus 1pt minus 1pt} +\setlist[2]{topsep=2pt, partopsep=0pt, itemsep=1pt, parsep=1pt} +\setlist[3]{topsep=2pt, partopsep=0pt, itemsep=1pt, parsep=1pt} + +% Do not use multicols environment for hlist directive, but keep the compactness +\renewenvironment{multicols}[1]{\begingroup}{\endgroup} + +% Use arabic, alpha, roman for level 1-3 +% New versions of sphinx ignore this and set the formatting based on the +% source text +\setlist[enumerate,1]{label=\arabic*.} +\setlist[enumerate,2]{label=\alph*.} +\setlist[enumerate,3]{label=\roman*.} + +% Use bullet, em-dash, and circle for level 1-3 +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=---} +\setlist[itemize,3]{label=$\circ$} + +% Remove Sphinx hack for formatting multiple terms in definition list +% It forces the list formatting, and breaks the styling done with enumitem +\renewcommand\sphinxlineitem[2]{\item[#1]\leavevmode#2}% + +% Define standard definition list format +\def\termmargin {13ex} +\def\termindent {2ex} +\def\termspace {1ex} + +\setlist[description]{% + style=nextline,% + labelindent=\termindent, labelwidth=!, labelsep=\termspace,% + itemindent=0ex, leftmargin=\termmargin,% + font=\psabody,% + topsep=3pt, partopsep=0pt, itemsep=2pt, parsep=3pt% +} + +% Define API subitem definition list format +% This displays as a grid definition list, almost table-like +% psa-api-tool.py wraps the subitem lists in a apisubitem environment - so +% we can define that environment to set the description format +\def\apiitemwidth {31.5ex} +\def\apiitemindent { 0ex} +\def\apiitemspace {.5ex} + +\newenvironment{sphinxclassapisubitem} + {\setlist[description]{% + style=nextline,% + labelindent=\apiitemindent, labelwidth=\apiitemwidth,% + labelsep=\apiitemspace, itemindent=0ex, leftmargin=!,% + font=\psabody,% + topsep=3pt, partopsep=0pt, itemsep=2pt, parsep=3pt% + }} + {} + +% Define Threat card definition list format +\def\threatlabelwidth {20ex} +\def\threatlabelindent { 0ex} +\def\threatlabelspace {.5ex} + +\newenvironment{sphinxclassthreat} + {\setlist[description]{% + style=nextline,% + labelindent=\threatlabelindent, labelwidth=\threatlabelwidth,% + labelsep=\threatlabelspace, itemindent=0ex, leftmargin=!,% + font=\sphinxstylestrong,% + topsep=6pt plus 2pt minus 1pt, partopsep=0pt,% + itemsep=2pt, parsep=6pt plus 2pt minus 1pt% + }} + {} + +\newenvironment{sphinxclassriskrow} + {\renewcommand{\arraystretch}{1.2}% + \setlength\tabcolsep{0pt}% + \def\sphinxattableend{}% + \vskip\dimexpr-\parskip-\baselineskip\relax% + } + {} diff --git a/tools/templates/psa-api-2025/sphinx-templates/indextoc.html b/tools/templates/psa-api-2025/sphinx-templates/indextoc.html new file mode 100644 index 00000000..549e3123 --- /dev/null +++ b/tools/templates/psa-api-2025/sphinx-templates/indextoc.html @@ -0,0 +1,8 @@ +<!-- +SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +SPDX-License-Identifier: Apache-2.0 +--> + +<ul> +<li class="toctree-l1"><a class="reference internal" href="{{ pathto("psa_c-identifiers.html", 1) }}">Index of API elements</a></li> +</ul> diff --git a/tools/templates/psa-api-2025/sphinx-templates/toc.html b/tools/templates/psa-api-2025/sphinx-templates/toc.html new file mode 100644 index 00000000..878dd9d2 --- /dev/null +++ b/tools/templates/psa-api-2025/sphinx-templates/toc.html @@ -0,0 +1,11 @@ +<!-- +SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +SPDX-License-Identifier: Apache-2.0 +--> + +<hr /> +<h3><a href="{{ pathto(master_doc) }}">{{ dochtmltitle }}</a></h3> +{{ docid }}<br/> +Version {{ docreleasefull }} +<hr /> +{{ toctree() }} diff --git a/tools/templates/psa-api-2025/template-conf.py b/tools/templates/psa-api-2025/template-conf.py new file mode 100644 index 00000000..cb90d882 --- /dev/null +++ b/tools/templates/psa-api-2025/template-conf.py @@ -0,0 +1,106 @@ +# SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +# SPDX-License-Identifier: Apache-2.0 + +# -*- coding: utf-8 -*- +# +# Adjust or reset the template_info dictionary with customized +# sphinx configurations for this template + +template_info['logo_file'] = 'ARM_LOGO-2025_INK_RGB' +template_info['html_theme'] = 'alabaster' +template_info['html_css_files'] = [ + ('https://fonts.googleapis.com', { 'rel': 'preconnect' }), + ('https://fonts.gstatic.com', { 'rel': 'preconnect', 'crossorigin': None }), + ('https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,300;0,400;1,300;1,400&display=swap', { 'rel': 'stylesheet' }), + ('https://fonts.googleapis.com/css2?family=Noto+Sans+Mono:ital,wght@0,300;0,400;1,300&display=swap', { 'rel': 'stylesheet' }) +] +template_info['mathjax3_config'] = { + 'chtml': { + 'mtextInheritFont': False, + 'mtextFont': "Lato-Light", + } +} +template_info['latex_pointsize'] = '11pt' +template_info['latex_fonts']= [ + r'\usepackage[default]{lato}', + r'\usepackage[scale=.8]{noto-mono}' + ] +template_info['latex_sphinxsetup'] = [ + # Use black for titles + 'TitleColor={rgb}{0.03,0.01,0.145}', + # Reduce margins + 'hmargin={1.9cm,1.25cm}', + 'vmargin={3.5cm, 3cm}', + 'marginpar=1.27cm', + # Format the verbatim blocks + 'verbatimwithframe=true', + 'verbatimsep=3pt', + 'VerbatimBorderColor={rgb}{0.9,0.9,0.9}', + 'verbatimborder=0.5pt', + 'VerbatimColor={rgb}{0.97,0.97,0.97}', + # format hyperlink color + 'InnerLinkColor={rgb}{0,0.26,0.75}', + 'OuterLinkColor={rgb}{0,0.26,0.75}', + # format admonitions + 'noteBorderColor={rgb}{0.667,0.667,0.667}', + 'warningBorderColor={rgb}{.75,0.5,0.5}', + 'warningborder=2pt', + # Use attention admonition for the front page banner + 'attentionBorderColor={rgb}{.8,.8,0}', + 'attentionBgColor={rgb}{1,1,.7}', + 'attentionborder=1pt', + # Use error admonition for rationale boxes + 'errorBorderColor={rgb}{.5,.75,.5}', + 'errorBgColor={rgb}{.9,.95,.9}', + 'errorborder=1pt', + # Use hint admonition for comment boxes + 'hintBorderColor={rgb}{.6,.6,.6}', + 'hintBgColor={rgb}{.97,.97,.97}', + 'hintborder=0pt', + 'hintTextColor={rgb}{.4,.4,.4}', + # Use the normal font for headings + 'HeaderFamily=\\normalfont\\mdseries', +] +template_info['latex_table_style'] = ['booktabs','nocolorrows'] +template_info['graphviz_dot_args'] = [ + '-Gfontname=Lato', + '-Gfontsize=12', + '-Nfontname=Lato', + '-Nfontsize=12', + '-Efontname=Lato', + '-Efontsize=12' +] + +def make_doc_filename(info, id, title, version, status): + doc_parts = [id.replace(' ',''), title, version] + status = status.split(' ')[-1].lower() + if status != 'release': + doc_parts += [status] + if all((k in info for k in ('doc_id','quality','issue_no'))): + return '-'.join(doc_parts) + return None +template_info['make_filename'] = make_doc_filename + +template_info['front_sections'] = [ + 'abstract', + 'release-info', + 'todos', + 'license', + 'references', + 'terms', + 'potential-for-change', + 'conventions', + 'pseudocode', + 'assembler', + 'current-status', + 'feedback', + 'inclusive-language', + ] + +if 'author' not in doc_info: + doc_info['author'] = 'Arm Limited' +doc_info.setdefault('feedback', 'visit :url:`github.com/arm-software/psa-api/issues`' + + ' to create a new issue at the PSA Certified API GitHub project') +# force use of Arm copyright notice and OSS license +doc_info['copyright'] = 'Arm Limited and/or its affiliates' +doc_info['license'] = 'arm-psa-certified-api-license' diff --git a/tools/templates/psa-api-2025/title-page.rst b/tools/templates/psa-api-2025/title-page.rst new file mode 100644 index 00000000..297476ac --- /dev/null +++ b/tools/templates/psa-api-2025/title-page.rst @@ -0,0 +1,47 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. only:: html + + .. template-image:: ARM_LOGO-2025_INK_RGB.svg + :alt: Arm + :class: titlelogo + +========================== +|docrsttitle| |docversion| +========================== + +.. raw:: latex + + \psabody\color{psaink} + + \begin{psatitle} + +.. csv-table:: + :class: titletable borderless + :align: left + + Document number:, |docid| + Release Quality:, |docquality| + Issue Number:, |docissue| + Date of Issue:, |docdate| + +.. raw:: latex + + \psatitlecopyright + +.. insert-banner:: + +.. insert-section:: Abstract + :section: abstract + :not-in-toc: + +.. raw:: latex + + \end{psatitle} + +.. only:: html + + .. insert-section:: Contents + :not-in-toc: + :keep-if-empty: From f166f26936a24f0a85e60e5bd3eb61eea9d3e862 Mon Sep 17 00:00:00 2001 From: Andrew Thoelke <andrew.thoelke@arm.com> Date: Thu, 11 Jun 2026 10:44:52 +0100 Subject: [PATCH 2/9] Switch repository builds to psa-api-tool Signed-off-by: Andrew Thoelke <andrew.thoelke@arm.com> --- .gitignore | 5 ++ Makefile | 11 +++ design/rfc-01-fwu-suit/fetch-sequence.puml | 2 +- .../rfc-01-fwu-suit/installer-sequence.puml | 2 +- .../rfc-01-fwu-suit/no-reboot-sequence.puml | 2 +- design/rfc-01-fwu-suit/suit-install.puml | 2 +- design/rfc-01-fwu-suit/suit-update.puml | 2 +- doc/attestation/conf.py | 12 ++- doc/attestation/pyproject.toml | 4 + doc/crypto-driver/conf.py | 12 ++- doc/crypto-driver/pyproject.toml | 4 + doc/crypto/conf.py | 12 ++- doc/crypto/figure/multi_part_operation.puml | 2 +- doc/crypto/figure/pake/j-pake.puml | 2 +- doc/crypto/figure/pake/spake2plus-reg.puml | 2 +- doc/crypto/figure/pake/spake2plus.puml | 2 +- doc/crypto/figure/pake/wpa3-sae-pt.puml | 2 +- doc/crypto/figure/pake/wpa3-sae.puml | 2 +- .../figure/sra/dfd_caller_isolation.puml | 4 +- .../figure/sra/dfd_crypto_isolation.puml | 4 +- doc/crypto/figure/sra/dfd_no_isolation.puml | 4 +- doc/crypto/figure/sra/system-entities.puml | 2 +- doc/crypto/pyproject.toml | 4 + doc/fwu/conf.py | 12 ++- doc/fwu/figure/arch/components.puml | 28 +++---- doc/fwu/figure/arch/trusted-client.puml | 20 ++--- doc/fwu/figure/arch/untrusted-client.puml | 22 +++--- doc/fwu/figure/arch/untrusted-staging.puml | 22 +++--- doc/fwu/figure/intro/context.puml | 18 ++--- doc/fwu/figure/intro/fwu-api.puml | 24 +++--- doc/fwu/figure/sequence.puml | 2 +- doc/fwu/figure/sra/lifecycle.puml | 4 +- doc/fwu/figure/states/default.puml | 2 +- .../states/no-reboot-no-trial-volatile.puml | 2 +- doc/fwu/figure/states/no-reboot-no-trial.puml | 2 +- doc/fwu/figure/states/no-reboot-volatile.puml | 2 +- doc/fwu/figure/states/no-reboot.puml | 2 +- doc/fwu/figure/states/no-trial-volatile.puml | 2 +- doc/fwu/figure/states/no-trial.puml | 2 +- doc/fwu/figure/states/volatile.puml | 2 +- doc/fwu/pyproject.toml | 4 + doc/status-code/conf.py | 24 ++---- doc/status-code/pyproject.toml | 4 + doc/storage/conf.py | 12 ++- doc/storage/figure/callers.puml | 68 ++++++++--------- doc/storage/figure/dm-authorized.puml | 60 +++++++-------- doc/storage/figure/dm-exposed.puml | 56 +++++++------- doc/storage/figure/dm-protected.puml | 56 +++++++------- doc/storage/figure/dm-secure-link.puml | 60 +++++++-------- doc/storage/figure/lifecycle.puml | 76 +++++++++---------- doc/storage/figure/storage.puml | 2 +- doc/storage/pyproject.toml | 4 + tools/docs/using-psa-api-tool.md | 14 ++-- 53 files changed, 364 insertions(+), 344 deletions(-) create mode 100644 Makefile create mode 100644 doc/attestation/pyproject.toml create mode 100644 doc/crypto-driver/pyproject.toml create mode 100644 doc/crypto/pyproject.toml create mode 100644 doc/fwu/pyproject.toml create mode 100644 doc/status-code/pyproject.toml create mode 100644 doc/storage/pyproject.toml diff --git a/.gitignore b/.gitignore index 58aa680a..d1433703 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,11 @@ # IDE settings /.vscode +# Local OS files +.DS_Store +# Python cache +__pycache__/ +*.py[cod] # Generated documentation _build build diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..0cf4d916 --- /dev/null +++ b/Makefile @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: Copyright 2025 Arm Limited and/or its affiliates +# SPDX-License-Identifier: Apache-2.0 + +PSA_API_TOOL ?= tools + +# The location of psa-api-tool must be specified +ifeq ($(wildcard $(PSA_API_TOOL)/make),) + $(error The 'PSA_API_TOOL' variable is not set, or does not point to a suitable installation of psa-api-tool) +endif + +include $(PSA_API_TOOL)/make diff --git a/design/rfc-01-fwu-suit/fetch-sequence.puml b/design/rfc-01-fwu-suit/fetch-sequence.puml index 565f9cc6..2c5953ee 100644 --- a/design/rfc-01-fwu-suit/fetch-sequence.puml +++ b/design/rfc-01-fwu-suit/fetch-sequence.puml @@ -5,7 +5,7 @@ ' SUIT update using the FWU API -!include atg-spec.pumh +!include psa-spec.pumh box Network participant "Update server" as server diff --git a/design/rfc-01-fwu-suit/installer-sequence.puml b/design/rfc-01-fwu-suit/installer-sequence.puml index 00fc60c6..8b87af9f 100644 --- a/design/rfc-01-fwu-suit/installer-sequence.puml +++ b/design/rfc-01-fwu-suit/installer-sequence.puml @@ -3,7 +3,7 @@ @startuml -!include atg-spec.pumh +!include psa-spec.pumh ' Complex SUIT installation using the FWU API diff --git a/design/rfc-01-fwu-suit/no-reboot-sequence.puml b/design/rfc-01-fwu-suit/no-reboot-sequence.puml index 2ed3154b..419a9239 100644 --- a/design/rfc-01-fwu-suit/no-reboot-sequence.puml +++ b/design/rfc-01-fwu-suit/no-reboot-sequence.puml @@ -3,7 +3,7 @@ @startuml -!include atg-spec.pumh +!include psa-spec.pumh ' Complex SUIT installation using the FWU API, no boot diff --git a/design/rfc-01-fwu-suit/suit-install.puml b/design/rfc-01-fwu-suit/suit-install.puml index b658fc02..3cbb7985 100644 --- a/design/rfc-01-fwu-suit/suit-install.puml +++ b/design/rfc-01-fwu-suit/suit-install.puml @@ -3,7 +3,7 @@ @startuml -!include atg-spec.pumh +!include psa-spec.pumh ' title SUIT update : advanced installers diff --git a/design/rfc-01-fwu-suit/suit-update.puml b/design/rfc-01-fwu-suit/suit-update.puml index 02fd2f99..cdf8e642 100644 --- a/design/rfc-01-fwu-suit/suit-update.puml +++ b/design/rfc-01-fwu-suit/suit-update.puml @@ -3,7 +3,7 @@ @startuml -!include atg-spec.pumh +!include psa-spec.pumh ' title SUIT update : high-level flow diff --git a/doc/attestation/conf.py b/doc/attestation/conf.py index b7455619..78a83c72 100644 --- a/doc/attestation/conf.py +++ b/doc/attestation/conf.py @@ -68,14 +68,12 @@ 'page_break': 'chapter' } -# absolute or relative path to the psa_spec material from this file -# atg_sphinx_spec_dir = '../atg-sphinx-spec' - -# Set up and run the atg-sphinx-spec configuration +# Set up and run the psa-api-tool configuration import os -atg_sphinx_spec_dir = os.environ.get('ATG_SPHINX_SPEC') or atg_sphinx_spec_dir -exec(compile(open(os.path.join(atg_sphinx_spec_dir,'atg-sphinx-conf.py'), +psa_api_tool_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..', '..', 'tools')) +psa_api_tool_path = os.environ.get('PSA_API_TOOL') or psa_api_tool_path +exec(compile(open(os.path.join(psa_api_tool_path,'psa-api-conf.py'), encoding='utf-8').read(), - 'atg-sphinx-conf.py', 'exec')) + 'psa-api-conf.py', 'exec')) diff --git a/doc/attestation/pyproject.toml b/doc/attestation/pyproject.toml new file mode 100644 index 00000000..52de3a0e --- /dev/null +++ b/doc/attestation/pyproject.toml @@ -0,0 +1,4 @@ +# SPDX-FileCopyrightText: Copyright 2026 Arm Limited and/or its affiliates +# SPDX-License-Identifier: Apache-2.0 + +[tool.esbonio] diff --git a/doc/crypto-driver/conf.py b/doc/crypto-driver/conf.py index 5edc7445..c04bdab2 100644 --- a/doc/crypto-driver/conf.py +++ b/doc/crypto-driver/conf.py @@ -84,14 +84,12 @@ #'page_break': 'chapter' } -# absolute or relative path to the psa_spec material from this file -# atg_sphinx_spec_dir = '../atg-sphinx-spec' - -# Set up and run the atg-sphinx-spec configuration +# Set up and run the psa-api-tool configuration import os -atg_sphinx_spec_dir = os.environ.get('ATG_SPHINX_SPEC') or atg_sphinx_spec_dir -exec(compile(open(os.path.join(atg_sphinx_spec_dir,'atg-sphinx-conf.py'), +psa_api_tool_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..', '..', 'tools')) +psa_api_tool_path = os.environ.get('PSA_API_TOOL') or psa_api_tool_path +exec(compile(open(os.path.join(psa_api_tool_path,'psa-api-conf.py'), encoding='utf-8').read(), - 'atg-sphinx-conf.py', 'exec')) + 'psa-api-conf.py', 'exec')) diff --git a/doc/crypto-driver/pyproject.toml b/doc/crypto-driver/pyproject.toml new file mode 100644 index 00000000..52de3a0e --- /dev/null +++ b/doc/crypto-driver/pyproject.toml @@ -0,0 +1,4 @@ +# SPDX-FileCopyrightText: Copyright 2026 Arm Limited and/or its affiliates +# SPDX-License-Identifier: Apache-2.0 + +[tool.esbonio] diff --git a/doc/crypto/conf.py b/doc/crypto/conf.py index 37e72cd8..a442a3ee 100644 --- a/doc/crypto/conf.py +++ b/doc/crypto/conf.py @@ -99,14 +99,12 @@ 'prolog_files': ['/substitutions'], } -# absolute or relative path to the psa_spec material from this file -# atg_sphinx_spec_dir = '../atg-sphinx-spec' - -# Set up and run the atg-sphinx-spec configuration +# Set up and run the psa-api-tool configuration import os -atg_sphinx_spec_dir = os.environ.get('ATG_SPHINX_SPEC') or atg_sphinx_spec_dir -exec(compile(open(os.path.join(atg_sphinx_spec_dir,'atg-sphinx-conf.py'), +psa_api_tool_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..', '..', 'tools')) +psa_api_tool_path = os.environ.get('PSA_API_TOOL') or psa_api_tool_path +exec(compile(open(os.path.join(psa_api_tool_path,'psa-api-conf.py'), encoding='utf-8').read(), - 'atg-sphinx-conf.py', 'exec')) + 'psa-api-conf.py', 'exec')) diff --git a/doc/crypto/figure/multi_part_operation.puml b/doc/crypto/figure/multi_part_operation.puml index c73cf3cc..add60e78 100644 --- a/doc/crypto/figure/multi_part_operation.puml +++ b/doc/crypto/figure/multi_part_operation.puml @@ -2,7 +2,7 @@ ' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license @startuml -!include atg-spec.pumh +!include psa-spec.pumh skinparam LegendFontSize 12 diff --git a/doc/crypto/figure/pake/j-pake.puml b/doc/crypto/figure/pake/j-pake.puml index defeff76..cb9e4da7 100644 --- a/doc/crypto/figure/pake/j-pake.puml +++ b/doc/crypto/figure/pake/j-pake.puml @@ -3,7 +3,7 @@ @startuml - !include atg-spec.pumh + !include psa-spec.pumh participant User participant Peer diff --git a/doc/crypto/figure/pake/spake2plus-reg.puml b/doc/crypto/figure/pake/spake2plus-reg.puml index f642280a..22e42ede 100644 --- a/doc/crypto/figure/pake/spake2plus-reg.puml +++ b/doc/crypto/figure/pake/spake2plus-reg.puml @@ -3,7 +3,7 @@ @startuml - !include atg-spec.pumh + !include psa-spec.pumh participant "Prover //(Client role)//" as Prover participant "Verifier //(Server role)//" as Verifier diff --git a/doc/crypto/figure/pake/spake2plus.puml b/doc/crypto/figure/pake/spake2plus.puml index cc91b8b0..08d95cbb 100644 --- a/doc/crypto/figure/pake/spake2plus.puml +++ b/doc/crypto/figure/pake/spake2plus.puml @@ -3,7 +3,7 @@ @startuml - !include atg-spec.pumh + !include psa-spec.pumh participant "Prover //(Client role)//" as Prover participant "Verifier //(Server role)//" as Verifier diff --git a/doc/crypto/figure/pake/wpa3-sae-pt.puml b/doc/crypto/figure/pake/wpa3-sae-pt.puml index bc4b0ec4..17afd73c 100644 --- a/doc/crypto/figure/pake/wpa3-sae-pt.puml +++ b/doc/crypto/figure/pake/wpa3-sae-pt.puml @@ -3,7 +3,7 @@ @startuml - !include atg-spec.pumh + !include psa-spec.pumh participant "station (STA)" as Participant diff --git a/doc/crypto/figure/pake/wpa3-sae.puml b/doc/crypto/figure/pake/wpa3-sae.puml index bb99bed6..0c0f3e01 100644 --- a/doc/crypto/figure/pake/wpa3-sae.puml +++ b/doc/crypto/figure/pake/wpa3-sae.puml @@ -3,7 +3,7 @@ @startuml - !include atg-spec.pumh + !include psa-spec.pumh participant "STA-A" as STAA participant "STA-B" as STAB diff --git a/doc/crypto/figure/sra/dfd_caller_isolation.puml b/doc/crypto/figure/sra/dfd_caller_isolation.puml index 08ca3c24..0328b364 100644 --- a/doc/crypto/figure/sra/dfd_caller_isolation.puml +++ b/doc/crypto/figure/sra/dfd_caller_isolation.puml @@ -2,8 +2,8 @@ ' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license @startuml -!include atg-spec.pumh -!include atg-dataflow.pumh +!include psa-spec.pumh +!include psa-dataflow.pumh dfd_agent "External system" as ext dfd_agent "External system" as ext2 diff --git a/doc/crypto/figure/sra/dfd_crypto_isolation.puml b/doc/crypto/figure/sra/dfd_crypto_isolation.puml index 94da4da2..0e804843 100644 --- a/doc/crypto/figure/sra/dfd_crypto_isolation.puml +++ b/doc/crypto/figure/sra/dfd_crypto_isolation.puml @@ -2,8 +2,8 @@ ' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license @startuml -!include atg-spec.pumh -!include atg-dataflow.pumh +!include psa-spec.pumh +!include psa-dataflow.pumh dfd_agent "External system" as ext dfd_tb("System boundary") { diff --git a/doc/crypto/figure/sra/dfd_no_isolation.puml b/doc/crypto/figure/sra/dfd_no_isolation.puml index ed437af9..a80ca5df 100644 --- a/doc/crypto/figure/sra/dfd_no_isolation.puml +++ b/doc/crypto/figure/sra/dfd_no_isolation.puml @@ -2,8 +2,8 @@ ' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license @startuml -!include atg-spec.pumh -!include atg-dataflow.pumh +!include psa-spec.pumh +!include psa-dataflow.pumh dfd_agent "External system" as ext dfd_tb("System boundary") { diff --git a/doc/crypto/figure/sra/system-entities.puml b/doc/crypto/figure/sra/system-entities.puml index 061c3b3b..2e0a66f7 100644 --- a/doc/crypto/figure/sra/system-entities.puml +++ b/doc/crypto/figure/sra/system-entities.puml @@ -2,7 +2,7 @@ ' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license @startuml -!include atg-spec.pumh +!include psa-spec.pumh skinparam defaultTextAlignment center diff --git a/doc/crypto/pyproject.toml b/doc/crypto/pyproject.toml new file mode 100644 index 00000000..52de3a0e --- /dev/null +++ b/doc/crypto/pyproject.toml @@ -0,0 +1,4 @@ +# SPDX-FileCopyrightText: Copyright 2026 Arm Limited and/or its affiliates +# SPDX-License-Identifier: Apache-2.0 + +[tool.esbonio] diff --git a/doc/fwu/conf.py b/doc/fwu/conf.py index 3dea5982..e28f8a40 100644 --- a/doc/fwu/conf.py +++ b/doc/fwu/conf.py @@ -73,14 +73,12 @@ 'page_break': 'chapter', } -# absolute or relative path to the psa_spec material from this file -atg_sphinx_spec_dir = '../atg-sphinx-spec' - -# Set up and run the atg-sphinx-spec configuration +# Set up and run the psa-api-tool configuration import os -atg_sphinx_spec_dir = os.environ.get('ATG_SPHINX_SPEC') or atg_sphinx_spec_dir -exec(compile(open(os.path.join(atg_sphinx_spec_dir,'atg-sphinx-conf.py'), +psa_api_tool_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..', '..', 'tools')) +psa_api_tool_path = os.environ.get('PSA_API_TOOL') or psa_api_tool_path +exec(compile(open(os.path.join(psa_api_tool_path,'psa-api-conf.py'), encoding='utf-8').read(), - 'atg-sphinx-conf.py', 'exec')) + 'psa-api-conf.py', 'exec')) diff --git a/doc/fwu/figure/arch/components.puml b/doc/fwu/figure/arch/components.puml index c8314680..78af628b 100644 --- a/doc/fwu/figure/arch/components.puml +++ b/doc/fwu/figure/arch/components.puml @@ -3,31 +3,31 @@ @startuml -!include atg-spec.pumh -!include atg-dataflow.pumh +!include psa-spec.pumh +!include psa-dataflow.pumh skinparam RectangleborderThickness 0 skinparam RectanglefontColor white -skinparam DatabaseBorderColor #ArmMidGray -skinparam InterfaceBorderColor #ArmMidGray +skinparam DatabaseBorderColor #PSAMidGray +skinparam InterfaceBorderColor #PSAMidGray -rectangle "Firmware creator" as creator #ArmDarkBlue +rectangle "Firmware creator" as creator #PSADarkBlue cloud Internet { - rectangle "Update server" as server #ArmMidGray + rectangle "Update server" as server #PSAMidGray } -interface "MQTT\n CoAP\nHTTPS\n ..." as tls #ArmLightGray +interface "MQTT\n CoAP\nHTTPS\n ..." as tls #PSALightGray dfd_tb("Device ") { - rectangle "Update client" as client #ArmMidGray - interface " **Firmware**\n**Update API**" as api #ArmGreen - rectangle "Update service" as service #ArmMidBlue - database "Firmware store" as store #ArmLightGray - rectangle "Bootloader" as bootloader #ArmMidBlue + rectangle "Update client" as client #PSAMidGray + interface " **Firmware**\n**Update API**" as api #PSAGreen + rectangle "Update service" as service #PSAMidBlue + database "Firmware store" as store #PSALightGray + rectangle "Bootloader" as bootloader #PSAMidBlue label "<size:30> <&key>\nTrust anchor" as anchor } -database "External storage" as drive #ArmLightGray -interface "USB" as usb #ArmLightGray +database "External storage" as drive #PSALightGray +interface "USB" as usb #PSALightGray creator -> server server <- tls diff --git a/doc/fwu/figure/arch/trusted-client.puml b/doc/fwu/figure/arch/trusted-client.puml index f25404c5..4576ad8d 100644 --- a/doc/fwu/figure/arch/trusted-client.puml +++ b/doc/fwu/figure/arch/trusted-client.puml @@ -3,23 +3,23 @@ @startuml -!include atg-spec.pumh -!include atg-dataflow.pumh +!include psa-spec.pumh +!include psa-dataflow.pumh skinparam RectangleborderThickness 0 skinparam RectanglefontColor white skinparam FilefontColor white -skinparam DatabaseBorderColor #ArmMidGray -skinparam InterfaceBorderColor #ArmMidGray +skinparam DatabaseBorderColor #PSAMidGray +skinparam InterfaceBorderColor #PSAMidGray -file "Firmware package" <<data>> as firmware #ArmDarkBlue +file "Firmware package" <<data>> as firmware #PSADarkBlue dfd_tb($label = "Device") { - rectangle "Update client" <<app>> as client #ArmMidGray - interface " **Firmware**\n**Update API**" as api #ArmGreen - rectangle "Update service" <<library>> as service #ArmMidBlue - database "Firmware store" as store #ArmLightGray - rectangle "Bootloader" as bootloader #ArmMidBlue + rectangle "Update client" <<app>> as client #PSAMidGray + interface " **Firmware**\n**Update API**" as api #PSAGreen + rectangle "Update service" <<library>> as service #PSAMidBlue + database "Firmware store" as store #PSALightGray + rectangle "Bootloader" as bootloader #PSAMidBlue label "<size:30> <&key>\nTrust anchor" as anchor } diff --git a/doc/fwu/figure/arch/untrusted-client.puml b/doc/fwu/figure/arch/untrusted-client.puml index e5d0512b..552cf9ac 100644 --- a/doc/fwu/figure/arch/untrusted-client.puml +++ b/doc/fwu/figure/arch/untrusted-client.puml @@ -3,27 +3,27 @@ @startuml -!include atg-spec.pumh -!include atg-dataflow.pumh +!include psa-spec.pumh +!include psa-dataflow.pumh skinparam RectangleborderThickness 0 skinparam RectanglefontColor white skinparam FilefontColor white -skinparam DatabaseBorderColor #ArmMidGray -skinparam InterfaceBorderColor #ArmMidGray +skinparam DatabaseBorderColor #PSAMidGray +skinparam InterfaceBorderColor #PSAMidGray -file "Firmware package" <<data>> as firmware #ArmDarkBlue +file "Firmware package" <<data>> as firmware #PSADarkBlue dfd_tb($label = "Device") { dfd_align() { - rectangle "Update client" <<app>> as client #ArmMidGray - interface " **Firmware**\n**Update API**" as api #ArmGreen - rectangle "Update service proxy" <<library>> as proxy #ArmMidBlue + rectangle "Update client" <<app>> as client #PSAMidGray + interface " **Firmware**\n**Update API**" as api #PSAGreen + rectangle "Update service proxy" <<library>> as proxy #PSAMidBlue } dfd_tb($label = "Platform Root of Trust") as rot { - rectangle "Update service" <<RoT service>> as service #ArmMidBlue - database "Firmware store" as store #ArmLightGray - rectangle "Bootloader" as bootloader #ArmMidBlue + rectangle "Update service" <<RoT service>> as service #PSAMidBlue + database "Firmware store" as store #PSALightGray + rectangle "Bootloader" as bootloader #PSAMidBlue label "<size:30> <&key>\nTrust anchor" as anchor } } diff --git a/doc/fwu/figure/arch/untrusted-staging.puml b/doc/fwu/figure/arch/untrusted-staging.puml index c5c6ec95..be1aedce 100644 --- a/doc/fwu/figure/arch/untrusted-staging.puml +++ b/doc/fwu/figure/arch/untrusted-staging.puml @@ -3,27 +3,27 @@ @startuml -!include atg-spec.pumh -!include atg-dataflow.pumh +!include psa-spec.pumh +!include psa-dataflow.pumh skinparam RectangleborderThickness 0 skinparam RectanglefontColor white skinparam FilefontColor white -skinparam DatabaseBorderColor #ArmMidGray -skinparam InterfaceBorderColor #ArmMidGray +skinparam DatabaseBorderColor #PSAMidGray +skinparam InterfaceBorderColor #PSAMidGray -file "Firmware package" <<data>> as firmware #ArmDarkBlue +file "Firmware package" <<data>> as firmware #PSADarkBlue dfd_tb($label = "Device") { dfd_align() { - rectangle "Update client" <<app>> as client #ArmMidGray - interface " **Firmware**\n**Update API**" as api #ArmGreen - rectangle "Update service" <<library>> as service #ArmMidBlue - database "Staging area" as second #ArmLightGray + rectangle "Update client" <<app>> as client #PSAMidGray + interface " **Firmware**\n**Update API**" as api #PSAGreen + rectangle "Update service" <<library>> as service #PSAMidBlue + database "Staging area" as second #PSALightGray } dfd_tb($label = "Platform Root of Trust") { - database "//active// image" as active #ArmLightGray - rectangle "Bootloader" as bootloader #ArmMidBlue + database "//active// image" as active #PSALightGray + rectangle "Bootloader" as bootloader #PSAMidBlue label "<size:30> <&key>\nTrust anchor" as anchor } } diff --git a/doc/fwu/figure/intro/context.puml b/doc/fwu/figure/intro/context.puml index 971ecb5a..716b93cb 100644 --- a/doc/fwu/figure/intro/context.puml +++ b/doc/fwu/figure/intro/context.puml @@ -3,23 +3,23 @@ @startuml -!include atg-spec.pumh -!include atg-dataflow.pumh +!include psa-spec.pumh +!include psa-dataflow.pumh skinparam RectangleborderThickness 0 skinparam RectanglefontColor white -skinparam DatabaseBorderColor #ArmMidGray -skinparam InterfaceBorderColor #ArmMidGray +skinparam DatabaseBorderColor #PSAMidGray +skinparam InterfaceBorderColor #PSAMidGray -rectangle "Firmware creator" as creator #ArmDarkBlue +rectangle "Firmware creator" as creator #PSADarkBlue cloud Internet { - rectangle "Update server" as server #ArmMidGray + rectangle "Update server" as server #PSAMidGray } -interface "MQTT\n CoAP\nHTTPS\n ..." as tls #ArmLightGray +interface "MQTT\n CoAP\nHTTPS\n ..." as tls #PSALightGray dfd_tb("Device ") { - rectangle "Update client" as client #ArmMidBlue - database "Firmware store" as store #ArmLightGray + rectangle "Update client" as client #PSAMidBlue + database "Firmware store" as store #PSALightGray } creator -> server diff --git a/doc/fwu/figure/intro/fwu-api.puml b/doc/fwu/figure/intro/fwu-api.puml index d258e686..e3346d98 100644 --- a/doc/fwu/figure/intro/fwu-api.puml +++ b/doc/fwu/figure/intro/fwu-api.puml @@ -3,26 +3,26 @@ @startuml -!include atg-spec.pumh -!include atg-dataflow.pumh +!include psa-spec.pumh +!include psa-dataflow.pumh skinparam RectangleborderThickness 0 skinparam RectanglefontColor white -skinparam DatabaseBorderColor #ArmMidGray -skinparam InterfaceBorderColor #ArmMidGray +skinparam DatabaseBorderColor #PSAMidGray +skinparam InterfaceBorderColor #PSAMidGray -rectangle "Firmware creator" as creator #ArmDarkBlue +rectangle "Firmware creator" as creator #PSADarkBlue cloud Internet { - rectangle "Update server" as server #ArmMidGray + rectangle "Update server" as server #PSAMidGray } -interface "MQTT\n CoAP\nHTTPS\n ..." as tls #ArmLightGray +interface "MQTT\n CoAP\nHTTPS\n ..." as tls #PSALightGray dfd_tb("Device ") { - rectangle "Update client" as client #ArmMidGray - interface " **Firmware**\n**Update API**" as api #ArmGreen - rectangle "Update service" as service #ArmMidBlue - database "Firmware store" as store #ArmLightGray - rectangle "Bootloader" as bootloader #ArmMidBlue + rectangle "Update client" as client #PSAMidGray + interface " **Firmware**\n**Update API**" as api #PSAGreen + rectangle "Update service" as service #PSAMidBlue + database "Firmware store" as store #PSALightGray + rectangle "Bootloader" as bootloader #PSAMidBlue } creator -> server diff --git a/doc/fwu/figure/sequence.puml b/doc/fwu/figure/sequence.puml index 19109bc8..5262ddd9 100644 --- a/doc/fwu/figure/sequence.puml +++ b/doc/fwu/figure/sequence.puml @@ -3,7 +3,7 @@ @startuml -!include atg-spec.pumh +!include psa-spec.pumh participant "Update server" as server participant "Update client" as client diff --git a/doc/fwu/figure/sra/lifecycle.puml b/doc/fwu/figure/sra/lifecycle.puml index aa6ec7e8..ec41710e 100644 --- a/doc/fwu/figure/sra/lifecycle.puml +++ b/doc/fwu/figure/sra/lifecycle.puml @@ -3,8 +3,8 @@ @startuml -!include atg-spec.pumh -!include atg-lifecycle.pumh +!include psa-spec.pumh +!include psa-lifecycle.pumh stakeholder "SiP and OEM" as k1 stakeholder "SiP, OEM,\nand/or Owner" as k2 diff --git a/doc/fwu/figure/states/default.puml b/doc/fwu/figure/states/default.puml index 8ad98abb..fb16f403 100644 --- a/doc/fwu/figure/states/default.puml +++ b/doc/fwu/figure/states/default.puml @@ -4,7 +4,7 @@ @startuml ' State diagram -!include atg-spec.pumh +!include psa-spec.pumh legend **Transitions** diff --git a/doc/fwu/figure/states/no-reboot-no-trial-volatile.puml b/doc/fwu/figure/states/no-reboot-no-trial-volatile.puml index 3910f448..3e66a0f7 100644 --- a/doc/fwu/figure/states/no-reboot-no-trial-volatile.puml +++ b/doc/fwu/figure/states/no-reboot-no-trial-volatile.puml @@ -4,7 +4,7 @@ @startuml '' State diagram -!include atg-spec.pumh +!include psa-spec.pumh skinparam LegendFontSize 12 diff --git a/doc/fwu/figure/states/no-reboot-no-trial.puml b/doc/fwu/figure/states/no-reboot-no-trial.puml index cb778517..dcafbc39 100644 --- a/doc/fwu/figure/states/no-reboot-no-trial.puml +++ b/doc/fwu/figure/states/no-reboot-no-trial.puml @@ -4,7 +4,7 @@ @startuml '' State diagram -!include atg-spec.pumh +!include psa-spec.pumh skinparam LegendFontSize 12 diff --git a/doc/fwu/figure/states/no-reboot-volatile.puml b/doc/fwu/figure/states/no-reboot-volatile.puml index d8b3ebf6..beadf9d0 100644 --- a/doc/fwu/figure/states/no-reboot-volatile.puml +++ b/doc/fwu/figure/states/no-reboot-volatile.puml @@ -4,7 +4,7 @@ @startuml '' State diagram -!include atg-spec.pumh +!include psa-spec.pumh skinparam LegendFontSize 12 diff --git a/doc/fwu/figure/states/no-reboot.puml b/doc/fwu/figure/states/no-reboot.puml index 33149c36..d193ce5c 100644 --- a/doc/fwu/figure/states/no-reboot.puml +++ b/doc/fwu/figure/states/no-reboot.puml @@ -4,7 +4,7 @@ @startuml '' State diagram -!include atg-spec.pumh +!include psa-spec.pumh skinparam LegendFontSize 12 diff --git a/doc/fwu/figure/states/no-trial-volatile.puml b/doc/fwu/figure/states/no-trial-volatile.puml index f382ad6a..b477457d 100644 --- a/doc/fwu/figure/states/no-trial-volatile.puml +++ b/doc/fwu/figure/states/no-trial-volatile.puml @@ -4,7 +4,7 @@ @startuml '' State diagram -!include atg-spec.pumh +!include psa-spec.pumh skinparam LegendFontSize 12 diff --git a/doc/fwu/figure/states/no-trial.puml b/doc/fwu/figure/states/no-trial.puml index cde5f676..1055197b 100644 --- a/doc/fwu/figure/states/no-trial.puml +++ b/doc/fwu/figure/states/no-trial.puml @@ -4,7 +4,7 @@ @startuml '' State diagram -!include atg-spec.pumh +!include psa-spec.pumh skinparam LegendFontSize 12 diff --git a/doc/fwu/figure/states/volatile.puml b/doc/fwu/figure/states/volatile.puml index e8433398..16ef6079 100644 --- a/doc/fwu/figure/states/volatile.puml +++ b/doc/fwu/figure/states/volatile.puml @@ -4,7 +4,7 @@ @startuml ' State diagram -!include atg-spec.pumh +!include psa-spec.pumh skinparam LegendFontSize 12 diff --git a/doc/fwu/pyproject.toml b/doc/fwu/pyproject.toml new file mode 100644 index 00000000..52de3a0e --- /dev/null +++ b/doc/fwu/pyproject.toml @@ -0,0 +1,4 @@ +# SPDX-FileCopyrightText: Copyright 2026 Arm Limited and/or its affiliates +# SPDX-License-Identifier: Apache-2.0 + +[tool.esbonio] diff --git a/doc/status-code/conf.py b/doc/status-code/conf.py index 662997f5..02032788 100644 --- a/doc/status-code/conf.py +++ b/doc/status-code/conf.py @@ -73,26 +73,12 @@ 'page_break': 'chapter', } -# If the draft flag is set, then include extra content and watermark - -if doc_info.get('draft'): - doc_info.pop('date', None) # Remove any release date - use build date - doc_info['include_content'] = ['rationale', 'todo', 'banner'] - doc_info['watermark'] = "DRAFT" - -# If a release candidate, then include watermark - -if doc_info.get('release_candidate'): - doc_info['watermark'] = "Candidate" - -# absolute or relative path to the psa_spec material from this file -# atg_sphinx_spec_dir = '../atg-sphinx-spec' - -# Set up and run the atg-sphinx-spec configuration +# Set up and run the psa-api-tool configuration import os -atg_sphinx_spec_dir = os.environ.get('ATG_SPHINX_SPEC') or atg_sphinx_spec_dir -exec(compile(open(os.path.join(atg_sphinx_spec_dir,'atg-sphinx-conf.py'), +psa_api_tool_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..', '..', 'tools')) +psa_api_tool_path = os.environ.get('PSA_API_TOOL') or psa_api_tool_path +exec(compile(open(os.path.join(psa_api_tool_path,'psa-api-conf.py'), encoding='utf-8').read(), - 'atg-sphinx-conf.py', 'exec')) + 'psa-api-conf.py', 'exec')) diff --git a/doc/status-code/pyproject.toml b/doc/status-code/pyproject.toml new file mode 100644 index 00000000..52de3a0e --- /dev/null +++ b/doc/status-code/pyproject.toml @@ -0,0 +1,4 @@ +# SPDX-FileCopyrightText: Copyright 2026 Arm Limited and/or its affiliates +# SPDX-License-Identifier: Apache-2.0 + +[tool.esbonio] diff --git a/doc/storage/conf.py b/doc/storage/conf.py index 28ee2c7f..84e3bdd5 100644 --- a/doc/storage/conf.py +++ b/doc/storage/conf.py @@ -87,14 +87,12 @@ 'page_break': 'chapter', } -# absolute or relative path to the psa_spec material from this file -# atg_sphinx_spec_dir = '../atg-sphinx-spec' - -# Set up and run the atg-sphinx-spec configuration +# Set up and run the psa-api-tool configuration import os -atg_sphinx_spec_dir = os.environ.get('ATG_SPHINX_SPEC') or atg_sphinx_spec_dir -exec(compile(open(os.path.join(atg_sphinx_spec_dir,'atg-sphinx-conf.py'), +psa_api_tool_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..', '..', 'tools')) +psa_api_tool_path = os.environ.get('PSA_API_TOOL') or psa_api_tool_path +exec(compile(open(os.path.join(psa_api_tool_path,'psa-api-conf.py'), encoding='utf-8').read(), - 'atg-sphinx-conf.py', 'exec')) + 'psa-api-conf.py', 'exec')) diff --git a/doc/storage/figure/callers.puml b/doc/storage/figure/callers.puml index 19910fb8..516469c5 100644 --- a/doc/storage/figure/callers.puml +++ b/doc/storage/figure/callers.puml @@ -1,35 +1,35 @@ ' SPDX-FileCopyrightText: Copyright 2023 Arm Limited and/or its affiliates -' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license - -@startuml - -!include atg-spec.pumh -!include atg-dataflow.pumh - -skinparam RectangleborderThickness 0 -skinparam RectanglefontColor white -skinparam DatabaseBorderColor #ArmMidGray -skinparam InterfaceBorderColor #ArmMidGray - -left to right direction - -dfd_tb("Application boundary") { - rectangle "Application 1" as caller1 #ArmMidGray - interface "**Secure Storage API**" as api1 #ArmGreen -} -dfd_tb("Data protection boundary") { -rectangle "Storage service" as service #ArmMidBlue -database "Storage medium" as store #ArmLightGray -} -dfd_tb("Application boundary") { - interface "**Secure Storage API**" as api2 #ArmGreen - rectangle "Application 2" as caller2 #ArmMidGray -} - -caller1 -d- api1 -api1 -d-> service -service <--> store -caller2 -d- api2 -api2 -d-> service - -@enduml +' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +@startuml + +!include psa-spec.pumh +!include psa-dataflow.pumh + +skinparam RectangleborderThickness 0 +skinparam RectanglefontColor white +skinparam DatabaseBorderColor #PSAMidGray +skinparam InterfaceBorderColor #PSAMidGray + +left to right direction + +dfd_tb("Application boundary") { + rectangle "Application 1" as caller1 #PSAMidGray + interface "**Secure Storage API**" as api1 #PSAGreen +} +dfd_tb("Data protection boundary") { +rectangle "Storage service" as service #PSAMidBlue +database "Storage medium" as store #PSALightGray +} +dfd_tb("Application boundary") { + interface "**Secure Storage API**" as api2 #PSAGreen + rectangle "Application 2" as caller2 #PSAMidGray +} + +caller1 -d- api1 +api1 -d-> service +service <--> store +caller2 -d- api2 +api2 -d-> service + +@enduml diff --git a/doc/storage/figure/dm-authorized.puml b/doc/storage/figure/dm-authorized.puml index 6a962e0a..48d172ef 100644 --- a/doc/storage/figure/dm-authorized.puml +++ b/doc/storage/figure/dm-authorized.puml @@ -1,31 +1,31 @@ ' SPDX-FileCopyrightText: Copyright 2023 Arm Limited and/or its affiliates -' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license - -@startuml - -!include atg-spec.pumh -!include atg-dataflow.pumh - -skinparam RectangleborderThickness 0 -skinparam RectanglefontColor white -skinparam DatabaseBorderColor #ArmMidGray -skinparam InterfaceBorderColor #ArmMidGray - -left to right direction - -dfd_tb("Device ") { - rectangle "Application" as caller #ArmMidGray - interface "**Secure Storage API**" as api #ArmGreen - dfd_tb($label="Platform Root of Trust") { - rectangle "Storage service" as service #ArmMidBlue - } - dfd_tb($label="Replay-Protected\nMemory Block") { - database "Storage medium" as store #ArmLightGray - } -} - -caller -d- api -api -d-> service : DF1 -service <-d-> store : DF4 - -@enduml +' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +@startuml + +!include psa-spec.pumh +!include psa-dataflow.pumh + +skinparam RectangleborderThickness 0 +skinparam RectanglefontColor white +skinparam DatabaseBorderColor #PSAMidGray +skinparam InterfaceBorderColor #PSAMidGray + +left to right direction + +dfd_tb("Device ") { + rectangle "Application" as caller #PSAMidGray + interface "**Secure Storage API**" as api #PSAGreen + dfd_tb($label="Platform Root of Trust") { + rectangle "Storage service" as service #PSAMidBlue + } + dfd_tb($label="Replay-Protected\nMemory Block") { + database "Storage medium" as store #PSALightGray + } +} + +caller -d- api +api -d-> service : DF1 +service <-d-> store : DF4 + +@enduml diff --git a/doc/storage/figure/dm-exposed.puml b/doc/storage/figure/dm-exposed.puml index c85f66ae..7501975a 100644 --- a/doc/storage/figure/dm-exposed.puml +++ b/doc/storage/figure/dm-exposed.puml @@ -1,29 +1,29 @@ ' SPDX-FileCopyrightText: Copyright 2023 Arm Limited and/or its affiliates -' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license - -@startuml - -!include atg-spec.pumh -!include atg-dataflow.pumh - -skinparam RectangleborderThickness 0 -skinparam RectanglefontColor white -skinparam DatabaseBorderColor #ArmMidGray -skinparam InterfaceBorderColor #ArmMidGray - -left to right direction - -dfd_tb("Device ") { - rectangle "Application" as caller #ArmMidGray - interface "**Secure Storage API**" as api #ArmGreen - dfd_tb($label="Platform Root of Trust") { - rectangle "Storage service" as service #ArmMidBlue - } - database "Storage medium" as store #ArmLightGray -} - -caller -d- api -api -d-> service : DF1 -service <-d-> store : DF3 - -@enduml +' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +@startuml + +!include psa-spec.pumh +!include psa-dataflow.pumh + +skinparam RectangleborderThickness 0 +skinparam RectanglefontColor white +skinparam DatabaseBorderColor #PSAMidGray +skinparam InterfaceBorderColor #PSAMidGray + +left to right direction + +dfd_tb("Device ") { + rectangle "Application" as caller #PSAMidGray + interface "**Secure Storage API**" as api #PSAGreen + dfd_tb($label="Platform Root of Trust") { + rectangle "Storage service" as service #PSAMidBlue + } + database "Storage medium" as store #PSALightGray +} + +caller -d- api +api -d-> service : DF1 +service <-d-> store : DF3 + +@enduml diff --git a/doc/storage/figure/dm-protected.puml b/doc/storage/figure/dm-protected.puml index e2b3a578..49a33f63 100644 --- a/doc/storage/figure/dm-protected.puml +++ b/doc/storage/figure/dm-protected.puml @@ -1,29 +1,29 @@ ' SPDX-FileCopyrightText: Copyright 2023 Arm Limited and/or its affiliates -' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license - -@startuml - -!include atg-spec.pumh -!include atg-dataflow.pumh - -skinparam RectangleborderThickness 0 -skinparam RectanglefontColor white -skinparam DatabaseBorderColor #ArmMidGray -skinparam InterfaceBorderColor #ArmMidGray - -left to right direction - -dfd_tb("Device ") { - rectangle "Application" as caller #ArmMidGray - interface "**Secure Storage API**" as api #ArmGreen - dfd_tb($label="Platform Root of Trust") { - rectangle "Storage\nservice" as service #ArmMidBlue - database "Storage medium" as store #ArmLightGray - } -} - -caller -d- api -api -d-> service : DF1 -service <--> store : DF2 - -@enduml +' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +@startuml + +!include psa-spec.pumh +!include psa-dataflow.pumh + +skinparam RectangleborderThickness 0 +skinparam RectanglefontColor white +skinparam DatabaseBorderColor #PSAMidGray +skinparam InterfaceBorderColor #PSAMidGray + +left to right direction + +dfd_tb("Device ") { + rectangle "Application" as caller #PSAMidGray + interface "**Secure Storage API**" as api #PSAGreen + dfd_tb($label="Platform Root of Trust") { + rectangle "Storage\nservice" as service #PSAMidBlue + database "Storage medium" as store #PSALightGray + } +} + +caller -d- api +api -d-> service : DF1 +service <--> store : DF2 + +@enduml diff --git a/doc/storage/figure/dm-secure-link.puml b/doc/storage/figure/dm-secure-link.puml index f9096ed3..fd21f993 100644 --- a/doc/storage/figure/dm-secure-link.puml +++ b/doc/storage/figure/dm-secure-link.puml @@ -1,31 +1,31 @@ ' SPDX-FileCopyrightText: Copyright 2023 Arm Limited and/or its affiliates -' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license - -@startuml - -!include atg-spec.pumh -!include atg-dataflow.pumh - -skinparam RectangleborderThickness 0 -skinparam RectanglefontColor white -skinparam DatabaseBorderColor #ArmMidGray -skinparam InterfaceBorderColor #ArmMidGray - -left to right direction - -dfd_tb("Device ") { - rectangle "Application" as caller #ArmMidGray - interface "**Secure Storage API**" as api #ArmGreen - dfd_tb($label="Platform Root of Trust") { - rectangle "Storage service" as service #ArmMidBlue - } - dfd_tb($label="Secure Element") { - database "Storage medium" as store #ArmLightGray - } -} - -caller -d- api -api -d-> service : DF1 -service <-d-> store : DF5 - -@enduml +' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +@startuml + +!include psa-spec.pumh +!include psa-dataflow.pumh + +skinparam RectangleborderThickness 0 +skinparam RectanglefontColor white +skinparam DatabaseBorderColor #PSAMidGray +skinparam InterfaceBorderColor #PSAMidGray + +left to right direction + +dfd_tb("Device ") { + rectangle "Application" as caller #PSAMidGray + interface "**Secure Storage API**" as api #PSAGreen + dfd_tb($label="Platform Root of Trust") { + rectangle "Storage service" as service #PSAMidBlue + } + dfd_tb($label="Secure Element") { + database "Storage medium" as store #PSALightGray + } +} + +caller -d- api +api -d-> service : DF1 +service <-d-> store : DF5 + +@enduml diff --git a/doc/storage/figure/lifecycle.puml b/doc/storage/figure/lifecycle.puml index ff5bc138..160264b4 100644 --- a/doc/storage/figure/lifecycle.puml +++ b/doc/storage/figure/lifecycle.puml @@ -1,39 +1,39 @@ ' SPDX-FileCopyrightText: Copyright 2023 Arm Limited and/or its affiliates -' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license - -@startuml - -!include atg-spec.pumh -!include atg-lifecycle.pumh - -stakeholder "SiP and OEM" as n1 -stakeholder "SiP and/or OEM" as n2 -stakeholder "[everybody]" as n3 -stakeholder_skip as n4 -stakeholder "SiP, OEM,\nand Owner" as n5 - -lifecycle_phase "Manufacturing" as r1 { - lifecycle_state "System\nmanufacturing\nand initialization" as lc1 - lifecycle_state "Provision of\nRoot of Trust\nsecrets" as lc2 -} -lifecycle_phase "Operational" as r3 { - lifecycle_state "Boot" as lc3 - lifecycle_state "Secure operation" as lc4 -} -lifecycle_phase "End of life" as r5 { - lifecycle_state "Return to\nManufacturer" as lc5 -} - -lc1 --> lc2 -lc2 --> lc3 -lc3 --> lc4 -lc4 --> lc5 - -n1 -[hidden]- n2 -n2 -[hidden]- n3 -n3 -[hidden]- n4 -n4 -[hidden]- n5 - -lc1 -[hidden] n1 - -@enduml +' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +@startuml + +!include psa-spec.pumh +!include psa-lifecycle.pumh + +stakeholder "SiP and OEM" as n1 +stakeholder "SiP and/or OEM" as n2 +stakeholder "[everybody]" as n3 +stakeholder_skip as n4 +stakeholder "SiP, OEM,\nand Owner" as n5 + +lifecycle_phase "Manufacturing" as r1 { + lifecycle_state "System\nmanufacturing\nand initialization" as lc1 + lifecycle_state "Provision of\nRoot of Trust\nsecrets" as lc2 +} +lifecycle_phase "Operational" as r3 { + lifecycle_state "Boot" as lc3 + lifecycle_state "Secure operation" as lc4 +} +lifecycle_phase "End of life" as r5 { + lifecycle_state "Return to\nManufacturer" as lc5 +} + +lc1 --> lc2 +lc2 --> lc3 +lc3 --> lc4 +lc4 --> lc5 + +n1 -[hidden]- n2 +n2 -[hidden]- n3 +n3 -[hidden]- n4 +n4 -[hidden]- n5 + +lc1 -[hidden] n1 + +@enduml diff --git a/doc/storage/figure/storage.puml b/doc/storage/figure/storage.puml index 0947d76a..f48add93 100644 --- a/doc/storage/figure/storage.puml +++ b/doc/storage/figure/storage.puml @@ -2,7 +2,7 @@ ' SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license @startuml -!include atg-spec.pumh +!include psa-spec.pumh participant "Application" as app box "Platform Root of Trust" #E0E0E0 diff --git a/doc/storage/pyproject.toml b/doc/storage/pyproject.toml new file mode 100644 index 00000000..52de3a0e --- /dev/null +++ b/doc/storage/pyproject.toml @@ -0,0 +1,4 @@ +# SPDX-FileCopyrightText: Copyright 2026 Arm Limited and/or its affiliates +# SPDX-License-Identifier: Apache-2.0 + +[tool.esbonio] diff --git a/tools/docs/using-psa-api-tool.md b/tools/docs/using-psa-api-tool.md index b818b7a7..5065f226 100644 --- a/tools/docs/using-psa-api-tool.md +++ b/tools/docs/using-psa-api-tool.md @@ -42,11 +42,15 @@ sets `psa_api_tool_path` to the repository `tools/` directory, allows the `PSA_A environment variable to override that path, then executes `psa-api-conf.py` from the selected tool copy. -Older PSA API source revisions used the former `atg-sphinx-spec` name. The -shared makefile exports `ATG_SPHINX_SPEC` as an alias for `PSA_API_TOOL`, and -the tool provides `atg-sphinx-conf.py` as a compatibility wrapper around -`psa-api-conf.py`. This allows older source trees to be built with the newer -tool by invoking: +Each specification directory also contains a minimal `pyproject.toml` file. These files +act as project-boundary markers for editor integrations such as Esbonio, allowing each +specification to have a separate Sphinx session and live preview while using the same +checked-in tool copy. They are not used by the repository make targets. + +Older PSA API source revisions used the former `atg-sphinx-spec` name. The shared +makefile exports `ATG_SPHINX_SPEC` as an alias for `PSA_API_TOOL`, and the tool provides +`atg-sphinx-conf.py` as a compatibility wrapper around `psa-api-conf.py`. This allows +older source trees to be built with the newer tool by invoking: ```sh make -f /path/to/psa-api-tool/make doc/crypto/html From b1c5a3bda8a97c74d31459f25c38bbf62d328ac4 Mon Sep 17 00:00:00 2001 From: Andrew Thoelke <andrew.thoelke@arm.com> Date: Fri, 12 Jun 2026 00:50:33 +0100 Subject: [PATCH 3/9] Document specification build workflow Signed-off-by: Andrew Thoelke <andrew.thoelke@arm.com> --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index d7d58fb9..34222e1a 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ This GitHub repository contains: * Specification source files * Reference copies of the PSA Certified API header files * Examples of usage and implementation of the PSA Certified APIs +* Build tooling for rendering the specifications * Discussions of updates to the specifications * Proposed changes to the specifications @@ -77,6 +78,32 @@ Crypto Driver Interface | [1.0 Alpha-1][crypto-driver-specs] | [doc/crypto-drive Reference header files for each minor version of each API are provided in the [headers/](headers) folder. +## Building the specifications + +This repository includes the documentation build tooling in [tools/](tools). The top-level `Makefile` uses that local tool copy by default, so a normal build does not require a separate checkout of the build tools. + +The core HTML build path requires Python, Sphinx, and `make`. PDF output also requires a LaTeX toolchain with `pdflatex`. Regenerating figures can require additional tools, depending on the figure source format, including Graphviz, `wavedrompy`, PlantUML, Java, and `rsvg-convert`. + +Build one specification from the repository root with: + +```sh +make doc/crypto/html +make doc/crypto/pdf +make doc/crypto/headers +make doc/crypto/api-diff +``` + +Replace `doc/crypto` with another specification directory, such as `doc/attestation`, `doc/storage`, `doc/fwu`, `doc/status-code`, or `doc/crypto-driver`. + +Build one output format for every specification with: + +```sh +make html +make pdf +``` + +Generated output is written under [build/](build). The build guide in [tools/docs/using-psa-api-tool.md](tools/docs/using-psa-api-tool.md) describes the available targets, dependencies, and validation flow. The editing reference in [tools/docs/psa-api-tool-notes.md](tools/docs/psa-api-tool-notes.md) describes the custom directives, roles, and source conventions used by the specifications. + ## Test Suite Test suites are available to validate compliance of API implementations against the specifications for Crypto, Attestation, and Secure Storage APIs, from: From 7ef036d6457814b4ec55d79031d7b32e3ec81b6c Mon Sep 17 00:00:00 2001 From: Andrew Thoelke <andrew.thoelke@arm.com> Date: Wed, 15 Apr 2026 16:51:53 +0100 Subject: [PATCH 4/9] Remove unneccessary uses of 'Arm' in the tools and documents Signed-off-by: Andrew Thoelke <andrew.thoelke@arm.com> --- doc/attestation/about.rst | 6 +++--- doc/attestation/conf.py | 8 ++++---- doc/crypto-driver/about/references | 2 +- doc/crypto-driver/appendix/open-issues.rst | 2 +- doc/crypto-driver/conf.py | 8 ++++---- doc/crypto/about/about.rst | 6 +----- doc/crypto/about/references | 12 ++++++------ doc/crypto/conf.py | 8 ++++---- doc/crypto/overview/sample-arch.rst | 4 ++-- doc/fwu/conf.py | 8 ++++---- doc/fwu/references | 16 ++++++++-------- doc/status-code/about/references | 2 +- doc/status-code/conf.py | 8 ++++---- doc/storage/about.rst | 8 ++++---- doc/storage/conf.py | 8 ++++---- 15 files changed, 51 insertions(+), 55 deletions(-) diff --git a/doc/attestation/about.rst b/doc/attestation/about.rst index aeb2edff..03a259da 100644 --- a/doc/attestation/about.rst +++ b/doc/attestation/about.rst @@ -60,17 +60,17 @@ .. reference:: PSM :title: Platform Security Model - :doc_no: ARM DEN 0128 + :doc_id: ARM DEN 0128 :url: developer.arm.com/documentation/den0128 .. reference:: PSA-STAT :title: PSA Certified Status code API - :doc_no: ARM IHI 0097 + :doc_id: ARM IHI 0097 :url: arm-software.github.io/psa-api/status-code .. reference:: PSA-FFM :title: Arm® Platform Security Architecture Firmware Framework - :doc_no: ARM DEN 0063 + :doc_id: ARM DEN 0063 :url: developer.arm.com/documentation/den0063 .. reference:: C99 diff --git a/doc/attestation/conf.py b/doc/attestation/conf.py index 78a83c72..e5cb6b94 100644 --- a/doc/attestation/conf.py +++ b/doc/attestation/conf.py @@ -18,14 +18,14 @@ 'copyright_date': '2018-2020, 2022-2026', 'copyright': 'Arm Limited and/or its affiliates', - # Arm document identifier, marked as open issue if not provided + # Document identifier, marked as open issue if not provided 'doc_id': 'IHI 0085', # The short X.Y version. MANDATORY 'version': '2.0', - # Arm document quality status, marked as open issue if not provided + # Document quality status, marked as open issue if not provided 'quality': 'REL', - # Arm document issue number (within that version and quality status) + # Document issue number (within that version and quality status) # Marked as open issue if not provided 'issue_no': 0, # Identifies the sequence number of a release candidate of the same issue @@ -33,7 +33,7 @@ 'release_candidate': None, #'draft': True, - # Arm document confidentiality. Must be either Non-confidential or Confidential + # Document confidentiality. Must be either Non-confidential or Confidential # Marked as open issue if not provided 'confidentiality': 'Non-confidential', diff --git a/doc/crypto-driver/about/references b/doc/crypto-driver/about/references index 6beffaa9..e42aeefd 100644 --- a/doc/crypto-driver/about/references +++ b/doc/crypto-driver/about/references @@ -3,5 +3,5 @@ .. reference:: PSA-CRYPT :title: PSA Certified Crypto API - :doc_no: IHI 0086 + :doc_id: IHI 0086 :url: arm-software.github.io/psa-api/crypto diff --git a/doc/crypto-driver/appendix/open-issues.rst b/doc/crypto-driver/appendix/open-issues.rst index 115b2bdb..50e02cd7 100644 --- a/doc/crypto-driver/appendix/open-issues.rst +++ b/doc/crypto-driver/appendix/open-issues.rst @@ -44,7 +44,7 @@ Use the same vendor assignment as for PSA services? Can the driver assembly process generate distinct location values as needed? This can be convenient, but it's also risky: if you upgrade a device, you need the location values to be the same between builds. -The current plan is for Arm to maintain a registry of vendors and assign a location namespace to each vendor. +The current plan is to maintain a registry of vendors and assign a location namespace to each vendor. Parts of the namespace would be reserved for implementations and integrators. Multiple transparent drivers diff --git a/doc/crypto-driver/conf.py b/doc/crypto-driver/conf.py index c04bdab2..65d53204 100644 --- a/doc/crypto-driver/conf.py +++ b/doc/crypto-driver/conf.py @@ -18,14 +18,14 @@ 'copyright_date': '2020-2025', 'copyright': 'Arm Limited and/or its affiliates', - # Arm document identifier, marked as open issue if not provided + # Document identifier, marked as open issue if not provided 'doc_id': '111106', # The short X.Y version. MANDATORY 'version': '1.0', - # Arm document quality status, marked as open issue if not provided + # Document quality status, marked as open issue if not provided 'quality': 'ALP', - # Arm document issue number (within that version and quality status) + # Document issue number (within that version and quality status) # Marked as open issue if not provided 'issue_no': 1, # Identifies the sequence number of a release candidate of the same issue @@ -34,7 +34,7 @@ # Draft status - use this to indicate the document is not ready for publication #'draft': True, - # Arm document confidentiality. Must be either Non-confidential or Confidential + # Document confidentiality. Must be either Non-confidential or Confidential # Marked as open issue if not provided 'confidentiality': 'Non-confidential', diff --git a/doc/crypto/about/about.rst b/doc/crypto/about/about.rst index 148683f5..dc1b25b2 100644 --- a/doc/crypto/about/about.rst +++ b/doc/crypto/about/about.rst @@ -14,11 +14,7 @@ This document refers to the following documents. - .. reference-table:: Arm documents referenced by this document - :filter: arm - - .. reference-table:: Other documents referenced by this document - :filter: non-arm + .. reference-table:: Documents referenced by this document :sorted: .. include:: terms diff --git a/doc/crypto/about/references b/doc/crypto/about/references index b23bf4e7..7d9c99cf 100644 --- a/doc/crypto/about/references +++ b/doc/crypto/about/references @@ -2,18 +2,18 @@ .. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license .. reference:: PSM - :title: Platform Security Model - :doc_no: ARM DEN 0128 - :url: developer.arm.com/documentation/den0128 + :title: Platform Security Model + :doc_id: ARM DEN 0128 + :url: developer.arm.com/documentation/den0128 .. reference:: PSA-FFM :title: Arm® Platform Security Architecture Firmware Framework - :doc_no: ARM DEN 0063 + :doc_id: ARM DEN 0063 :url: developer.arm.com/documentation/den0063 .. reference:: PSA-STAT :title: PSA Certified Status code API - :doc_no: ARM IHI 0097 + :doc_id: ARM IHI 0097 :url: arm-software.github.io/psa-api/status-code .. reference:: C99 @@ -405,7 +405,7 @@ .. reference:: PSA-PQC :title: PSA Certified Crypto API 1.4 PQC Extension - :doc_no: ARM AES 0119 + :doc_id: ARM AES 0119 :url: arm-software.github.io/psa-api/crypto .. reference:: RFC5958 diff --git a/doc/crypto/conf.py b/doc/crypto/conf.py index a442a3ee..57b34d46 100644 --- a/doc/crypto/conf.py +++ b/doc/crypto/conf.py @@ -18,14 +18,14 @@ 'copyright_date': '2018-2026', 'copyright': 'Arm Limited and/or its affiliates', - # Arm document identifier, marked as open issue if not provided + # Document identifier, marked as open issue if not provided 'doc_id': 'IHI 0086', # The short X.Y version. MANDATORY 'version': '1.5', - # Arm document quality status, marked as open issue if not provided + # Document quality status, marked as open issue if not provided 'quality': 'REL', - # Arm document issue number (within that version and quality status) + # Document issue number (within that version and quality status) # Marked as open issue if not provided 'issue_no': 0, # Identifies the sequence number of a release candidate of the same issue @@ -34,7 +34,7 @@ # Draft status - use this to indicate the document is not ready for publication #'draft': True, - # Arm document confidentiality. Must be either Non-confidential or Confidential + # Document confidentiality. Must be either Non-confidential or Confidential # Marked as open issue if not provided 'confidentiality': 'Non-confidential', diff --git a/doc/crypto/overview/sample-arch.rst b/doc/crypto/overview/sample-arch.rst index 94e6721e..f4a77142 100644 --- a/doc/crypto/overview/sample-arch.rst +++ b/doc/crypto/overview/sample-arch.rst @@ -18,8 +18,8 @@ application code can access all the system memory, including the memory used by the cryptographic services described in this specification. Thus, the architecture provides :term:`no isolation`. -This architecture does not conform to the Arm *Platform Security Architecture -Security Model*. However, it is useful for providing cryptographic services +This architecture does not conform to the :cite-title:`PSM`. +However, it is useful for providing cryptographic services that use the same interface, even on devices that cannot support any security boundary. So, while this architecture is not the primary design goal of the API defined in the present specification, it is supported. diff --git a/doc/fwu/conf.py b/doc/fwu/conf.py index e28f8a40..fdd6246e 100644 --- a/doc/fwu/conf.py +++ b/doc/fwu/conf.py @@ -18,14 +18,14 @@ 'copyright_date': '2020-2025', 'copyright': 'Arm Limited and/or its affiliates', - # Arm document identifier, marked as open issue if not provided + # Document identifier, marked as open issue if not provided 'doc_id': 'IHI 0093', # The short X.Y version. MANDATORY 'version': '1.0', - # Arm document quality status, marked as open issue if not provided + # Document quality status, marked as open issue if not provided 'quality': 'REL', - # Arm document issue number (within that version and quality status) + # Document issue number (within that version and quality status) # Marked as open issue if not provided 'issue_no': 1, # Identifies the sequence number of a release candidate of the same issue @@ -33,7 +33,7 @@ #'release_candidate': 2, #'draft': True, - # Arm document confidentiality. Must be either Non-confidential or Confidential + # Document confidentiality. Must be either Non-confidential or Confidential # Marked as open issue if not provided 'confidentiality': 'Non-confidential', diff --git a/doc/fwu/references b/doc/fwu/references index 2c6c6799..d03707df 100644 --- a/doc/fwu/references +++ b/doc/fwu/references @@ -3,27 +3,27 @@ .. reference:: PSA-STAT :title: PSA Certified Status code API - :doc_no: ARM IHI 0097 + :doc_id: ARM IHI 0097 :url: arm-software.github.io/psa-api/status-code .. reference:: PSA-FFM :title: Arm® Platform Security Architecture Firmware Framework - :doc_no: ARM DEN 0063 + :doc_id: ARM DEN 0063 :url: developer.arm.com/documentation/den0063 .. reference:: PSM :title: Platform Security Model - :doc_no: ARM DEN 0128 + :doc_id: ARM DEN 0128 :url: developer.arm.com/documentation/den0128 .. reference:: PSA-CERT :title: PSA Certified™ Level 2 Lightweight Protection Profile - :doc_no: JSA DEN 002 + :doc_id: JSA DEN 002 :url: psacertified.org/development-resources/certification-resources/#leveltwo .. reference:: IR8259 :author: NIST - :doc_no: IR 8259 + :doc_id: IR 8259 :title: Foundational Cybersecurity Activities for IoT Device Manufacturers :publication: May 2020 :url: doi.org/10.6028/NIST.IR.8259 @@ -31,20 +31,20 @@ .. reference:: EN303645 :title: Cyber Security for Consumer Internet of Things: Baseline Requirements :author: ETSI - :doc_no: EN 303 645 + :doc_id: EN 303 645 :publication: June 2020 :url: www.etsi.org/standards/get-standards#search=303%20645 .. reference:: LWM2M :title: Lightweight M2M :author: OMA - :doc_no: LwM2M v1.2 + :doc_id: LwM2M v1.2 :publication: November 2020 :url: openmobilealliance.org/release/LightweightM2M .. reference:: UEFI :title: Unified Extensible Firmware Interface (UEFI) Specification - :doc_no: UEFI v2.10 + :doc_id: UEFI v2.10 :author: UEFI Forum, Inc. :publication: August 2022 :url: uefi.org/specifications diff --git a/doc/status-code/about/references b/doc/status-code/about/references index d3a490cf..86cab83f 100644 --- a/doc/status-code/about/references +++ b/doc/status-code/about/references @@ -3,7 +3,7 @@ .. reference:: PSA-FFM :title: Arm® Platform Security Architecture Firmware Framework - :doc_no: DEN 0063 + :doc_id: DEN 0063 :url: https://developer.arm.com/documentation/den0063/a .. reference:: TF-M diff --git a/doc/status-code/conf.py b/doc/status-code/conf.py index 02032788..4df32c93 100644 --- a/doc/status-code/conf.py +++ b/doc/status-code/conf.py @@ -18,14 +18,14 @@ 'copyright_date': '2017-2022, 2024-2026', 'copyright': 'Arm Limited and/or its affiliates', - # Arm document identifier, marked as open issue if not provided + # Document identifier, marked as open issue if not provided 'doc_id': 'IHI 0097', # The short X.Y version. MANDATORY 'version': '1.0', - # Arm document quality status, marked as open issue if not provided + # Document quality status, marked as open issue if not provided 'quality': 'REL', - # Arm document issue number (within that version and quality status) + # Document issue number (within that version and quality status) # Marked as open issue if not provided 'issue_no': 5, # Identifies the sequence number of a release candidate of the same issue @@ -33,7 +33,7 @@ 'release_candidate': None, 'draft': False, - # Arm document confidentiality. Must be either Non-confidential or Confidential + # Document confidentiality. Must be either Non-confidential or Confidential # Marked as open issue if not provided 'confidentiality': 'Non-confidential', diff --git a/doc/storage/about.rst b/doc/storage/about.rst index 2abc0bed..e580e915 100644 --- a/doc/storage/about.rst +++ b/doc/storage/about.rst @@ -57,22 +57,22 @@ .. reference:: PSM :title: Platform Security Model - :doc_no: ARM DEN 0128 + :doc_id: ARM DEN 0128 :url: developer.arm.com/documentation/den0128 .. reference:: PSA-CRYPT :title: PSA Certified Crypto API - :doc_no: IHI 0086 + :doc_id: IHI 0086 :url: arm-software.github.io/psa-api/crypto .. reference:: PSA-STAT :title: PSA Certified Status code API - :doc_no: ARM IHI 0097 + :doc_id: ARM IHI 0097 :url: arm-software.github.io/psa-api/status-code .. reference:: PSA-FFM :title: Arm® Platform Security Architecture Firmware Framework - :doc_no: ARM DEN 0063 + :doc_id: ARM DEN 0063 :url: developer.arm.com/documentation/den0063 .. reference:: SP800-30 diff --git a/doc/storage/conf.py b/doc/storage/conf.py index 84e3bdd5..58ed9db0 100644 --- a/doc/storage/conf.py +++ b/doc/storage/conf.py @@ -18,14 +18,14 @@ 'copyright_date': '2018-2019, 2022-2025', 'copyright': 'Arm Limited and/or its affiliates', - # Arm document identifier, marked as open issue if not provided + # Document identifier, marked as open issue if not provided 'doc_id': 'IHI 0087', # The short X.Y version. MANDATORY 'version': '1.0', - # Arm document quality status, marked as open issue if not provided + # Document quality status, marked as open issue if not provided 'quality': 'REL', - # Arm document issue number (within that version and quality status) + # Document issue number (within that version and quality status) # Marked as open issue if not provided 'issue_no': 4, # Identifies the sequence number of a release candidate of the same issue @@ -34,7 +34,7 @@ # Draft status - use this to indicate the document is not ready for publication #'draft': True, - # Arm document confidentiality. Must be either Non-confidential or Confidential + # Document confidentiality. Must be either Non-confidential or Confidential # Marked as open issue if not provided 'confidentiality': 'Non-confidential', From 37c76f41a45fafe7498330ddb3618516e1610615 Mon Sep 17 00:00:00 2001 From: Andrew Thoelke <andrew.thoelke@arm.com> Date: Fri, 15 May 2026 10:04:35 +0100 Subject: [PATCH 5/9] Tidy up front matter, rely on common REL change note Signed-off-by: Andrew Thoelke <andrew.thoelke@arm.com> Renamed docversion to APIversion Signed-off-by: Andrew Thoelke <andrew.thoelke@arm.com> --- doc/attestation/about.rst | 140 ---------------------------- doc/attestation/about/about.rst | 10 ++ doc/attestation/about/references | 35 +++++++ doc/attestation/about/releases | 71 ++++++++++++++ doc/attestation/about/terms | 32 +++++++ doc/attestation/index.rst | 2 +- doc/attestation/overview/report.rst | 2 +- doc/crypto-driver/README.md | 2 +- doc/crypto-driver/about/about.rst | 8 -- doc/crypto-driver/about/releases | 5 + doc/crypto-driver/about/terms | 3 + doc/crypto/about/about.rst | 23 ----- doc/crypto/about/references | 7 ++ doc/crypto/about/releases | 5 + doc/crypto/appendix/history.rst | 2 +- doc/fwu/README.md | 3 +- doc/fwu/about.rst | 33 ------- doc/fwu/about/about.rst | 10 ++ doc/fwu/{ => about}/references | 8 ++ doc/fwu/{ => about}/releases | 6 ++ doc/fwu/{ => about}/terms | 0 doc/fwu/index.rst | 2 +- doc/fwu/overview/goals.rst | 2 +- doc/status-code/about/about.rst | 11 --- doc/status-code/about/releases | 12 +++ 25 files changed, 212 insertions(+), 222 deletions(-) delete mode 100644 doc/attestation/about.rst create mode 100644 doc/attestation/about/about.rst create mode 100644 doc/attestation/about/references create mode 100644 doc/attestation/about/releases create mode 100644 doc/attestation/about/terms delete mode 100644 doc/fwu/about.rst create mode 100644 doc/fwu/about/about.rst rename doc/fwu/{ => about}/references (95%) rename doc/fwu/{ => about}/releases (88%) rename doc/fwu/{ => about}/terms (100%) diff --git a/doc/attestation/about.rst b/doc/attestation/about.rst deleted file mode 100644 index 03a259da..00000000 --- a/doc/attestation/about.rst +++ /dev/null @@ -1,140 +0,0 @@ -.. SPDX-FileCopyrightText: Copyright 2018-2020, 2022-2026 Arm Limited and/or its affiliates -.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license - -.. Releases of this specification - -.. release:: 1.0.0 - :date: June 2019 - :confidentiality: Non-confidential - - First stable release with finalized 1.0 API. - -.. release:: 1.0.1 - :date: August 2019 - :confidentiality: Non-confidential - - Recommend type byte 0x01 for arm_psa_UEID. - - Remove erroneous guidance regarding EAT’s origination claim. - -.. release:: 1.0.2 - :date: February 2020 - :confidentiality: Non-confidential - - Clarify the claim number of Instance ID. - - Permit COSE-Mac0 for signing tokens (with appropriate warning). - - Update URLs. - -.. release:: 1.0.3 - :date: October 2022 - :confidentiality: Non-confidential - - Relicensed as open source under CC BY-SA 4.0. - - CDDL definition added to the appendices. - - Example header file added to the appendices. - - Minor corrections and clarifications. - -.. release:: 1.0.4 - :date: September 2025 - :confidentiality: Non-confidential - - GlobalPlatform governance of PSA Certified evaluation scheme. - -.. release:: 2.0.0 - :date: May 2026 - :confidentiality: Non-confidential - - Updated attestation token format to the PSA attestation token. - -.. release-info:: - :extend: - - The detailed changes in each release are described in :secref:`document-history`. - -.. References used within this specification - -.. reference:: PSM - :title: Platform Security Model - :doc_id: ARM DEN 0128 - :url: developer.arm.com/documentation/den0128 - -.. reference:: PSA-STAT - :title: PSA Certified Status code API - :doc_id: ARM IHI 0097 - :url: arm-software.github.io/psa-api/status-code - -.. reference:: PSA-FFM - :title: Arm® Platform Security Architecture Firmware Framework - :doc_id: ARM DEN 0063 - :url: developer.arm.com/documentation/den0063 - -.. reference:: C99 - :title: ISO/IEC 9899:1999 --- Programming Languages --- C - :author: ISO/IEC - :publication: December 1999 - :url: www.iso.org/standard/29237.html - -.. reference:: RFC9783 - :title: Arm's Platform Security Architecture (PSA) Attestation Token - :author: H. Tschofenig, S. Frost, M. Brossard, A. Shaw, and T. Fossati - :publication: June 2025 - :url: tools.ietf.org/html/rfc9783 - -.. reference:: RFC2104 - :title: HMAC: Keyed-Hashing for Message Authentication - :author: IETF - :publication: February 1997 - :url: tools.ietf.org/html/rfc2104 - - -.. Terms used within this specification - -.. term:: Initial Attestation Key - :abbr: IAK - - Typically, the Initial Attestation Key is a secret private key from an asymmetric key-pair accessible only to the Initial Attestation service within the :term:`Platform Root of Trust`. See :cite-title:`PSM`. - -.. term:: PSA - - Platform Security Architecture - -.. term:: Platform Root of Trust - :abbr: PRoT - - The overall trust anchor for the system. This ensures the platform is securely booted and configured, and establishes the secure environments required to protect security services. See :cite-title:`PSM`. - -.. scterm:: Implementation Defined - - Behavior that is not defined by this specification, but is defined and documented by individual implementations. - - Application developers can choose to depend on :sc:`IMPLEMENTATION DEFINED` behavior, but must be aware that their code might not be portable to another implementation. - -.. term:: Secure Processing Environment - :abbr: SPE - - This is the security domain that includes the :term:`Platform Root of Trust` domain. - -.. term:: Non-secure Processing Environment - :abbr: NSPE - - This is the security domain outside of the :term:`Secure Processing Environment`. It is the application domain, typically containing the application firmware and hardware. - - - -.. potential-for-change:: - - The contents of this specification are stable for version |docversion|. - - The following may change in updates to the version |docversion| specification: - - * Small optional feature additions. - * Clarifications. - - Significant additions, or any changes that affect the compatibility of the interfaces defined in this specification will only be included in a new major or minor version of the specification. - -.. about:: diff --git a/doc/attestation/about/about.rst b/doc/attestation/about/about.rst new file mode 100644 index 00000000..f6259b36 --- /dev/null +++ b/doc/attestation/about/about.rst @@ -0,0 +1,10 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2020, 2022-2025 Arm Limited and/or its affiliates +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. include:: releases + +.. include:: references + +.. include:: terms + +.. about:: diff --git a/doc/attestation/about/references b/doc/attestation/about/references new file mode 100644 index 00000000..8ae77ffc --- /dev/null +++ b/doc/attestation/about/references @@ -0,0 +1,35 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2020, 2022-2025 Arm Limited and/or its affiliates +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. reference:: PSM + :title: Platform Security Model + :doc_id: ARM DEN 0128 + :url: developer.arm.com/documentation/den0128 + +.. reference:: PSA-STAT + :title: PSA Certified Status code API + :doc_id: ARM IHI 0097 + :url: arm-software.github.io/psa-api/status-code + +.. reference:: PSA-FFM + :title: Arm® Platform Security Architecture Firmware Framework + :doc_id: ARM DEN 0063 + :url: developer.arm.com/documentation/den0063 + +.. reference:: C99 + :title: ISO/IEC 9899:1999 --- Programming Languages --- C + :author: ISO/IEC + :publication: December 1999 + :url: www.iso.org/standard/29237.html + +.. reference:: RFC9783 + :title: Arm's Platform Security Architecture (PSA) Attestation Token + :author: H. Tschofenig, S. Frost, M. Brossard, A. Shaw, and T. Fossati + :publication: June 2025 + :url: tools.ietf.org/html/rfc9783 + +.. reference:: RFC2104 + :title: HMAC: Keyed-Hashing for Message Authentication + :author: IETF + :publication: February 1997 + :url: tools.ietf.org/html/rfc2104 diff --git a/doc/attestation/about/releases b/doc/attestation/about/releases new file mode 100644 index 00000000..d43ac70b --- /dev/null +++ b/doc/attestation/about/releases @@ -0,0 +1,71 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2020, 2022-2025 Arm Limited and/or its affiliates +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. Releases of this specification + +.. release:: 1.0 beta 0 + :date: February 2019 + :confidentiality: Non-confidential + + Initial publication. + +.. release:: 1.0.0 + :date: June 2019 + :confidentiality: Non-confidential + + First stable release with 1.0 API finalized. + + Uses the PSA Certified API common error status codes. + + Modified the API parameters to align with other PSA Certified APIs. + + Updated the claims and lifecycle to match the latest Platform Security Model. + + Updated CBOR example in the appendix. + +.. release:: 1.0.1 + :date: August 2019 + :confidentiality: Non-confidential + + Recommend type byte 0x01 for arm_psa_UEID. + + Remove erroneous guidance regarding EAT’s origination claim. + +.. release:: 1.0.2 + :date: February 2020 + :confidentiality: Non-confidential + + Clarify the claim number of Instance ID. + + Permit COSE-Mac0 for signing tokens (with appropriate warning). + + Update URLs. + +.. release:: 1.0.3 + :date: October 2022 + :confidentiality: Non-confidential + + Relicensed as open source under CC BY-SA 4.0. + + CDDL definition added to the appendices. + + Example header file added to the appendices. + + Minor corrections and clarifications. + +.. release:: 1.0.4 + :date: September 2025 + :confidentiality: Non-confidential + + GlobalPlatform governance of PSA Certified evaluation scheme. + +.. release:: 2.0.0 + :date: ? + :confidentiality: Non-confidential + + Updated attestation token format to the PSA attestation token. + +.. release-info:: + :extend: + + The detailed changes in each release are described in :secref:`document-history`. diff --git a/doc/attestation/about/terms b/doc/attestation/about/terms new file mode 100644 index 00000000..40718007 --- /dev/null +++ b/doc/attestation/about/terms @@ -0,0 +1,32 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2020, 2022-2025 Arm Limited and/or its affiliates +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. term:: Initial Attestation Key + :abbr: IAK + + Typically, the Initial Attestation Key is a secret private key from an asymmetric key-pair accessible only to the Initial Attestation service within the :term:`Platform Root of Trust`. See :cite-title:`PSM`. + +.. term:: PSA + + Platform Security Architecture + +.. term:: Platform Root of Trust + :abbr: PRoT + + The overall trust anchor for the system. This ensures the platform is securely booted and configured, and establishes the secure environments required to protect security services. See :cite-title:`PSM`. + +.. scterm:: Implementation Defined + + Behavior that is not defined by this specification, but is defined and documented by individual implementations. + + Application developers can choose to depend on :sc:`IMPLEMENTATION DEFINED` behavior, but must be aware that their code might not be portable to another implementation. + +.. term:: Secure Processing Environment + :abbr: SPE + + This is the security domain that includes the :term:`Platform Root of Trust` domain. + +.. term:: Non-secure Processing Environment + :abbr: NSPE + + This is the security domain outside of the :term:`Secure Processing Environment`. It is the application domain, typically containing the application firmware and hardware. diff --git a/doc/attestation/index.rst b/doc/attestation/index.rst index a816bf36..3876a8f2 100644 --- a/doc/attestation/index.rst +++ b/doc/attestation/index.rst @@ -9,7 +9,7 @@ .. front-matter:: - about + about/about .. maintoc:: diff --git a/doc/attestation/overview/report.rst b/doc/attestation/overview/report.rst index 3cdc38eb..527ca2da 100644 --- a/doc/attestation/overview/report.rst +++ b/doc/attestation/overview/report.rst @@ -10,7 +10,7 @@ The attestation report returned by the |API| is formatted and encoded as a signe The PSA Attestation Token is an incompatible evolution of the original attestation format, that was specified in version 1.0 of the |API|. -To comply with version |docversion| of the |API|, an implementation must only produce attestation reports that conform to :rfc:`9783`. +To comply with version |APIversion| of the |API|, an implementation must only produce attestation reports that conform to :rfc:`9783`. :numref:`tab-psa-token-notes` provides specific recommendations for the construction of some of the token claims. diff --git a/doc/crypto-driver/README.md b/doc/crypto-driver/README.md index 51ea3341..aa6b7bcc 100644 --- a/doc/crypto-driver/README.md +++ b/doc/crypto-driver/README.md @@ -9,7 +9,7 @@ The Crypto Driver Interface specification source files are organized as follows: Folder | Content -- | -- -Current directory | Configuration and front-matter +Current directory | Configuration and table of contents `about` | Front matter `body` | Specification chapters `appendix` | Appendices diff --git a/doc/crypto-driver/about/about.rst b/doc/crypto-driver/about/about.rst index faab1969..4a8038c5 100644 --- a/doc/crypto-driver/about/about.rst +++ b/doc/crypto-driver/about/about.rst @@ -7,14 +7,6 @@ .. include:: terms -.. release-info:: - :extend: - - The detailed changes in each release are described in :secref:`changes`. - -.. terms:: - :hide: - .. potential-for-change:: This document is in active, collaborative development. diff --git a/doc/crypto-driver/about/releases b/doc/crypto-driver/about/releases index 4ec27336..eb402826 100644 --- a/doc/crypto-driver/about/releases +++ b/doc/crypto-driver/about/releases @@ -12,3 +12,8 @@ :confidentiality: Non-confidential Republished as part of the PSA Certified APIs. + +.. release-info:: + :extend: + + The detailed changes in each release are described in :secref:`changes`. diff --git a/doc/crypto-driver/about/terms b/doc/crypto-driver/about/terms index aa4424e9..a82dae71 100644 --- a/doc/crypto-driver/about/terms +++ b/doc/crypto-driver/about/terms @@ -1,2 +1,5 @@ .. SPDX-FileCopyrightText: Copyright 2025 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. terms:: + :hide: diff --git a/doc/crypto/about/about.rst b/doc/crypto/about/about.rst index dc1b25b2..e6129c64 100644 --- a/doc/crypto/about/about.rst +++ b/doc/crypto/about/about.rst @@ -3,31 +3,8 @@ .. include:: releases -.. release-info:: - :extend: - - The detailed changes in each release are described in :secref:`changes`. - .. include:: references -.. references:: - - This document refers to the following documents. - - .. reference-table:: Documents referenced by this document - :sorted: - .. include:: terms -.. potential-for-change:: - - The contents of this specification are stable for version |docversion|. - - The following may change in updates to the version |docversion| specification: - - * Small optional feature additions. - * Clarifications. - - Significant additions, or any changes that affect the compatibility of the interfaces defined in this specification will only be included in a new major or minor version of the specification. - .. about:: diff --git a/doc/crypto/about/references b/doc/crypto/about/references index 7d9c99cf..9a41c89a 100644 --- a/doc/crypto/about/references +++ b/doc/crypto/about/references @@ -551,3 +551,10 @@ :author: Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O’Hearn, Christian Winnerlein :publication: January 2013 :url: blake2.net/blake2.pdf + +.. references:: + + This document refers to the following documents. + + .. reference-table:: Documents referenced by this document + :sorted: diff --git a/doc/crypto/about/releases b/doc/crypto/about/releases index eb0a6df0..986dbeab 100644 --- a/doc/crypto/about/releases +++ b/doc/crypto/about/releases @@ -110,3 +110,8 @@ Integrated the PQC extension. New algorithms for BLAKE2 and multi-part asymmetric signature operations. + +.. release-info:: + :extend: + + The detailed changes in each release are described in :secref:`changes`. diff --git a/doc/crypto/appendix/history.rst b/doc/crypto/appendix/history.rst index 73a2cf62..fd8ba034 100644 --- a/doc/crypto/appendix/history.rst +++ b/doc/crypto/appendix/history.rst @@ -915,7 +915,7 @@ Other changes * Document formatting improvements. -Planned changes for version |docversion|.x +Planned changes for version |APIversion|.x ------------------------------------------ Future versions of this specification that use a |docversion|.x version will describe the same API as this specification. diff --git a/doc/fwu/README.md b/doc/fwu/README.md index a3e9a142..4f3756bf 100644 --- a/doc/fwu/README.md +++ b/doc/fwu/README.md @@ -9,7 +9,8 @@ The Firmware Update API specification source files are organized as follows: Folder | Content -- | -- -Current directory | Configuration and front-matter +Current directory | Configuration and table of contents +`about` | Front matter `overview` | Informative chapters 1-4 `api` | API reference chapter 5 `appendix` | Appendix chapters diff --git a/doc/fwu/about.rst b/doc/fwu/about.rst deleted file mode 100644 index 72e99ead..00000000 --- a/doc/fwu/about.rst +++ /dev/null @@ -1,33 +0,0 @@ -.. SPDX-FileCopyrightText: Copyright 2020-2023 Arm Limited and/or its affiliates -.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license - -.. include:: releases - -.. release-info:: - :extend: - - For a detailed list of changes, see :secref:`change-history`. - -.. include:: references - -.. include:: terms - -.. references:: - - This document refers to the following documents. - - .. reference-table:: Documents referenced by this document - :sorted: - -.. potential-for-change:: - - The contents of this specification are stable for version |docversion|. - - The following may change in updates to the version |docversion| specification: - - * Small optional feature additions. - * Clarifications. - - Significant additions, or any changes that affect the compatibility of the interfaces defined in this specification will only be included in a new major or minor version of the specification. - -.. about:: diff --git a/doc/fwu/about/about.rst b/doc/fwu/about/about.rst new file mode 100644 index 00000000..c5748c47 --- /dev/null +++ b/doc/fwu/about/about.rst @@ -0,0 +1,10 @@ +.. SPDX-FileCopyrightText: Copyright 2020-2023 Arm Limited and/or its affiliates +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. include:: releases + +.. include:: references + +.. include:: terms + +.. about:: diff --git a/doc/fwu/references b/doc/fwu/about/references similarity index 95% rename from doc/fwu/references rename to doc/fwu/about/references index d03707df..f06b8d58 100644 --- a/doc/fwu/references +++ b/doc/fwu/about/references @@ -100,3 +100,11 @@ :author: NIST :publication: September 2012 :url: doi.org/10.6028/NIST.SP.800-30r1 + + +.. references:: + + This document refers to the following documents. + + .. reference-table:: Documents referenced by this document + :sorted: diff --git a/doc/fwu/releases b/doc/fwu/about/releases similarity index 88% rename from doc/fwu/releases rename to doc/fwu/about/releases index 9aaa973f..733f6e1a 100644 --- a/doc/fwu/releases +++ b/doc/fwu/about/releases @@ -28,3 +28,9 @@ :confidentiality: Non-confidential GlobalPlatform governance of PSA Certified evaluation scheme. + + +.. release-info:: + :extend: + + For a detailed list of changes, see :secref:`change-history`. diff --git a/doc/fwu/terms b/doc/fwu/about/terms similarity index 100% rename from doc/fwu/terms rename to doc/fwu/about/terms diff --git a/doc/fwu/index.rst b/doc/fwu/index.rst index f3717c89..77ec2b08 100644 --- a/doc/fwu/index.rst +++ b/doc/fwu/index.rst @@ -13,7 +13,7 @@ .. front-matter:: - about + about/about .. maintoc:: diff --git a/doc/fwu/overview/goals.rst b/doc/fwu/overview/goals.rst index 020f731e..c00d70d3 100644 --- a/doc/fwu/overview/goals.rst +++ b/doc/fwu/overview/goals.rst @@ -101,7 +101,7 @@ The |API| must be independent of the format and encoding of firmware images and This version of the |API| is suitable for some of the use cases that are defined by :rfc-title:`9124` and :cite-title:`SUIT-MFST`. For example, where the payloads are integrated in the manifest envelope, or there is just one external payload to the envelope. - Support for the more complex use cases from :rfc:`9124`, with multiple external payloads, is not considered in version |docversion| of the |API|, but might be in scope for future versions of the interface. + Support for the more complex use cases from :rfc:`9124`, with multiple external payloads, is not considered in version |APIversion| of the |API|, but might be in scope for future versions of the interface. Flexibility for different hardware designs ------------------------------------------ diff --git a/doc/status-code/about/about.rst b/doc/status-code/about/about.rst index 2a516c3b..4437543b 100644 --- a/doc/status-code/about/about.rst +++ b/doc/status-code/about/about.rst @@ -3,17 +3,6 @@ .. include:: releases -.. release-info:: - :replace: - - Prior to version 1.0.1, the definitions in this specification were released as part of :cite-title:`PSA-FFM`. - - The change history table lists the changes that have been made to this document. - - .. release-table:: Document revision history - - For a detailed list of changes, see :secref:`change-history`. - .. include:: references .. include:: terms diff --git a/doc/status-code/about/releases b/doc/status-code/about/releases index 4de207a7..049d70df 100644 --- a/doc/status-code/about/releases +++ b/doc/status-code/about/releases @@ -34,3 +34,15 @@ :confidentiality: Non-confidential Fix link to PSA FF-M specification + + +.. release-info:: + :replace: + + Prior to version 1.0.1, the definitions in this specification were released as part of :cite-title:`PSA-FFM`. + + The change history table lists the changes that have been made to this document. + + .. release-table:: Document revision history + + For a detailed list of changes, see :secref:`change-history`. From 82ed43b7abe76a4b45e9597d8c9cdef54ae3fa73 Mon Sep 17 00:00:00 2001 From: Andrew Thoelke <andrew.thoelke@arm.com> Date: Thu, 11 Jun 2026 01:06:48 +0100 Subject: [PATCH 6/9] Add psa-api-2026 template Signed-off-by: Andrew Thoelke <andrew.thoelke@arm.com> --- .../templates/psa-api-2026/about-chapter.rst | 115 ++++ .../psa-api-2026/html-static/custom.css | 526 ++++++++++++++++ tools/templates/psa-api-2026/logo.pdf | Bin 0 -> 9134 bytes tools/templates/psa-api-2026/logo.pdf.license | 2 + tools/templates/psa-api-2026/logo.svg | 53 ++ tools/templates/psa-api-2026/logo.svg.license | 2 + tools/templates/psa-api-2026/psa-api-tool.sty | 594 ++++++++++++++++++ .../sphinx-templates/indextoc.html | 8 + .../psa-api-2026/sphinx-templates/toc.html | 13 + tools/templates/psa-api-2026/template-conf.py | 99 +++ tools/templates/psa-api-2026/title-page.rst | 49 ++ 11 files changed, 1461 insertions(+) create mode 100644 tools/templates/psa-api-2026/about-chapter.rst create mode 100644 tools/templates/psa-api-2026/html-static/custom.css create mode 100644 tools/templates/psa-api-2026/logo.pdf create mode 100644 tools/templates/psa-api-2026/logo.pdf.license create mode 100644 tools/templates/psa-api-2026/logo.svg create mode 100644 tools/templates/psa-api-2026/logo.svg.license create mode 100644 tools/templates/psa-api-2026/psa-api-tool.sty create mode 100644 tools/templates/psa-api-2026/sphinx-templates/indextoc.html create mode 100644 tools/templates/psa-api-2026/sphinx-templates/toc.html create mode 100644 tools/templates/psa-api-2026/template-conf.py create mode 100644 tools/templates/psa-api-2026/title-page.rst diff --git a/tools/templates/psa-api-2026/about-chapter.rst b/tools/templates/psa-api-2026/about-chapter.rst new file mode 100644 index 00000000..a843725e --- /dev/null +++ b/tools/templates/psa-api-2026/about-chapter.rst @@ -0,0 +1,115 @@ +.. SPDX-FileCopyrightText: Copyright 2026 Arm Limited +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. _introduction: + +Introduction +============ + +.. insert-section:: + :section: introduction + + .. todo:: Provide an introduction. + +.. insert-section:: + :section: api-status + +.. _feedback: + +.. insert-section:: + :section: feedback + + .. rubric:: Feedback + + We welcome feedback on the |docfulltitle|. + + If you have comments on the content of this specification, |docfeedback|. Give: + + * The title (|docfulltitle|). + * The number and issue (|docid| |docrelease|). + * The location in the document to which your comments apply. + * A concise explanation of your comments. + + We also welcome general suggestions for additions and improvements. + +.. _audience: + +.. insert-section:: Audience + :section: audience + :keep-if-empty: + + .. todo:: Describe the audience + +.. include-license:: + +.. _license: + +.. insert-section:: License + :section: license + :class: license + +.. _references: + +.. insert-section:: References + :section: references + + This section lists references applicable to this specification. The latest version of each reference applies unless a publication date or version is explicitly stated. + + .. reference-table:: Normative References + :layout: by-ref + :kind: normative + :sorted: + + .. reference-table:: Informative References + :layout: by-ref + :kind: informative + :sorted: + +.. _terms: + +.. insert-section:: Terminology and Definitions + :section: terms + + Selected terms used in this document are included in :numref:`tab-terms`. + + .. term-table:: Terminology and Definitions + :name: tab-terms + :sorted: + :kind: terms + +.. _abbreviations: + +.. insert-section:: Abbreviations + :section: abbreviations + + Abbreviations and notations used in this document are included in :numref:`tab-abbreviations`. + + .. term-table:: Abbreviations + :name: tab-abbreviations + :sorted: + :kind: abbreviations + +.. _release-info: + +.. insert-section:: Revision History + :section: release-info + + PSA Certified API documents use the following versioning scheme: + + * Those with version x.0 are major releases. + * Those versioned x.1, x.2, etc., are minor releases where changes typically introduce supplementary items that do not impact backward compatibility or interoperability of the specifications. + * Those versioned x.y.1, x.y.2, etc., are maintenance releases that incorporate errata and clarifications. + + :numref:`tab-revision-history` lists the changes that have been made to this document. + + .. release-table:: Revision History + :name: tab-revision-history + +.. only:: include_todo + + .. insert-section:: TODO items + :section: todos + + The following items are marked as TODO in the document source: + + .. todolist:: diff --git a/tools/templates/psa-api-2026/html-static/custom.css b/tools/templates/psa-api-2026/html-static/custom.css new file mode 100644 index 00000000..bca5234f --- /dev/null +++ b/tools/templates/psa-api-2026/html-static/custom.css @@ -0,0 +1,526 @@ +/* SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited */ +/* SPDX-License-Identifier: Apache-2.0 */ + +/* CSS overrides for the html output */ + +body { + font-family: Roboto, sans-serif; + font-size: 15px; + font-weight: 300; + color: black; +} + +div.document { + width: 965px; +} + +div.bodywrapper { + margin: 0 0 0 270px; +} + +div.body { + background-color: unset; + color: black; + padding: 0; +} + +div.sphinxsidebar { + width: 240px; + font-size: 12.5px; + margin-top: -30px; +} + +div.sphinxsidebarwrapper { + padding: 0; +} + +div.sphinxsidebarwrapper p.logo { + margin: 0; +} + +div.footer { + width: 965px; +} + +div.watermark { + position: fixed; + width: 660px; + height: 100%; + z-index: -999; + pointer-events: none; + } + +div.watermark p { + color: #EEE; + font-size: 160px; + font-weight: 400; + pointer-events: none; + user-select: none; + margin: 0px; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%) rotate(-45deg); + } + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Roboto, sans-serif; + font-weight: 400; + color: #002353; +} + +div.body h1 { font-size: 181%; } +div.body h2 { font-size: 145%; } +div.body h3 { font-size: 127%; } +div.body h4 { font-size: 114%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Roboto, sans-serif; + font-size: 20px; + font-weight: 400; + color: #002353; +} + +p.rubric { + font-weight: 400; + color: #002353; +} + +div.body input, div.sphinxsidebar input { + font-family: Roboto, sans-serif; + font-size: 15px; +} + +div.line { + line-height: 1.4em; +} + +a, a:visited { + color: #7D0097; + text-decoration: none; +} + +a.reference, div.sphinxsidebar a.reference { + border-bottom: none; +} + +a.reference:hover, div.sphinxsidebar a.reference:hover, a:hover code, a:hover tt { + color: #0688FF; + border-bottom: 1px dotted #0688FF; + background: unset; +} + +pre a:hover, a:hover code, a:hover tt { + font-weight: 400; +} + +mjx-math { + color: #555 +} + +tt, code { + font-family: "Roboto Mono", monospace; + font-size: 80%; + background-color: unset; + color: unset; +} + +h3 code, h4 code { + font-size: 88%; +} + +code.xref, a code { + font-weight: 300; + color: #7D0097; + background-color: unset; + border-bottom: unset; +} + +pre { + font-family: "Roboto Mono", monospace; + font-size: 80%; + color: black; + background: rgba(187,187,187,0.12); + padding: 5px; + margin: 10px -6px; + line-height: 1.3em; + border-style: solid; + border-width: 1px; + border-radius: 5px; + border-color: rgba(187,187,187,0.3); +} + +/* Fix the specific overrides in basic.css and alabaster.css for code blocks */ +div.highlight pre, dl pre, blockquote pre, li pre { + padding: 5px; + margin: 10px -6px; +} + +sub { + font-size: 70%; + vertical-align: -10%; + font-weight: 400; + color: #555; +} + +sup { + font-size: 70%; + line-height: normal; + vertical-align: 25%; + font-weight: 400; + color: #555; +} + +/* Default table formatting is like 'booktabs', 'standard' formatting can + can be specified explicitly. + */ + +table { + font-weight: 300; +} + +table.docutils { + font-size: unset; + box-shadow: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + /*width: 100%;*/ + border: 0; + border-top: 1px solid #A1B4B4; + border-bottom: 1px solid #A1B4B4; + margin-bottom: 1em; +} + +table.docutils.align-left { + margin-left: 0; + margin-right: auto; +} + +table.docutils.align-right { + margin-left: auto; + margin-right: 0; +} + +table.docutils.standard { + border: 1px solid #A1B4B4; +} + +table.docutils.borderless { + border: 0; +} + +table.docutils.borderless.titletable { + margin-top: 40px; + width: 70%; + margin-right: 0px; + margin-left: auto; +} + +table.docutils caption, div.figure p.caption, figcaption { + font-size: 90%; + text-align: right; + margin-right: -13px; /* move permalink into margin */ +} + +table.docutils caption span.caption-number, div.figure p.caption span.caption-number, figcaption span.caption-number { + font-weight: 400; + font-style: normal; +} + +table.docutils td, table.docutils th { + border: 0; + padding: 0.15em 0.5em 0.15em 0.5em; + text-align: left; + vertical-align: baseline; +} + +table.docutils tr:first-child th, table.docutils tr:first-child td { + padding-top: 0.4em; +} + +/* Add all rules for standard table formatting */ +table.docutils.standard td, table.docutils.standard th { + border: 1px solid #AAA; +} + +table.docutils td p, table.docutils th p, table.docutils td .line-block { + margin-block-start: .3em; + margin-block-end: .3em; +} + +table.docutils th > p:first-child, table.docutils td > p:first-child { + margin-top: 0px; +} + +table.docutils th { + font-weight: 400; + font-size: 90%; +} + +/* rule below stub rows */ +table.docutils th.stub { + border-bottom: none; +} + +table.docutils.standard th.stub { + border-bottom: 1px solid #A1B4B4; +} + +/* rule below header rows */ +table.docutils th.head { + border-bottom: 0; +} + +table.docutils tr:last-child > th.head { + border-bottom: 1px solid #A1B4B4; +} + +table.docutils.borderless tr:last-child > th.head { + border-bottom: 0; +} + +table.docutils.standard th.head { + border-bottom: 1px solid #A1B4B4; +} + +table.docutils.borderless th.head { + border-bottom: 0; +} + +figure { + margin-inline-start: 0px; + margin-inline-end: 0px; +} + +div.figure div.legend, figcaption div.legend { + font-size: 90%; /* adds to the figcaption scaling */ + text-align: center; +} + +div.figure p.caption, div.figure div.legend p, figcaption p, figcaption div.legend { + margin-block-start: 0.2em; + margin-block-end: 0.5em; +} + +table.docutils caption { + margin-bottom: 0.25em; +} + +div.admonition { + margin: 5px 15px; + padding: 5px 15px; + background-color: unset; + border: 0; + border-left: 6px solid #DDD; +} + +div.admonition p.admonition-title { + font-family: Roboto, sans-serif; + font-weight: 400; + font-size: 90%; +} + +p.admonition-title:after { + content: ""; +} + +div.admonition p { + margin-top: 0; + margin-bottom: 5px; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: unset; +} + +div.highlight { + background-color: unset; +} + +div.admonition div.highlight pre { + background-color: unset; +} + +div.warning { + border-left: 6px solid #FBB; +} + +div.warning p.admonition-title { + color: darkred; +} + +div.banner { + border: 2px solid #CC0; + background-color: rgba(255,255,0,0.25); +} + +div.rationale { + border-left: 6px solid #BFB; + background-color: rgba(127,255,127,0.125); +} + +div.rationale p.admonition-title { + color: darkgreen; +} + +div.comment p.admonition-title { + color: #555; +} + +div.comment { + border-left: 6px solid #ccc; + background-color: #f8f8f8; + color: #555; + font-size: 95%; +} + +div.admonition-todo { + border-left: 6px solid #CC0; + background-color: rgba(255,255,0,0.25); +} + +div.admonition-todo p.admonition-title { + color: #660; +} + +.scterm, .sc { + font-variant: small-caps; + text-transform: lowercase; +} + +div.license span.sectiontitle { + margin-top: 24px; + font-size: 127%; +} + +.anchor { + color: #7D0097; +} + +.issue { + color: F04665; +} + +.term { + font-style: italic; +} + +.secref { + font-style: italic; +} + +.sectiontitle { + display: block; + margin-top: 30px; + font-weight: 400; + font-size: 145%; + color: #002353; +} + +.sralabel { + font-weight: 400; + font-size: 90%; +} + +.sradef { + font-weight: 400; + font-size: 90%; +} + +.sraref { + font-size: 90%; +} + +img.titlelogo { + float: left; + margin-top: 0.7em; + margin-bottom: 3em; + margin-right: 5%; + width: 25%; +} + +img.logo { + display: block; + margin: 1em auto; + width: 40%; +} + +div.sphinxsidebar hr { + width: 100%; +} + +dl dd { + margin-left: 3em; + margin-top: 0.2em; + margin-bottom: 0.8em; +} + +dl p { + margin-block-start: 0.6em; + margin-block-end: 0.6em; +} + +div.apisubitem dl { + display: grid; + grid-template-columns: 30ex 1fr; /* term column + description column */ + gap: 0 0.5ex; /* row gap, column gap */ + align-items: start; +} + +div.apisubitem dt p { + margin-block-start: 0; + margin-block-end: 0; +} + +div.apisubitem dd { + margin: 0; +} + +div.threat dl { + display: grid; + grid-template-columns: 20ex 1fr; /* term column + description column */ + gap: 0 0.5ex; /* row gap, column gap */ + align-items: start; +} + +div.threat dt p { + margin-block-start: 0; +} + +div.threat dd { + margin: 0; +} + +div.riskrow table.docutils.borderless { + width: 100%; + margin-top: 0; + margin-bottom: 0.6em; +} + +div.riskrow table.docutils td { + padding: 0; +} + +div.riskrow table.docutils td p { + margin: 0; +} + +ol { + list-style-type: decimal; /* 1, 2, 3 */ +} + +ol ol { + list-style-type: lower-alpha; /* a, b, c */ +} + +ol ol ol { + list-style-type: lower-roman; /* i, ii, iii */ +} diff --git a/tools/templates/psa-api-2026/logo.pdf b/tools/templates/psa-api-2026/logo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a340e04aadaeccf8432fc9527459b30b3fec1cea GIT binary patch literal 9134 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 literal 0 HcmV?d00001 diff --git a/tools/templates/psa-api-2026/logo.pdf.license b/tools/templates/psa-api-2026/logo.pdf.license new file mode 100644 index 00000000..8c3078e2 --- /dev/null +++ b/tools/templates/psa-api-2026/logo.pdf.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license diff --git a/tools/templates/psa-api-2026/logo.svg b/tools/templates/psa-api-2026/logo.svg new file mode 100644 index 00000000..eecc6b11 --- /dev/null +++ b/tools/templates/psa-api-2026/logo.svg @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="40mm" + height="40mm" + viewBox="0 0 40 40" + version="1.1" + id="svg1" + inkscape:version="1.4.2 (ebf0e940, 2025-05-08)" + sodipodi:docname="logo.svg" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview1" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:document-units="mm" + inkscape:zoom="3.82" + inkscape:cx="87.041885" + inkscape:cy="87.303665" + inkscape:window-width="1712" + inkscape:window-height="1186" + inkscape:window-x="0" + inkscape:window-y="30" + inkscape:window-maximized="0" + inkscape:current-layer="layer1" /> + <defs + id="defs1" /> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.2889px;line-height:1.2;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-decoration-color:#000000;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#b3b3b3;stroke:#b3b3b3;stroke-width:0.353;stroke-miterlimit:3;stroke-dasharray:none" + x="19.983463" + y="23.202988" + id="text1"><tspan + sodipodi:role="line" + id="tspan1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28890033px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.353;stroke-dasharray:none;fill:#b3b3b3;stroke:#b3b3b3" + x="19.983463" + y="23.202988">[logo]</tspan></text> + </g> +</svg> diff --git a/tools/templates/psa-api-2026/logo.svg.license b/tools/templates/psa-api-2026/logo.svg.license new file mode 100644 index 00000000..8c3078e2 --- /dev/null +++ b/tools/templates/psa-api-2026/logo.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license diff --git a/tools/templates/psa-api-2026/psa-api-tool.sty b/tools/templates/psa-api-2026/psa-api-tool.sty new file mode 100644 index 00000000..12e6fb87 --- /dev/null +++ b/tools/templates/psa-api-2026/psa-api-tool.sty @@ -0,0 +1,594 @@ +% SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +% SPDX-License-Identifier: Apache-2.0 + +% Hide the warning when multiple inkscape-generated PDF [image] files are +% rendered on the same page +\pdfsuppresswarningpagegroup=1 + +% Set the ToC depth to include sub-section headings +\setcounter{tocdepth}{2} + +% Set the PDF bookmark depth to include sub-sub-section headings (API elements) +% The final level is not in the TOC +\def\psabookmarkdepth{3} + +\usepackage{apptools} +\usepackage{titletoc} +\usepackage[titles]{tocloft} +\usepackage{enumitem} +\usepackage[depth=\psabookmarkdepth, numbered]{bookmark} +\usepackage{caption} +\usepackage{ifthen} +\usepackage{xstring} +\usepackage[section]{placeins} +\usepackage{scalefnt} +\usepackage{calc} +\usepackage{changepage} +\usepackage[figure,table]{totalcount} +\usepackage{zref-totpages} + +% The Sphinx DUrole command fails when multiple classes are defined +% This version splits the roles, and creates a nested set of calls to +% the sphinx command, +\let\sphinxDUrole\DUrole +\renewcommand{\DUrole}[2]{% + \IfSubStr{\detokenize{#1}}{,}{% + \StrBefore[1]{\detokenize{#1}}{,}[\myhead]% + \StrBehind[1]{\detokenize{#1}}{,}[\mytail]% + \expandafter\sphinxDUrole\expandafter{\myhead}{\expandafter\DUrole\expandafter{\mytail}{#2}}% + }{\sphinxDUrole{#1}{#2}}% +} +\MakeRobust\DUrole + +% PSA document styling +\def\psaht {\normalfont\fontsize{30pt}{36pt}\fontseries{m}\selectfont\color{gnavy}} +\def\psah {\normalfont\fontsize{20pt}{24pt}\fontseries{m}\selectfont\color{gnavy}} +\def\psahh {\normalfont\fontsize{16pt}{19.2pt}\fontseries{m}\selectfont\color{gnavy}} +\def\psahhh {\normalfont\fontsize{14pt}{16.8pt}\fontseries{m}\selectfont\color{gnavy}} +\def\psahhhh {\normalfont\fontsize{12.5pt}{15pt}\fontseries{m}\selectfont\color{gnavy}} +\def\psabody {\normalfont\fontsize{11pt}{13.2pt}\fontseries{l}\selectfont} +\def\psasmall {\normalfont\fontsize{10pt}{12pt}\fontseries{l}\selectfont} +\def\psafootnote {\normalfont\fontsize{9pt}{10.8pt}\fontseries{l}\selectfont} +\def\psascript {\normalfont\fontsize{8pt}{9.6pt}\fontseries{l}\selectfont} +\def\psasc {\scalefont{0.75}} +\def\psacitation {\itshape} +\def\psalicense {\psabody} +\def\psasubtext {\psascript} +\def\psasubtitle {\psabody\mdseries\color{gnavy}} +\def\psathead {\psasmall\mdseries} +\def\psalabel {\psasmall\mdseries} +\def\psacaption {\psasmall} +\def\psalegend {\psafootnote} +\def\psacontd {\psafootnote\mdseries} + +\definecolor{psaissue}{RGB}{240,70,101} +\definecolor{psaink}{rgb}{0.03,0.01,0.145} +\definecolor{gnavy}{rgb}{0,0.14,0.33} +\definecolor{gblue}{rgb}{0.02,0.53,1} +\definecolor{gplum}{rgb}{0.5,0,0.59} +\definecolor{ggrey}{rgb}{0.63,0.71,0.71} + +% Set up PSA style spacing rules +\frenchspacing +% remove justification on main text +\raggedright +% the line leading already gives us 2pt (in LaTeX spacing model) +\setlength{\parskip}{6pt plus 2pt minus 1pt} + + +% Define the heading styles for level 1-4 +\ifdefined\docchapterbreak + \titleclass{\chapter}{top} +\else + \titleclass{\chapter}{straight} +\fi +\titleformat{\chapter} + {\psah} + {\IfAppendix{Annex \thechapter:}{\thechapter}} + {0.5em}{}{} +\titlespacing{\chapter}{0pt}{*4}{*1} + +\titleformat{\section} + {\psahh} + {\thesection} + {0.5em}{}{} +\titlespacing{\section}{0pt}{*3}{*1} + +\titleformat{\subsection} + {\psahhh} + {\thesubsection} + {0.5em}{}{} +\titlespacing{\subsection}{0pt}{*3}{*1} + +\titleformat{\subsubsection} + {\psahhhh} + {\thesubsubsection} + {0.5em}{}{} +\titlespacing{\subsubsection}{0pt}{*3}{*1} + +% Add a watermark if requested +\ifdefined\docwatermark + \usepackage{draftwatermark} + \SetWatermarkText{\mdseries\docwatermark} + \SetWatermarkScale{0.8} + \SetWatermarkColor[gray]{0.93} +\fi + +% remove emphasis on cross references +\def\sphinxcrossref#1{#1} + +% define a macro to provide a hyperlinked page reference, if on another page +% this is used for Section, Figure and Table references +\newcounter{testpagecount} +\DeclareRobustCommand\ifrefthispage[3]{% + \refstepcounter{testpagecount}\label{tpc\thetestpagecount}% + \ifthenelse{\equal{\pageref{#1}}{\pageref{tpc\thetestpagecount}}}{#2}{#3}% +} + +\newcommand\psapageref[1]{\ifrefthispage{#1}{}{\hyperref[#1]{{} on page~\pageref{#1}}}} + +% Define the format for the index sub-headings +\def\sphinxstyleindexlettergroup #1{{\psahhhh#1}\nopagebreak\vspace{4pt}} + +% set the size of API element names in subsubsection titles +\def\sphinxstyleliteralintitle#1{{\scalefont{1.1}\texttt{#1}}} + +\def\sphinxstylestrong#1{{\fontseries{m}\selectfont{#1}}} +\def\sphinxstrong#1{{\fontseries{m}\selectfont{#1}}} + +\raggedright + +% define the specification rule color +\definecolor{psarulecolor}{rgb}{0.63,0.71,0.71} +\def\psarulewidth{.8pt} + +% Layout and style for tables + +\arrayrulecolor{psarulecolor} +\heavyrulewidth=.8pt + +% Set the table header rows font style +\def\sphinxstyletheadfamily {\psathead} + +% Set the table continuation style +\def\sphinxtablecontinued{\psacontd} + +% Table row spacing +\renewcommand{\arraystretch}{1.4} + +% Table captions +\captionsetup[table]{position=top} +\DeclareCaptionFormat{custom} +{% + \psalabel{#1#2}\psacaption{#3} +} +\captionsetup{% + format=custom, + margin={2cm,0cm}, justification=raggedleft, singlelinecheck=false, + labelsep=space +} + +% Formatting for table cells +% * default paragraph spacing is 0pt, use a smaller (non-zero) spacing +% * reduced item spacing +% * left aligned text +\def\psacellformat{% + \setlength\parskip{3pt plus 1pt minus 1pt}% + \setlist[1]{topsep=2pt, partopsep=0pt, itemsep=1pt, parsep=2pt minus 1pt}% + \raggedright\arraybackslash% + } + +% redefine sphinx column types to be left aligned, with adjusted spacing +\makeatletter +\newcolumntype{\X}[2]{>{\psacellformat}p{\dimexpr + (\linewidth-\spx@arrayrulewidth)*#1/#2-\tw@\tabcolsep-\spx@arrayrulewidth\relax}} +\newcolumntype{\Y}[1]{>{\psacellformat}p{\dimexpr + #1\dimexpr\linewidth-\spx@arrayrulewidth\relax-\tw@\tabcolsep-\spx@arrayrulewidth\relax}} +\newcolumntype{T}{>{\psacellformat}L}% +\makeatother + +% Figure legend formatting comes after caption and may contain arbitrary body elements +\renewenvironment{sphinxlegend}{\par\medskip\psalegend}{\par} + +% format Notes to have a wider left margin +\renewenvironment{sphinxnote}[1] + {\list{}{\leftmargin1cm}\item[]\begin{sphinxlightbox}\sphinxstrong{#1}\par }{\end{sphinxlightbox}\endlist} + +% format for banner box. Use the environment defined for attention admonitions +\makeatletter +\newenvironment{sphinxclassbanner} + {% set parameters of heavybox + \def\spx@noticetype {attention}% + \sphinxcolorlet{spx@notice@bordercolor}{sphinxattentionBorderColor}% + \sphinxcolorlet{spx@notice@bgcolor}{sphinxattentionBgColor}% + \spx@notice@border \dimexpr1pt\relax + \begin{sphinxheavybox} + } + {\end{sphinxheavybox}} +\makeatother + +% format for rationale boxes. Use the environment defined for error admonitions +\makeatletter +\newenvironment{sphinxclassrationale} + {% set parameters of heavybox + \def\spx@noticetype {error}% + \sphinxcolorlet{spx@notice@bordercolor}{sphinxerrorBorderColor}% + \sphinxcolorlet{spx@notice@bgcolor}{sphinxerrorBgColor}% + \spx@notice@border \dimexpr1pt\relax + \begin{sphinxheavybox} + } + {\end{sphinxheavybox}} +\makeatother + +% format for comment boxes. Use the environment defined for error admonitions +\makeatletter +\newenvironment{sphinxclasscomment} + {% set parameters of heavybox + \def\spx@noticetype {hint}% + \sphinxcolorlet{spx@notice@bordercolor}{sphinxhintBorderColor}% + \sphinxcolorlet{spx@notice@bgcolor}{sphinxhintBgColor}% + \spx@notice@border \dimexpr0pt\relax + \begin{sphinxheavybox}% + \color{sphinxhintTextColor}% + \psasmall + } + {\end{sphinxheavybox}} +\makeatother + +% Set up the PSA specification header/footer +\geometry{head=1cm,headsep=0.22cm,foot=1.73cm} +\usepackage{fancyhdr} + \pagestyle{fancy} + \fancyhf{} + \fancyhead[L]{\psasmall\docfulltitle} + \fancyhead[C]{\psasmall\docstatus} + \fancyhead[R]{\psasmall{}v\docrelease} + \renewcommand{\headrulewidth}{\psarulewidth} + \renewcommand{\headrule}{{\color{psarulecolor}\vskip -8pt\rule{\headwidth}{\headrulewidth}}} + \renewcommand{\footrulewidth}{\psarulewidth} + \renewcommand{\footrule}{{\color{psarulecolor} \rule{\headwidth}{\footrulewidth} \vskip -\footrulewidth}} + \fancyfoot[L]{\psasmall\textcolor{psaissue}{Unofficial publication}} + \fancyfoot[C]{\psascript\selectfont{\textit{Copyright \textcopyright \doccopyright}}} + \fancyfoot[R]{\psasmall{}Page \thepage} + +\fancypagestyle{normal}{} +\fancypagestyle{plain}{} + +% Prevent the change of page number style from resetting the page number itself +\newcounter{savepage} +\let\oldpagenumbering\pagenumbering +\renewcommand{\pagenumbering}[1]{\setcounter{savepage}{\value{page}} \oldpagenumbering{#1} \setcounter{page}{\value{savepage}}} + +% A frontmatter environment, which continues roman page numbers, +% does not number titles, but includes them in the TOC. +\newcommand{\psafrontmatter}[1]% + {\setcounter{secnumdepth}{#1}} + +\newcommand{\psamain}[2] + {\clearpage% + \setcounter{secnumdepth}{#1} + \renewcommand{\thetable}{#2\arabic{table}} + \renewcommand{\thefigure}{#2\arabic{figure}} + } + +\newcommand{\psaappendix}[2] + {\ifdefined\docappendixbreak \clearpage\fi% + \setcounter{secnumdepth}{#1} + \appendix% + \renewcommand{\thetable}{#2\arabic{table}} + \renewcommand{\thefigure}{#2\arabic{figure}} + } + +\setcounter{secnumdepth}{2} +\setcounter{tocdepth}{2} + +% Remove the page numbering changes from the default Sphinx manual document +\makeatletter +\renewcommand{\sphinxtableofcontents}{% + \begingroup + \parskip \z@skip + \sphinxtableofcontentshook + \tableofcontents + \endgroup + \if@openright\cleardoublepage\else\clearpage\fi +} +\makeatother + +% List of tables and figures +\newcommand{\psalistoftables}{ + \renewcommand{\listtablename}{Tables} + \cftsetindents{tab}{0cm}{2cm} + \renewcommand{\cfttabfont}{\psabody} + \renewcommand{\cfttabpresnum}{Table } + \renewcommand{\cfttabaftersnum}{:} + \renewcommand{\cfttabdotsep}{\cftnodots} + \renewcommand{\cfttabpagefont}{\psabody} + \listoftables +} +\newcommand{\psalistoffigures}{ + \renewcommand{\listfigurename}{Figures} + \cftsetindents{fig}{0cm}{2cm} + \renewcommand{\cftfigfont}{\psabody} + \renewcommand{\cftfigpresnum}{Figure } + \renewcommand{\cftfigaftersnum}{:} + \renewcommand{\cftfigdotsep}{\cftnodots} + \renewcommand{\cftfigpagefont}{\psabody} + \listoffigures +} + +% The title page command +\newenvironment{psatitle}% +{ + \thispagestyle{empty} + \setlength{\parindent}{0pt} + + % PDF information dictionary + \begingroup + \def\endgraf{ }\def\and{\& }% + \pdfstringdefDisableCommands{\def\\{, }}% overwrite hyperref setup + \hypersetup{% + pdfauthor={\docauthor},% + pdftitle={\docfulltitle},% + pdfsubject={\docrelease}% + }% + \endgroup + + % Placeholder logo + \noindent\begin{minipage}[t]{5.2cm} + \vspace{0pt}% required to get top-alignment of image and text + \sphinxlogo + \end{minipage} + \hfill\begin{minipage}[t]{0.67\textwidth}\raggedleft% + \vspace{0pt}% required to get top-alignment of image and text + {\psah \doclatextitle{} \par} + \end{minipage} + + \bigskip\bigskip\bigskip + + \newcommand{\psatitlecopyright}{ + \medskip + + \begingroup\raggedleft + \scriptsize{Copyright \textcopyright \doccopyright}\\\par + \endgroup + + \bigskip\bigskip\bigskip\bigskip + } + % Title page information table, copyright and banner will follow +} +{ + \clearpage + + % Contents tables + \pagestyle{plain} + \pagenumbering{arabic} + \begingroup + \sphinxtableofcontents + \iftotaltables\psalistoftables\fi + \let\clearpage\relax % prevent page break between tables + \iftotalfigures\psalistoffigures\fi + \endgroup + + \pagestyle{normal} +} + +% emulate small-caps: +\newcommand{\DUrolesc}[1] + {{\psasc\uppercase{#1}}} + +% small caps for special term references +\newcommand{\DUrolescterm}[1] + {{\psasc\uppercase{#1}}} + +% Other glossary term references are emphasized +\newcommand{\DUroleterm}[1] + {{\sphinxstyleemphasis{#1}}} + +% Define issue role as red color +\newcommand{\DUroleissue}[1] + {\textcolor{psaissue}{#1}} + +% Emphasise section and title-text references +\newcommand{\DUrolesecref}[1] + {{\sphinxstyleemphasis{#1}}} + +% SRA definition style +\newcommand{\DUrolesradef}[1] + {{\scalefont{.9}\sphinxstylestrong{#1}}} + +% SRA reference style +\newcommand{\DUrolesraref}[1] + {{\scalefont{.9}#1}} + +% SRA threat card label style +\newcommand{\DUrolesralabel}[1] + {{\psathead{#1}}} + +% associate anchor role with the InnerlinkColor +\newcommand{\DUroleanchor}[1] + {\textcolor{InnerLinkColor}{#1}} + +% Provide sectiontitle role for frontmatter titles that are not in TOC +\newcommand{\DUrolesectiontitle}[1] + {{\psahh #1}} + +\newcommand{\DUroleversionmodified}[1] + {{\psasmall\sphinxstyleemphasis{#1}}} + +% define class environment for the license text (much smaller font) +\newenvironment{sphinxclasslicense} + {\psalicense\setlist[enumerate,1]{label=\mdseries(\roman*)}% + \renewcommand{\DUrolesectiontitle}[1] + {{\psahhh ##1}}% + } + {} + +% If running in a high enough version of sphinx, also +% Divert use of the sphinxalltt environment to use Verbatim. This requires +% setting a default config for Verbatim, which does not work in some earlier +% versions of Sphinx. +% +% This ensures that all literal blocks are rendered using the Verbatim +% configuration below, whether or not sphinx runs the highlighting engine on +% the block. +\newcommand{\useverbatimfortt}{% + \let\sphinxalltt\sphinxVerbatim% + \let\endsphinxalltt\endsphinxVerbatim% + \fvset{commandchars=\\\{\}}% + } + +% Set up the style for the Table of Contents + +\renewcommand{\contentsname}{Contents} +\contentsmargin{1cm} +\titlecontents{chapter}[1cm] + {\addvspace{12pt}} + {\psahhh\contentslabel{1cm}} + {\psahhh} + {\titlerule[0pt]\contentspage} +\titlecontents{section}[2cm] + {\addvspace{2pt}} + {\psahhhh\contentslabel{2cm}} + {\psahhhh} + {\titlerule[0pt]\contentspage} +\titlecontents{subsection}[2cm] + {} + {\psabody\contentslabel{1.5cm}} + {\psabody} + {\titlerule[0pt]\contentspage} + +% and remove sphinx's ToC overrides +\let\sphinxtableofcontentshook\relax + +% Sphinx/pdflatex does not pick up the chpater title format from titlesec +% So hook the environment to insert formatting in the index title +\renewenvironment{sphinxtheindex}{% + \clearpage + \let\ixtitle\indexname% + \renewcommand{\indexname}{\psahh \ixtitle}% + \phantomsection % needed as no chapter, section, ... created + \begin{theindex}% + \addcontentsline{toc}{chapter}{\ixtitle}% + }{\end{theindex}} + +% This is something of a hack to get consistent, and differentiated API element +% subtitles in the specification. Simple specs might have API elements at +% level 3 headings (subsections), and complex ones at level 4 (subsubsection). +% So using a section level for the subtitles will yield inconsistent results. +% +% psa-api-tool.py uses `rubric` nodes for these sections (so don't use rubric in +% API reference for other things?). Unfortunately, Sphinx does not copy +% docutils and emit a \rubric{} command, it just emits \subsubsection*{}. +% +% As that [starred] command is not used for other elements, we replaced the +% \subsubsection command to intercept these uses and divert them to \rubric{}. +% We can then define \rubric{} as we wish - A bold 10pt runin for the main +% document text, and the original \subsubsection*{} in the appendix. +% +% Older versions of Sphinx directly use \paragraph{} for rubric, so +% also intercept level 5 headings and treat as rubric +% +% Heading 5 is used for all api subtitles +\newcommand{\subtitlett}[1]{{\normalfont\ttfamily #1}} +\newcommand{\apisubtitle}[1]{{\let\sphinxstyleliteralintitle\subtitlett #1}} +\titleformat{\paragraph} + {\psasubtitle} + {} + {0.5em}{\apisubtitle}{} +\titlespacing{\paragraph}{0pt}{*2}{4pt} + +\makeatletter +\let\oldsubsubsection\subsubsection +\renewcommand{\subsubsection} + % Only intercept rubrics in the main section + {\@ifstar{\IfAppendix{\oldsubsubsection*}{\paragraph*}}{\oldsubsubsection}} +\makeatother + +% Format lineblock text (consecutive lines prefixed with |) as a paragraph +% with forced line breaks +\renewenvironment{DUlineblock}[1]{% + \renewcommand{\item}[1][]{\par \renewcommand{\item}[1][]{\\}}% + \setlength{\leftmargin}{#1}% + \raggedright% +}{} + +% Set up item lists, enumerations and definition lists + +% Define spacing for lists +\setlist[1]{topsep=2pt, partopsep=0pt, itemsep=2pt, parsep=3pt plus 1pt minus 1pt} +\setlist[2]{topsep=2pt, partopsep=0pt, itemsep=1pt, parsep=1pt} +\setlist[3]{topsep=2pt, partopsep=0pt, itemsep=1pt, parsep=1pt} + +% Do not use multicols environment for hlist directive, but keep the compactness +\renewenvironment{multicols}[1]{\begingroup}{\endgroup} + +% Arabic, alpha, roman for level 1-3 +% New versions of sphinx ignore this and set the formatting based on the +% source text +\setlist[enumerate,1]{label=\arabic*.} +\setlist[enumerate,2]{label=\alph*.} +\setlist[enumerate,3]{label=\roman*.} + +% Bullet, em-dash, and circle for level 1-3 +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=---} +\setlist[itemize,3]{label=$\circ$} + +% Remove Sphinx hack for formatting multiple terms in definition list +% It forces the list formatting, and breaks the styling done with enumitem +\renewcommand\sphinxlineitem[2]{\item[#1]\leavevmode#2}% + +% Define standard definition list format +\def\termmargin {13ex} +\def\termindent {2ex} +\def\termspace {1ex} + +\setlist[description]{% + style=nextline,% + labelindent=\termindent, labelwidth=!, labelsep=\termspace,% + itemindent=0ex, leftmargin=\termmargin,% + font=\psabody,% + topsep=3pt, partopsep=0pt, itemsep=2pt, parsep=3pt% +} + +% Define API subitem definition list format +% This displays as a grid definition list, almost table-like +% psa-api-tool.py wraps the subitem lists in a apisubitem environment - so +% we can define that environment to set the description format +\def\apiitemwidth {30ex} +\def\apiitemindent { 0ex} +\def\apiitemspace {.5ex} + +\newenvironment{sphinxclassapisubitem} + {\setlist[description]{% + style=nextline,% + labelindent=\apiitemindent, labelwidth=\apiitemwidth,% + labelsep=\apiitemspace, itemindent=0ex, leftmargin=!,% + font=\psabody,% + topsep=3pt, partopsep=0pt, itemsep=2pt, parsep=3pt% + }} + {} + +% Define Threat card definition list format +\def\threatlabelwidth {20ex} +\def\threatlabelindent { 0ex} +\def\threatlabelspace {.5ex} + +\newenvironment{sphinxclassthreat} + {\setlist[description]{% + style=nextline,% + labelindent=\threatlabelindent, labelwidth=\threatlabelwidth,% + labelsep=\threatlabelspace, itemindent=0ex, leftmargin=!,% + font=\sphinxstylestrong,% + topsep=6pt plus 2pt minus 1pt, partopsep=0pt,% + itemsep=2pt, parsep=6pt plus 2pt minus 1pt% + }} + {} + +\newenvironment{sphinxclassriskrow} + {\renewcommand{\arraystretch}{1.2}% + \setlength\tabcolsep{0pt}% + \def\sphinxattableend{}% + \vskip\dimexpr-\parskip-\baselineskip\relax% + } + {} diff --git a/tools/templates/psa-api-2026/sphinx-templates/indextoc.html b/tools/templates/psa-api-2026/sphinx-templates/indextoc.html new file mode 100644 index 00000000..549e3123 --- /dev/null +++ b/tools/templates/psa-api-2026/sphinx-templates/indextoc.html @@ -0,0 +1,8 @@ +<!-- +SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +SPDX-License-Identifier: Apache-2.0 +--> + +<ul> +<li class="toctree-l1"><a class="reference internal" href="{{ pathto("psa_c-identifiers.html", 1) }}">Index of API elements</a></li> +</ul> diff --git a/tools/templates/psa-api-2026/sphinx-templates/toc.html b/tools/templates/psa-api-2026/sphinx-templates/toc.html new file mode 100644 index 00000000..3f7916bd --- /dev/null +++ b/tools/templates/psa-api-2026/sphinx-templates/toc.html @@ -0,0 +1,13 @@ +<!-- +SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +SPDX-License-Identifier: Apache-2.0 +--> + +<h3><a href="{{ pathto(master_doc) }}">{{ dochtmltitle }}</a></h3> +Version {{ docrelease }}<br/> +{{ docstatus }}<br/> +{{ docdate }}<br/> +<hr /> +<b><span class='issue'>Unofficial publication</span></b><br/>This is an open-source build +<hr /> +{{ toctree() }} diff --git a/tools/templates/psa-api-2026/template-conf.py b/tools/templates/psa-api-2026/template-conf.py new file mode 100644 index 00000000..e8c70eb6 --- /dev/null +++ b/tools/templates/psa-api-2026/template-conf.py @@ -0,0 +1,99 @@ +# SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +# SPDX-License-Identifier: Apache-2.0 + +# -*- coding: utf-8 -*- +# +# Adjust or reset the template_info dictionary with customized +# sphinx configurations for this template + +template_info['logo_file'] = 'logo' +template_info['html_theme'] = 'alabaster' +template_info['html_css_files'] = [ + ('https://fonts.googleapis.com', { 'rel': 'preconnect' }), + ('https://fonts.gstatic.com', { 'rel': 'preconnect', 'crossorigin': None }), + ('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,300;0,400;1,300;1,400&family=Roboto+Mono:ital,wght@0,300;0,400;1,300&display=swap', { 'rel': 'stylesheet' }), +] +template_info['mathjax3_config'] = { + 'chtml': { + 'scale': 0.9, + 'mtextInheritFont': False, + 'mtextFont': "Roboto", + } +} +template_info['latex_pointsize'] = '11pt' +template_info['latex_fonts']= [ + r'\usepackage[scale=.95,sfdefault]{roboto}', + r'\usepackage[scale=.76]{roboto-mono}', + ] +template_info['latex_sphinxsetup'] = [ + # Reduce margins + 'hmargin={2cm,2cm}', + 'vmargin={2.5cm, 3cm}', + 'marginpar=1.27cm', + # Format the verbatim blocks + 'verbatimwithframe=true', + 'verbatimsep=3pt', + 'VerbatimBorderColor={rgb}{0.9,0.9,0.9}', + 'verbatimborder=0.5pt', + 'VerbatimColor={rgb}{0.97,0.97,0.97}', + # format hyperlink color + 'InnerLinkColor={rgb}{0.5,0,0.59}', + 'OuterLinkColor={rgb}{0.5,0,0.59}', + # format admonitions + 'noteBorderColor={rgb}{0.667,0.667,0.667}', + 'warningBorderColor={rgb}{.75,0.5,0.5}', + 'warningborder=2pt', + # Use attention admonition for the front page banner + 'attentionBorderColor={rgb}{.8,.8,0}', + 'attentionBgColor={rgb}{1,1,.7}', + 'attentionborder=1pt', + # Use error admonition for rationale boxes + 'errorBorderColor={rgb}{.5,.75,.5}', + 'errorBgColor={rgb}{.9,.95,.9}', + 'errorborder=1pt', + # Use hint admonition for comment boxes + 'hintBorderColor={rgb}{.6,.6,.6}', + 'hintBgColor={rgb}{.97,.97,.97}', + 'hintborder=0pt', + 'hintTextColor={rgb}{.4,.4,.4}', + # Use the normal font for headings + 'HeaderFamily=\\normalfont\\mdseries', +] +template_info['latex_table_style'] = ['booktabs','nocolorrows'] +template_info['graphviz_dot_args'] = [ + '-Gfontname=Lato', + '-Gfontsize=12', + '-Nfontname=Lato', + '-Nfontsize=12', + '-Efontname=Lato', + '-Efontsize=12' +] + +def make_doc_filename(info, id, title, version, status): + doc_parts = [info.get('filetitle',title), version] + status = status.split(' ')[-1].lower() + if status != 'release': + doc_parts += [status] + return '-'.join(doc_parts) +template_info['make_filename'] = make_doc_filename + +template_info['front_sections'] = [ + 'introduction', + 'api-status', + 'feedback', + 'audience', + 'license', + 'references', + 'terms', + 'abbreviations', + 'release-info', + 'todos', + ] +template_info['numfig_sec_depth'] = 1 +template_info['page_break'] = 'chapter' + +doc_info.setdefault('author', 'The PSA Certified API contributors') +doc_info.setdefault('copyright', 'The PSA Certified API contributors') +doc_info.setdefault('feedback', 'visit :url:`github.com/arm-software/psa-api/issues`' + + ' to create a new issue at the PSA Certified API GitHub project') +doc_info.setdefault('license', 'psa-certified-api-license') diff --git a/tools/templates/psa-api-2026/title-page.rst b/tools/templates/psa-api-2026/title-page.rst new file mode 100644 index 00000000..3954db10 --- /dev/null +++ b/tools/templates/psa-api-2026/title-page.rst @@ -0,0 +1,49 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. only:: html + + .. template-image:: logo.svg + :alt: [logo]] + :class: titlelogo + +============= +|docrsttitle| +============= + +.. raw:: latex + + \psabody\color{psaink} + + \begin{psatitle} + +.. csv-table:: + :class: titletable borderless + :align: left + + Version:, |docreleasefull| + Quality:, |docquality| + Status:, |docstatus| + Date of Issue:, |docdate| + +.. raw:: latex + + \psatitlecopyright + +.. csv-table:: + :align: center + :class: standard + + :issue:`Unofficial publication`: This is an open-source build of the documentation + +.. insert-banner:: + +.. raw:: latex + + \end{psatitle} + +.. only:: html + + .. insert-section:: Contents + :not-in-toc: + :keep-if-empty: From 94fffc41eccb781d0c359d30de91c52316de5219 Mon Sep 17 00:00:00 2001 From: Andrew Thoelke <andrew.thoelke@arm.com> Date: Sat, 16 May 2026 01:17:11 +0100 Subject: [PATCH 7/9] Migrate documents to new template Signed-off-by: Andrew Thoelke <andrew.thoelke@arm.com> --- doc/attestation/about/about.rst | 4 +- doc/attestation/about/intro | 25 + doc/attestation/about/references | 54 +- doc/attestation/about/releases | 2 +- doc/attestation/api/api.rst | 4 +- doc/attestation/appendix/history.rst | 6 + doc/attestation/conf.py | 23 +- doc/attestation/index.rst | 10 +- doc/attestation/overview/intro.rst | 31 - doc/crypto-driver/about/about.rst | 26 +- doc/crypto-driver/about/intro | 33 + doc/crypto-driver/about/references | 4 +- doc/crypto-driver/about/terms | 7 +- doc/crypto-driver/appendix/history.rst | 10 + doc/crypto-driver/body/introduction.rst | 46 +- doc/crypto-driver/body/opaque.rst | 2 + doc/crypto-driver/body/overview.rst | 2 + doc/crypto-driver/body/transparent.rst | 2 + doc/crypto-driver/body/using-drivers.rst | 2 + doc/crypto-driver/conf.py | 31 +- doc/crypto-driver/index.rst | 12 +- doc/crypto/about/about.rst | 4 +- doc/crypto/about/intro | 26 + doc/crypto/about/references | 924 +++---- doc/crypto/about/releases | 18 - doc/crypto/api/library/status.rst | 10 +- doc/crypto/appendix/encodings.rst | 4 +- doc/crypto/appendix/history.rst | 557 +---- doc/crypto/conf.py | 27 +- doc/crypto/index.rst | 10 +- doc/crypto/overview/conventions.rst | 2 +- doc/crypto/overview/intro.rst | 31 - doc/fwu/about/about.rst | 4 +- doc/fwu/about/intro | 14 + doc/fwu/about/references | 65 +- doc/fwu/api/api.rst | 7 +- doc/fwu/appendix/change-history.rst | 9 + doc/fwu/conf.py | 28 +- doc/fwu/index.rst | 14 +- doc/fwu/overview/goals.rst | 70 +- doc/fwu/overview/intro.rst | 63 - doc/status-code/about/about.rst | 3 +- doc/status-code/about/intro | 12 + doc/status-code/about/references | 8 +- doc/status-code/about/releases | 8 +- doc/status-code/about/terms | 2 +- doc/status-code/api/status-codes.rst | 8 +- doc/status-code/appendix/change-history.rst | 17 +- doc/status-code/conf.py | 27 +- doc/status-code/index.rst | 10 +- doc/status-code/overview/intro.rst | 17 - doc/storage/about.rst | 145 -- doc/storage/about/about.rst | 12 + doc/storage/about/intro | 22 + doc/storage/about/references | 34 + doc/storage/about/releases | 45 + doc/storage/about/terms | 47 + doc/storage/api/api.rst | 2 +- doc/storage/appendix/history.rst | 8 +- doc/storage/appendix/sra.rst | 2438 +++++++++---------- doc/storage/conf.py | 33 +- doc/storage/index.rst | 12 +- doc/storage/overview/architecture.rst | 2 +- doc/storage/overview/intro.rst | 29 - doc/storage/overview/operation.rst | 2 +- doc/storage/overview/requirements.rst | 2 +- 66 files changed, 2270 insertions(+), 2898 deletions(-) create mode 100644 doc/attestation/about/intro delete mode 100644 doc/attestation/overview/intro.rst create mode 100644 doc/crypto-driver/about/intro create mode 100644 doc/crypto/about/intro delete mode 100644 doc/crypto/overview/intro.rst create mode 100644 doc/fwu/about/intro delete mode 100644 doc/fwu/overview/intro.rst create mode 100644 doc/status-code/about/intro delete mode 100644 doc/status-code/overview/intro.rst delete mode 100644 doc/storage/about.rst create mode 100644 doc/storage/about/about.rst create mode 100644 doc/storage/about/intro create mode 100644 doc/storage/about/references create mode 100644 doc/storage/about/releases create mode 100644 doc/storage/about/terms delete mode 100644 doc/storage/overview/intro.rst diff --git a/doc/attestation/about/about.rst b/doc/attestation/about/about.rst index f6259b36..8356ef34 100644 --- a/doc/attestation/about/about.rst +++ b/doc/attestation/about/about.rst @@ -1,4 +1,4 @@ -.. SPDX-FileCopyrightText: Copyright 2018-2020, 2022-2025 Arm Limited and/or its affiliates +.. SPDX-FileCopyrightText: Copyright 2018-2020, 2022-2026 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license .. include:: releases @@ -7,4 +7,6 @@ .. include:: terms +.. include:: intro + .. about:: diff --git a/doc/attestation/about/intro b/doc/attestation/about/intro new file mode 100644 index 00000000..f4a4122b --- /dev/null +++ b/doc/attestation/about/intro @@ -0,0 +1,25 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2020, 2022-2026 Arm Limited and/or its affiliates +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. introduction:: + + This document is one of a set of resources that can help organizations develop products that meet the security requirements of GlobalPlatform's PSA Certified evaluation scheme. The PSA Certified scheme provides a framework and methodology that helps silicon manufacturers, system software providers and OEMs to develop more secure products. You can read more about PSA Certified here at :url:`www.psacertified.org`. + + .. rubric:: About the |API| + + The interface described in this document is a PSA Certified API, that provides a verifiable report of the state of the platform. The platform attestation service is provided by the :term:`Platform Root of Trust` and is described in :cite-title:`PSM`. + + The format of the attestation report that is produced by the |API| is specified in :rfc-title:`9783`. + + .. note:: + + Version 2.0 of this specification is not compatible with any 1.0 version, as a result of the change in format of the attestation report that is generated by this API. + + This document includes: + + - A set of common use cases. See :secref:`use cases`. + - The associated Application Programming Interface (API). See :secref:`api`. + + The |API| can be used either to directly produce verifiable evidence about the platform state in the context of a challenge-response interaction, or as a way to bootstrap trust in other attestation schemes. The PSA Certified framework provides the generic security features allowing OEM and service providers to integrate various attestation schemes on top of the Platform Root of Trust. + + You can find additional resources relating to the |API| here at :url:`arm-software.github.io/psa-api/attestation`, and find other PSA Certified APIs here at :url:`arm-software.github.io/psa-api`. diff --git a/doc/attestation/about/references b/doc/attestation/about/references index 8ae77ffc..ab4e8c02 100644 --- a/doc/attestation/about/references +++ b/doc/attestation/about/references @@ -1,35 +1,35 @@ .. SPDX-FileCopyrightText: Copyright 2018-2020, 2022-2025 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license -.. reference:: PSM - :title: Platform Security Model - :doc_id: ARM DEN 0128 - :url: developer.arm.com/documentation/den0128 +.. reference:: PSA STAT + :title: PSA Certified Status code API + :kind: normative + :doc_id: Arm IHI 0097 + :url: arm-software.github.io/psa-api/status-code -.. reference:: PSA-STAT - :title: PSA Certified Status code API - :doc_id: ARM IHI 0097 - :url: arm-software.github.io/psa-api/status-code +.. reference:: RFC 9783 + :title: Arm's Platform Security Architecture (PSA) Attestation Token + :kind: normative + :author: H. Tschofenig, S. Frost, M. Brossard, A. Shaw, and T. Fossati + :publication: June 2025 + :url: tools.ietf.org/html/rfc9783 -.. reference:: PSA-FFM - :title: Arm® Platform Security Architecture Firmware Framework - :doc_id: ARM DEN 0063 - :url: developer.arm.com/documentation/den0063 +.. reference:: PSM + :title: Platform Security Model + :kind: informative + :doc_id: JSADEN014 + :author: PSA Certified + :url: psacertified.org/development-resources/building-in-security/threat-models/ .. reference:: C99 - :title: ISO/IEC 9899:1999 --- Programming Languages --- C - :author: ISO/IEC - :publication: December 1999 - :url: www.iso.org/standard/29237.html - -.. reference:: RFC9783 - :title: Arm's Platform Security Architecture (PSA) Attestation Token - :author: H. Tschofenig, S. Frost, M. Brossard, A. Shaw, and T. Fossati - :publication: June 2025 - :url: tools.ietf.org/html/rfc9783 + :title: Programming Languages --- C + :kind: informative + :doc_id: ISO/IEC 9899:1999 + :publication: December 1999 + :url: www.iso.org/standard/29237.html -.. reference:: RFC2104 - :title: HMAC: Keyed-Hashing for Message Authentication - :author: IETF - :publication: February 1997 - :url: tools.ietf.org/html/rfc2104 +.. reference:: RFC 2104 + :title: HMAC: Keyed-Hashing for Message Authentication + :kind: informative + :publication: February 1997 + :url: tools.ietf.org/html/rfc2104 diff --git a/doc/attestation/about/releases b/doc/attestation/about/releases index d43ac70b..ccf79af9 100644 --- a/doc/attestation/about/releases +++ b/doc/attestation/about/releases @@ -60,7 +60,7 @@ GlobalPlatform governance of PSA Certified evaluation scheme. .. release:: 2.0.0 - :date: ? + :date: May 2026 :confidentiality: Non-confidential Updated attestation token format to the PSA attestation token. diff --git a/doc/attestation/api/api.rst b/doc/attestation/api/api.rst index 5667e986..94a2101a 100644 --- a/doc/attestation/api/api.rst +++ b/doc/attestation/api/api.rst @@ -24,7 +24,7 @@ All the elements are defined in the C language. The |API| makes use of standard API conventions --------------- -All functions return a status indication of type ``psa_status_t``, which is defined by :cite-title:`PSA-STAT`. The value ``0`` (``PSA_SUCCESS``) indicates successful operation, and a negative value indicates an error. Each API documents the specific error codes that might be returned, and the meaning of each error. +All functions return a status indication of type ``psa_status_t``, which is defined by :cite-title:`PSA STAT`. The value ``0`` (``PSA_SUCCESS``) indicates successful operation, and a negative value indicates an error. Each API documents the specific error codes that might be returned, and the meaning of each error. All parameters of pointer type must be valid, non-null pointers unless the pointer is to a buffer of length 0 or the function's documentation explicitly describes the behavior when the pointer is null. For implementations where a null pointer dereference usually aborts the application, passing NULL as a function parameter where a null pointer is not allowed should abort the caller in the habitual manner. @@ -36,7 +36,7 @@ Status codes The |API| uses the status code definitions that are shared with the other PSA Certified APIs. -The following elements are defined in :file:`psa/error.h` from :cite-title:`PSA-STAT` (previously defined in :cite:`PSA-FFM`): +The following elements are defined in :file:`psa/error.h` from :cite-title:`PSA STAT`: .. code-block:: xref diff --git a/doc/attestation/appendix/history.rst b/doc/attestation/appendix/history.rst index ad3a0502..51b28c02 100644 --- a/doc/attestation/appendix/history.rst +++ b/doc/attestation/appendix/history.rst @@ -14,6 +14,12 @@ Document history * - Date - Changes + * - TBD + - *Draft GlobalPlatform publication revision* + + * Migrated the document to the 2026 PSA Certified API template. + * Changed the document front matter structure and publication styling, without changing the API. + * - June 2019 - *1.0.0* diff --git a/doc/attestation/conf.py b/doc/attestation/conf.py index e5cb6b94..d038e2cd 100644 --- a/doc/attestation/conf.py +++ b/doc/attestation/conf.py @@ -8,7 +8,7 @@ doc_info = { # Document template - 'template': 'psa-api-2025', + 'template': 'psa-api-2026', # Document title, MANDATORY 'title': 'PSA Certified\nAttestation API', @@ -19,27 +19,20 @@ 'copyright': 'Arm Limited and/or its affiliates', # Document identifier, marked as open issue if not provided - 'doc_id': 'IHI 0085', + 'doc_id': 'GPD_SPE_085', # The short X.Y version. MANDATORY 'version': '2.0', - # Document quality status, marked as open issue if not provided - 'quality': 'REL', - # Document issue number (within that version and quality status) - # Marked as open issue if not provided + # Document maintenance revision 'issue_no': 0, - # Identifies the sequence number of a release candidate of the same issue - # default to None - 'release_candidate': None, - #'draft': True, - - # Document confidentiality. Must be either Non-confidential or Confidential - # Marked as open issue if not provided - 'confidentiality': 'Non-confidential', + # Document draft revision + 'draft': 1, + # Document status + 'status': 'DFT', # Id of the legal notice for this document # Marked as open issue if not provided - 'license': 'psa-certified-api-license', + #'license': 'psa-certified-api-license', # Document date, default to build date 'date': 'May 2026', diff --git a/doc/attestation/index.rst b/doc/attestation/index.rst index 3876a8f2..c630d07d 100644 --- a/doc/attestation/index.rst +++ b/doc/attestation/index.rst @@ -3,17 +3,9 @@ .. title:: - .. abstract:: - - This document is part of the PSA Certified API specifications. It defines interfaces to provide an attestation service for the Root of Trust. - -.. front-matter:: - - about/about - .. maintoc:: - overview/intro + about/about overview/use-cases overview/report api/api diff --git a/doc/attestation/overview/intro.rst b/doc/attestation/overview/intro.rst deleted file mode 100644 index 063eb5a6..00000000 --- a/doc/attestation/overview/intro.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. SPDX-FileCopyrightText: Copyright 2018-2020, 2022-2025 Arm Limited and/or its affiliates -.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license - -Introduction -============ - - -About Platform Security Architecture ------------------------------------- - -This document is one of a set of resources provided by Arm that can help organizations develop products that meet the security requirements of GlobalPlatform's PSA Certified evaluation scheme on Arm-based platforms. The PSA Certified scheme provides a framework and methodology that helps silicon manufacturers, system software providers and OEMs to develop more secure products. Arm resources that support PSA Certified range from threat models, standard architectures that simplify development and increase portability, and open-source partnerships that provide ready-to-use software. You can read more about PSA Certified here at :url:`www.psacertified.org` and find more Arm resources here at :url:`developer.arm.com/platform-security-resources` and :url:`www.trustedfirmware.org`. - -About the |API| ---------------- - -The interface described in this document is a PSA Certified API, that provides a verifiable report of the state of the platform. The platform attestation service is provided by the :term:`Platform Root of Trust` and is described in :cite-title:`PSM`. - -The format of the attestation report that is produced by the |API| is specified in :rfc-title:`9783`. - -.. note:: - - Version 2.0 of this specification is not compatible with any 1.0 version, as a result of the change in format of the attestation report that is generated by this API. - -This document includes: - -- A set of common use cases. See :secref:`use cases`. -- The associated Application Programming Interface (API). See :secref:`api`. - -The |API| can be used either to directly produce verifiable evidence about the platform state in the context of a challenge-response interaction, or as a way to bootstrap trust in other attestation schemes. The PSA Certified framework provides the generic security features allowing OEM and service providers to integrate various attestation schemes on top of the Platform Root of Trust. - -You can find additional resources relating to the |API| here at :url:`arm-software.github.io/psa-api/attestation`, and find other PSA Certified APIs here at :url:`arm-software.github.io/psa-api`. diff --git a/doc/crypto-driver/about/about.rst b/doc/crypto-driver/about/about.rst index 4a8038c5..40f3f50d 100644 --- a/doc/crypto-driver/about/about.rst +++ b/doc/crypto-driver/about/about.rst @@ -1,34 +1,12 @@ .. SPDX-FileCopyrightText: Copyright 2025 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license +.. include:: intro + .. include:: releases .. include:: references .. include:: terms -.. potential-for-change:: - - This document is in active, collaborative development. - - Issues and changes are discussed in the project on Github, alongside the PSA Certified API specifications. - See :url:`github.com/arm-software/psa-api`. - - A list of open questions can be found in :secref:`open-issues`. - -.. conventions:: - :hide: - -.. current-status:: - - This document is at Alpha quality. - It is shared to support ongoing development and discussion of the architecture and interfaces for Crypto Drivers. - - The current planned scope for v1.0 is found here at :url:`github.com/ARM-software/psa-api/discussions/306`. - - There are several projects currently implementing the |API|, see :url:`github.com/arm-software/psa-api/blob/main/related-projects.md`. - - For a practical guide, with a description of the current state of drivers in Mbed TLS, see the examples in :url:`github.com/Mbed-TLS/TF-PSA-Crypto/blob/development/docs/psa-driver-example-and-guide.md`. - - .. about:: diff --git a/doc/crypto-driver/about/intro b/doc/crypto-driver/about/intro new file mode 100644 index 00000000..7ef70793 --- /dev/null +++ b/doc/crypto-driver/about/intro @@ -0,0 +1,33 @@ +.. SPDX-FileCopyrightText: Copyright 2025-2026 Arm Limited and/or its affiliates +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. introduction:: + + This document is one of a set of resources that can help organizations develop products that meet the security requirements of GlobalPlatform's PSA Certified evaluation scheme. The PSA Certified scheme provides a framework and methodology that helps silicon manufacturers, system software providers and OEMs to develop more secure products. You can read more about PSA Certified here at :url:`www.psacertified.org`. + + .. rubric:: About the |API| + + This document describes an interface for cryptoprocessor drivers within an implementation of the PSA Certified Crypto API. This interface complements :cite-title:`PSA CRYPT`, which describes the interface between a Crypto API implementation and an application. + + In the remainder of this document: + + * :secref:`introduction` describes the purpose of this interface. + * :secref:`overview` describes what a Crypto Driver looks like. + * :secref:`driver-description` outlines the Driver manifest. + * :secref:`driver-entry-points` provides details of driver capabilities. + * :secref:`transparent-drivers` and :secref:`opaque-drivers` explain the requirements for specific driver types. + * :secref:`using-drivers` describes how application code influences Driver selection. + +.. api-status:: + + .. warning:: **API status : ALPHA** + + This interfaces defined by this document are at Alpha quality. This document is shared to support ongoing development and discussion of the architecture and interfaces for Crypto Drivers. + + At ALPHA quality, any aspect of the interface might be changed in a future version of the document. + + The current planned scope for v1.0 is found here at :url:`github.com/ARM-software/psa-api/discussions/306`. + + There are several projects currently implementing the |API|, see :url:`github.com/arm-software/psa-api/blob/main/related-projects.md`. + + For a practical guide, with a description of the current state of drivers in Mbed TLS, see the examples in :url:`github.com/Mbed-TLS/TF-PSA-Crypto/blob/development/docs/psa-driver-example-and-guide.md`. diff --git a/doc/crypto-driver/about/references b/doc/crypto-driver/about/references index e42aeefd..0a4841d4 100644 --- a/doc/crypto-driver/about/references +++ b/doc/crypto-driver/about/references @@ -1,7 +1,7 @@ .. SPDX-FileCopyrightText: Copyright 2025 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license -.. reference:: PSA-CRYPT +.. reference:: PSA CRYPT :title: PSA Certified Crypto API - :doc_id: IHI 0086 + :doc_id: Arm IHI 0086 :url: arm-software.github.io/psa-api/crypto diff --git a/doc/crypto-driver/about/terms b/doc/crypto-driver/about/terms index a82dae71..f28a7fe5 100644 --- a/doc/crypto-driver/about/terms +++ b/doc/crypto-driver/about/terms @@ -1,5 +1,8 @@ -.. SPDX-FileCopyrightText: Copyright 2025 Arm Limited and/or its affiliates +.. SPDX-FileCopyrightText: Copyright 2025-2026 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license .. terms:: - :hide: + :hide: + +.. abbreviations:: + :hide: diff --git a/doc/crypto-driver/appendix/history.rst b/doc/crypto-driver/appendix/history.rst index 014cd0ea..6c4ee894 100644 --- a/doc/crypto-driver/appendix/history.rst +++ b/doc/crypto-driver/appendix/history.rst @@ -10,3 +10,13 @@ Document change history ----------------------- This section provides the detailed changes made between published version of the document. + +Changes in the draft GlobalPlatform publication revision +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Other changes +~~~~~~~~~~~~~ + +* Migrated the document to the 2026 PSA Certified API template. + + This changes the document front matter structure and publication styling, without changing the API. diff --git a/doc/crypto-driver/body/introduction.rst b/doc/crypto-driver/body/introduction.rst index 88293899..a76fa458 100644 --- a/doc/crypto-driver/body/introduction.rst +++ b/doc/crypto-driver/body/introduction.rst @@ -1,11 +1,11 @@ -.. SPDX-FileCopyrightText: Copyright 2020-2025 Arm Limited and/or its affiliates +.. SPDX-FileCopyrightText: Copyright 2020-2026 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 -Introduction ------------- +Crypto Driver Interface +======================= -Purpose of the driver interface -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Purpose +------- The Crypto API defines an interface that allows applications to perform cryptographic operations in a uniform way regardless of how the operations are performed. Under the hood, different keys may be stored and used in different hardware or in different logical partitions, and different algorithms may involve different hardware or software components. @@ -18,44 +18,40 @@ Functions in the Crypto API implementation invoke functions in the core. Code from the core calls drivers as described in the present document. Types of drivers -~~~~~~~~~~~~~~~~ +---------------- The PSA Cryptoprocessor driver interface supports two types of cryptoprocessors, and accordingly two types of drivers. -* **Transparent** drivers implement cryptographic operations on keys that are provided in cleartext at the beginning of each operation. - They are typically used for hardware **accelerators**. - When a transparent driver is available for a particular combination of parameters (cryptographic algorithm, key type and size, etc.), it is used instead of the default software implementation. - Transparent drivers can also be pure software implementations that are distributed as plug-ins to a Crypto API implementation (for example, an alternative implementation with different performance characteristics, or a certified implementation). -* **Opaque** drivers implement cryptographic operations on keys that can only be used inside a protected environment such as a **secure element**, a hardware security module, a smartcard, a secure enclave, etc. - An opaque driver is invoked for the specific `key location <lifetimes-and-locations>` that the driver is registered for: the dispatch is based on the key's lifetime. +* **Transparent** drivers implement cryptographic operations on keys that are provided in cleartext at the beginning of each operation. They are typically used for hardware **accelerators**. When a transparent driver is available for a particular combination of parameters (cryptographic algorithm, key type and size, etc.), it is used instead of the default software implementation. Transparent drivers can also be pure software implementations that are distributed as plug-ins to a Crypto API implementation (for example, an alternative implementation with different performance characteristics, or a certified implementation). +* **Opaque** drivers implement cryptographic operations on keys that can only be used inside a protected environment such as a **secure element**, a hardware security module, a smartcard, a secure enclave, etc. An opaque driver is invoked for the specific `key location <lifetimes-and-locations>` that the driver is registered for: the dispatch is based on the key's lifetime. Requirements -~~~~~~~~~~~~ +------------ The present specification was designed to fulfill the following high-level requirements. [Req.plugins] - It is possible to combine multiple drivers from different providers into the same implementation, without any prior arrangement other than choosing certain names and values from disjoint namespaces. + It is possible to combine multiple drivers from different providers into the same implementation, without any prior arrangement other than choosing certain names and values from disjoint namespaces. [Req.compile] - It is possible to compile the code of each driver and of the core separately, and link them together. - A small amount of glue code may need to be compiled once the list of drivers is available. + It is possible to compile the code of each driver and of the core separately, and link them together. + A small amount of glue code may need to be compiled once the list of drivers is available. [Req.types] - Support drivers for the following types of hardware: accelerators that operate on keys in cleartext; cryptoprocessors that can wrap keys with a built-in keys but not store user keys; and cryptoprocessors that store key material. + Support drivers for the following types of hardware: accelerators that operate on keys in cleartext; cryptoprocessors that can wrap keys with a built-in keys but not store user keys; and cryptoprocessors that store key material. [Req.portable] - The interface between drivers and the core does not involve any platform-specific consideration. - Driver calls are simple C function calls. - Interactions with platform-specific hardware happen only inside the driver (and in fact a driver need not involve any hardware at all). + The interface between drivers and the core does not involve any platform-specific consideration. + Driver calls are simple C function calls. + Interactions with platform-specific hardware happen only inside the driver (and in fact a driver need not involve any hardware at all). [Req.location] - Applications can tell which location values correspond to which secure element drivers. + Applications can tell which location values correspond to which secure element drivers. [Req.fallback] - Accelerator drivers can specify that they do not fully support a cryptographic mechanism and that a fallback to core code may be necessary. - Conversely, if an accelerator fully supports cryptographic mechanism, the core must be able to omit code for this mechanism. + Accelerator drivers can specify that they do not fully support a cryptographic mechanism and that a fallback to core code may be necessary. + Conversely, if an accelerator fully supports cryptographic mechanism, the core must be able to omit code for this mechanism. [Req.mechanisms] - Drivers can specify which mechanisms they support. - A driver's code will not be invoked for cryptographic mechanisms that it does not support. + Drivers can specify which mechanisms they support. + A driver's code will not be invoked for cryptographic mechanisms that it does not support. diff --git a/doc/crypto-driver/body/opaque.rst b/doc/crypto-driver/body/opaque.rst index 559d3054..22ff608b 100644 --- a/doc/crypto-driver/body/opaque.rst +++ b/doc/crypto-driver/body/opaque.rst @@ -1,6 +1,8 @@ .. SPDX-FileCopyrightText: Copyright 2020-2025 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 +.. _opaque-drivers: + Opaque drivers -------------- diff --git a/doc/crypto-driver/body/overview.rst b/doc/crypto-driver/body/overview.rst index 692552af..0c6c705a 100644 --- a/doc/crypto-driver/body/overview.rst +++ b/doc/crypto-driver/body/overview.rst @@ -1,6 +1,8 @@ .. SPDX-FileCopyrightText: Copyright 2020-2025 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 +.. _overview: + Overview of drivers ------------------- diff --git a/doc/crypto-driver/body/transparent.rst b/doc/crypto-driver/body/transparent.rst index 67595ef7..e8b6cc53 100644 --- a/doc/crypto-driver/body/transparent.rst +++ b/doc/crypto-driver/body/transparent.rst @@ -1,6 +1,8 @@ .. SPDX-FileCopyrightText: Copyright 2020-2025 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 +.. _transparent-drivers: + Transparent drivers ------------------- diff --git a/doc/crypto-driver/body/using-drivers.rst b/doc/crypto-driver/body/using-drivers.rst index 3895097e..e6c0b9ae 100644 --- a/doc/crypto-driver/body/using-drivers.rst +++ b/doc/crypto-driver/body/using-drivers.rst @@ -1,6 +1,8 @@ .. SPDX-FileCopyrightText: Copyright 2020-2025 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 +.. _using-drivers: + Using drivers from an application --------------------------------- diff --git a/doc/crypto-driver/conf.py b/doc/crypto-driver/conf.py index 65d53204..d3dfb9dc 100644 --- a/doc/crypto-driver/conf.py +++ b/doc/crypto-driver/conf.py @@ -8,14 +8,14 @@ doc_info = { # Document template - 'template': 'psa-api-2025', + 'template': 'psa-api-2026', # Document title, MANDATORY 'title': 'PSA Certified\nCrypto Driver Interface', 'author': 'Arm Limited', # Document copyright date, default to year of 'date' - 'copyright_date': '2020-2025', + 'copyright_date': '2020-2026', 'copyright': 'Arm Limited and/or its affiliates', # Document identifier, marked as open issue if not provided @@ -25,25 +25,19 @@ 'version': '1.0', # Document quality status, marked as open issue if not provided 'quality': 'ALP', - # Document issue number (within that version and quality status) - # Marked as open issue if not provided + # Document maintenance revision 'issue_no': 1, - # Identifies the sequence number of a release candidate of the same issue - # default to None - # 'release_candidate': 1, - # Draft status - use this to indicate the document is not ready for publication - #'draft': True, - - # Document confidentiality. Must be either Non-confidential or Confidential - # Marked as open issue if not provided - 'confidentiality': 'Non-confidential', + # Document draft revision + 'draft': 1, + # Document status + 'status': 'DFT', # Id of the legal notice for this document # Marked as open issue if not provided - 'license': 'psa-certified-api-license', + #'license': 'psa-certified-api-license', # Document date, default to build date - 'date': '30/09/2025', + 'date': 'September 2025', # Default header file for API definitions # default to None, and can be set in documentation source @@ -55,10 +49,7 @@ # 2 : Sub-elements of API - parameters, fields, values 'header_doxygen': 2, - # Declare a watermark for the PDF output - # 'watermark': 'DRAFT', - -# List of optional content that should be included in the build. + # List of optional content that should be included in the build. # Valid options are: # 'rationale' : This enables output of ..rationale:: directives # 'banner' : This enables output of the title page banner @@ -81,7 +72,7 @@ # 'appendix' : just before the appendices # 'chapter' : before every chapter # Default to 'appendix' - #'page_break': 'chapter' + 'page_break': 'chapter' } # Set up and run the psa-api-tool configuration diff --git a/doc/crypto-driver/index.rst b/doc/crypto-driver/index.rst index 73c28308..b931ce87 100644 --- a/doc/crypto-driver/index.rst +++ b/doc/crypto-driver/index.rst @@ -3,23 +3,15 @@ .. title:: - .. abstract:: - - This document describes an interface for cryptoprocessor drivers within an implementation of the PSA Certified Crypto API. - This interface complements :cite-title:`PSA-CRYPT`, which describes the interface between a Crypto API implementation and an application. - .. banner:: **ALPHA** This specification is work in progress and should be considered to be in at Alpha quality. - See :secref:`current-status` for details. - -.. front-matter:: - - about/about + See :secref:`introduction` for details. .. maintoc:: + about/about body/introduction body/overview body/manifest diff --git a/doc/crypto/about/about.rst b/doc/crypto/about/about.rst index e6129c64..76ff93e9 100644 --- a/doc/crypto/about/about.rst +++ b/doc/crypto/about/about.rst @@ -1,6 +1,8 @@ -.. SPDX-FileCopyrightText: Copyright 2018-2022 Arm Limited and/or its affiliates +.. SPDX-FileCopyrightText: Copyright 2018-2022, 2026 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license +.. include:: intro + .. include:: releases .. include:: references diff --git a/doc/crypto/about/intro b/doc/crypto/about/intro new file mode 100644 index 00000000..2a9c8244 --- /dev/null +++ b/doc/crypto/about/intro @@ -0,0 +1,26 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited and/or its affiliates +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. introduction:: + + This document is one of a set of resources that can help organizations develop products that meet the security requirements of GlobalPlatform's PSA Certified evaluation scheme. The PSA Certified scheme provides a framework and methodology that helps silicon manufacturers, system software providers and OEMs to develop more secure products. You can read more about PSA Certified here at :url:`www.psacertified.org`. + + .. rubric:: About the |API| + + The interface described in this document is a PSA Certified API, that provides a portable programming interface to cryptographic operations, and key storage functionality, on a wide range of hardware. + + The interface is user-friendly, while still providing access to the low-level primitives used in modern cryptography. It does not require that the user has access to the key material. Instead, it uses opaque key identifiers. + + You can find additional resources relating to the |API| here at :url:`arm-software.github.io/psa-api/crypto`, and find other PSA Certified APIs here at :url:`arm-software.github.io/psa-api`. + + This document includes: + + * A rationale for the design. See :secref:`design-goals`. + * A high-level overview of the functionality provided by the interface. See :secref:`functionality-overview`. + * A description of typical architectures of implementations for this specification. See :secref:`architectures`. + * General considerations for implementers of this specification, and for applications that use the interface defined in this specification. See :secref:`implementation-considerations` and :secref:`usage-considerations`. + * A detailed definition of the API. See :secref:`library-management`, :secref:`key-management`, and :secref:`crypto-operations`. + + In future, companion documents will define *profiles* for this specification. A profile is + a minimum mandatory subset of the interface that a compliant implementation must + provide. diff --git a/doc/crypto/about/references b/doc/crypto/about/references index 9a41c89a..5ac455d6 100644 --- a/doc/crypto/about/references +++ b/doc/crypto/about/references @@ -3,558 +3,568 @@ .. reference:: PSM :title: Platform Security Model - :doc_id: ARM DEN 0128 - :url: developer.arm.com/documentation/den0128 + :kind: informative + :doc_id: JSADEN014 + :author: PSA Certified + :url: psacertified.org/development-resources/building-in-security/threat-models/ -.. reference:: PSA-FFM - :title: Arm® Platform Security Architecture Firmware Framework - :doc_id: ARM DEN 0063 - :url: developer.arm.com/documentation/den0063 - -.. reference:: PSA-STAT - :title: PSA Certified Status code API - :doc_id: ARM IHI 0097 - :url: arm-software.github.io/psa-api/status-code +.. reference:: PSA STAT + :title: PSA Certified Status code API + :kind: normative + :doc_id: Arm IHI 0097 + :url: arm-software.github.io/psa-api/status-code .. reference:: C99 - :title: ISO/IEC 9899:1999 --- Programming Languages --- C - :author: ISO/IEC - :publication: December 1999 - :url: www.iso.org/standard/29237.html + :title: Programming Languages --- C + :kind: informative + :doc_id: ISO/IEC 9899:1999 + :publication: December 1999 + :url: www.iso.org/standard/29237.html .. reference:: NTT-CAM - :title: Specification of Camellia — a 128-bit Block Cipher - :author: NTT Corporation and Mitsubishi Electric Corporation - :publication: September 2001 - :url: info.isl.ntt.co.jp/crypt/eng/camellia/specifications + :title: Specification of Camellia — a 128-bit Block Cipher + :doc_id: Camellia + :author: NTT Corporation and Mitsubishi Electric Corporation + :publication: September 2001 + :url: info.isl.ntt.co.jp/crypt/eng/camellia/specifications .. reference:: Curve25519 - :author: Bernstein et al. - :title: Curve25519: new Diffie-Hellman speed records - :publication: LNCS 3958, 2006 - :url: www.iacr.org/archive/pkc2006/39580209/39580209.pdf + :author: Bernstein et al. + :title: Curve25519: new Diffie-Hellman speed records + :publication: LNCS 3958, 2006 + :url: www.iacr.org/archive/pkc2006/39580209/39580209.pdf .. reference:: Curve448 - :title: Ed448-Goldilocks, a new elliptic curve - :author: Hamburg - :publication: NIST ECC Workshop, 2015 - :url: eprint.iacr.org/2015/625.pdf + :title: Ed448-Goldilocks, a new elliptic curve + :author: Hamburg + :publication: NIST ECC Workshop, 2015 + :url: eprint.iacr.org/2015/625.pdf .. reference:: Ed25519 - :author: Bernstein et al. - :title: Twisted Edwards curves - :publication: Africacrypt, 2008 - :url: eprint.iacr.org/2008/013.pdf + :author: Bernstein et al. + :title: Twisted Edwards curves + :publication: Africacrypt, 2008 + :url: eprint.iacr.org/2008/013.pdf .. reference:: Ed448 - :title: Ed448-Goldilocks, a new elliptic curve - :author: Hamburg - :publication: NIST ECC Workshop, 2015 - :url: eprint.iacr.org/2015/625.pdf + :title: Ed448-Goldilocks, a new elliptic curve + :author: Hamburg + :publication: NIST ECC Workshop, 2015 + :url: eprint.iacr.org/2015/625.pdf .. reference:: FIPS180-4 - :title: FIPS Publication 180-4: Secure Hash Standard (SHS) - :author: NIST - :publication: August 2015 - :url: doi.org/10.6028/NIST.FIPS.180-4 + :title: FIPS Publication 180-4: Secure Hash Standard (SHS) + :doc_id: FIPS 180-4 + :author: NIST + :publication: August 2015 + :url: doi.org/10.6028/NIST.FIPS.180-4 .. reference:: FIPS186-4 - :title: FIPS Publication 186-4: Digital Signature Standard (DSS) - :author: NIST - :publication: July 2013 - :url: doi.org/10.6028/NIST.FIPS.186-4 + :title: FIPS Publication 186-4: Digital Signature Standard (DSS) + :doc_id: FIPS 186-4 + :author: NIST + :publication: July 2013 + :url: doi.org/10.6028/NIST.FIPS.186-4 .. reference:: FIPS197 - :title: FIPS Publication 197: Advanced Encryption Standard (AES) - :author: NIST - :publication: November 2001 - :url: doi.org/10.6028/NIST.FIPS.197 + :title: FIPS Publication 197: Advanced Encryption Standard (AES) + :doc_id: FIPS 197 + :author: NIST + :publication: November 2001 + :url: doi.org/10.6028/NIST.FIPS.197 .. reference:: FIPS202 - :title: FIPS Publication 202: SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions - :author: NIST - :publication: August 2015 - :url: doi.org/10.6028/NIST.FIPS.202 + :title: FIPS Publication 202: SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions + :doc_id: FIPS 202 + :author: NIST + :publication: August 2015 + :url: doi.org/10.6028/NIST.FIPS.202 .. reference:: FRP - :title: Publication d'un paramétrage de courbe elliptique visant des applications de passeport électronique et de l'administration électronique française - :author: Agence nationale de la sécurité des systèmes d'information - :publication: 21 November 2011 - :url: www.ssi.gouv.fr/agence/rayonnement-scientifique/publications-scientifiques/articles-ouvrages-actes + :title: Publication d'un paramétrage de courbe elliptique visant des applications de passeport électronique et de l'administration électronique française + :doc_id: FRP256v1 + :author: Agence nationale de la sécurité des systèmes d'information + :publication: 21 November 2011 + :url: cyber.gouv.fr/nous-connaitre/publications/publications-scientifiques .. reference:: IEEE-XTS - :title: 1619-2018 --- IEEE Standard for Cryptographic Protection of Data on Block-Oriented Storage Devices - :author: IEEE - :publication: January 2019 - :url: ieeexplore.ieee.org/servlet/opac?punumber=8637986 + :title: Standard for Cryptographic Protection of Data on Block-Oriented Storage Devices + :doc_id: IEEE 1619-2018 + :publication: January 2019 + :url: ieeexplore.ieee.org/servlet/opac?punumber=8637986 .. reference:: SEC1 - :title: SEC 1: Elliptic Curve Cryptography - :author: Standards for Efficient Cryptography - :publication: May 2009 - :url: www.secg.org/sec1-v2.pdf + :title: SEC 1: Elliptic Curve Cryptography + :doc_id: SEC 1 + :author: Standards for Efficient Cryptography + :publication: May 2009 + :url: www.secg.org/sec1-v2.pdf .. reference:: SEC2 - :title: SEC 2: Recommended Elliptic Curve Domain Parameters - :author: Standards for Efficient Cryptography - :publication: January 2010 - :url: www.secg.org/sec2-v2.pdf + :title: SEC 2: Recommended Elliptic Curve Domain Parameters + :doc_id: SEC 2 v2 + :author: Standards for Efficient Cryptography + :publication: January 2010 + :url: www.secg.org/sec2-v2.pdf .. reference:: SEC2v1 - :title: SEC 2: Recommended Elliptic Curve Domain Parameters, Version 1.0 - :author: Standards for Efficient Cryptography - :publication: September 2000 - :url: www.secg.org/SEC2-Ver-1.0.pdf + :title: SEC 2: Recommended Elliptic Curve Domain Parameters, Version 1.0 + :doc_id: SEC 2 v1.0 + :author: Standards for Efficient Cryptography + :publication: September 2000 + :url: www.secg.org/SEC2-Ver-1.0.pdf .. reference:: SP800-30 - :title: NIST Special Publication 800-30 Revision 1: Guide for Conducting Risk Assessments - :author: NIST - :publication: September 2012 - :url: doi.org/10.6028/NIST.SP.800-30r1 + :title: Special Publication 800-30 Revision 1: Guide for Conducting Risk Assessments + :kind: informative + :author: NIST + :publication: September 2012 + :url: doi.org/10.6028/NIST.SP.800-30r1 .. reference:: SP800-38A - :title: NIST Special Publication 800-38A: Recommendation for Block Cipher Modes of Operation: Methods and Techniques - :author: NIST - :publication: December 2001 - :url: doi.org/10.6028/NIST.SP.800-38A + :title: Special Publication 800-38A: Recommendation for Block Cipher Modes of Operation: Methods and Techniques + :author: NIST + :publication: December 2001 + :url: doi.org/10.6028/NIST.SP.800-38A .. reference:: SP800-38B - :title: NIST Special Publication 800-38B: Recommendation for Block Cipher Modes of Operation: the CMAC Mode for Authentication - :author: NIST - :publication: May 2005 - :url: doi.org/10.6028/NIST.SP.800-38B + :title: Special Publication 800-38B: Recommendation for Block Cipher Modes of Operation: the CMAC Mode for Authentication + :author: NIST + :publication: May 2005 + :url: doi.org/10.6028/NIST.SP.800-38B .. reference:: SP800-38D - :title: NIST Special Publication 800-38D: Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC - :author: NIST - :publication: November 2007 - :url: doi.org/10.6028/NIST.SP.800-38D + :title: Special Publication 800-38D: Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC + :author: NIST + :publication: November 2007 + :url: doi.org/10.6028/NIST.SP.800-38D .. reference:: SP800-56A - :title: NIST Special Publication 800-56A: Recommendation for Pair-Wise Key-Establishment Schemes Using Discrete Logarithm Cryptography - :author: NIST - :publication: April 2018 - :url: doi.org/10.6028/NIST.SP.800-56Ar3 + :title: Special Publication 800-56A: Recommendation for Pair-Wise Key-Establishment Schemes Using Discrete Logarithm Cryptography + :author: NIST + :publication: April 2018 + :url: doi.org/10.6028/NIST.SP.800-56Ar3 .. reference:: SP800-67 - :title: NIST Special Publication 800-67: Recommendation for the Triple Data Encryption Algorithm (TDEA) Block Cipher - :author: NIST - :publication: November 2017 - :url: doi.org/10.6028/NIST.SP.800-67r2 + :title: Special Publication 800-67: Recommendation for the Triple Data Encryption Algorithm (TDEA) Block Cipher + :author: NIST + :publication: November 2017 + :url: doi.org/10.6028/NIST.SP.800-67r2 .. reference:: SP800-108 - :title: NIST Special Publication 800-108r1: Recommendation for Key Derivation Using Pseudorandom Functions - :author: NIST - :publication: August 2022 - :url: doi.org/10.6028/NIST.SP.800-108r1 + :title: Special Publication 800-108r1: Recommendation for Key Derivation Using Pseudorandom Functions + :author: NIST + :publication: August 2022 + :url: doi.org/10.6028/NIST.SP.800-108r1 .. reference:: SP800-232 - :title: NIST Special Publication 800-232: Ascon-Based Lightweight Cryptography Standards for Constrained Devices - :author: NIST - :publication: August 2025 - :url: doi.org/10.6028/NIST.SP.800-232 - -.. reference:: RFC1319 - :title: The MD2 Message-Digest Algorithm - :author: IETF - :publication: April 1992 - :url: tools.ietf.org/html/rfc1319.html - -.. reference:: RFC1320 - :title: The MD4 Message-Digest Algorithm - :author: IETF - :publication: April 1992 - :url: tools.ietf.org/html/rfc1320.html - -.. reference:: RFC1321 - :title: The MD5 Message-Digest Algorithm - :author: IETF - :publication: April 1992 - :url: tools.ietf.org/html/rfc1321.html - -.. reference:: RFC2104 - :title: HMAC: Keyed-Hashing for Message Authentication - :author: IETF - :publication: February 1997 - :url: tools.ietf.org/html/rfc2104.html - -.. reference:: RFC2315 - :title: PKCS #7: Cryptographic Message Syntax Version 1.5 - :author: IETF - :publication: March 1998 - :url: tools.ietf.org/html/rfc2315.html - -.. reference:: RFC3279 - :title: Algorithms and Identifiers for the Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile - :author: IETF - :publication: April 2002 - :url: tools.ietf.org/html/rfc3279.html - -.. reference:: RFC3610 - :title: Counter with CBC-MAC (CCM) - :author: IETF - :publication: September 2003 - :url: tools.ietf.org/html/rfc3610 - -.. reference:: RFC3713 - :title: A Description of the Camellia Encryption Algorithm - :author: IETF - :publication: April 2004 - :url: tools.ietf.org/html/rfc3713 - -.. reference:: RFC4279 - :title: Pre-Shared Key Ciphersuites for Transport Layer Security (TLS) - :author: IETF - :publication: December 2005 - :url: tools.ietf.org/html/rfc4279.html - -.. reference:: RFC4615 - :title: The Advanced Encryption Standard-Cipher-based Message Authentication Code-Pseudo-Random Function-128 (AES-CMAC-PRF-128) Algorithm for the Internet Key Exchange Protocol (IKE) - :author: IETF - :publication: August 2006 - :url: tools.ietf.org/html/rfc4615.html - -.. reference:: RFC5116 - :title: An Interface and Algorithms for Authenticated Encryption - :author: IETF - :publication: January 2008 - :url: tools.ietf.org/html/rfc5116.html - -.. reference:: RFC5246 - :title: The Transport Layer Security (TLS) Protocol Version 1.2 - :author: IETF - :publication: August 2008 - :url: tools.ietf.org/html/rfc5246.html - -.. reference:: RFC5489 - :title: ECDHE_PSK Cipher Suites for Transport Layer Security (TLS) - :author: IETF - :publication: March 2009 - :url: tools.ietf.org/html/rfc5489.html - -.. reference:: RFC5639 - :title: Elliptic Curve Cryptography (ECC) Brainpool Standard Curves and Curve Generation - :author: IETF - :publication: March 2010 - :url: tools.ietf.org/html/rfc5639.html - -.. reference:: RFC5794 - :title: A Description of the ARIA Encryption Algorithm - :author: IETF - :publication: March 2010 - :url: datatracker.ietf.org/doc/html/rfc5794 - -.. reference:: RFC5869 - :title: HMAC-based Extract-and-Expand Key Derivation Function (HKDF) - :author: IETF - :publication: May 2010 - :url: tools.ietf.org/html/rfc5869.html - -.. reference:: RFC5915 - :title: Elliptic Curve Private Key Structure - :author: IETF - :publication: June 2010 - :url: tools.ietf.org/html/rfc5915.html - -.. reference:: RFC6979 - :title: Deterministic Usage of the Digital Signature Algorithm (DSA) and Elliptic Curve Digital Signature Algorithm (ECDSA) - :author: IETF - :publication: August 2013 - :url: tools.ietf.org/html/rfc6979.html - -.. reference:: RFC7748 - :title: Elliptic Curves for Security - :author: IETF - :publication: January 2016 - :url: tools.ietf.org/html/rfc7748.html - -.. reference:: RFC7919 - :title: Negotiated Finite Field Diffie-Hellman Ephemeral Parameters for Transport Layer Security (TLS) - :author: IETF - :publication: August 2016 - :url: tools.ietf.org/html/rfc7919.html - -.. reference:: RFC8017 - :title: PKCS #1: RSA Cryptography Specifications Version 2.2 - :author: IETF - :publication: November 2016 - :url: tools.ietf.org/html/rfc8017.html - -.. reference:: RFC8018 - :title: PKCS #5: Password-Based Cryptography Specification Version 2.1 - :author: IETF - :publication: January 2017 - :url: tools.ietf.org/html/rfc8018.html - -.. reference:: RFC8032 - :title: Edwards-Curve Digital Signature Algorithm (EdDSA) - :author: IRTF - :publication: January 2017 - :url: tools.ietf.org/html/rfc8032.html - -.. reference:: RFC8439 - :title: ChaCha20 and Poly1305 for IETF Protocols - :author: IRTF - :publication: June 2018 - :url: tools.ietf.org/html/rfc8439.html + :title: Special Publication 800-232: Ascon-Based Lightweight Cryptography Standards for Constrained Devices + :author: NIST + :publication: August 2025 + :url: doi.org/10.6028/NIST.SP.800-232 + +.. reference:: RFC 1319 + :title: The MD2 Message-Digest Algorithm + :author: IETF + :publication: April 1992 + :url: tools.ietf.org/html/rfc1319.html + +.. reference:: RFC 1320 + :title: The MD4 Message-Digest Algorithm + :author: IETF + :publication: April 1992 + :url: tools.ietf.org/html/rfc1320.html + +.. reference:: RFC 1321 + :title: The MD5 Message-Digest Algorithm + :author: IETF + :publication: April 1992 + :url: tools.ietf.org/html/rfc1321.html + +.. reference:: RFC 2104 + :title: HMAC: Keyed-Hashing for Message Authentication + :author: IETF + :publication: February 1997 + :url: tools.ietf.org/html/rfc2104.html + +.. reference:: RFC 2315 + :title: PKCS #7: Cryptographic Message Syntax Version 1.5 + :author: IETF + :publication: March 1998 + :url: tools.ietf.org/html/rfc2315.html + +.. reference:: RFC 3279 + :title: Algorithms and Identifiers for the Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile + :author: IETF + :publication: April 2002 + :url: tools.ietf.org/html/rfc3279.html + +.. reference:: RFC 3610 + :title: Counter with CBC-MAC (CCM) + :author: IETF + :publication: September 2003 + :url: tools.ietf.org/html/rfc3610 + +.. reference:: RFC 3713 + :title: A Description of the Camellia Encryption Algorithm + :author: IETF + :publication: April 2004 + :url: tools.ietf.org/html/rfc3713 + +.. reference:: RFC 4279 + :title: Pre-Shared Key Ciphersuites for Transport Layer Security (TLS) + :author: IETF + :publication: December 2005 + :url: tools.ietf.org/html/rfc4279.html + +.. reference:: RFC 4615 + :title: The Advanced Encryption Standard-Cipher-based Message Authentication Code-Pseudo-Random Function-128 (AES-CMAC-PRF-128) Algorithm for the Internet Key Exchange Protocol (IKE) + :author: IETF + :publication: August 2006 + :url: tools.ietf.org/html/rfc4615.html + +.. reference:: RFC 5116 + :title: An Interface and Algorithms for Authenticated Encryption + :author: IETF + :publication: January 2008 + :url: tools.ietf.org/html/rfc5116.html + +.. reference:: RFC 5246 + :title: The Transport Layer Security (TLS) Protocol Version 1.2 + :author: IETF + :publication: August 2008 + :url: tools.ietf.org/html/rfc5246.html + +.. reference:: RFC 5489 + :title: ECDHE_PSK Cipher Suites for Transport Layer Security (TLS) + :author: IETF + :publication: March 2009 + :url: tools.ietf.org/html/rfc5489.html + +.. reference:: RFC 5639 + :title: Elliptic Curve Cryptography (ECC) Brainpool Standard Curves and Curve Generation + :author: IETF + :publication: March 2010 + :url: tools.ietf.org/html/rfc5639.html + +.. reference:: RFC 5794 + :title: A Description of the ARIA Encryption Algorithm + :author: IETF + :publication: March 2010 + :url: datatracker.ietf.org/doc/html/rfc5794 + +.. reference:: RFC 5869 + :title: HMAC-based Extract-and-Expand Key Derivation Function (HKDF) + :author: IETF + :publication: May 2010 + :url: tools.ietf.org/html/rfc5869.html + +.. reference:: RFC 5915 + :title: Elliptic Curve Private Key Structure + :author: IETF + :publication: June 2010 + :url: tools.ietf.org/html/rfc5915.html + +.. reference:: RFC 6979 + :title: Deterministic Usage of the Digital Signature Algorithm (DSA) and Elliptic Curve Digital Signature Algorithm (ECDSA) + :author: IETF + :publication: August 2013 + :url: tools.ietf.org/html/rfc6979.html + +.. reference:: RFC 7748 + :title: Elliptic Curves for Security + :author: IETF + :publication: January 2016 + :url: tools.ietf.org/html/rfc7748.html + +.. reference:: RFC 7919 + :title: Negotiated Finite Field Diffie-Hellman Ephemeral Parameters for Transport Layer Security (TLS) + :author: IETF + :publication: August 2016 + :url: tools.ietf.org/html/rfc7919.html + +.. reference:: RFC 8017 + :title: PKCS #1: RSA Cryptography Specifications Version 2.2 + :author: IETF + :publication: November 2016 + :url: tools.ietf.org/html/rfc8017.html + +.. reference:: RFC 8018 + :title: PKCS #5: Password-Based Cryptography Specification Version 2.1 + :author: IETF + :publication: January 2017 + :url: tools.ietf.org/html/rfc8018.html + +.. reference:: RFC 8032 + :title: Edwards-Curve Digital Signature Algorithm (EdDSA) + :author: IRTF + :publication: January 2017 + :url: tools.ietf.org/html/rfc8032.html + +.. reference:: RFC 8439 + :title: ChaCha20 and Poly1305 for IETF Protocols + :author: IRTF + :publication: June 2018 + :url: tools.ietf.org/html/rfc8439.html .. reference:: RIPEMD - :title: RIPEMD-160: A Strengthened Version of RIPEMD - :author: Dobbertin, Bosselaers and Preneel - :publication: April 1996 - :url: homes.esat.kuleuven.be/~bosselae/ripemd160.html + :title: RIPEMD-160: A Strengthened Version of RIPEMD + :author: Dobbertin, Bosselaers and Preneel + :publication: April 1996 + :url: homes.esat.kuleuven.be/~bosselae/ripemd160.html .. reference:: ISO9797 - :title: ISO/IEC 9797-1:2011 Information technology — Security techniques — Message Authentication Codes (MACs) — Part 1: Mechanisms using a block cipher - :author: ISO/IEC - :publication: March 2011 - :url: www.iso.org/standard/50375.html + :title: Information technology — Security techniques — Message Authentication Codes (MACs) — Part 1: Mechanisms using a block cipher + :doc_id: ISO/IEC 9797-1:2011 + :publication: March 2011 + :url: www.iso.org/standard/50375.html .. reference:: ISO10118 - :title: ISO/IEC 10118-3:2018 IT Security techniques — Hash-functions — Part 3: Dedicated hash-functions - :author: ISO/IEC - :publication: October 2018 - :url: www.iso.org/standard/67116.html + :title: IT Security techniques — Hash-functions — Part 3: Dedicated hash-functions + :doc_id: ISO/IEC 10118-3:2018 + :publication: October 2018 + :url: www.iso.org/standard/67116.html .. reference:: CSTC0002 - :title: GM/T 0002-2012: SM4 block cipher algorithm - :author: Cryptography Standardization Technical Committee - :publication: March 2012 + :title: SM4 block cipher algorithm + :doc_id: GM/T 0002-2012 + :author: Cryptography Standardization Technical Committee + :publication: March 2012 .. reference:: CSTC0004 - :title: GM/T 0004-2012: SM3 cryptographic hash algorithm - :author: Cryptography Standardization Technical Committee - :publication: March 2012 + :title: SM3 cryptographic hash algorithm + :doc_id: GM/T 0004-2012 + :author: Cryptography Standardization Technical Committee + :publication: March 2012 .. reference:: X9-62 - :title: Public Key Cryptography For The Financial Services Industry: The Elliptic Curve Digital Signature Algorithm (ECDSA) - :author: ANSI - :url: standards.globalspec.com/std/1955141/ANSI%20X9.62 + :title: Public Key Cryptography For The Financial Services Industry: The Elliptic Curve Digital Signature Algorithm (ECDSA) + :doc_id: ANSI X9-62 + :url: standards.globalspec.com/std/1955141/ANSI%20X9.62 .. reference:: CHACHA20 - :author: Bernstein, D. - :title: ChaCha, a variant of Salsa20 - :url: http://cr.yp.to/chacha/chacha-20080128.pdf - :publication: January 2008 + :author: Bernstein, D. + :title: ChaCha, a variant of Salsa20 + :url: http://cr.yp.to/chacha/chacha-20080128.pdf + :publication: January 2008 .. reference:: XCHACHA - :title: XChaCha: eXtended-nonce ChaCha and AEAD_XChaCha20_Poly1305 - :author: Arciszewski - :publication: January 2020 - :url: datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha-03 + :title: XChaCha: eXtended-nonce ChaCha and AEAD_XChaCha20_Poly1305 + :author: Arciszewski + :publication: January 2020 + :url: datatracker.ietf.org/doc/html/draft-irtf-cfrg-xchacha-03 .. reference:: CLULOW - :author: Clulow, Jolyon - :title: On the Security of PKCS #11 - :url: link.springer.com/chapter/10.1007/978-3-540-45238-6_32 - :publication: 2003 + :author: Clulow, Jolyon + :title: On the Security of PKCS #11 + :kind: informative + :url: link.springer.com/chapter/10.1007/978-3-540-45238-6_32 + :publication: 2003 .. reference:: TLS-ECJPAKE - :title: Elliptic Curve J-PAKE Cipher Suites for Transport Layer Security (TLS) - :author: Cragie, Hao - :publication: June 2016 - :url: datatracker.ietf.org/doc/html/draft-cragie-tls-ecjpake-01 + :title: Elliptic Curve J-PAKE Cipher Suites for Transport Layer Security (TLS) + :author: Cragie, Hao + :publication: June 2016 + :url: datatracker.ietf.org/doc/html/draft-cragie-tls-ecjpake-01 .. reference:: ZIGBEE - :author: zigbee alliance - :title: zigbee Specification - :url: csa-iot.org/wp-content/uploads/2022/01/docs-05-3474-22-0csg-zigbee-specification-1.pdf - :publication: April 2017 + :title: zigbee Specification + :doc_id: zigbee 05-3474-22 + :url: csa-iot.org/wp-content/uploads/2022/01/docs-05-3474-22-0csg-zigbee-specification-1.pdf + :publication: April 2017 .. reference:: IEEE-CCM - :author: IEEE - :title: IEEE Standard for Low-Rate Wireless Networks - :url: standards.ieee.org/ieee/802.15.4/7029/ - :publication: 2020 + :title: IEEE Standard for Low-Rate Wireless Networks + :doc_id: IEEE 802.15.4-2020 + :url: standards.ieee.org/ieee/802.15.4/7029/ + :publication: 2020 .. reference:: MATTER - :title: Matter Specification, Version 1.2 - :author: CSA - :publication: October 2023 - :url: csa-iot.org/all-solutions/matter/ - -.. reference:: RFC8235 - :title: Schnorr Non-interactive Zero-Knowledge Proof - :author: IETF - :publication: September 2017 - :url: tools.ietf.org/html/rfc8235.html - -.. reference:: RFC8236 - :title: J-PAKE: Password-Authenticated Key Exchange by Juggling - :author: IETF - :publication: September 2017 - :url: tools.ietf.org/html/rfc8236.html - -.. reference:: RFC9383 - :title: SPAKE2+, an Augmented Password-Authenticated Key Exchange (PAKE) Protocol - :author: IETF - :publication: September 2023 - :url: tools.ietf.org/html/rfc9383.html + :title: Matter Specification, Version 1.2 + :author: CSA + :publication: October 2023 + :url: csa-iot.org/all-solutions/matter/ + +.. reference:: RFC 8235 + :title: Schnorr Non-interactive Zero-Knowledge Proof + :author: IETF + :publication: September 2017 + :url: tools.ietf.org/html/rfc8235.html + +.. reference:: RFC 8236 + :title: J-PAKE: Password-Authenticated Key Exchange by Juggling + :author: IETF + :publication: September 2017 + :url: tools.ietf.org/html/rfc8236.html + +.. reference:: RFC 9383 + :title: SPAKE2+, an Augmented Password-Authenticated Key Exchange (PAKE) Protocol + :author: IETF + :publication: September 2023 + :url: tools.ietf.org/html/rfc9383.html .. reference:: SPAKE2P-2 - :title: SPAKE2+, an Augmented PAKE (Draft 02) - :author: IETF - :publication: December 2020 - :url: datatracker.ietf.org/doc/draft-bar-cfrg-spake2plus-02 + :title: SPAKE2+, an Augmented PAKE (Draft 02) + :author: IETF + :publication: December 2020 + :url: datatracker.ietf.org/doc/draft-bar-cfrg-spake2plus-02 .. reference:: THREAD - :title: Thread Specification 1.3.0 - :author: Thread Group - :publication: July 2022 - :url: www.threadgroup.org/ThreadSpec - -.. reference:: PSA-PQC - :title: PSA Certified Crypto API 1.4 PQC Extension - :doc_id: ARM AES 0119 - :url: arm-software.github.io/psa-api/crypto - -.. reference:: RFC5958 - :title: Asymmetric Key Packages - :author: IETF - :publication: August 2010 - :url: tools.ietf.org/html/rfc5958.html - -.. reference:: RFC3394 - :title: Advanced Encryption Standard (AES) Key Wrap Algorithm - :author: IETF - :publication: September 2002 - :url: tools.ietf.org/html/rfc3394.html - -.. reference:: RFC5649 - :title: Advanced Encryption Standard (AES) Key Wrap with Padding Algorithm - :author: IETF - :publication: August 2009 - :url: tools.ietf.org/html/rfc5649.html + :title: Thread Specification 1.3.0 + :author: Thread Group + :publication: July 2022 + :url: www.threadgroup.org/ThreadSpec + +.. reference:: PSA PQC + :title: PSA Certified Crypto API 1.4 PQC Extension + :doc_id: Arm AES 0119 + :url: arm-software.github.io/psa-api/crypto + +.. reference:: RFC 5958 + :title: Asymmetric Key Packages + :kind: informative + :author: IETF + :publication: August 2010 + :url: tools.ietf.org/html/rfc5958.html + +.. reference:: RFC 3394 + :title: Advanced Encryption Standard (AES) Key Wrap Algorithm + :author: IETF + :publication: September 2002 + :url: tools.ietf.org/html/rfc3394.html + +.. reference:: RFC 5649 + :title: Advanced Encryption Standard (AES) Key Wrap with Padding Algorithm + :author: IETF + :publication: August 2009 + :url: tools.ietf.org/html/rfc5649.html .. reference:: SP800-38F - :title: NIST Special Publication 800-38F: Recommendation for Block Cipher Modes of Operation: Methods for Key Wrapping - :author: NIST - :publication: December 2012 - :url: doi.org/10.6028/NIST.SP.800-38F + :title: NIST Special Publication 800-38F: Recommendation for Block Cipher Modes of Operation: Methods for Key Wrapping + :author: NIST + :publication: December 2012 + :url: doi.org/10.6028/NIST.SP.800-38F -.. reference:: RFC3526 - :title: More Modular Exponential (MODP) Diffie-Hellman groups for Internet Key Exchange (IKE) - :author: IETF - :publication: May 2003 - :url: tools.ietf.org/html/rfc3526.html +.. reference:: RFC 3526 + :title: More Modular Exponential (MODP) Diffie-Hellman groups for Internet Key Exchange (IKE) + :author: IETF + :publication: May 2003 + :url: tools.ietf.org/html/rfc3526.html .. reference:: IEEE-802.11 - :title: IEEE 802.11-2024: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications - :author: IEEE - :publication: 2024 - :url: standards.ieee.org/ieee/802.11/10548/ + :title: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications + :doc_id: IEEE 802.11:2024 + :publication: 2024 + :url: standards.ieee.org/ieee/802.11/10548/ .. reference:: MailTrusT - :title: MailTrusT Version 2 Algorithmen - :author: TeleTrusT - :publication: March 1999 - :url: www.teletrust.de/fileadmin/files/ag8_mttv2-6.pdf + :title: MailTrusT Version 2 Algorithmen + :author: TeleTrusT + :publication: March 1999 + :url: www.teletrust.de/fileadmin/files/ag8_mttv2-6.pdf .. reference:: SM3-draft - :title: The SM3 Cryptographic Hash Function (Draft 02) - :author: Sean Shen, XiaoDong Lee, Ronald Henry Tse, Wong Wai Kit, Paul Yang - :publication: July 2018 - :url: datatracker.ietf.org/doc/html/draft-sca-cfrg-sm3-02 - -.. reference:: RFC9688 - :title: Use of the SHA3 One-Way Hash Functions in the Cryptographic Message Syntax (CMS) - :author: IETF - :publication: November 2024 - :url: tools.ietf.org/html/rfc9688.html + :title: The SM3 Cryptographic Hash Function (Draft 02) + :kind: informative + :author: Sean Shen, XiaoDong Lee, Ronald Henry Tse, Wong Wai Kit, Paul Yang + :publication: July 2018 + :url: datatracker.ietf.org/doc/html/draft-sca-cfrg-sm3-02 + +.. reference:: RFC 9688 + :title: Use of the SHA3 One-Way Hash Functions in the Cryptographic Message Syntax (CMS) + :author: IETF + :publication: November 2024 + :url: tools.ietf.org/html/rfc9688.html .. reference:: FIPS203 - :title: FIPS Publication 203: Module-Lattice-Based Key-Encapsulation Mechanism Standard - :author: NIST - :publication: August 2024 - :url: doi.org/10.6028/NIST.FIPS.203 + :title: FIPS Publication 203: Module-Lattice-Based Key-Encapsulation Mechanism Standard + :doc_id: FIPS 203 + :author: NIST + :publication: August 2024 + :url: doi.org/10.6028/NIST.FIPS.203 .. reference:: FIPS204 - :title: FIPS Publication 204: Module-Lattice-Based Digital Signature Standard - :author: NIST - :publication: August 2024 - :url: doi.org/10.6028/NIST.FIPS.204 + :title: FIPS Publication 204: Module-Lattice-Based Digital Signature Standard + :doc_id: FIPS 204 + :author: NIST + :publication: August 2024 + :url: doi.org/10.6028/NIST.FIPS.204 .. reference:: FIPS205 - :title: FIPS Publication 205: Stateless Hash-Based Digital Signature Standard - :author: NIST - :publication: August 2024 - :url: doi.org/10.6028/NIST.FIPS.205 - -.. reference:: RFC9935 - :title: Internet X.509 Public Key Infrastructure - Algorithm Identifiers for Module-Lattice-Based Key-Encapsulation Mechanism (ML-KEM) - :author: IETF - :publication: March 2026 - :url: tools.ietf.org/html/rfc9935 - -.. reference:: RFC9881 - :title: Internet X.509 Public Key Infrastructure --- Algorithm Identifiers for the Module-Lattice-Based Digital Signature Algorithm (ML-DSA) - :author: IETF - :publication: October 2025 - :url: tools.ietf.org/html/rfc9881 - -.. reference:: RFC9909 - :title: Internet X.509 Public Key Infrastructure --- Algorithm Identifiers for the Stateless Hash-Based Digital Signature Algorithm (SLH-DSA) - :author: IETF - :publication: December 2025 - :url: tools.ietf.org/html/rfc9909 + :title: FIPS Publication 205: Stateless Hash-Based Digital Signature Standard + :doc_id: FIPS 205 + :author: NIST + :publication: August 2024 + :url: doi.org/10.6028/NIST.FIPS.205 + +.. reference:: RFC 9935 + :title: Internet X.509 Public Key Infrastructure - Algorithm Identifiers for Module-Lattice-Based Key-Encapsulation Mechanism (ML-KEM) + :author: IETF + :publication: March 2026 + :url: tools.ietf.org/html/rfc9935 + +.. reference:: RFC 9881 + :title: Internet X.509 Public Key Infrastructure --- Algorithm Identifiers for the Module-Lattice-Based Digital Signature Algorithm (ML-DSA) + :author: IETF + :publication: October 2025 + :url: tools.ietf.org/html/rfc9881 + +.. reference:: RFC 9909 + :title: Internet X.509 Public Key Infrastructure --- Algorithm Identifiers for the Stateless Hash-Based Digital Signature Algorithm (SLH-DSA) + :author: IETF + :publication: December 2025 + :url: tools.ietf.org/html/rfc9909 .. reference:: NIST-PQC - :title: Post-Quantum Cryptography - :author: NIST - :publication: PQC Project page - :url: nist.gov/pqcrypto + :title: Post-Quantum Cryptography + :author: NIST + :publication: PQC Project page + :url: nist.gov/pqcrypto .. reference:: SP800-208 - :title: NIST Special Publication 800-208: Recommendation for Stateful Hash-Based Signature Schemes - :author: NIST - :publication: October 2020 - :url: doi.org/10.6028/NIST.SP.800-208 - -.. reference:: RFC8391 - :title: XMSS: eXtended Merkle Signature Scheme - :author: IRTF - :publication: May 2018 - :url: tools.ietf.org/html/rfc8391 - -.. reference:: RFC8554 - :title: Leighton-Micali Hash-Based Signatures - :author: IRTF - :publication: April 2019 - :url: tools.ietf.org/html/rfc8554 - -.. reference:: RFC9858 - :title: Additional Parameter sets for HSS/LMS Hash-Based Signatures - :author: IRTF - :publication: October 2025 - :url: tools.ietf.org/html/rfc9858 - -.. reference:: RFC9802 - :title: Use of the HSS and XMSS Hash-Based Signature Algorithms in Internet X.509 Public Key Infrastructure - :author: IETF - :publication: June 2025 - :url: tools.ietf.org/html/rfc9802 - -.. reference:: RFC8702 - :title: Use of the SHAKE One-Way Hash Functions in the Cryptographic Message Syntax (CMS) - :author: IETF - :publication: January 2020 - :url: tools.ietf.org/html/rfc8702.html - -.. reference:: RFC7693 - :title: The BLAKE2 Cryptographic Hash and Message Authentication Code (MAC) - :author: J-P. Aumasson, M-J. Saarinen - :publication: November 2015 - :url: tools.ietf.org/html/rfc7693.html + :title: NIST Special Publication 800-208: Recommendation for Stateful Hash-Based Signature Schemes + :author: NIST + :publication: October 2020 + :url: doi.org/10.6028/NIST.SP.800-208 + +.. reference:: RFC 8391 + :title: XMSS: eXtended Merkle Signature Scheme + :author: IRTF + :publication: May 2018 + :url: tools.ietf.org/html/rfc8391 + +.. reference:: RFC 8554 + :title: Leighton-Micali Hash-Based Signatures + :author: IRTF + :publication: April 2019 + :url: tools.ietf.org/html/rfc8554 + +.. reference:: RFC 9858 + :title: Additional Parameter sets for HSS/LMS Hash-Based Signatures + :author: IRTF + :publication: October 2025 + :url: tools.ietf.org/html/rfc9858 + +.. reference:: RFC 9802 + :title: Use of the HSS and XMSS Hash-Based Signature Algorithms in Internet X.509 Public Key Infrastructure + :author: IETF + :publication: June 2025 + :url: tools.ietf.org/html/rfc9802 + +.. reference:: RFC 8702 + :title: Use of the SHAKE One-Way Hash Functions in the Cryptographic Message Syntax (CMS) + :author: IETF + :publication: January 2020 + :url: tools.ietf.org/html/rfc8702.html + +.. reference:: RFC 7693 + :title: The BLAKE2 Cryptographic Hash and Message Authentication Code (MAC) + :author: J-P. Aumasson, M-J. Saarinen + :publication: November 2015 + :url: tools.ietf.org/html/rfc7693.html .. reference:: BLAKE2 - :title: BLAKE2: simpler, smaller, fast as MD5 - :author: Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O’Hearn, Christian Winnerlein - :publication: January 2013 - :url: blake2.net/blake2.pdf - -.. references:: - - This document refers to the following documents. - - .. reference-table:: Documents referenced by this document - :sorted: + :title: BLAKE2: simpler, smaller, fast as MD5 + :author: Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O’Hearn, Christian Winnerlein + :publication: January 2013 + :url: blake2.net/blake2.pdf diff --git a/doc/crypto/about/releases b/doc/crypto/about/releases index 986dbeab..50ff2685 100644 --- a/doc/crypto/about/releases +++ b/doc/crypto/about/releases @@ -1,24 +1,6 @@ .. SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license -.. release:: 1.0 Beta 1 - :date: January 2019 - :confidentiality: Non-confidential - - First public beta release. - -.. release:: 1.0 Beta 2 - :date: February 2019 - :confidentiality: Non-confidential - - Update for release with other PSA Certified API specifications. - -.. release:: 1.0 Beta 3 - :date: May 2019 - :confidentiality: Non-confidential - - Update for release with other PSA Certified API specifications. - .. release:: 1.0 :date: February 2020 :confidentiality: Non-confidential diff --git a/doc/crypto/api/library/status.rst b/doc/crypto/api/library/status.rst index 40c55b6a..fc21af1e 100644 --- a/doc/crypto/api/library/status.rst +++ b/doc/crypto/api/library/status.rst @@ -1,4 +1,4 @@ -.. SPDX-FileCopyrightText: Copyright 2018-2025 Arm Limited and/or its affiliates +.. SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license .. _status-codes: @@ -8,7 +8,7 @@ Status codes The |API| uses the status code definitions that are shared with the other PSA Certified APIs. The |API| also provides some |API|-specific status codes, see :secref:`specific-errors`. -The following elements are defined in :file:`psa/error.h` from :cite-title:`PSA-STAT` (previously defined in :cite:`PSA-FFM`): +The following elements are defined in :file:`psa/error.h` from :cite-title:`PSA STAT`: .. code-block:: xref @@ -45,7 +45,7 @@ These definitions must be available to an application that includes the :file:`p Common error codes ^^^^^^^^^^^^^^^^^^ -Some of the common status codes have a more precise meaning when returned by a function in the |API|, compared to the definitions in `[PSA-STAT]`. See also :secref:`error-handling`. +Some of the common status codes have a more precise meaning when returned by a function in the |API|, compared to the definitions in `[PSA STAT]`. See also :secref:`error-handling`. .. list-table:: :class: longtable @@ -56,12 +56,12 @@ Some of the common status codes have a more precise meaning when returned by a f - Meaning in the |API| * - :code:`PSA_ERROR_NOT_SUPPORTED` - - `[PSA-STAT]` recommends the use of :code:`PSA_ERROR_INVALID_ARGUMENT` for invalid parameter values. + - `[PSA STAT]` recommends the use of :code:`PSA_ERROR_INVALID_ARGUMENT` for invalid parameter values. In the |API|, this is relaxed for algorithm identifier and key type parameters. It is recommended to return :code:`PSA_ERROR_INVALID_ARGUMENT` for invalid values, but :code:`PSA_ERROR_NOT_SUPPORTED` is also allowed, to permit implementations to avoid having to recognize all the cryptographic mechanisms that are defined in the PSA specification but not provided by that particular implementation. * - :code:`PSA_ERROR_INVALID_ARGUMENT` - - `[PSA-STAT]` recommends the use of :code:`PSA_ERROR_NOT_SUPPORTED` for unsupported parameter values. + - `[PSA STAT]` recommends the use of :code:`PSA_ERROR_NOT_SUPPORTED` for unsupported parameter values. In the |API|, either :code:`PSA_ERROR_INVALID_ARGUMENT` or :code:`PSA_ERROR_NOT_SUPPORTED` can be returned when unsupported algorithm identifier or key type parameters are used. This allows implementations to avoid having to recognize all the cryptographic mechanisms that are defined in the PSA specification but not provided by that particular implementation. diff --git a/doc/crypto/appendix/encodings.rst b/doc/crypto/appendix/encodings.rst index b40c57b3..0ceb7048 100644 --- a/doc/crypto/appendix/encodings.rst +++ b/doc/crypto/appendix/encodings.rst @@ -737,7 +737,7 @@ RFC3526 defines a set of FF groups that are recommended for use with WPA3-SAE (t :widths: auto WPA3-SAE suite, DH-FAMILY, P, DH family :sup:`a`, Key value - RFC3526, 0x02, 1, `PSA_DH_FAMILY_RFC3526`, ``0x3305`` + RFC 3526, 0x02, 1, `PSA_DH_FAMILY_RFC3526`, ``0x3305`` a. The finite field Diffie Hellman family values defined in the API also include the parity bit. The password token key type value is constructed from the finite field Diffie Hellman family using :code:`PSA_KEY_TYPE_WPA3_SAE_DH(family)`. @@ -895,7 +895,7 @@ The defined values for DH-FAMILY and P are shown in :numref:`table-dh-type`. :widths: auto DH key group, DH-FAMILY, P, DH family :sup:`a`, Public-key value, Key-pair value - RFC7919, 0x01, 1, `PSA_DH_FAMILY_RFC7919`, ``0x4203``, ``0x7203`` + RFC 7919, 0x01, 1, `PSA_DH_FAMILY_RFC7919`, ``0x4203``, ``0x7203`` a. The finite field Diffie Hellman group family values defined in the API also include the parity bit. The key type value is constructed from the finite field Diffie Hellman family using either :code:`PSA_KEY_TYPE_DH_PUBLIC_KEY(family)` or :code:`PSA_KEY_TYPE_DH_KEY_PAIR(family)` as required. diff --git a/doc/crypto/appendix/history.rst b/doc/crypto/appendix/history.rst index fd8ba034..4dce0754 100644 --- a/doc/crypto/appendix/history.rst +++ b/doc/crypto/appendix/history.rst @@ -11,6 +11,16 @@ Document change history This section provides the detailed changes made between published version of the document. +Changes in the draft GlobalPlatform publication revision +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Other changes +~~~~~~~~~~~~~ + +* Migrated the document to the 2026 PSA Certified API template. + + This changes the document front matter structure and publication styling, without changing the API. + Changes between *1.4.1* and *1.5* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -31,7 +41,7 @@ Changes to the API Other changes ~~~~~~~~~~~~~ -* Integrated the PQC algorithms and key types from :cite-title:`PSA-PQC`. +* Integrated the PQC algorithms and key types from :cite-title:`PSA PQC`. This provides support for LMS, HSS, XMSS, |XMSS^MT|, ML-DSA, SLH-DSA, and ML-KEM. @@ -370,551 +380,6 @@ Other changes - Moved most introductory material from the :secref:`functionality-overview` into the relevant API sections. -Changes between *1.0 beta 3* and *1.0.0* -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Changes to the API -~~~~~~~~~~~~~~~~~~ - -* Added `PSA_CRYPTO_API_VERSION_MAJOR` and `PSA_CRYPTO_API_VERSION_MINOR` to report the |API| version. - -* Removed ``PSA_ALG_GMAC`` algorithm identifier. - -* Removed internal implementation macros from the API specification: - - - ``PSA_AEAD_TAG_LENGTH_OFFSET`` - - ``PSA_ALG_AEAD_FROM_BLOCK_FLAG`` - - ``PSA_ALG_AEAD_TAG_LENGTH_MASK`` - - ``PSA__ALG_AEAD_WITH_DEFAULT_TAG_LENGTH__CASE`` - - ``PSA_ALG_CATEGORY_AEAD`` - - ``PSA_ALG_CATEGORY_ASYMMETRIC_ENCRYPTION`` - - ``PSA_ALG_CATEGORY_CIPHER`` - - ``PSA_ALG_CATEGORY_HASH`` - - ``PSA_ALG_CATEGORY_KEY_AGREEMENT`` - - ``PSA_ALG_CATEGORY_KEY_DERIVATION`` - - ``PSA_ALG_CATEGORY_MAC`` - - ``PSA_ALG_CATEGORY_MASK`` - - ``PSA_ALG_CATEGORY_SIGN`` - - ``PSA_ALG_CIPHER_FROM_BLOCK_FLAG`` - - ``PSA_ALG_CIPHER_MAC_BASE`` - - ``PSA_ALG_CIPHER_STREAM_FLAG`` - - ``PSA_ALG_DETERMINISTIC_ECDSA_BASE`` - - ``PSA_ALG_ECDSA_BASE`` - - ``PSA_ALG_ECDSA_IS_DETERMINISTIC`` - - ``PSA_ALG_HASH_MASK`` - - ``PSA_ALG_HKDF_BASE`` - - ``PSA_ALG_HMAC_BASE`` - - ``PSA_ALG_IS_KEY_DERIVATION_OR_AGREEMENT`` - - ``PSA_ALG_IS_VENDOR_DEFINED`` - - ``PSA_ALG_KEY_AGREEMENT_MASK`` - - ``PSA_ALG_KEY_DERIVATION_MASK`` - - ``PSA_ALG_MAC_SUBCATEGORY_MASK`` - - ``PSA_ALG_MAC_TRUNCATION_MASK`` - - ``PSA_ALG_RSA_OAEP_BASE`` - - ``PSA_ALG_RSA_PKCS1V15_SIGN_BASE`` - - ``PSA_ALG_RSA_PSS_BASE`` - - ``PSA_ALG_TLS12_PRF_BASE`` - - ``PSA_ALG_TLS12_PSK_TO_MS_BASE`` - - ``PSA_ALG_VENDOR_FLAG`` - - ``PSA_BITS_TO_BYTES`` - - ``PSA_BYTES_TO_BITS`` - - ``PSA_ECDSA_SIGNATURE_SIZE`` - - ``PSA_HMAC_MAX_HASH_BLOCK_SIZE`` - - ``PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE`` - - ``PSA_KEY_EXPORT_DSA_KEY_PAIR_MAX_SIZE`` - - ``PSA_KEY_EXPORT_DSA_PUBLIC_KEY_MAX_SIZE`` - - ``PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE`` - - ``PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE`` - - ``PSA_KEY_EXPORT_RSA_KEY_PAIR_MAX_SIZE`` - - ``PSA_KEY_EXPORT_RSA_PUBLIC_KEY_MAX_SIZE`` - - ``PSA_KEY_TYPE_CATEGORY_FLAG_PAIR`` - - ``PSA_KEY_TYPE_CATEGORY_KEY_PAIR`` - - ``PSA_KEY_TYPE_CATEGORY_MASK`` - - ``PSA_KEY_TYPE_CATEGORY_PUBLIC_KEY`` - - ``PSA_KEY_TYPE_CATEGORY_RAW`` - - ``PSA_KEY_TYPE_CATEGORY_SYMMETRIC`` - - ``PSA_KEY_TYPE_DH_GROUP_MASK`` - - ``PSA_KEY_TYPE_DH_KEY_PAIR_BASE`` - - ``PSA_KEY_TYPE_DH_PUBLIC_KEY_BASE`` - - ``PSA_KEY_TYPE_ECC_CURVE_MASK`` - - ``PSA_KEY_TYPE_ECC_KEY_PAIR_BASE`` - - ``PSA_KEY_TYPE_ECC_PUBLIC_KEY_BASE`` - - ``PSA_KEY_TYPE_IS_VENDOR_DEFINED`` - - ``PSA_KEY_TYPE_VENDOR_FLAG`` - - ``PSA_MAC_TRUNCATED_LENGTH`` - - ``PSA_MAC_TRUNCATION_OFFSET`` - - ``PSA_ROUND_UP_TO_MULTIPLE`` - - ``PSA_RSA_MINIMUM_PADDING_SIZE`` - - ``PSA_VENDOR_ECC_MAX_CURVE_BITS`` - - ``PSA_VENDOR_RSA_MAX_KEY_BITS`` - -* Remove the definition of implementation-defined macros from the specification, and clarified the implementation requirements for these macros in :secref:`implementation-specific-macro`. - - - Macros with implementation-defined values are indicated by ``/* implementation-defined value */`` in the API prototype. - The implementation must provide the implementation. - - - Macros for algorithm and key type construction and inspection have specification-defined values. - This is indicated by ``/* specification-defined value */`` in the API prototype. - Example definitions of these macros is provided in :secref:`appendix-specdef-values`. - -* Changed the semantics of multi-part operations. - - - Formalize the standard pattern for multi-part operations. - - Require all errors to result in an error state, requiring a call to ``psa_xxx_abort()`` to reset the object. - - Define behavior in illegal and impossible operation states, and for copying and reusing operation objects. - - Although the API signatures have not changed, this change requires modifications to application flows that handle error conditions in multi-part operations. - -* Merge the key identifier and key handle concepts in the API. - - - Replaced all references to key handles with key identifiers, or something similar. - - Replaced all uses of ``psa_key_handle_t`` with `psa_key_id_t` in the API, and removes the ``psa_key_handle_t`` type. - - Removed ``psa_open_key`` and ``psa_close_key``. - - Added `PSA_KEY_ID_NULL` for the never valid zero key identifier. - - Document rules related to destroying keys whilst in use. - - Added the `PSA_KEY_USAGE_CACHE` usage flag and the related `psa_purge_key()` API. - - Added clarification about caching keys to non-volatile memory. - -* Renamed ``PSA_ALG_TLS12_PSK_TO_MS_MAX_PSK_LEN`` to `PSA_TLS12_PSK_TO_MS_PSK_MAX_SIZE`. - -* Relax definition of implementation-defined types. - - - This is indicated in the specification by ``/* implementation-defined type */`` in the type definition. - - The specification only defines the name of implementation-defined types, and does not require that the implementation is a C struct. - -* Zero-length keys are not permitted. Attempting to create one will now result in an error. - -* Relax the constraints on inputs to key derivation: - - - `psa_key_derivation_input_bytes()` can be used for secret input steps. This is necessary if a zero-length input is required by the application. - - `psa_key_derivation_input_key()` can be used for non-secret input steps. - -* Multi-part cipher operations now require that the IV is passed using `psa_cipher_set_iv()`, the option to provide this as part of the input to `psa_cipher_update()` has been removed. - - The format of the output from `psa_cipher_encrypt()`, and input to `psa_cipher_decrypt()`, is documented. - -* Support macros to calculate the size of output buffers, IVs and nonces. - - - Macros to calculate a key and/or algorithm specific result are provided for all output buffers. The new macros are: - - * `PSA_AEAD_NONCE_LENGTH()` - * `PSA_CIPHER_ENCRYPT_OUTPUT_SIZE()` - * `PSA_CIPHER_DECRYPT_OUTPUT_SIZE()` - * `PSA_CIPHER_UPDATE_OUTPUT_SIZE()` - * `PSA_CIPHER_FINISH_OUTPUT_SIZE()` - * `PSA_CIPHER_IV_LENGTH()` - * `PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE()` - * `PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE()` - - - Macros that evaluate to a maximum type-independent buffer size are provided. The new macros are: - - * `PSA_AEAD_ENCRYPT_OUTPUT_MAX_SIZE()` - * `PSA_AEAD_DECRYPT_OUTPUT_MAX_SIZE()` - * `PSA_AEAD_UPDATE_OUTPUT_MAX_SIZE()` - * `PSA_AEAD_FINISH_OUTPUT_MAX_SIZE` - * `PSA_AEAD_VERIFY_OUTPUT_MAX_SIZE` - * `PSA_AEAD_NONCE_MAX_SIZE` - * `PSA_AEAD_TAG_MAX_SIZE` - * `PSA_ASYMMETRIC_ENCRYPT_OUTPUT_MAX_SIZE` - * `PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE` - * `PSA_CIPHER_ENCRYPT_OUTPUT_MAX_SIZE()` - * `PSA_CIPHER_DECRYPT_OUTPUT_MAX_SIZE()` - * `PSA_CIPHER_UPDATE_OUTPUT_MAX_SIZE()` - * `PSA_CIPHER_FINISH_OUTPUT_MAX_SIZE` - * `PSA_CIPHER_IV_MAX_SIZE` - * `PSA_EXPORT_KEY_PAIR_MAX_SIZE` - * `PSA_EXPORT_PUBLIC_KEY_MAX_SIZE` - * `PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE` - - - AEAD output buffer size macros are now parameterized on the key type as well as the algorithm: - - * `PSA_AEAD_ENCRYPT_OUTPUT_SIZE()` - * `PSA_AEAD_DECRYPT_OUTPUT_SIZE()` - * `PSA_AEAD_UPDATE_OUTPUT_SIZE()` - * `PSA_AEAD_FINISH_OUTPUT_SIZE()` - * `PSA_AEAD_TAG_LENGTH()` - * `PSA_AEAD_VERIFY_OUTPUT_SIZE()` - - - Some existing macros have been renamed to ensure that the name of the support macros are consistent. The following macros have been renamed: - - * ``PSA_ALG_AEAD_WITH_DEFAULT_TAG_LENGTH()`` → `PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG()` - * ``PSA_ALG_AEAD_WITH_TAG_LENGTH()`` → `PSA_ALG_AEAD_WITH_SHORTENED_TAG()` - * ``PSA_KEY_EXPORT_MAX_SIZE()`` → `PSA_EXPORT_KEY_OUTPUT_SIZE()` - * ``PSA_HASH_SIZE()`` → `PSA_HASH_LENGTH()` - * ``PSA_MAC_FINAL_SIZE()`` → `PSA_MAC_LENGTH()` - * ``PSA_BLOCK_CIPHER_BLOCK_SIZE()`` → `PSA_BLOCK_CIPHER_BLOCK_LENGTH()` - * ``PSA_MAX_BLOCK_CIPHER_BLOCK_SIZE`` → `PSA_BLOCK_CIPHER_BLOCK_MAX_SIZE` - - - Documentation of the macros and of related APIs has been updated to reference the related API elements. - -* Provide hash-and-sign operations as well as sign-the-hash operations. The API for asymmetric signature has been changed to clarify the use of the new functions. - - - The existing asymmetric signature API has been renamed to clarify that this is for signing a hash that is already computed: - - * ``PSA_KEY_USAGE_SIGN`` → `PSA_KEY_USAGE_SIGN_HASH` - * ``PSA_KEY_USAGE_VERIFY`` → `PSA_KEY_USAGE_VERIFY_HASH` - * ``psa_asymmetric_sign()`` → `psa_sign_hash()` - * ``psa_asymmetric_verify()`` → `psa_verify_hash()` - - - New APIs added to provide the complete message signing operation: - - * `PSA_KEY_USAGE_SIGN_MESSAGE` - * `PSA_KEY_USAGE_VERIFY_MESSAGE` - * `psa_sign_message()` - * `psa_verify_message()` - - - New Support macros to identify which algorithms can be used in which signing API: - - * `PSA_ALG_IS_SIGN_HASH()` - * `PSA_ALG_IS_SIGN_MESSAGE()` - - - Renamed support macros that apply to both signing APIs: - - * ``PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE()`` → `PSA_SIGN_OUTPUT_SIZE()` - * ``PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE`` → `PSA_SIGNATURE_MAX_SIZE` - - - The usage flag values have been changed, including for `PSA_KEY_USAGE_DERIVE`. - -* Restructure `psa_key_type_t` and reassign all key type values. - - - `psa_key_type_t` changes from 32-bit to 16-bit integer. - - Reassigned the key type categories. - - Add a parity bit to the key type to ensure that valid key type values differ by at least 2 bits. - - 16-bit elliptic curve ids (``psa_ecc_curve_t``) replaced by 8-bit ECC curve family ids (`psa_ecc_family_t`). - 16-bit Diffie-Hellman group ids (``psa_dh_group_t``) replaced by 8-bit DH group family ids (`psa_dh_family_t`). - - * These ids are no longer related to the IANA Group Registry specification. - * The new key type values do not encode the key size for ECC curves or DH groups. The key bit size from the key attributes identify a specific ECC curve or DH group within the family. - - - The following macros have been removed: - - * ``PSA_DH_GROUP_FFDHE2048`` - * ``PSA_DH_GROUP_FFDHE3072`` - * ``PSA_DH_GROUP_FFDHE4096`` - * ``PSA_DH_GROUP_FFDHE6144`` - * ``PSA_DH_GROUP_FFDHE8192`` - * ``PSA_ECC_CURVE_BITS`` - * ``PSA_ECC_CURVE_BRAINPOOL_P256R1`` - * ``PSA_ECC_CURVE_BRAINPOOL_P384R1`` - * ``PSA_ECC_CURVE_BRAINPOOL_P512R1`` - * ``PSA_ECC_CURVE_CURVE25519`` - * ``PSA_ECC_CURVE_CURVE448`` - * ``PSA_ECC_CURVE_SECP160K1`` - * ``PSA_ECC_CURVE_SECP160R1`` - * ``PSA_ECC_CURVE_SECP160R2`` - * ``PSA_ECC_CURVE_SECP192K1`` - * ``PSA_ECC_CURVE_SECP192R1`` - * ``PSA_ECC_CURVE_SECP224K1`` - * ``PSA_ECC_CURVE_SECP224R1`` - * ``PSA_ECC_CURVE_SECP256K1`` - * ``PSA_ECC_CURVE_SECP256R1`` - * ``PSA_ECC_CURVE_SECP384R1`` - * ``PSA_ECC_CURVE_SECP521R1`` - * ``PSA_ECC_CURVE_SECT163K1`` - * ``PSA_ECC_CURVE_SECT163R1`` - * ``PSA_ECC_CURVE_SECT163R2`` - * ``PSA_ECC_CURVE_SECT193R1`` - * ``PSA_ECC_CURVE_SECT193R2`` - * ``PSA_ECC_CURVE_SECT233K1`` - * ``PSA_ECC_CURVE_SECT233R1`` - * ``PSA_ECC_CURVE_SECT239K1`` - * ``PSA_ECC_CURVE_SECT283K1`` - * ``PSA_ECC_CURVE_SECT283R1`` - * ``PSA_ECC_CURVE_SECT409K1`` - * ``PSA_ECC_CURVE_SECT409R1`` - * ``PSA_ECC_CURVE_SECT571K1`` - * ``PSA_ECC_CURVE_SECT571R1`` - * ``PSA_KEY_TYPE_GET_CURVE`` - * ``PSA_KEY_TYPE_GET_GROUP`` - - - The following macros have been added: - - * `PSA_DH_FAMILY_RFC7919` - * `PSA_ECC_FAMILY_BRAINPOOL_P_R1` - * `PSA_ECC_FAMILY_SECP_K1` - * `PSA_ECC_FAMILY_SECP_R1` - * `PSA_ECC_FAMILY_SECP_R2` - * `PSA_ECC_FAMILY_SECT_K1` - * `PSA_ECC_FAMILY_SECT_R1` - * `PSA_ECC_FAMILY_SECT_R2` - * `PSA_ECC_FAMILY_MONTGOMERY` - * `PSA_KEY_TYPE_DH_GET_FAMILY` - * `PSA_KEY_TYPE_ECC_GET_FAMILY` - - - The following macros have new values: - - * `PSA_KEY_TYPE_AES` - * `PSA_KEY_TYPE_ARC4` - * `PSA_KEY_TYPE_CAMELLIA` - * `PSA_KEY_TYPE_CHACHA20` - * `PSA_KEY_TYPE_DERIVE` - * `PSA_KEY_TYPE_DES` - * `PSA_KEY_TYPE_HMAC` - * `PSA_KEY_TYPE_NONE` - * `PSA_KEY_TYPE_RAW_DATA` - * `PSA_KEY_TYPE_RSA_KEY_PAIR` - * `PSA_KEY_TYPE_RSA_PUBLIC_KEY` - - - The following macros with specification-defined values have new example implementations: - - * `PSA_BLOCK_CIPHER_BLOCK_LENGTH` - * `PSA_KEY_TYPE_DH_KEY_PAIR` - * `PSA_KEY_TYPE_DH_PUBLIC_KEY` - * `PSA_KEY_TYPE_ECC_KEY_PAIR` - * `PSA_KEY_TYPE_ECC_PUBLIC_KEY` - * `PSA_KEY_TYPE_IS_ASYMMETRIC` - * `PSA_KEY_TYPE_IS_DH` - * `PSA_KEY_TYPE_IS_DH_KEY_PAIR` - * `PSA_KEY_TYPE_IS_DH_PUBLIC_KEY` - * `PSA_KEY_TYPE_IS_ECC` - * `PSA_KEY_TYPE_IS_ECC_KEY_PAIR` - * `PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY` - * `PSA_KEY_TYPE_IS_KEY_PAIR` - * `PSA_KEY_TYPE_IS_PUBLIC_KEY` - * `PSA_KEY_TYPE_IS_RSA` - * `PSA_KEY_TYPE_IS_UNSTRUCTURED` - * `PSA_KEY_TYPE_KEY_PAIR_OF_PUBLIC_KEY` - * `PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR` - -* Add ECC family `PSA_ECC_FAMILY_FRP` for the FRP256v1 curve. - -* Restructure `psa_algorithm_t` encoding, to increase consistency across algorithm categories. - - - Algorithms that include a hash operation all use the same structure to encode the hash algorithm. The following ``PSA_ALG_XXXX_GET_HASH()`` macros have all been replaced by a single macro `PSA_ALG_GET_HASH()`: - - * ``PSA_ALG_HKDF_GET_HASH()`` - * ``PSA_ALG_HMAC_GET_HASH()`` - * ``PSA_ALG_RSA_OAEP_GET_HASH()`` - * ``PSA_ALG_SIGN_GET_HASH()`` - * ``PSA_ALG_TLS12_PRF_GET_HASH()`` - * ``PSA_ALG_TLS12_PSK_TO_MS_GET_HASH()`` - - - Stream cipher algorithm macros have been removed; the key type indicates which cipher to use. Instead of ``PSA_ALG_ARC4`` and ``PSA_ALG_CHACHA20``, use `PSA_ALG_STREAM_CIPHER`. - - All of the other ``PSA_ALG_XXX`` macros have updated values or updated example implementations. - - - The following macros have new values: - - * `PSA_ALG_ANY_HASH` - * `PSA_ALG_CBC_MAC` - * `PSA_ALG_CBC_NO_PADDING` - * `PSA_ALG_CBC_PKCS7` - * `PSA_ALG_CCM` - * `PSA_ALG_CFB` - * `PSA_ALG_CHACHA20_POLY1305` - * `PSA_ALG_CMAC` - * `PSA_ALG_CTR` - * `PSA_ALG_ECDH` - * `PSA_ALG_ECDSA_ANY` - * `PSA_ALG_FFDH` - * `PSA_ALG_GCM` - * `PSA_ALG_MD2` - * `PSA_ALG_MD4` - * `PSA_ALG_MD5` - * `PSA_ALG_OFB` - * `PSA_ALG_RIPEMD160` - * `PSA_ALG_RSA_PKCS1V15_CRYPT` - * `PSA_ALG_RSA_PKCS1V15_SIGN_RAW` - * `PSA_ALG_SHA_1` - * `PSA_ALG_SHA_224` - * `PSA_ALG_SHA_256` - * `PSA_ALG_SHA_384` - * `PSA_ALG_SHA_512` - * `PSA_ALG_SHA_512_224` - * `PSA_ALG_SHA_512_256` - * `PSA_ALG_SHA3_224` - * `PSA_ALG_SHA3_256` - * `PSA_ALG_SHA3_384` - * `PSA_ALG_SHA3_512` - * `PSA_ALG_XTS` - - - The following macros with specification-defined values have new example implementations: - - * `PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG()` - * `PSA_ALG_AEAD_WITH_SHORTENED_TAG()` - * `PSA_ALG_DETERMINISTIC_ECDSA()` - * `PSA_ALG_ECDSA()` - * `PSA_ALG_FULL_LENGTH_MAC()` - * `PSA_ALG_HKDF()` - * `PSA_ALG_HMAC()` - * `PSA_ALG_IS_AEAD()` - * `PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER()` - * `PSA_ALG_IS_ASYMMETRIC_ENCRYPTION()` - * `PSA_ALG_IS_BLOCK_CIPHER_MAC()` - * `PSA_ALG_IS_CIPHER()` - * `PSA_ALG_IS_DETERMINISTIC_ECDSA()` - * `PSA_ALG_IS_ECDH()` - * `PSA_ALG_IS_ECDSA()` - * `PSA_ALG_IS_FFDH()` - * `PSA_ALG_IS_HASH()` - * `PSA_ALG_IS_HASH_AND_SIGN()` - * `PSA_ALG_IS_HKDF()` - * `PSA_ALG_IS_HMAC()` - * `PSA_ALG_IS_KEY_AGREEMENT()` - * `PSA_ALG_IS_KEY_DERIVATION()` - * `PSA_ALG_IS_MAC()` - * `PSA_ALG_IS_RANDOMIZED_ECDSA()` - * `PSA_ALG_IS_RAW_KEY_AGREEMENT()` - * `PSA_ALG_IS_RSA_OAEP()` - * `PSA_ALG_IS_RSA_PKCS1V15_SIGN()` - * `PSA_ALG_IS_RSA_PSS()` - * `PSA_ALG_IS_SIGN()` - * `PSA_ALG_IS_SIGN_MESSAGE()` - * `PSA_ALG_IS_STREAM_CIPHER()` - * `PSA_ALG_IS_TLS12_PRF()` - * `PSA_ALG_IS_TLS12_PSK_TO_MS()` - * `PSA_ALG_IS_WILDCARD()` - * `PSA_ALG_KEY_AGREEMENT()` - * `PSA_ALG_KEY_AGREEMENT_GET_BASE()` - * `PSA_ALG_KEY_AGREEMENT_GET_KDF()` - * `PSA_ALG_RSA_OAEP()` - * `PSA_ALG_RSA_PKCS1V15_SIGN()` - * `PSA_ALG_RSA_PSS()` - * `PSA_ALG_TLS12_PRF()` - * `PSA_ALG_TLS12_PSK_TO_MS()` - * `PSA_ALG_TRUNCATED_MAC()` - -* Added ECB block cipher mode, with no padding, as `PSA_ALG_ECB_NO_PADDING`. - -* Add functions to suspend and resume hash operations: - - - `psa_hash_suspend()` halts the current operation and outputs a hash suspend state. - - `psa_hash_resume()` continues a previously suspended hash operation. - - The format of the hash suspend state is documented in :secref:`hash-suspend-state`, and supporting macros are provided for using the |API|: - - - `PSA_HASH_SUSPEND_OUTPUT_SIZE()` - - `PSA_HASH_SUSPEND_OUTPUT_MAX_SIZE` - - `PSA_HASH_SUSPEND_ALGORITHM_FIELD_LENGTH` - - `PSA_HASH_SUSPEND_INPUT_LENGTH_FIELD_LENGTH()` - - `PSA_HASH_SUSPEND_HASH_STATE_FIELD_LENGTH()` - - `PSA_HASH_BLOCK_LENGTH()` - -* Complement :code:`PSA_ERROR_STORAGE_FAILURE` with new error codes :code:`PSA_ERROR_DATA_CORRUPT` and :code:`PSA_ERROR_DATA_INVALID`. These permit an implementation to distinguish different causes of failure when reading from key storage. - -* Added input step `PSA_KEY_DERIVATION_INPUT_CONTEXT` for key derivation, supporting obvious mapping from the step identifiers to common KDF constructions. - -Clarifications -~~~~~~~~~~~~~~ - -* Clarified rules regarding modification of parameters in concurrent environments. - -* Guarantee that :code:`psa_destroy_key(PSA_KEY_ID_NULL)` always returns :code:`PSA_SUCCESS`. - -* Clarified the TLS PSK to MS key-agreement algorithm. - -* Document the key policy requirements for all APIs that accept a key parameter. - -* Document more of the error codes for each function. - -Other changes -~~~~~~~~~~~~~ - -* Require C99 for this specification instead of C89. - -* Removed references to non-standard mbed-crypto header files. The only header file that applications need to include is :file:`psa/crypto.h`. - -* Reorganized the API reference, grouping the elements in a more natural way. - -* Improved the cross referencing between all of the document sections, and from code snippets to API element descriptions. - - -Changes between *1.0 beta 2* and *1.0 beta 3* -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Changes to the API -~~~~~~~~~~~~~~~~~~ - -* Change the value of error codes, and some names, to align - with other PSA Certified APIs. The name changes are: - - - :code:`PSA_ERROR_UNKNOWN_ERROR` → :code:`PSA_ERROR_GENERIC_ERROR` - - :code:`PSA_ERROR_OCCUPIED_SLOT` → :code:`PSA_ERROR_ALREADY_EXISTS` - - :code:`PSA_ERROR_EMPTY_SLOT` → :code:`PSA_ERROR_DOES_NOT_EXIST` - - :code:`PSA_ERROR_INSUFFICIENT_CAPACITY` → :code:`PSA_ERROR_INSUFFICIENT_DATA` - - :code:`PSA_ERROR_TAMPERING_DETECTED` → :code:`PSA_ERROR_CORRUPTION_DETECTED` - -* Change the way keys are created to avoid “half-filled” handles - that contained key metadata, but no key material. - Now, to create a key, first fill in a data structure containing - its attributes, then pass this structure to a function that - both allocates resources for the key and fills in the key - material. This affects the following functions: - - - `psa_import_key()`, `psa_generate_key()`, ``psa_generator_import_key()`` - and `psa_copy_key()` now take an attribute structure, as - a pointer to `psa_key_attributes_t`, to specify key metadata. - This replaces the previous method of passing arguments to - ``psa_create_key()`` or to the key material creation function - or calling ``psa_set_key_policy()``. - - ``psa_key_policy_t`` and functions operating on that type - no longer exist. A key's policy is now accessible as part of - its attributes. - - ``psa_get_key_information()`` is also replaced by accessing the - key's attributes, retrieved with `psa_get_key_attributes()`. - - ``psa_create_key()`` no longer exists. Instead, set the key id - attribute and the lifetime attribute before creating the - key material. - -* Allow `psa_aead_update()` to buffer data. - -* New buffer size calculation macros. - -* Key identifiers are no longer specific to a given lifetime value. ``psa_open_key()`` no longer takes a ``lifetime`` parameter. - -* Define a range of key identifiers for use by applications and a separate range for use by implementations. - -* Avoid the unusual terminology "generator": call them - "key-derivation operations" instead. Rename a number of functions - and other identifiers related to for clarity and consistency: - - - ``psa_crypto_generator_t`` → `psa_key_derivation_operation_t` - - ``PSA_CRYPTO_GENERATOR_INIT`` → `PSA_KEY_DERIVATION_OPERATION_INIT` - - ``psa_crypto_generator_init()`` → `psa_key_derivation_operation_init()` - - ``PSA_GENERATOR_UNBRIDLED_CAPACITY`` → `PSA_KEY_DERIVATION_UNLIMITED_CAPACITY` - - ``psa_set_generator_capacity()`` → `psa_key_derivation_set_capacity()` - - ``psa_get_generator_capacity()`` → `psa_key_derivation_get_capacity()` - - ``psa_key_agreement()`` → `psa_key_derivation_key_agreement()` - - ``psa_generator_read()`` → `psa_key_derivation_output_bytes()` - - ``psa_generate_derived_key()`` → `psa_key_derivation_output_key()` - - ``psa_generator_abort()`` → `psa_key_derivation_abort()` - - ``psa_key_agreement_raw_shared_secret()`` → `psa_raw_key_agreement()` - - ``PSA_KDF_STEP_xxx`` → ``PSA_KEY_DERIVATION_INPUT_xxx`` - - ``PSA_xxx_KEYPAIR`` → ``PSA_xxx_KEY_PAIR`` - -* Convert TLS1.2 KDF descriptions to multi-part key derivation. - -Clarifications -~~~~~~~~~~~~~~ - -* Specify ``psa_generator_import_key()`` for most key types. - -* Clarify the behavior in various corner cases. - -* Document more error conditions. - - - -Changes between *1.0 beta 1* and *1.0 beta 2* -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Changes to the API -~~~~~~~~~~~~~~~~~~ - -* Remove obsolete definition ``PSA_ALG_IS_KEY_SELECTION``. -* `PSA_AEAD_FINISH_OUTPUT_SIZE`: remove spurious parameter ``plaintext_length``. - -Clarifications -~~~~~~~~~~~~~~ - -* ``psa_key_agreement()``: document ``alg`` parameter. - -Other changes -~~~~~~~~~~~~~ - -* Document formatting improvements. - - Planned changes for version |APIversion|.x ------------------------------------------ diff --git a/doc/crypto/conf.py b/doc/crypto/conf.py index 57b34d46..073241fc 100644 --- a/doc/crypto/conf.py +++ b/doc/crypto/conf.py @@ -8,7 +8,7 @@ doc_info = { # Document template - 'template': 'psa-api-2025', + 'template': 'psa-api-2026', # Document title, MANDATORY 'title': 'PSA Certified\nCrypto API', @@ -19,28 +19,20 @@ 'copyright': 'Arm Limited and/or its affiliates', # Document identifier, marked as open issue if not provided - 'doc_id': 'IHI 0086', + 'doc_id': 'GPD_SPE_086', # The short X.Y version. MANDATORY 'version': '1.5', - # Document quality status, marked as open issue if not provided - 'quality': 'REL', - # Document issue number (within that version and quality status) - # Marked as open issue if not provided + # Document maintenance revision 'issue_no': 0, - # Identifies the sequence number of a release candidate of the same issue - # default to None - #'release_candidate': 1, - # Draft status - use this to indicate the document is not ready for publication - #'draft': True, - - # Document confidentiality. Must be either Non-confidential or Confidential - # Marked as open issue if not provided - 'confidentiality': 'Non-confidential', + # Document draft revision + 'draft': 1, + # Document status + 'status': 'DFT', # Id of the legal notice for this document # Marked as open issue if not provided - 'license': 'psa-certified-api-license', + #'license': 'psa-certified-api-license', # Document date, default to build date 'date': 'June 2026', @@ -55,9 +47,6 @@ # 2 : Sub-elements of API - parameters, fields, values 'header_doxygen': 2, - # Declare a watermark for the PDF output - # 'watermark': 'DRAFT', - # Optional ordering of return error values # This list is used to create a standard ordering of return value responses # throughout the document, irrespective of their ordering in the source text diff --git a/doc/crypto/index.rst b/doc/crypto/index.rst index 05a13b3d..5e84429c 100644 --- a/doc/crypto/index.rst +++ b/doc/crypto/index.rst @@ -3,17 +3,9 @@ .. title:: - .. abstract:: - - This document is part of the PSA Certified API specifications. It defines interfaces to provide cryptographic operations and key storage services. - -.. front-matter:: - - about/about - .. maintoc:: - overview/intro + about/about overview/goals overview/functionality overview/sample-arch diff --git a/doc/crypto/overview/conventions.rst b/doc/crypto/overview/conventions.rst index a286a243..59786c96 100644 --- a/doc/crypto/overview/conventions.rst +++ b/doc/crypto/overview/conventions.rst @@ -17,7 +17,7 @@ The header file for the |API| has the name :file:`psa/crypto.h`. All of the API Implementations must provide their own version of the :file:`psa/crypto.h` header file. Implementations can provide a subset of the API defined in this specification and a subset of the available algorithms. :secref:`appendix-example-header` provides an incomplete, example header file which includes all of the API elements. See also :secref:`implementation-considerations`. -The |API| uses the status code definitions that are shared with the other PSA Certified APIs. :cite-title:`PSA-STAT` defines these status codes in the :file:`psa/error.h` header file. Applications are not required to explicitly include the :file:`psa/error.h` header file when using these status codes with the |API|. See :secref:`status-codes`. +The |API| uses the status code definitions that are shared with the other PSA Certified APIs. :cite-title:`PSA STAT` defines these status codes in the :file:`psa/error.h` header file. Applications are not required to explicitly include the :file:`psa/error.h` header file when using these status codes with the |API|. See :secref:`status-codes`. .. _api-conventions: diff --git a/doc/crypto/overview/intro.rst b/doc/crypto/overview/intro.rst deleted file mode 100644 index c5da96ad..00000000 --- a/doc/crypto/overview/intro.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. SPDX-FileCopyrightText: Copyright 2018-2026 Arm Limited and/or its affiliates -.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license - -Introduction -============ - -About Platform Security Architecture ------------------------------------- - -This document is one of a set of resources provided by Arm that can help organizations develop products that meet the security requirements of GlobalPlatform's PSA Certified evaluation scheme on Arm-based platforms. The PSA Certified scheme provides a framework and methodology that helps silicon manufacturers, system software providers and OEMs to develop more secure products. Arm resources that support PSA Certified range from threat models, standard architectures that simplify development and increase portability, and open-source partnerships that provide ready-to-use software. You can read more about PSA Certified here at :url:`www.psacertified.org` and find more Arm resources here at :url:`developer.arm.com/platform-security-resources` and :url:`www.trustedfirmware.org`. - -About the |API| ---------------- - -The interface described in this document is a PSA Certified API, that provides a portable programming interface to cryptographic operations, and key storage functionality, on a wide range of hardware. - -The interface is user-friendly, while still providing access to the low-level primitives used in modern cryptography. It does not require that the user has access to the key material. Instead, it uses opaque key identifiers. - -You can find additional resources relating to the |API| here at :url:`arm-software.github.io/psa-api/crypto`, and find other PSA Certified APIs here at :url:`arm-software.github.io/psa-api`. - -This document includes: - -* A rationale for the design. See :secref:`design-goals`. -* A high-level overview of the functionality provided by the interface. See :secref:`functionality-overview`. -* A description of typical architectures of implementations for this specification. See :secref:`architectures`. -* General considerations for implementers of this specification, and for applications that use the interface defined in this specification. See :secref:`implementation-considerations` and :secref:`usage-considerations`. -* A detailed definition of the API. See :secref:`library-management`, :secref:`key-management`, and :secref:`crypto-operations`. - -In future, companion documents will define *profiles* for this specification. A profile is -a minimum mandatory subset of the interface that a compliant implementation must -provide. diff --git a/doc/fwu/about/about.rst b/doc/fwu/about/about.rst index c5748c47..28271cda 100644 --- a/doc/fwu/about/about.rst +++ b/doc/fwu/about/about.rst @@ -1,6 +1,8 @@ -.. SPDX-FileCopyrightText: Copyright 2020-2023 Arm Limited and/or its affiliates +.. SPDX-FileCopyrightText: Copyright 2020-2023, 2026 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license +.. include:: intro + .. include:: releases .. include:: references diff --git a/doc/fwu/about/intro b/doc/fwu/about/intro new file mode 100644 index 00000000..c754f8c6 --- /dev/null +++ b/doc/fwu/about/intro @@ -0,0 +1,14 @@ +.. SPDX-FileCopyrightText: Copyright 2020-2026 Arm Limited and/or its affiliates +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. introduction:: + + This document is one of a set of resources that can help organizations develop products that meet the security requirements of GlobalPlatform's PSA Certified evaluation scheme. The PSA Certified scheme provides a framework and methodology that helps silicon manufacturers, system software providers and OEMs to develop more secure products. You can read more about PSA Certified here at :url:`www.psacertified.org`. + + .. rubric:: About the |API| + + The interface described in this document is a PSA Certified API, that provides a portable programming interface to firmware update and installation operations on a wide range of hardware. + + The interface enables the software and systems that manage and deliver a firmware update to a device, to be developed independently from the hardware-specific mechanisms required to apply the update to the device. Reusing the deployment and delivery system for firmware updates reduces the complexity of providing firmware updates across a diverse set of managed devices. + + You can find additional resources relating to the |API| here at :url:`arm-software.github.io/psa-api/fwu`, and find other PSA Certified APIs here at :url:`arm-software.github.io/psa-api`. diff --git a/doc/fwu/about/references b/doc/fwu/about/references index f06b8d58..fba6e473 100644 --- a/doc/fwu/about/references +++ b/doc/fwu/about/references @@ -1,23 +1,21 @@ -.. SPDX-FileCopyrightText: Copyright 2020-2023 Arm Limited and/or its affiliates +.. SPDX-FileCopyrightText: Copyright 2020-2023, 2026 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license -.. reference:: PSA-STAT - :title: PSA Certified Status code API - :doc_id: ARM IHI 0097 - :url: arm-software.github.io/psa-api/status-code - -.. reference:: PSA-FFM - :title: Arm® Platform Security Architecture Firmware Framework - :doc_id: ARM DEN 0063 - :url: developer.arm.com/documentation/den0063 +.. reference:: PSA STAT + :title: PSA Certified Status code API + :kind: normative + :doc_id: ARM IHI 0097 + :url: arm-software.github.io/psa-api/status-code .. reference:: PSM :title: Platform Security Model + :kind: informative :doc_id: ARM DEN 0128 :url: developer.arm.com/documentation/den0128 .. reference:: PSA-CERT :title: PSA Certified™ Level 2 Lightweight Protection Profile + :kind: informative :doc_id: JSA DEN 002 :url: psacertified.org/development-resources/certification-resources/#leveltwo @@ -25,11 +23,13 @@ :author: NIST :doc_id: IR 8259 :title: Foundational Cybersecurity Activities for IoT Device Manufacturers + :kind: informative :publication: May 2020 :url: doi.org/10.6028/NIST.IR.8259 .. reference:: EN303645 :title: Cyber Security for Consumer Internet of Things: Baseline Requirements + :kind: informative :author: ETSI :doc_id: EN 303 645 :publication: June 2020 @@ -37,6 +37,7 @@ .. reference:: LWM2M :title: Lightweight M2M + :kind: informative :author: OMA :doc_id: LwM2M v1.2 :publication: November 2020 @@ -44,67 +45,63 @@ .. reference:: UEFI :title: Unified Extensible Firmware Interface (UEFI) Specification + :kind: informative :doc_id: UEFI v2.10 :author: UEFI Forum, Inc. :publication: August 2022 :url: uefi.org/specifications -.. reference:: RFC4122 - :author: IETF - :title: A Universally Unique IDentifier (UUID) URN Namespace - :url: tools.ietf.org/html/rfc4122 - -.. reference:: RFC8240 +.. reference:: RFC 8240 :title: Report from the Internet of Things Software Update (IoTSU) Workshop 2016 + :kind: informative :author: IAB :publication: September 2017 :url: tools.ietf.org/html/rfc8240 -.. reference:: RFC9019 +.. reference:: RFC 9019 :title: A Firmware Update Architecture for Internet of Things + :kind: informative :author: IETF :publication: April 2021 :url: tools.ietf.org/html/rfc9019 -.. reference:: RFC9124 +.. reference:: RFC 9124 :title: A Manifest Information Model for Firmware Updates in Internet of Things (IoT) Devices + :kind: informative :author: IETF :publication: January 2022 :url: tools.ietf.org/html/rfc9124 .. reference:: SUIT-MFST :title: A Concise Binary Object Representation (CBOR)-based Serialization Format for the Software Updates for Internet of Things (SUIT) Manifest + :kind: informative :author: IETF, (draft) :publication: February 2023 :url: datatracker.ietf.org/doc/draft-ietf-suit-manifest .. reference:: SUIT-ENC :title: Encrypted Payloads in SUIT Manifests + :kind: informative :author: IETF, (draft) :publication: April 2023 :url: datatracker.ietf.org/doc/draft-ietf-suit-firmware-encryption .. reference:: C99 - :title: ISO/IEC 9899:1999 --- Programming Languages --- C - :author: ISO/IEC - :publication: December 1999 - :url: www.iso.org/standard/29237.html + :title: Programming Languages --- C + :kind: informative + :doc_id: ISO/IEC 9899:1999 + :publication: December 1999 + :url: www.iso.org/standard/29237.html .. reference:: EBBR :author: Arm Limited and Contributors :title: Embedded Base Boot Requirements (EBBR) Specification + :kind: informative :url: arm-software.github.io/ebbr .. reference:: SP800-30 - :title: NIST Special Publication 800-30 Revision 1: Guide for Conducting Risk Assessments - :author: NIST - :publication: September 2012 - :url: doi.org/10.6028/NIST.SP.800-30r1 - - -.. references:: - - This document refers to the following documents. - - .. reference-table:: Documents referenced by this document - :sorted: + :title: Special Publication 800-30 Revision 1: Guide for Conducting Risk Assessments + :kind: informative + :author: NIST + :publication: September 2012 + :url: doi.org/10.6028/NIST.SP.800-30r1 diff --git a/doc/fwu/api/api.rst b/doc/fwu/api/api.rst index 4d3d4ef8..c5f634ad 100644 --- a/doc/fwu/api/api.rst +++ b/doc/fwu/api/api.rst @@ -133,10 +133,7 @@ The header file for the |API| has the name :file:`psa/update.h`. All of the inte Implementations must provide their own version of the :file:`psa/update.h` header file. :secref:`appendix-example-header` provides an incomplete, example header file which includes all of the |API| elements. -This |API| uses some of the common status codes that are defined by :cite-title:`PSA-STAT` as part of the :file:`psa/error.h` header file. Applications are not required to explicitly include the :file:`psa/error.h` header file when using these status codes with the |API|. See :secref:`status-codes`. - -.. note:: - The common error codes in :file:`psa/error.h` were previously defined in :cite-title:`PSA-FFM`. +This |API| uses some of the common status codes that are defined by :cite-title:`PSA STAT` as part of the :file:`psa/error.h` header file. Applications are not required to explicitly include the :file:`psa/error.h` header file when using these status codes with the |API|. See :secref:`status-codes`. .. _required_functions: @@ -200,7 +197,7 @@ The |API| uses the status code definitions that are shared with the other PSA Ce Common status codes ^^^^^^^^^^^^^^^^^^^ -The following elements are defined in :file:`psa/error.h` from :cite:`PSA-STAT` (previously defined in :cite:`PSA-FFM`): +The following elements are defined in :file:`psa/error.h` from :cite:`PSA STAT`: .. code-block:: xref diff --git a/doc/fwu/appendix/change-history.rst b/doc/fwu/appendix/change-history.rst index 0b8c7691..2720eeba 100644 --- a/doc/fwu/appendix/change-history.rst +++ b/doc/fwu/appendix/change-history.rst @@ -6,6 +6,15 @@ Document change history ======================= +Changes in the draft GlobalPlatform publication revision +-------------------------------------------------------- + +.. rubric:: General changes + +* Migrated the document to the 2026 PSA Certified API template. + + This changes the document front matter structure and publication styling, without changing the API. + Changes between version *1.0.0* and *1.0.1* ------------------------------------------- diff --git a/doc/fwu/conf.py b/doc/fwu/conf.py index fdd6246e..9c83f70a 100644 --- a/doc/fwu/conf.py +++ b/doc/fwu/conf.py @@ -8,42 +8,34 @@ doc_info = { # Document template - 'template': 'psa-api-2025', + 'template': 'psa-api-2026', # Document title, MANDATORY 'title': 'PSA Certified\nFirmware Update API', 'author': 'Arm Limited', # Document copyright date, default to year of 'date' - 'copyright_date': '2020-2025', + 'copyright_date': '2020-2026', 'copyright': 'Arm Limited and/or its affiliates', # Document identifier, marked as open issue if not provided - 'doc_id': 'IHI 0093', + 'doc_id': 'GPD_SPE_093', # The short X.Y version. MANDATORY 'version': '1.0', - # Document quality status, marked as open issue if not provided - 'quality': 'REL', - # Document issue number (within that version and quality status) - # Marked as open issue if not provided + # Document maintenance revision 'issue_no': 1, - # Identifies the sequence number of a release candidate of the same issue - # default to None - #'release_candidate': 2, - #'draft': True, - - # Document confidentiality. Must be either Non-confidential or Confidential - # Marked as open issue if not provided - 'confidentiality': 'Non-confidential', + # Document draft revision + 'draft': 1, + # Document status + 'status': 'DFT', # Id of the legal notice for this document # Marked as open issue if not provided - 'license': 'psa-certified-api-license', + #'license': 'psa-certified-api-license', # Document date, default to build date - 'date': '23/9/2025', - + 'date': 'September 2025', # psa_spec: default header file for API definitions # default to None, and can be set in documentation source diff --git a/doc/fwu/index.rst b/doc/fwu/index.rst index 77ec2b08..35165999 100644 --- a/doc/fwu/index.rst +++ b/doc/fwu/index.rst @@ -3,21 +3,9 @@ .. title:: - .. banner:: - - This is a DRAFT release. The content is subject to change. To provide feedback, see :secref:`feedback`. - - .. abstract:: - - This document defines a standard firmware interface for installing firmware updates. - -.. front-matter:: - - about/about - .. maintoc:: - overview/intro + about/about overview/goals overview/architecture overview/programming-model diff --git a/doc/fwu/overview/goals.rst b/doc/fwu/overview/goals.rst index c00d70d3..e69306c2 100644 --- a/doc/fwu/overview/goals.rst +++ b/doc/fwu/overview/goals.rst @@ -1,17 +1,61 @@ -.. SPDX-FileCopyrightText: Copyright 2020-2023 Arm Limited and/or its affiliates +.. SPDX-FileCopyrightText: Copyright 2020-2023, 2026 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license +.. _intro: + +Firmware update +=============== + +Connected devices need a reliable and secure firmware update mechanism. Incorporating such an update mechanism is a fundamental requirement for fixing vulnerabilities, but it also enables other important capabilities such as updating configuration settings and adding new functionality. This can be particularly challenging for devices with resource constraints, as highlighted in :rfc-title:`8240`. + +:numref:`fig-context` depicts the actors and agents involved in a typical firmware update scenario. + +.. figure:: /figure/intro/context.* + :name: fig-context + + A typical over-the-air firmware update scenario + +In this example, the new firmware is uploaded by the Firmware creator to an Update server. The Update server communicates with an Update client application on the device, announcing the availability of new firmware. The client downloads the new firmware, and installs it into the device firmware storage. + +In :numref:`fig-context`, the Update client has to combine the following capabilities: + +* The specific protocols used by the network operator in which the device is deployed +* The specific mechanism used by the hardware platform to install firmware for execution + +Devices developed for the Internet of Things (IoT) have a very diverse ecosystem of hardware and software developers, and utilize a broad set of communication protocols and technologies. This will lead to a large, fragmented set of Update clients, that are each tightly coupled to one hardware platform and one network protocol. + +The |API| separates the software responsible for delivering the new firmware in the device, from the software that is responsible for storing and installing it in the device memory. :numref:`fig-api` shows how the |API| separates an Update client, which obtains the new firmware from the Firmware Server, from an Update service, which stores the firmware in the device memory. + +.. figure:: /figure/intro/fwu-api.* + :name: fig-api + + The |API| + +In practice, this enables an Update client to be written independently of the firmware storage design, and the Update service to be written independently of the delivery mechanism. + +The remainder of this document includes: + +* The design goals for the |API|. See :secref:`design-goals`. +* A definition of the concepts and terminology used in this document. See :secref:`architecture`. +* A description of the interface design. See :secref:`programming-model`. +* A detailed definition of the API. See :secref:`api-reference`. + +The appendixes provide additional information: + +* A sample header file containing all of the API elements. See :secref:`appendix-example-header`. +* Some example code demonstrating various use cases. See :secref:`examples`. + .. _design-goals: Design goals -============ +------------ This section describes the main goals and use cases for the |API|. .. _goal-constrained: Suitable for constrained devices ---------------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The interface is suitable for a range of embedded devices: from those with resource-limited microcontrollers with one or two simple firmware images, to richer devices that have firmware images for multiple subsystems and separated applications. @@ -38,7 +82,7 @@ For example, the following resource constraints can affect the |API|: For devices with sufficient resources, it is recommended to follow the :cite-title:`EBBR` specification, which prescribes the :cite-title:`UEFI` capsule update interface. Updating the Platform Root of Trust ------------------------------------ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The |API| is suitable for updating the device's :term:`Platform Root of Trust` (PRoT) firmware. @@ -51,12 +95,12 @@ The :cite:`PSM` requirements for firmware update are also reflected in publicati The TOE also rejects attempts of firmware downgrade. Updating the Application Root of Trust --------------------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In addition to the PRoT firmware, other services that run in the :term:`Secure processing environment` (SPE), but outside of the PRoT, can require update via the |API|. These services may be combined with the updatable PRoT in a single firmware image, or provided in a separate firmware image. Flexibility for different trust models ---------------------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ There are a number of factors that impact the trust model that is used to authorize device updates and firmware execution. For example: @@ -67,7 +111,7 @@ There are a number of factors that impact the trust model that is used to author The |API| must be flexible enough to support the trust model required for particular products, without imposing unnecessary overheads on constrained devices. Protocol independence ---------------------- +~~~~~~~~~~~~~~~~~~~~~ Different protocols are used to communicate with a device depending on the industry and application context. This includes open protocols, such as :cite-title:`LWM2M`, and proprietary protocols from cloud service providers. These protocols serve the specific needs of their respective markets. @@ -76,7 +120,7 @@ Some of the protocols have :term:`manifest` data that is separate from the firmw The |API| must be independent of the protocol used by the update client to receive an update. Transport independence ----------------------- +~~~~~~~~~~~~~~~~~~~~~~ Embedded devices can receive over-the-air (OTA) firmware updates over different transport technologies, depending on the industry and the application. For example, this includes Wi-Fi, LTE, LoRa, and commercial low-power wide-area networks. @@ -89,7 +133,7 @@ The |API| must be independent of the transport used by the update client to rece The |API| does not cover reprogramming of a device using a debug interface, for example, JTAG or SWD. Firmware format independence ----------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Many device manufacturers and cloud service providers have established formats for firmware images and manifests, tailored to the specific needs of their systems and markets. @@ -104,7 +148,7 @@ The |API| must be independent of the format and encoding of firmware images and Support for the more complex use cases from :rfc:`9124`, with multiple external payloads, is not considered in version |APIversion| of the |API|, but might be in scope for future versions of the interface. Flexibility for different hardware designs ------------------------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The |API| is designed to be reasonably efficient to implement on different system-on-chip (SoC) architectures, while providing a consistent interface for update clients to target. @@ -118,14 +162,14 @@ For example, the |API| should be effective in the following types of system: * Systems that have a mixture of on-chip and external non-volatile memory used for firmware storage. Suitable for composite devices ------------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Some platforms have independent subsystems that are isolated from the main microprocessor. These subsystems can have their own firmware, which can also require updates. For example, radios, secure elements, secure enclaves, or other kinds of microcontroller. The |API| must support an implementation updates these types of subsystem. Robust and reliable update --------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~ Devices that are remotely deployed, or are deployed in large numbers, must use an update process that does not have routine failure modes that result in devices that cannot be remotely recovered. @@ -138,7 +182,7 @@ The |API| must support an update process that reduces the risk of in-field updat The |API| might be useful for implementation of recovery firmware, but the requirements of recovery firmware are not considered in the interface design. Flexibility in implementation design ------------------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The |API| is architectural and does not define a single implementation. An implementation can make trade-offs to target specific device needs. For example: diff --git a/doc/fwu/overview/intro.rst b/doc/fwu/overview/intro.rst deleted file mode 100644 index 155135d2..00000000 --- a/doc/fwu/overview/intro.rst +++ /dev/null @@ -1,63 +0,0 @@ -.. SPDX-FileCopyrightText: Copyright 2020-2025 Arm Limited and/or its affiliates -.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license - -Introduction -============ - -About Platform Security Architecture ------------------------------------- - -This document is one of a set of resources provided by Arm that can help organizations develop products that meet the security requirements of GlobalPlatform's PSA Certified evaluation scheme on Arm-based platforms. The PSA Certified scheme provides a framework and methodology that helps silicon manufacturers, system software providers and OEMs to develop more secure products. Arm resources that support PSA Certified range from threat models, standard architectures that simplify development and increase portability, and open-source partnerships that provide ready-to-use software. You can read more about PSA Certified here at :url:`www.psacertified.org` and find more Arm resources here at :url:`developer.arm.com/platform-security-resources` and :url:`www.trustedfirmware.org`. - -About the |API| ---------------- - -The interface described in this document is a PSA Certified API, that provides a portable programming interface to firmware update and installation operations on a wide range of hardware. - -The interface enables the software and systems that manage and deliver a firmware update to a device, to be developed independently from the hardware-specific mechanisms required to apply the update to the device. Reusing the deployment and delivery system for firmware updates reduces the complexity of providing firmware updates across a diverse set of managed devices. - -You can find additional resources relating to the |API| here at :url:`arm-software.github.io/psa-api/fwu`, and find other PSA Certified APIs here at :url:`arm-software.github.io/psa-api`. - -.. _intro: - -Firmware update ---------------- - -Connected devices need a reliable and secure firmware update mechanism. Incorporating such an update mechanism is a fundamental requirement for fixing vulnerabilities, but it also enables other important capabilities such as updating configuration settings and adding new functionality. This can be particularly challenging for devices with resource constraints, as highlighted in :rfc-title:`8240`. - -:numref:`fig-context` depicts the actors and agents involved in a typical firmware update scenario. - -.. figure:: /figure/intro/context.* - :name: fig-context - - A typical over-the-air firmware update scenario - -In this example, the new firmware is uploaded by the Firmware creator to an Update server. The Update server communicates with an Update client application on the device, announcing the availability of new firmware. The client downloads the new firmware, and installs it into the device firmware storage. - -In :numref:`fig-context`, the Update client has to combine the following capabilities: - -* The specific protocols used by the network operator in which the device is deployed -* The specific mechanism used by the hardware platform to install firmware for execution - -Devices developed for the Internet of Things (IoT) have a very diverse ecosystem of hardware and software developers, and utilize a broad set of communication protocols and technologies. This will lead to a large, fragmented set of Update clients, that are each tightly coupled to one hardware platform and one network protocol. - -The |API| separates the software responsible for delivering the new firmware in the device, from the software that is responsible for storing and installing it in the device memory. :numref:`fig-api` shows how the |API| separates an Update client, which obtains the new firmware from the Firmware Server, from an Update service, which stores the firmware in the device memory. - -.. figure:: /figure/intro/fwu-api.* - :name: fig-api - - The |API| - -In practice, this enables an Update client to be written independently of the firmware storage design, and the Update service to be written independently of the delivery mechanism. - -The remainder of this document includes: - -* The design goals for the |API|. See :secref:`design-goals`. -* A definition of the concepts and terminology used in this document. See :secref:`architecture`. -* A description of the interface design. See :secref:`programming-model`. -* A detailed definition of the API. See :secref:`api-reference`. - -The appendixes provide additional information: - -* A sample header file containing all of the API elements. See :secref:`appendix-example-header`. -* Some example code demonstrating various use cases. See :secref:`examples`. diff --git a/doc/status-code/about/about.rst b/doc/status-code/about/about.rst index 4437543b..d571f0f0 100644 --- a/doc/status-code/about/about.rst +++ b/doc/status-code/about/about.rst @@ -7,7 +7,6 @@ .. include:: terms -.. potential-for-change:: - :hide: +.. include:: intro .. about:: diff --git a/doc/status-code/about/intro b/doc/status-code/about/intro new file mode 100644 index 00000000..b1d41cd2 --- /dev/null +++ b/doc/status-code/about/intro @@ -0,0 +1,12 @@ +.. SPDX-FileCopyrightText: Copyright 2022, 2025-2026 Arm Limited and/or its affiliates +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. introduction:: + + This document is one of a set of resources that can help organizations develop products that meet the security requirements of GlobalPlatform's PSA Certified evaluation scheme. The PSA Certified scheme provides a framework and methodology that helps silicon manufacturers, system software providers and OEMs to develop more secure products. You can read more about PSA Certified here at :url:`www.psacertified.org`. + + .. rubric:: About the |API| + + The interface described in this document is a PSA Certified API, that provides a shared set of interface definitions used by other PSA Certified APIs. + + You can find additional resources relating to the |API| here at :url:`arm-software.github.io/psa-api/status-code`, and find other PSA Certified APIs here at :url:`arm-software.github.io/psa-api`. diff --git a/doc/status-code/about/references b/doc/status-code/about/references index 86cab83f..3ffe176a 100644 --- a/doc/status-code/about/references +++ b/doc/status-code/about/references @@ -1,12 +1,14 @@ -.. SPDX-FileCopyrightText: Copyright 2022, 2025 Arm Limited and/or its affiliates +.. SPDX-FileCopyrightText: Copyright 2022, 2026 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license -.. reference:: PSA-FFM +.. reference:: PSA FFM :title: Arm® Platform Security Architecture Firmware Framework - :doc_id: DEN 0063 + :kind: normative + :doc_id: Arm DEN 0063 :url: https://developer.arm.com/documentation/den0063/a .. reference:: TF-M :title: Trusted Firmware-M + :kind: informative :author: trustedfirmware.org :url: git.trustedfirmware.org/trusted-firmware-m.git/about/ diff --git a/doc/status-code/about/releases b/doc/status-code/about/releases index 049d70df..2cbc5b98 100644 --- a/doc/status-code/about/releases +++ b/doc/status-code/about/releases @@ -37,12 +37,8 @@ .. release-info:: - :replace: + :extend: - Prior to version 1.0.1, the definitions in this specification were released as part of :cite-title:`PSA-FFM`. - - The change history table lists the changes that have been made to this document. - - .. release-table:: Document revision history + Prior to version 1.0.1, the definitions in this specification were released as part of :cite-title:`PSA FFM`. For a detailed list of changes, see :secref:`change-history`. diff --git a/doc/status-code/about/terms b/doc/status-code/about/terms index 13a80e08..fee206ce 100644 --- a/doc/status-code/about/terms +++ b/doc/status-code/about/terms @@ -26,4 +26,4 @@ .. term:: Secure Partition Manager :abbr: SPM - Part of :cite-title:`PSA-FFM` that is responsible for isolating software in Partitions, managing the execution of software within Partitions, and providing communication between Partitions. + Part of :cite-title:`PSA FFM` that is responsible for isolating software in Partitions, managing the execution of software within Partitions, and providing communication between Partitions. diff --git a/doc/status-code/api/status-codes.rst b/doc/status-code/api/status-codes.rst index 94de2c51..b10dcefa 100644 --- a/doc/status-code/api/status-codes.rst +++ b/doc/status-code/api/status-codes.rst @@ -20,7 +20,7 @@ Status codes ``-129`` to ``-248`` are for use by PSA Certified API specification Status codes in this range must only be used as defined in a PSA specification. -In the context of an implementation of :cite-title:`PSA-FFM`: +In the context of an implementation of :cite-title:`PSA FFM`: * The :term:`Secure Partition Manager` (SPM) implementation can define error codes in the range ``-249`` to ``-256`` for :sc:`IMPLEMENTATION DEFINED` purposes. * A :term:`Root of Trust Service` (RoT Service) can define additional error codes in the ranges ``-1`` to ``-128`` and ``-257`` to ``MIN_INT32`` for RoT Service-specific error conditions. @@ -140,14 +140,14 @@ Error codes This error indicates that the function has detected an abnormal call, which typically indicates a programming error in the caller, or an abuse of the API. - This error has a specific meaning in an implementation of :cite-title:`PSA-FFM`. + This error has a specific meaning in an implementation of :cite-title:`PSA FFM`. .. macro:: PSA_ERROR_CONNECTION_REFUSED :definition: ((psa_status_t)-130) .. summary:: A status code that indicates that the caller is not permitted to connect to a Service. - This message has a specific meaning in an implementation of :cite-title:`PSA-FFM`. + This message has a specific meaning in an implementation of :cite-title:`PSA FFM`. .. macro:: PSA_ERROR_CONNECTION_BUSY @@ -155,7 +155,7 @@ Error codes .. summary:: A status code that indicates that the caller cannot connect to a service. - This message has a specific meaning in an implementation of :cite-title:`PSA-FFM`. + This message has a specific meaning in an implementation of :cite-title:`PSA FFM`. .. macro:: PSA_ERROR_GENERIC_ERROR diff --git a/doc/status-code/appendix/change-history.rst b/doc/status-code/appendix/change-history.rst index f93cf25a..a7992047 100644 --- a/doc/status-code/appendix/change-history.rst +++ b/doc/status-code/appendix/change-history.rst @@ -1,4 +1,4 @@ -.. SPDX-FileCopyrightText: Copyright 2022, 2024-2025 Arm Limited and/or its affiliates +.. SPDX-FileCopyrightText: Copyright 2022, 2024-2026 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license .. _change-history: @@ -7,11 +7,20 @@ Change history ============== +Document and API Changes +~~~~~~~~~~~~~~~~~~~~~~~~ + +Changes in the draft GlobalPlatform publication revision +-------------------------------------------------------- + +* Migrated the document to the 2026 PSA Certified API template. + + This changes the document front matter structure and publication styling, without changing the API. Changes between version 1.0.4 and version 1.0.5 ----------------------------------------------- -* Fixed the link in the :cite-title:`PSA-FFM` document reference. +* Fixed the link in the :cite-title:`PSA FFM` document reference. Changes between version 1.0.3 and version 1.0.4 ----------------------------------------------- @@ -26,7 +35,7 @@ Changes between version 1.0.2 and version 1.0.3 Changes between version 1.0.1 and version 1.0.2 ----------------------------------------------- -* Removed the whitespace within the definition of some of the status codes. The whitespace was erroneously introduced during the separation from the :cite-title:`PSA-FFM`. This change is necessary to ensure that multiple definitions of the same status code are identical, as required by the C language. +* Removed the whitespace within the definition of some of the status codes. The whitespace was erroneously introduced during the separation from the :cite-title:`PSA FFM`. This change is necessary to ensure that multiple definitions of the same status code are identical, as required by the C language. Changes between version 1.0.0 and version 1.0.1 @@ -47,4 +56,4 @@ Changes between version 1.0.0 and version 1.0.1 Changes prior to version 1.0.0 ------------------------------ -The definition of the common status codes was incorporated in the :cite-title:`PSA-FFM` specification up until version 1.0.0. +The definition of the common status codes was incorporated in the :cite-title:`PSA FFM` specification up until version 1.0.0. diff --git a/doc/status-code/conf.py b/doc/status-code/conf.py index 4df32c93..b5462900 100644 --- a/doc/status-code/conf.py +++ b/doc/status-code/conf.py @@ -8,7 +8,7 @@ doc_info = { # Document template - 'template': 'psa-api-2025', + 'template': 'psa-api-2026', # Document title, MANDATORY 'title': 'PSA Certified\nStatus code API', @@ -19,30 +19,23 @@ 'copyright': 'Arm Limited and/or its affiliates', # Document identifier, marked as open issue if not provided - 'doc_id': 'IHI 0097', + 'doc_id': 'GPD_SPE_097', # The short X.Y version. MANDATORY 'version': '1.0', - # Document quality status, marked as open issue if not provided - 'quality': 'REL', - # Document issue number (within that version and quality status) - # Marked as open issue if not provided + # Document maintenance revision 'issue_no': 5, - # Identifies the sequence number of a release candidate of the same issue - # default to None - 'release_candidate': None, - 'draft': False, - - # Document confidentiality. Must be either Non-confidential or Confidential - # Marked as open issue if not provided - 'confidentiality': 'Non-confidential', + # Document draft revision + 'draft': 1, + # Document status + 'status': 'DFT', # Id of the legal notice for this document # Marked as open issue if not provided - 'license': 'psa-certified-api-license', + #'license': 'psa-certified-api-license', # Document date, default to build date - 'date': '22/01/2026', + 'date': 'January 2026', # psa_spec: default header file for API definitions # default to None, and can be set in documentation source @@ -63,7 +56,7 @@ 'include_content': [], # Include the C Identifier index. Default to True - 'identifier_index': False, + 'identifier_index': True, # Specify where to add page breaks in main/appendix # 'none' : no page breaks diff --git a/doc/status-code/index.rst b/doc/status-code/index.rst index 0ac97848..60adba0b 100644 --- a/doc/status-code/index.rst +++ b/doc/status-code/index.rst @@ -3,17 +3,9 @@ .. title:: - .. abstract:: - - This document is part of the PSA Certified API specifications. It defines common interface elements relating to status and error codes. - -.. front-matter:: - - about/about - .. maintoc:: - overview/intro + about/about api/status-codes .. appendix:: diff --git a/doc/status-code/overview/intro.rst b/doc/status-code/overview/intro.rst deleted file mode 100644 index 82024e6a..00000000 --- a/doc/status-code/overview/intro.rst +++ /dev/null @@ -1,17 +0,0 @@ -.. SPDX-FileCopyrightText: Copyright 2022, 2025 Arm Limited and/or its affiliates -.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license - -Introduction -============ - -About Platform Security Architecture ------------------------------------- - -This document is one of a set of resources provided by Arm that can help organizations develop products that meet the security requirements of GlobalPlatform's PSA Certified evaluation scheme on Arm-based platforms. The PSA Certified scheme provides a framework and methodology that helps silicon manufacturers, system software providers and OEMs to develop more secure products. Arm resources that support PSA Certified range from threat models, standard architectures that simplify development and increase portability, and open-source partnerships that provide ready-to-use software. You can read more about PSA Certified here at :url:`www.psacertified.org` and find more Arm resources here at :url:`developer.arm.com/platform-security-resources` and :url:`www.trustedfirmware.org`. - -About the |API| ---------------- - -The interface described in this document is a PSA Certified API, that provides a shared set of interface definitions used by other PSA Certified APIs. - -You can find additional resources relating to the |API| here at :url:`arm-software.github.io/psa-api/status-code`, and find other PSA Certified APIs here at :url:`arm-software.github.io/psa-api`. diff --git a/doc/storage/about.rst b/doc/storage/about.rst deleted file mode 100644 index e580e915..00000000 --- a/doc/storage/about.rst +++ /dev/null @@ -1,145 +0,0 @@ -.. SPDX-FileCopyrightText: Copyright 2018-2019, 2022-2025 Arm Limited and/or its affiliates -.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license - -.. Releases of this specification - -.. release:: 1.0 beta 2 - :date: Feb 2019 - :confidentiality: Non-confidential - - Initial publication. - -.. release:: 1.0.0 - :date: June 2019 - :confidentiality: Non-confidential - - First stable release with 1.0 API finalized. - - Uses the common PSA Certified Status codes. - - Modified the API parameters to align with other PSA Certified APIs. - - Added storage flags to specify protection requirement. - -.. release:: 1.0.1 - :date: October 2022 - :confidentiality: Non-confidential - - Relicensed as open source under CC BY-SA 4.0. - - Documentation clarifications. - -.. release:: 1.0.2 - :date: March 2023 - :confidentiality: Non-confidential - - Documentation clarifications. - -.. release:: 1.0.3 - :date: January 2024 - :confidentiality: Non-confidential - - Provide a Security Risk Assessment. - -.. release:: 1.0.4 - :date: September 2025 - :confidentiality: Non-confidential - - GlobalPlatform governance of PSA Certified evaluation scheme. - -.. release-info:: - :extend: - - The detailed changes in each release are described in :secref:`document-history`. - - -.. References used in this specification - -.. reference:: PSM - :title: Platform Security Model - :doc_id: ARM DEN 0128 - :url: developer.arm.com/documentation/den0128 - -.. reference:: PSA-CRYPT - :title: PSA Certified Crypto API - :doc_id: IHI 0086 - :url: arm-software.github.io/psa-api/crypto - -.. reference:: PSA-STAT - :title: PSA Certified Status code API - :doc_id: ARM IHI 0097 - :url: arm-software.github.io/psa-api/status-code - -.. reference:: PSA-FFM - :title: Arm® Platform Security Architecture Firmware Framework - :doc_id: ARM DEN 0063 - :url: developer.arm.com/documentation/den0063 - -.. reference:: SP800-30 - :title: NIST Special Publication 800-30 Revision 1: Guide for Conducting Risk Assessments - :author: NIST - :publication: September 2012 - :url: doi.org/10.6028/NIST.SP.800-30r1 - -.. Glossary terms used in this specification - -.. term:: Application Root of Trust - :abbr: ARoT - - This is the security domain in which additional security services are implemented. See :cite-title:`PSM`. - -.. scterm:: Implementation Defined - - Behavior that is not defined by the this specification, but is defined and documented by individual implementations. - - Firmware developers can choose to depend on :sc:`IMPLEMENTATION DEFINED` behavior, but must be aware that their code might not be portable to another implementation. - -.. term:: Non-secure Processing Environment - :abbr: NSPE - - This is the security domain outside of the :term:`Secure Processing Environment`. It is the Application domain, typically containing the application firmware and hardware. - -.. term:: Platform Root of Trust - :abbr: PRoT - - The overall trust anchor for the system. This ensures the platform is securely booted and configured, and establishes the secure environments required to protect security services. See :cite-title:`PSM`. - -.. term:: Root of Trust - :abbr: RoT - - This is the minimal set of software, hardware and data that is implicitly trusted in the platform --- there is no software or hardware at a deeper level that can verify that the Root of Trust is authentic and unmodified. - -.. term:: Root of Trust Service - :abbr: RoT Service - - A set of related security operations that are provided by a :term:`Root of Trust`. - -.. term:: Secure Partition - - A processing context with protected runtime state within the :term:`Secure Processing Environment`. A secure partition may implement one or more :term:`RoT Service`\s, accessible via well-defined interfaces. - -.. term:: Secure Processing Environment - :abbr: SPE - - This is the security domain that includes the :term:`Platform Root of Trust` and the :term:`Application Root of Trust` domains. - -.. term:: Secure Partition Manager - :abbr: SPM - - Part of the :term:`Secure Processing Environment` that is responsible for allocating resources to :term:`Secure Partition`\s, managing the isolation and execution of software within partitions, and providing IPC between partitions. - - -.. potential-for-change:: - - The contents of this specification are stable for version 1.0. - - The following may change in updates to the version 1.0 specification: - - * Small optional feature additions. - * Clarifications. - - Significant additions, or any changes that affect the compatibility of the - interfaces defined in this specification will only be included in a - new major or minor version of the specification. - -.. about:: diff --git a/doc/storage/about/about.rst b/doc/storage/about/about.rst new file mode 100644 index 00000000..58d67b48 --- /dev/null +++ b/doc/storage/about/about.rst @@ -0,0 +1,12 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2019, 2022-2026 Arm Limited and/or its affiliates +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. include:: intro + +.. include:: releases + +.. include:: references + +.. include:: terms + +.. about:: diff --git a/doc/storage/about/intro b/doc/storage/about/intro new file mode 100644 index 00000000..ab4c0fa7 --- /dev/null +++ b/doc/storage/about/intro @@ -0,0 +1,22 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2019, 2022,2025 Arm Limited and/or its affiliates +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. introduction:: + + This document is one of a set of resources that can help organizations develop products that meet the security requirements of GlobalPlatform's PSA Certified evaluation scheme. The PSA Certified scheme provides a framework and methodology that helps silicon manufacturers, system software providers and OEMs to develop more secure products. You can read more about PSA Certified here at :url:`www.psacertified.org`. + + .. rubric:: About the |API| + + The interface described in this document is a PSA Certified API, that provides key/value storage interfaces for use with device-protected storage. The |API| describes two interfaces for storage: + + .. csv-table:: + :widths: 3 7 + + Internal Trusted Storage API, An interface for storage provided by the :term:`Platform Root of Trust` (PRoT). + Protected Storage API, An interface for external protected storage. + + The Internal Trusted Storage API must be implemented in the PRoT as described in the :cite-title:`PSM` specification. + + If there are no :term:`Application Root of Trust` (ARoT) services that rely on it, the Protected Storage API can be implemented in the :term:`NSPE`. Otherwise, the Protected Storage API must be implemented in an ARoT within the :term:`SPE`. + + You can find additional resources relating to the |API| here at :url:`arm-software.github.io/psa-api/storage`, and find other PSA Certified APIs here at :url:`arm-software.github.io/psa-api`. diff --git a/doc/storage/about/references b/doc/storage/about/references new file mode 100644 index 00000000..6f8f003b --- /dev/null +++ b/doc/storage/about/references @@ -0,0 +1,34 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2019, 2022-2026 Arm Limited and/or its affiliates +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. reference:: PSA STAT + :title: PSA Certified Status code API + :kind: normative + :doc_id: Arm IHI 0097 + :url: arm-software.github.io/psa-api/status-code + +.. reference:: PSA CRYPT + :title: PSA Certified Crypto API + :kind: informative + :doc_id: Arm IHI 0086 + :url: arm-software.github.io/psa-api/crypto + +.. reference:: PSM + :title: Platform Security Model + :kind: normative + :doc_id: JSADEN014 + :author: PSA Certified + :url: psacertified.org/development-resources/building-in-security/threat-models/ + +.. reference:: PSA FFM + :title: Arm® Platform Security Architecture Firmware Framework + :kind: normative + :doc_id: Arm DEN 0063 + :url: developer.arm.com/documentation/den0063 + +.. reference:: SP800-30 + :title: Special Publication 800-30 Revision 1: Guide for Conducting Risk Assessments + :kind: informative + :author: NIST + :publication: September 2012 + :url: doi.org/10.6028/NIST.SP.800-30r1 diff --git a/doc/storage/about/releases b/doc/storage/about/releases new file mode 100644 index 00000000..9a07dc92 --- /dev/null +++ b/doc/storage/about/releases @@ -0,0 +1,45 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2019, 2022-2026 Arm Limited and/or its affiliates +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. release:: 1.0.0 + :date: June 2019 + :confidentiality: Non-confidential + + First stable release with 1.0 API finalized. + + Uses the common PSA Certified Status codes. + + Modified the API parameters to align with other PSA Certified APIs. + + Added storage flags to specify protection requirement. + +.. release:: 1.0.1 + :date: October 2022 + :confidentiality: Non-confidential + + Relicensed as open source under CC BY-SA 4.0. + + Documentation clarifications. + +.. release:: 1.0.2 + :date: March 2023 + :confidentiality: Non-confidential + + Documentation clarifications. + +.. release:: 1.0.3 + :date: January 2024 + :confidentiality: Non-confidential + + Provide a Security Risk Assessment. + +.. release:: 1.0.4 + :date: September 2025 + :confidentiality: Non-confidential + + GlobalPlatform governance of PSA Certified evaluation scheme. + +.. release-info:: + :extend: + + The detailed changes in each release are described in :secref:`document-history`. diff --git a/doc/storage/about/terms b/doc/storage/about/terms new file mode 100644 index 00000000..967ccfb3 --- /dev/null +++ b/doc/storage/about/terms @@ -0,0 +1,47 @@ +.. SPDX-FileCopyrightText: Copyright 2018-2019, 2022-2025 Arm Limited and/or its affiliates +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. term:: Application Root of Trust + :abbr: ARoT + + This is the security domain in which additional security services are implemented. See :cite-title:`PSM`. + +.. scterm:: Implementation Defined + + Behavior that is not defined by the this specification, but is defined and documented by individual implementations. + + Firmware developers can choose to depend on :sc:`IMPLEMENTATION DEFINED` behavior, but must be aware that their code might not be portable to another implementation. + +.. term:: Non-secure Processing Environment + :abbr: NSPE + + This is the security domain outside of the :term:`Secure Processing Environment`. It is the Application domain, typically containing the application firmware and hardware. + +.. term:: Platform Root of Trust + :abbr: PRoT + + The overall trust anchor for the system. This ensures the platform is securely booted and configured, and establishes the secure environments required to protect security services. See :cite-title:`PSM`. + +.. term:: Root of Trust + :abbr: RoT + + This is the minimal set of software, hardware and data that is implicitly trusted in the platform --- there is no software or hardware at a deeper level that can verify that the Root of Trust is authentic and unmodified. + +.. term:: Root of Trust Service + :abbr: RoT Service + + A set of related security operations that are provided by a :term:`Root of Trust`. + +.. term:: Secure Partition + + A processing context with protected runtime state within the :term:`Secure Processing Environment`. A secure partition may implement one or more :term:`RoT Service`\s, accessible via well-defined interfaces. + +.. term:: Secure Processing Environment + :abbr: SPE + + This is the security domain that includes the :term:`Platform Root of Trust` and the :term:`Application Root of Trust` domains. + +.. term:: Secure Partition Manager + :abbr: SPM + + Part of the :term:`Secure Processing Environment` that is responsible for allocating resources to :term:`Secure Partition`\s, managing the isolation and execution of software within partitions, and providing IPC between partitions. diff --git a/doc/storage/api/api.rst b/doc/storage/api/api.rst index 9093306b..c64873c5 100644 --- a/doc/storage/api/api.rst +++ b/doc/storage/api/api.rst @@ -9,7 +9,7 @@ Status codes The |API| uses the status code definitions that are shared with the other PSA Certified APIs. -The following elements are defined in :file:`psa/error.h` from :cite-title:`PSA-STAT` (previously defined in :cite:`PSA-FFM`): +The following elements are defined in :file:`psa/error.h` from :cite-title:`PSA STAT`: .. code-block:: xref diff --git a/doc/storage/appendix/history.rst b/doc/storage/appendix/history.rst index 5a0108be..c61b6c14 100644 --- a/doc/storage/appendix/history.rst +++ b/doc/storage/appendix/history.rst @@ -15,13 +15,19 @@ Document history - Release - Details + * - TBD + - *Draft GlobalPlatform publication revision* + - Migrated the document to the 2026 PSA Certified API template. + + This changes the document front matter structure and publication styling, without changing the API. + * - 2019-02-25 - *1.0 Beta 2* - First Release * - 2019-06-12 - *1.0 Rel* - - Final 1.0 API + - 1.0 API finalized The protected storage API now supports flags `PSA_STORAGE_FLAG_NO_CONFIDENTIALITY` and `PSA_STORAGE_FLAG_NO_REPLAY_PROTECTION`. diff --git a/doc/storage/appendix/sra.rst b/doc/storage/appendix/sra.rst index 44586caa..5342af1f 100644 --- a/doc/storage/appendix/sra.rst +++ b/doc/storage/appendix/sra.rst @@ -1,1220 +1,1220 @@ .. SPDX-FileCopyrightText: Copyright 2023-2024 Arm Limited and/or its affiliates -.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license - -.. _sra: - -Security Risk Assessment -======================== - -This appendix provides a Security Risk Assessment (SRA) of the |API| and of a generic implementation of storage. -It describes the threats presented by various types of adversaries against the security goals for an implementation of a secure storage service, and mitigating actions for those threats. - -* :secref:`sra-about` describes the assessment methodology. -* :secref:`sra-definition` defines the security problem. -* :secref:`sra-threats` describes the threats and the recommended mitigating actions. -* :secref:`sra-mitigations` summarizes the mitigations, and where these are implemented. - -.. _sra-about: - -About this assessment ---------------------- - -Subject and scope -^^^^^^^^^^^^^^^^^ - -This SRA analyses the security of the |API| itself, and of the conceptual architectures for storage, not of any specific implementation of the API, or any specific use of the API. -It does, however, divide implementations into four deployment models representing common implementation types, and looks at the different mitigations needed in each deployment model. - -In this SRA: - -* *Storage service* means the firmware implementing the |API|. -* *Storage medium* refers to the physical storage location. - -Risk assessment methodology -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Our risk ratings use an approach derived from :cite-title:`SP800-30`: for each Threat, we determine its Likelihood and the Impact. -Each is evaluated on a 5-level scale, as defined in :numref:`tab-sra-likelihood` and :numref:`tab-sra-impact`. - -.. list-table:: Likelihood levels - :name: tab-sra-likelihood - :header-rows: 1 - :stub-columns: 1 - :widths: 1 6 - - * - Level - - Definition - - * - Very Low - - Unlikely to ever occur in practice, or *mathematically near impossible* - * - Low - - The event could occur, but only if the attacker employs *significant* resources; or it is *mathematically unlikely* - * - Medium - - A motivated, and well-equipped adversary can make it happen within the lifetime of a product based on the feature (resp. of the feature itself) - * - High - - Likely to happen within the lifetime of the product or feature - * - Very High - - Will happen, and soon (for instance a zero-day) - -.. list-table:: Impact levels - :name: tab-sra-impact - :header-rows: 1 - :stub-columns: 1 - :widths: 1 3 3 - - * - Level - - Definition - - Example Effects - - * - Very Low - - Causes virtually no damage. - - Probably none. - * - Low - - The damage can easily be tolerated or absorbed. - - There would be a CVE at most. - * - Medium - - The damage will have a *noticeable* effect, such as *degrading* some functionality, but won't degrade completely the use of the considered functionality. - - There would be a CVE at most. - * - High - - The damage will have a *strong* effect, such as causing a significant reduction in its functionality or in its security guarantees. - - Security Analysts would discuss this at length, there would be papers, blog entries. - Partners would complain. - * - Very High - - The damage will have *critical* consequences --- it could kill the feature, by affecting several of its security guarantees. - - It would be quite an event. - - Partners would complain strongly, and delay or cancel deployment of the feature. - -For both Likelihood and Impact, when in doubt always choose the higher value. -These two values are combined using :numref:`tab-sra-overall-risk` to determine the Overall Risk of a Threat. - -.. csv-table:: Overall risk calculation - :name: tab-sra-overall-risk - :header-rows: 2 - :stub-columns: 1 - :align: right - - ,Impact,,,, - Likelihood, Very Low, Low, Medium, High, Very High - Very Low, Very Low, Very Low, Very Low, Low, Low - Low, Very Low, Very Low, Low, Low, Medium - Medium, Very Low, Low, Medium, Medium, High - High, (Very) Low, Low, Medium, High, Very High - Very High, (Very) Low, Medium, High, Very High, Very High - -Threats are handled starting from the most severe ones. -Mitigations will be devised for these Threats one by one (note that a Mitigation may mitigate more Threats, and one Threat may require the deployment of more than one Mitigation to be addressed). -Likelihood and Impact will be reassessed assuming that the Mitigations are in place, resulting in a Mitigated Likelihood (this is the value that usually decreases), a Mitigated Impact (it is less common that this value will decrease), and finally a Mitigated Risk. -The Analysis is completed when all the Mitigated Risks are at the chosen residual level or lower, which usually is Low or Very Low. - -The Mitigating actions that can be taken are defined in the acronym **CAST**: - -* **Control**: Put in place steps to reduce the Likelihood and/or Impact of a Threat, thereby reducing the risk to an acceptable level. -* **Accept**: The threat is considered to be of acceptable risk such that a mitigation is not necessary or must be accepted because of other constraint or market needs. -* **Suppress**: Remove the feature or process that gives rise to the threat. -* **Transfer**: Identify a more capable or suitable party to address the risk and transfer the responsibility of providing a mitigation for the threat to them. - -.. _sra-definition: - -Feature definition ------------------- - -Introduction -^^^^^^^^^^^^ - -Background -~~~~~~~~~~ - -:secref:`intro` provides the context in which the |API| is designed. - -Purpose -~~~~~~~ - -The |API| separates the software responsible for providing the security of the data from the caller. -The storage service calls on firmware that provides low level reads and writes of non-volatile storage medium and the access to any required bus. -The |API| is to provide a consistent interface, so that applications do not need to account for the different low-level implementations. - -This analysis does not address the engineering requirements to create a reliable storage medium from the underlying physical storage. -It is assumed that the implementation will use the standard techniques, error correcting codes, wear levelling and so on, to ensure the storage is reliable. - -Lifecycle -^^^^^^^^^ - -:numref:`fig-lifecycle` shows the typical lifecycle of a device. - -.. figure:: /figure/lifecycle.* - :name: fig-lifecycle - - Device lifecycle of a system providing storage - -The storage service, and the |API| are active during the operational phase, implemented within the boot-time and run-time software. - -Within a boot session, it is the responsibility of the secure boot firmware to: - -* Set up the isolation barriers between partitions. -* Provision the firmware implementing the storage service. -* Provision the credentials for authorizing the storage of data. -* Enable or disable debug facilities. - -This SRA only considers threats to the storage service in its operational phase. -The security of the boot process and of any data provisioning service are not considered in this SRA. - -Operation and trust boundaries -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -:numref:`fig-boundaries` shows all of the main components in the storage service. -Presenting the context in which the |API| operates aids understanding of the threats and security mitigations and provides justification for some of the aspects of the API design. - -.. figure:: /figure/callers.* - :name: fig-boundaries - - Trust boundaries of a system providing storage - -|API| is a C language API. -Therefore, any implementation of the API must execute, at least partially, within the context of the caller. -When an implementation includes a trust boundary, the mechanism and protocol for communication across the boundary is not defined by this specification. - -The operational dataflow diagram is reproduced for each of the deployment models. -Although the dataflow itself is common to the models, the placement of trust boundaries is different. - -It is helpful to visualize the effect of these differences on the threats against the dataflows. - - -Deployment models -^^^^^^^^^^^^^^^^^ - -:deployment-model:`PROTECTED` - The storage service and all physical storage is within the :term:`Platform Root of Trust` (:term:`PRoT`) partition. - The :term:`PRoT` partition has sole access to an area of non-volatile storage, thus that storage cannot be accessed by any other partition or any other means. - This means that the storage service, any driver code, the storage service and storage medium all reside with the :term:`PRoT` and are protected by the :term:`PRoT`'s isolation mechanisms as shown in :numref:`fig-protected`. - - .. figure:: /figure/dm-protected.* - :name: fig-protected - - Trust boundaries in the deployment model `DM.PROTECTED` - - The storage service is the arbitrator of access from different applications and manages all data accesses (write, update and deletion). - Therefore, the storage service is responsible for the `SG.CONFIDENTIALITY`, `SG.INTEGRITY` and `SG.CURRENCY` goals of each caller, including maintaining confidentiality between different callers. - - An example of this deployment model is the use of on-chip flash or OTP with an access control mechanism such as a Memory Protection Unit. - -:deployment-model:`EXPOSED` - The :term:`PRoT` partition does not have sole access to the area of non-volatile storage, thus the storage medium can be read or written by another partition or by other means. - This means that the driver code, or the storage medium resides outside the :term:`PRoT` and is accessible to other partitions or by other means, as shown in as shown in :numref:`fig-exposed`. - Therefore, attackers can bypass the storage service. - - .. figure:: /figure/dm-exposed.* - :name: fig-exposed - - Trust boundaries in the deployment model `DM.EXPOSED` - - The storage service is the arbitrator of access from different applications and manages accesses that write, update, and delete data. - Therefore, the storage service is responsible for the `SG.CONFIDENTIALITY`, `SG.INTEGRITY` and `SG.CURRENCY` goal with respect to preventing access by a different caller. - - The storage service cannot prevent other partitions or other means from reading or writing the storage, or accessing the link DF3. - Therefore, the storage service is responsible for the `SG.CONFIDENTIALITY`, `SG.INTEGRITY` and `SG.CURRENCY` goals. - - An example of this deployment model is the use of a file system on a flash chip. - - -:deployment-model:`AUTHORIZED` - There is a separate isolated storage medium that can only be accessed in response to an authenticated command and from which all replies include a means for verification of the response, as shown in :numref:`fig-authorized`. - The isolation guarantees that there is no access to the storage medium other than by using the authentication mechanism. - - .. figure:: /figure/dm-authorized.* - :name: fig-authorized - - Trust boundaries in the deployment model `DM.AUTHORIZED` - - The storage service is the arbitrator of access from different applications and manages those data accesses (write, update and deletion). - Therefore, the storage service is responsible for the `SG.CONFIDENTIALITY` goal with respect to preventing access by a different caller. - - The authorization and verification mechanism provided by the storage medium controls access to data (reads, writes and modification). - Therefore, the storage medium is responsible for the `SG.INTEGRITY` and `SG.CURRENCY` goals. - Attacks on these mechanisms are out of scope. - - However, the communication between the storage service and the storage medium is observable by other partitions and any other means as any data sent in plain text can be observed. - Therefore, the storage service is responsible for `SG.CONFIDENTIALITY`. - - The storage service and the storage medium are jointly responsible for protecting the assets required to authorize commands. - Attacks on the storage service that expose these assets are in scope. - - An example of this deployment model is the use of an RPMB memory block. - -:deployment-model:`SECURE_LINK` - There is a separate isolated storage medium that can only be accessed across a cryptographically protected secure channel as shown in :numref:`fig-external-secure`. - The secure channel protocol provides authentication, confidentiality and integrity of data in transit. - The isolation guarantees that there is no access to the storage medium other than by using this channel. - - .. figure:: /figure/dm-secure-link.* - :name: fig-external-secure - - Trust boundaries in the deployment model `DM.SECURE_LINK` - - The storage service is the arbitrator of access from different applications and manages those data accesses (write, update and deletion). - Therefore, the storage service is responsible for the `SG.CONFIDENTIALITY` goal with respect to preventing access by a different caller. - - The authorization and verification mechanism provided by the secure channel protocol controls access to data (reads, writes and modification). - Therefore, the storage medium is responsible for the `SG.INTEGRITY` and `SG.CURRENCY` goals. - Attacks on the storage medium are out of scope. - - The communication between the storage service and the storage medium is protected from observation by other partitions and other means as the data is sent in encrypted form over the secure channel. - Attacks on the secure channel protocol are out of scope. - - The storage service uses the secure channel protocol, the storage service and the storage medium are jointly responsible for protecting the assets required to set up the channel. - Attacks on the storage service that expose these assets are in scope. - - An example of this deployment model is the use of a Secure Element, or a secure flash device. - - -.. _isolation: - -Optional isolation -~~~~~~~~~~~~~~~~~~ - -Implementations can isolate the storage service from the caller and can further isolate multiple calling applications. -Various technologies can provide protection, for example: - -* Process isolation in an operating system. -* Partition isolation, either with a virtual machine or a partition manager. -* Physical separation between execution environments. - -The mechanism for identifying callers is beyond the scope of this specification. -An implementation that provides caller isolation must document the identification mechanism. -An implementation that provides caller isolation must document any implementation-specific extension of the API that enables callers to share data in any form. - -In summary, there are three types of implementation: - -* No isolation: there is no security boundary between the caller and the storage service. - For example, a statically or dynamically linked library is an implementation with no isolation. - As the caller is in the same security domain as the storage, the API cannot prevent access to the storage medium that does not go through the API. - -* Simple Isolation: A single security boundary separates the storage service from the callers, but there is no isolation between callers. - The only access to stored data is via the storage service, but the storage service cannot partition data between different callers. - -* Caller isolation: there are multiple caller instances, with a security boundary between the caller instances among themselves, as well as between the storage service and the caller instances. - For example, a storage service in a multiprocessor environment is an implementation with caller isolation. - The only access to the stored data is via the storage service and the storage service can partition stored data between the different callers. - -Assumptions, constraints, and interacting entities -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -This SRA makes the following assumptions about the |API| design: - -* The API does not provide arguments that identify the caller, because they can be spoofed easily, and cannot be relied upon. - It is assumed that the implementation of the API can determine the caller identity, where this is required. - See :secref:`isolation`. - -* The API does not prevent the use of mitigations that are required by an implementation of the API. - See :secref:`tab-sra-remediations`. - -* The :cite-title:`PSM` assumes that at least the code in the :term:`Root of Trust` partitions (:term:`PRoT` and :term:`ARoT`) are verified at boot, and on any update. - Therefore, it is assumed that this code is trustworthy. - If any malicious code can run in the RoT partitions, it has achieved full control. - -* For the purposes of this analysis, it is assumed that in deployment models `DM.AUTHORIZED` and `DM.SECURE_LINK`, there is no way to access the stored data without going through the authenticated channel. - That is, an attack that would expose the physical storage medium is beyond the resources of the attacker. - -* The analysis ignores attacks that only result in a denial of service. - There are many ways an attacker can deny service to the complete system, with or without involving the storage service. - -* The analysis only looks at an active attack. - However, data is also subject to accidental modification, for example from cosmic radiation causing a bit flip. - Therefore, standard engineering practice --- such as use of error correcting codes --- should be taken to protect data. - -Stakeholders and Assets -^^^^^^^^^^^^^^^^^^^^^^^ - -This analysis looks at the security from the point of view of the applications that call on the service to store data, and on the overall system. - -The following assets are considered in this assessment: - -Data to be stored - The purpose of a storage service is to securely store data for its callers. - -Caller Identities - To ensure that data stored for one caller is not revealed to a different caller, each caller must have a unique identity. - -Implementation Secrets - If in order to secure the data, the storage service uses encryption keys for confidentiality and integrity, these mut be considered assets of the storage service. - -Goals -^^^^^ - -:security-goal:`CONFIDENTIALITY` - An adversary is unable to disclose Stored Data that belongs to a different Stored Data Owner. - A legitimate owner can guarantee their data has not been exposed. - -:security-goal:`INTEGRITY` - An adversary is unable to modify Stored Data that belongs to a different Stored Data Owner, to a value that was not previously stored by the Stored Data Owner. - A legitimate owner can guarantee that data returned is a value they have stored. - -:security-goal:`CURRENCY` - An adversary is unable to modify Stored Data that belongs to a different Stored Data Owner. - The legitimate owner can guarantee that data returned is the most recent value that have stored. - -Adversarial models -^^^^^^^^^^^^^^^^^^ - -Adversarial models are descriptions of capabilities that adversaries of systems implementing the |API| can have, grouped into classes. -The adversaries are defined in this way to assist with threat modelling an abstract API, which can have different implementations, in systems with a wide range of security sensitivity. - -:adversarial-model:`0` - The Adversary is only capable of accessing data that requires neither physical access to a system containing an implementation of the feature nor the ability to run software on it. - This Adversary is intercepting or providing data or requests to the target system via a network or other remote connection. - - For instance, the Adversary can: - - * Read any input and output to the target through external apparatus. - * Provide, forge, replay or modify such inputs and outputs. - * Perform timings on the observable operations being done by the target, either in normal operation or as a response to crafted inputs. - For example, timing attacks on web servers. - -:adversarial-model:`1` - The Adversary can additionally mount attacks from software running on a target processor implementing the feature. - This type of Adversary can run software on the target. - - For instance, the Adversary can: - - * Attempt software exploitation by running software on the target. - * Exploit access to any memory mapped configuration, monitoring, debug register. - * Mount any side channel analysis that relying on software-exposed built-in hardware features to perform physical unit and time measurements. - * Perform software-induced glitching of resources such as Rowhammer, RASpberry or crashing the CPU by running intensive tasks. - -:adversarial-model:`2` - In addition to the above, the Adversary is capable of mounting hardware attacks and fault injection that does not require breaching the physical envelope of the chips. - This type of Adversary has access to a system containing an implementation of the target feature. - - For instance, the Adversary can: - - * Conduct side-channel analysis that requires measurement equipment. - For example, this can utilize leakage sources such as EM emissions, power consumption, photonics emission, or acoustic channels. - * Plug malicious hardware into an unmodified system. - * Gain access to the internals of the target system and interpose the SoC or memory for the purposes of reading, blocking, replaying, and injecting transactions. - * Replace or add chips on the motherboard. - * Make simple, reversible modifications, to perform glitching. - -:adversarial-model:`3` - In addition to all the above, the Adversary can perform invasive SoC attacks. - - For instance, the Adversary can: - - * Decapsulate a chip, via laser or chemical etching, followed by microphotography to reverse engineer the chip. - * Use a focused ion beam microscope to perform gate level modification. - -The adversarial models that are in scope depend on the product requirements. -To ensure that the |API| can be used in a wide range of systems, this assessment considers adversarial models `AM.0`, `AM.1`, and `AM.2` to be in-scope. - -Code in the RoT partitions is assumed to be trustworthy --- and any untrustworthy code running in :term:`PRoT` partitions already has complete control of the target --- therefore, in `AM.1` this SRA only considers threats from malicious actors running in :term:`Non-secure Processing Environment`. - -.. _sra-threats: - -Threats -------- - -Because |API| can be used in a wide range of deployment models and a wide range of threats, not all mitigating actions apply to all deployment models. -As a result, various mitigations are optional to implement, depending on which threats exist in a particular domain of application, and which deployment model is used. - -:numref:`tab-sra-threats` summarizes the threats. - -.. csv-table:: Summary of threats - :name: tab-sra-threats - :class: longtable - :align: left - :widths: 1 3 - :header-rows: 1 - - Threat, Description - `T.INTERFACE_ABUSE`, Call the API with illegal inputs - `T.SPOOF_READ`, Reading data for a different caller using the API - `T.SPOOF_WRITE`, Writing data for a different caller using the API - `T.EAVESDROPPING`, Accessing data in transit - `T.MITM`, A Man in the Middle can actively interfere with communication - `T.DIRECT_READ`, "Directly reading stored data, bypassing the API" - `T.DIRECT_WRITE`, "Directly modifying data, bypassing the API" - `T.REPLACE`, Physical replacement of the storage medium - `T.GLITCH_READ`, Glitching during a read - `T.GLITCH_WRITE`, Glitching during a write - -.. threat:: Illegal inputs to the API - :id: INTERFACE_ABUSE - - .. description:: - An attacker can abuse the |API|. - For example: - - * Passing out of range values to the interface to provoke unexpected behavior of the implementation. - * Passing invalid input or output buffers to the interface, that would cause the implementation to access non-existent memory, or memory that is inaccessible to the caller --- including accessing assets of the storage service. - - .. security-goal:: `SG.CONFIDENTIALITY`, `SG.INTEGRITY` - .. adversarial-model:: `AM.1` - - .. mitigations:: - :mitigation:`ValidateParameter`. - **Transfer** to the implementation: check all API parameters to lie within valid ranges, including memory access permissions. - - :mitigation:`MemoryBuffer`. - **Control** by API design: input buffers are fully consumed by the implementation before returning from a function. - An implementation must not access the caller's memory after a function has returned. - - .. unmitigated:: - :impact: VH - :likelihood: VH - - .. residual:: - :impact: VH - :likelihood: VL - - -.. threat:: Use the API to read another caller's data - :id: SPOOF_READ - - .. description:: - In all deployment models, an attacker attempts to read data stored for another caller using the |API|. - - The API does not require that the names used by caller for stored data are globally unique, only unique within that caller's namespace. - - .. mitigations:: - :mitigation:`ImplicitIdentity`. - **Control** by API design: caller identity is not provided by the caller to the API. - If caller identity is supplied by the caller in the API, the identity can be spoofed by another caller. - Using authentication credentials only moves the problem of storing secrets, but does not solve it. - - **Transfer** to the implementation: provide caller identities, to isolate data that belongs to different callers. - The assurance that the storage service can give is limited by the assurance that the implementation can give as to the identity of the caller. - - Where each user runs in a separate partition, the identity can be provided by the partition manager. - Where different users run within a single partition, **Transfer** the responsibility for separating users within that partition to the operating system or run time within that partition. - - :mitigation:`FullyQualifiedNames`. - **Transfer** to the implementation: use a fully-qualified data identifier, that is a combination of an owner identity and the item UID. - The implementation must used the owner identity to ensure that a data request to the storage service does not return data of the same UID, that was stored by a different caller. - - The storage service must also ensure that if a data item with the fully-qualified identifier does not exist, the implementation returns the correct error. - - .. security-goal:: :SG:`CONFIDENTIALITY` - - .. adversarial-model:: `AM.1` - - .. unmitigated:: - :impact: VH - :likelihood: VH - - .. residual:: - :impact: VH - :likelihood: VL - -.. threat:: Use the API to modify another caller's data - :id: SPOOF_WRITE - - .. description:: - In all deployment models, an attacker attempts to write data to a file belonging to another caller using the |API| or create a new file in a different caller's namespace. - - This threat is the counterpart to `T.SPOOF_READ` except that the attacker tries to write data rather than read. - It is therefore subject to the same analysis. - - .. mitigations:: `M.FullyQualifiedNames`, `M.ImplicitIdentity`. - - .. security-goal:: :SG:`CONFIDENTIALITY` - .. adversarial-model:: `AM.1` - - .. unmitigated:: - :impact: VH - :likelihood: VH - - .. residual:: - :impact: VH - :likelihood: VL - -.. threat:: Eavesdropping - :id: EAVESDROPPING - - .. description:: - An attacker accesses data in transit, either between the caller and the storage service, or between the storage service and the storage medium. - - In all deployment models, by the definition of an isolated partition in the :cite-title:`PSM`, transfer within the partition, and transfers between one :term:`Secure Partition` and another are isolated from eavesdroppers. - Therefore, if the caller is in a :term:`Secure Partition`, there is no possibility of an eavesdropper accessing the data. - However, if data is sent or returned to a caller in the :term:`Non-secure Processing Environment` (NSPE), although the data is securely delivered to the :term:`NSPE`, it is exposed to all users in the :term:`NSPE`. - As previously noted, the implementation **transfers** the duty of separating users in the :term:`NSPE` to the OS. - - For deployment model `DM.PROTECTED`, the storage service and the storage medium are isolated. - - In `DM.EXPOSED`, any adversary that can obtain operating system privileges in the :term:`NSPE` will have access to all the memory and will therefore be able to eavesdrop on all data in transit. - - An attacker that is external to the processor, `AM.2`, will be able to exploit an eavesdropping attack if the bus to which the memory is attached is accessible via external pins. - Otherwise, the attack is limited to internal attackers `AM.1`. - - In `DM.AUTHORIZED`, an attacker with access to the bus, or to intermediate data buffers, can eavesdrop and obtain the messages. - - In `DM.SECURE_LINK`, an attacker can only eavesdrop on any data transfer not protected by the secure channel. - - .. mitigations:: - :mitigation:`Encrypt`. - **Transfer** to the implementation: for `DM.EXPOSED` and `DM.AUTHORIZED`, the data at rest must be encrypted. - The storage service must apply the encryption to the data before it leaves the :term:`PRoT` partition. - The encryption mechanism chosen must be sufficiently robust. - The key used for encryption must be sufficiently protected, that is, it must only be available to the storage service. - - :mitigation:`PRoTRootedSecLink`. - **Transfer** to the implementation: for `DM.SECURE_LINK`, communication with the storage medium must be over a well-designed secure channel. - If the secure channel is not rooted in the :term:`PRoT` then any adversary in the partition (`AM.1`), or with access to the partition (`AM.2`), in which the channel terminates will be able to eavesdrop on traffic leaving the :term:`PRoT` before it is encrypted. - The secure channel must be rooted within the PRoT. - However, the stored data does not need to be separately encrypted beyond the protection provided by the secure channel. - The private information required to establish the channel must be suitably protected by both the storage service and the storage medium. - - :mitigation:`UseSecurePartitions`. - **Transfer** to the application: for all deployment models, place callers that handle sensitive data into separate partitions. - To ensure that an attacker in the :term:`NSPE` cannot access the data sent by the caller to the storage service, or the replies the storage service returns to the caller, place all code that needs to use the storage service into one or more :term:`Secure Partition`, with one partition per service. - - - .. security-goal:: :SG:`CONFIDENTIALITY` - - .. adversarial-model:: `AM.0`, `AM.1`, `AM.2` - - .. unmitigated:: DM.PROTECTED - :impact: VH - :likelihood: n/a --- except for transfer of data to clients in the :term:`NSPE` - :risk: n/a - - .. residual:: DM.PROTECTED - :impact: VH - :likelihood: n/a - :risk: n/a - - .. unmitigated:: DM.EXPOSED - :impact: VH - :likelihood: VH - - .. residual:: DM.EXPOSED - :impact: VH - :likelihood: VL - - .. unmitigated:: DM.AUTHORIZED - :impact: VH - :likelihood: H - - .. residual:: DM.AUTHORIZED - :impact: VH - :likelihood: VL - - .. unmitigated:: DM.SECURE_LINK - :impact: VH - :likelihood: H - - .. residual:: DM.SECURE_LINK - :impact: VH - :likelihood: VL - - -.. threat:: Man In The Middle - :id: MITM - - .. description:: - An attacker can actively interfere with communication and replace the transmitted data. - In this threat the SRA only considers attackers between the storage service and the storage medium. - An attacker interposing between the Caller and the storage service is considered under `T.SPOOF_READ` or `T.SPOOF_WRITE`. - - For `DM.PROTECTED`, the storage service and the storage medium are isolated. - - For `DM.EXPOSED`, any code running in the :term:`NSPE` has access to the storage medium and any driver firmware, and therefore can act as a man in the middle, by for example persuading the storage service to write to one buffer, and the storage medium to read from another. - - For `DM.AUTHORIZED`, a man in the middle eavesdrops on data in transit. - - For `DM.SECURE_LINK`, a naive secure channel is vulnerable to a man in the middle attack. - - .. mitigations:: - `M.Encrypt`. - **Transfer** to the implementation: if data is encrypted, a man in the middle cannot know what data is being transferred. - It also means they cannot force a specific value to be stored. - - :mitigation:`MAC`. - **Transfer** to the implementation: for `DM.EXPOSED`, apply a Message Authentication Code or a signature to the stored data, or use an authenticated encryption scheme. If the storage service checks the MAC or tag when data is read back from the storage medium to detect unauthorized modification. - - :mitigation:`UniqueKeys`. - **Transfer** to the implementation: for `DM.AUTHORIZED` and `DM.SECURE_LINK`, use unique keys for securing the authenticated or secure channel. - If the keys used by the storage medium are unique to each instance, as an attacker can only learn the key used on this specific instance. - They cannot construct a class break by discovering the key for every instance. - - :mitigation:`VerifyReplies`. - **Transfer** to the implementation: for `DM.AUTHORIZED`, commands and replies are authenticated by the storage medium. - Therefore, the man in the middle cannot forge a valid reply which indicates that the data has been stored when it has not. - If the storage service validates replies from the storage medium, it can verify that the data it sent was correctly stored, and the data retrieved is the value previously stored. - - :mitigation:`AuthenticateEndpoints`. - **Transfer** to the implementation: for `DM.SECURE_LINK`, use mutual authentication of the storage service and storage medium when setting up the secure channel. - For example, this can be achieved by using a single key, known only to both parties. - - :mitigation:`ReplayProtection`. - **Transfer** to the implementation: for `DM.AUTHORIZED` and `DM.SECURE_LINK`, use replay protection in the communication protocol. - This can be achieved by including a nonce in the construction of protocol messages. - This enables the storage medium to detect attempts to replay previous commands and reject them. - - .. security-goal:: :SG:`INTEGRITY` - .. adversarial-model:: `AM.1`, `AM.2` - - .. unmitigated:: DM.PROTECTED - :impact: VH - :likelihood: n/a - :risk: n/a - - .. residual:: DM.PROTECTED - :impact: VH - :likelihood: n/a - :risk: n/a - - .. unmitigated:: DM.EXPOSED - :impact: VH - :likelihood: VH - - .. residual:: DM.EXPOSED - :impact: VH - :likelihood: VL - - .. unmitigated:: DM.AUTHORIZED - :impact: VH - :likelihood: H - - .. residual:: DM.AUTHORIZED - :impact: H - :likelihood: VL - - .. unmitigated:: DM.SECURE_LINK - :impact: H - :likelihood: H - - .. residual:: DM.SECURE_LINK - :impact: H - :likelihood: VL - - -.. threat:: Bypassing the API to directly read data - :id: DIRECT_READ - - .. description:: - An attacker might be able to read stored data through a mechanism other than the API. - - In `DM.PROTECTED`, no attacker should be able to access the stored data. - - In `DM.EXPOSED`, all attackers can access the data. - - In `DM.AUTHORIZED`, the attacker cannot form valid requests to access data. - It can, however, eavesdrop on a legitimate request and replay it later. - - In `DM.SECURE_LINK`, the attacker cannot form valid requests to access data. - It can, however, eavesdrop on a legitimate request and even if it cannot understand it, it could replay it later. - - .. adversarial-model:: `AM.1`, `AM.2` - - .. security-goal:: :SG:`CONFIDENTIALITY` - - .. mitigations:: - `M.ReplayProtection`. - **Transfer** to the implementation: for `DM.AUTHORIZED` and `DM.SECURE_LINK`, use replay protection in the communication protocol. - - `M.Encrypt`. - **Transfer** to the implementation: for `DM.EXPOSED` and `DM.AUTHORIZED`, encrypting the data prevents disclosure. - - .. unmitigated:: DM.PROTECTED - :impact: VH - :likelihood: n/a - :risk: n/a - - .. residual:: DM.PROTECTED - :impact: VH - :likelihood: n/a - :risk: n/a - - .. unmitigated:: DM.EXPOSED - :impact: VH - :likelihood: VH - - .. residual:: DM.EXPOSED - :impact: VH - :likelihood: VL - - .. unmitigated:: DM.AUTHORIZED - :impact: VH - :likelihood: H - - .. residual:: DM.AUTHORIZED - :impact: H - :likelihood: VL - - .. unmitigated:: DM.SECURE_LINK - :impact: H - :likelihood: H - - .. residual:: DM.SECURE_LINK - :impact: H - :likelihood: VL - - - -.. threat:: Bypassing the API to directly modify data - :id: DIRECT_WRITE - - .. description:: An attacker might be able to modify data stored for another caller. - - In `DM.PROTECTED`, no attacker should be able to access the stored data. - - In `DM.EXPOSED`, the SRA assumes that any attacker capable of running code in the :term:`NSPE` can modify the stored data. - However, assuming it is encrypted, the attacker cannot create the correct ciphertext for chosen plain text. - - In `DM.AUTHORIZED`, although the attacker cannot form a valid command, the attacker can eavesdrop on a legitimate request and replay it later. - - In `DM.SECURE_LINK`, although the attacker cannot form a valid command, the attacker can eavesdrop on a legitimate request and replay it later. - - - .. adversarial-model:: `AM.1` `AM.2` - - .. security-goal:: `SG.INTEGRITY`, `SG.CURRENCY` - - .. mitigations:: - `M.Encrypt`. - **Transfer** to the implementation: encrypted data cannot be modified to an attacker-chosen plaintext value. - However, an attacker can still corrupt the stored data. - - `M.MAC`. - **Transfer** to the implementation: for `DM.EXPOSED`, integrity-protect the stored data using a MAC, signature, or AEAD scheme. - The verification of data integrity must be implemented within the storage service in the :term:`PRoT`, otherwise the result could be spoofed. - - `M.ReplayProtection`. - **Transfer** to the implementation: for `DM.AUTHORIZED` and `DM.SECURE_LINK`, if the channel protocol includes replay protection, the storage medium will check the nonce for freshness, and prevent replay of old messages. - - :mitigation:`AntiRollback`. - **Transfer** to the implementation: in `DM.EXPOSED`, `M.MAC` is insufficient to prevent an attacker from replacing one version of stored data --- or the entire contents of the storage medium --- with a previously stored version. - The previously stored data would pass the integrity checks. - - To prevent this attack, the storage service must keep some authentication data in a location the attacker cannot access. - This location could be stored within the :term:`PRoT` partition, that is using the `DM.PROTECTED`, or in a separate secure enclave using the deployment model `DM.AUTHORIZED` or `DM.SECURE_LINK`. - The data could be the root of a hash tree, or it could be a counter used with a root key to generate a version-specific MAC key. - - In the case of a counter, some consideration should be given to the expected number of updates that will be made to the data. - If the implementation only needs to offer rollback protection on firmware updates, where a low number is expected in the lifetime of the product and the counter could be stored in fuse. - If the implementations needs to ensure the currency of a file store that is regularly updated --- the number of updates could exhaust any practical number of fuses and would instead need a 32-bit counter. - - - .. unmitigated:: DM.PROTECTED - :impact: VH - :likelihood: n/a - :risk: n/a - - .. residual:: DM.PROTECTED - :impact: VH - :likelihood: n/a - :risk: n/a - - .. unmitigated:: DM.EXPOSED - :impact: VH - :likelihood: VH - - .. residual:: DM.EXPOSED - :impact: VH - :likelihood: VL - - .. unmitigated:: DM.AUTHORIZED - :impact: VH - :likelihood: H - - .. residual:: DM.AUTHORIZED - :impact: H - :likelihood: VL - - .. unmitigated:: DM.SECURE_LINK - :impact: H - :likelihood: H - - .. residual:: DM.SECURE_LINK - :impact: H - :likelihood: VL - - -.. threat:: Physical replacement of the storage medium - :id: REPLACE - - .. description:: An attacker might physically replace the storage medium. - - For `DM.PROTECTED`, it is not possible to replace the storage. - - For `DM.EXPOSED`, if the storage medium is integrated with the chip, it is not possible to replace the storage. - But in many systems, the storage medium will be on a separate device. - - For `DM.AUTHORIZED` and `DM.SECURE_LINK`, it is possible to replace the storage medium. - - .. adversarial-model:: `AM.3` - - .. security-goal:: `SG.INTEGRITY` - - .. unmitigated:: DM.PROTECTED - :impact: VH - :likelihood: n/a - :risk: n/a - - .. residual:: DM.PROTECTED - :impact: VH - :likelihood: n/a - :risk: n/a - - .. unmitigated:: DM.EXPOSED - :impact: VH - :likelihood: VH - - .. residual:: DM.EXPOSED - :impact: VH - :likelihood: VL - - .. unmitigated:: DM.AUTHORIZED - :impact: VH - :likelihood: H - - .. residual:: DM.AUTHORIZED - :impact: H - :likelihood: VL - - .. unmitigated:: DM.SECURE_LINK - :impact: VH - :likelihood: H - - .. residual:: DM.SECURE_LINK - :impact: H - :likelihood: VL - - .. mitigations:: - `M.UniqueKeys` and `M.MAC`. - **Transfer** to the implementation: for `DM.EXPOSED`, use device-specific secret keys to authenticate the stored data. - With unique authentication keys, data stored on one device cannot be verified on another device. - - `M.UniqueKeys` and `M.VerifyReplies`. - **Transfer** to the implementation: for `DM.AUTHORIZED` and `DM.SECURE_LINK`, use device-specific secret keys to authenticate the communication between the storage service and storage medium. - - In `DM.AUTHORIZED`, the attacker will not be able to find a new instance of the storage medium that can form the correct responses to commands. - - In `DM.SECURE_LINK`, the attacker will not be able to find a new instance of the storage medium that can complete the handshake to set up the secure channel. - -.. threat:: Glitching during a read - :id: GLITCH_READ - - .. description:: An attacker with physical access might be able to disrupt the power or clock to cause a misread. - - In this threat, an attacker with physical access to the device causes a power or frequency glitch to cause a misread. - In particular, it might prevent the storage service from performing the verification of replies or causing it to ignore the result of any check. - Thus, causing the storage service to return an incorrect value to the caller. - - .. adversarial-model:: `AM.3` - - .. security-goal:: `SG.INTEGRITY` - - .. unmitigated:: DM.PROTECTED - :impact: VH - :likelihood: H - - .. residual:: DM.PROTECTED - :impact: VH - :likelihood: L - - .. unmitigated:: DM.EXPOSED - :impact: VH - :likelihood: H - - .. residual:: DM.EXPOSED - :impact: VH - :likelihood: VL - - .. unmitigated:: DM.AUTHORIZED - :impact: VH - :likelihood: L - - .. residual:: DM.AUTHORIZED - :impact: VH - :likelihood: VL - - .. unmitigated:: DM.SECURE_LINK - :impact: VH - :likelihood: L - - .. residual:: DM.SECURE_LINK - :impact: VH - :likelihood: VL - - .. mitigations:: - :mitigation:`GlitchDetection`. - **Transfer** to the implementation: for all deployment models, active glitch detection circuits can raise an exception if a glitch is detected, permitting the computing circuitry to take corrective action. - - -.. threat:: Glitching during a write - :id: GLITCH_WRITE - - .. description:: An attacker with physical access might be able to disrupt the power or clock to prevent a write from being completed. - - In this threat, an attacker with physical access to the device causes a power or frequency glitch to cause a write to fail. - - .. adversarial-model:: `AM.3` - - .. security-goal:: `SG.INTEGRITY` - - .. unmitigated:: DM.PROTECTED - :impact: VH - :likelihood: H - - .. residual:: DM.PROTECTED - :impact: VH - :likelihood: L - - .. unmitigated:: DM.EXPOSED - :impact: VH - :likelihood: H - - .. residual:: DM.EXPOSED - :impact: VH - :likelihood: VL - - .. unmitigated:: DM.AUTHORIZED - :impact: VH - :likelihood: H - - .. residual:: DM.AUTHORIZED - :impact: H - :likelihood: VL - - .. unmitigated:: DM.SECURE_LINK - :impact: VH - :likelihood: H - - .. residual:: DM.SECURE_LINK - :impact: H - :likelihood: VL - - .. mitigations:: - `M.MAC`. - **Transfer** to the implementation: - - * For `DM.PROTECTED` and `DM.EXPOSED`, if the implementation applies a MAC, a subsequent read can detect that data had not been written correctly. - However, MAC's are not error correcting, therefore the implementation can only mark the data as corrupt and the data is lost. - - * For `DM.AUTHORIZED` and `DM.SECURE_LINK`, if the implementation relies on the channel to provide the MAC or tag, there is a brief time of check, time of use (TOCTOU) window, where the storage medium has verified the command but has not written the data to physical storage. - If a glitch occurs in this window, and then a subsequent read occurs, the storage medium will apply a new tag to a reply containing corrupt data, and the storage service will not be aware that that data returned has been corrupted. - However, if the storage service applies a MAC before submitting the command, it can detect, but not correct, this corruption. - - :mitigation:`ErrorCorrectingCoding`. - **Transfer** to the implementation: for all deployment models, if the storage medium uses error correcting codes (ECC), it can detect and correct a certain number of incorrect bits in the data it reads back --- at the expense of extra storage. - If the storage medium does not offer ECC capability, the storage service could apply it and verify the coding in software, although this is generally less efficient than hardware. - - `M.GlitchDetection`. - **Transfer** to the implementation: for all deployment models, glitch detection can reduce the risk of a successful glitch. - - :mitigation:`ReadAfterWrite`. - **Transfer** to the implementation: for all deployment models, perform a checked-read after a write in the storage service. - The storage service can perform a read operation immediately after a write, while it still retains the original value in memory, and compare the two before reporting a successful write. - However, this has performance challenges: therefore, the implementation can decide to do this on a sampling basis. - - -.. _sra-mitigations: - -Mitigation Summary ------------------- - -This section provides a summary of the mitigations described in the threat analysis, organized by the entity responsible for providing the mitigation. - -Architecture level mitigations -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -:numref:`tab-sra-architecture` lists the mitigations that are controlled by the architecture. - -.. list-table:: Mitigations that are **controlled** by the Architecture - :name: tab-sra-architecture - :widths: 1 2 1 - :header-rows: 1 - :class: longtable - - * - Mitigations - - Description - - Threats - - * - `M.MemoryBuffer` - - In all deployment models, input buffers are fully consumed by the implementation before returning from a function. - - `T.INTERFACE_ABUSE` - -Implementation-level mitigations -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -:numref:`tab-sra-remediations` lists the mitigations that are transferred to the implementation. -These are also known as 'remediations'. - -.. list-table:: Mitigations that are **transferred** to the implementation - :name: tab-sra-remediations - :widths: 1 2 1 - :header-rows: 1 - :class: longtable - - * - Mitigations - - Description - - Threats - - * - `M.AntiRollback` - - When using `DM.EXPOSED`, the implementation must provide a mechanism to prevent an attacker from replacing the stored data with a version that was valid at a previous date. - An attacker can use this attack to reinstate flawed firmware, or to return to a version with a broken credential. - - `T.DIRECT_WRITE` - - * - `M.AuthenticateEndpoints` - - When using `DM.AUTHORIZED` or `DM.SECURE_LINK`, the storage service must authenticate the storage medium before reading from it or writing to it. - - `T.MITM` - - * - `M.Encrypt` - - When using `DM.EXPOSED` or `DM.AUTHORIZED`, the storage service must encrypt data to be written to storage, and decrypt data read from storage, inside the isolated environment to ensure confidentiality. - - `T.EAVESDROPPING`, `T.MITM`, `T.DIRECT_READ`, `T.DIRECT_WRITE` - - * - `M.ErrorCorrectingCoding` - - In all deployments, to deter attacks based on glitching the power or clock, the implementation can implement error correcting coding on stored data. - - `T.GLITCH_WRITE` - - * - `M.FullyQualifiedNames` - - In all deployments, the implementation must identify which caller each stored object belongs to and must refer to them internally by the combination of caller identity and name. - Otherwise, it might return a stored object to the wrong caller. - - `T.SPOOF_READ`, `T.SPOOF_WRITE` - - * - `M.ImplicitIdentity` - - In all deployments, the implementation must identify the caller. - - `T.SPOOF_READ`, `T.SPOOF_WRITE` - - * - `M.GlitchDetection` - - In all deployments, to deter attacks based on glitching the power or clock, the implementation can implement detection circuits. - - `T.GLITCH_READ`, `T.GLITCH_WRITE` - - * - `M.MAC` - - In `DM.EXPOSED`, the storage service must apply an integrity check, a MAC, signature, or authenticated encryption tag, within the storage service before it is sent to storage. - It must also verify this on every read. - - `T.MITM`, `T.DIRECT_WRITE`, `T.REPLACE` - - * - `M.PRoTRootedSecLink` - - In `DM.SECURE_LINK`, the storage service must use a secure channel rooted within the isolated environment to ensure there is no opportunity for eavesdropping. - - `T.EAVESDROPPING` - - * - `M.ReadAfterWrite` - - To deter glitch attacks on writing data, the implementation can read the data it has just written to verify it. - - `T.GLITCH_WRITE` - - * - `M.ReplayProtection` - - In `DM.AUTHORIZED` and `DM.SECURE_LINK` there must be protection against an attacker replaying previous messages. - - `T.DIRECT_READ`, `T.DIRECT_WRITE` - - * - `M.UniqueKeys` - - In `DM.AUTHORIZED` and `DM.SECURE_LINK` the keys used by the storage service and storage medium must be unique, otherwise there is no mechanism for detecting that the storage medium has been replaced. - - `T.MITM`, `T.REPLACE` - - * - `M.ValidateParameter` - - In all deployment models, check all API parameters to lie within valid ranges, including memory access permissions. - - `T.INTERFACE_ABUSE` - - * - `M.VerifyReplies` - - In `DM.AUTHORIZED` and `DM.SECURE_LINK` the storage service must verify all replies from the partition that implements storage, to ensure that they do indeed come from the expected partition and no errors are reported. - - `T.MITM`, `T.REPLACE` - - -User-level mitigations -^^^^^^^^^^^^^^^^^^^^^^ - -:numref:`tab-sra-residual-risk` lists mitigations that are transferred to the application or other external components. -These are also known as 'residual risks'. - -.. list-table:: Mitigations that are **transferred** to the application - :name: tab-sra-residual-risk - :widths: 1 2 1 - :header-rows: 1 - :class: longtable - - - * - Mitigations - - Description - - Threats - - * - `M.UseSecurePartitions` - - In all deployments, if the caller wants to be certain that there is no chance of eavesdropping, they should make use of caller isolation, with each caller in its own isolated partition. - - `T.EAVESDROPPING` - -Mitigations required by each deployment model -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -:numref:`tab-sra-api-mitigations` summarizes the mitigations required in each deployment model. - -.. list-table:: Mitigations required by each deployment model - :name: tab-sra-api-mitigations - :widths: 1 3 - :header-rows: 1 - :class: longtable - - * - Implementation - - Mitigations - - - * - `DM.PROTECTED` - - `M.ErrorCorrectingCoding`, - `M.FullyQualifiedNames`, - `M.GlitchDetection`, - `M.ImplicitIdentity`, - `M.MemoryBuffer`, - `M.ReadAfterWrite`, - `M.UseSecurePartitions`, - `M.ValidateParameter` - - * - `DM.EXPOSED` - - `M.AntiRollback`, - `M.Encrypt`, - `M.ErrorCorrectingCoding`, - `M.FullyQualifiedNames`, - `M.GlitchDetection`, - `M.ImplicitIdentity`, - `M.MAC`, - `M.MemoryBuffer`, - `M.ReadAfterWrite`, - `M.UseSecurePartitions`, - `M.ValidateParameter` - - * - `DM.AUTHORIZED` - - `M.AuthenticateEndpoints`, - `M.ErrorCorrectingCoding`, - `M.FullyQualifiedNames`, - `M.GlitchDetection`, - `M.ImplicitIdentity`, - `M.MemoryBuffer`, - `M.ReadAfterWrite`, - `M.ReplayProtection`, - `M.UniqueKeys`, - `M.UseSecurePartitions`, - `M.VerifyReplies`, - `M.ValidateParameter` - - * - `DM.SECURE_LINK` - - `M.AuthenticateEndpoints`, - `M.ErrorCorrectingCoding`, - `M.FullyQualifiedNames`, - `M.GlitchDetection`, - `M.ImplicitIdentity`, - `M.MemoryBuffer`, - `M.PRoTRootedSecLink`, - `M.ReadAfterWrite`, - `M.ReplayProtection`, - `M.UniqueKeys`, - `M.UseSecurePartitions`, - `M.VerifyReplies`, - `M.ValidateParameter` - - -In implementations `DM.PROTECTED` and `DM.SECURE_LINK`, the stored data can be implicitly trusted, and therefore it is not required to be encrypted or authenticated. -There is no more secure location to store verification data, therefore, any attacker able to access the stored data would also be able to access the key. -However, it is possible for the data to be accidentally corrupted, therefore standard engineering practice to guard against this, for example the use of error correcting codes, should be used. - -In implementation `DM.EXPOSED`, the data can be read or modified by an attacker, therefore the storage service must provide confidentiality, integrity, and authenticity by cryptographic means. -The keys used to do this must be stored securely. -This could be a key derived from the HUK, or separately stored in fuse in a location only readable from the :term:`PRoT`. - -As the attacker can always read and modify the stored data, even if they cannot decrypt the data, they can attempt to subvert a change by resetting the storage medium to a prior state. -To detect this, the storage service needs to have some means of authenticating that it is reading the most recent state. -This implies some form of authentication data stored in a location the attacker cannot modify. - -In implementation `DM.AUTHORIZED`, the data can be observed, even if it cannot be modified. -Therefore, data stored does need to be encrypted for confidentiality. -However, provided the authentication protocol is strong, and prevents replay, it should not be possible for an attacker to modify the stored data. -As the store applies a MAC to each reply, the storage service does not need to apply extra integrity. - -In implementation `DM.SECURE_LINK` provided the secure channel is rooted within the :term:`PRoT`, the data transferred cannot be observed, and any modification will be detected. -Therefore, no further encryption is needed for confidentiality or integrity. +.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license + +.. _sra: + +Security Risk Assessment +======================== + +This appendix provides a Security Risk Assessment (SRA) of the |API| and of a generic implementation of storage. +It describes the threats presented by various types of adversaries against the security goals for an implementation of a secure storage service, and mitigating actions for those threats. + +* :secref:`sra-about` describes the assessment methodology. +* :secref:`sra-definition` defines the security problem. +* :secref:`sra-threats` describes the threats and the recommended mitigating actions. +* :secref:`sra-mitigations` summarizes the mitigations, and where these are implemented. + +.. _sra-about: + +About this assessment +--------------------- + +Subject and scope +^^^^^^^^^^^^^^^^^ + +This SRA analyses the security of the |API| itself, and of the conceptual architectures for storage, not of any specific implementation of the API, or any specific use of the API. +It does, however, divide implementations into four deployment models representing common implementation types, and looks at the different mitigations needed in each deployment model. + +In this SRA: + +* *Storage service* means the firmware implementing the |API|. +* *Storage medium* refers to the physical storage location. + +Risk assessment methodology +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Our risk ratings use an approach derived from :cite-title:`SP800-30`: for each Threat, we determine its Likelihood and the Impact. +Each is evaluated on a 5-level scale, as defined in :numref:`tab-sra-likelihood` and :numref:`tab-sra-impact`. + +.. list-table:: Likelihood levels + :name: tab-sra-likelihood + :header-rows: 1 + :stub-columns: 1 + :widths: 1 6 + + * - Level + - Definition + + * - Very Low + - Unlikely to ever occur in practice, or *mathematically near impossible* + * - Low + - The event could occur, but only if the attacker employs *significant* resources; or it is *mathematically unlikely* + * - Medium + - A motivated, and well-equipped adversary can make it happen within the lifetime of a product based on the feature (resp. of the feature itself) + * - High + - Likely to happen within the lifetime of the product or feature + * - Very High + - Will happen, and soon (for instance a zero-day) + +.. list-table:: Impact levels + :name: tab-sra-impact + :header-rows: 1 + :stub-columns: 1 + :widths: 1 3 3 + + * - Level + - Definition + - Example Effects + + * - Very Low + - Causes virtually no damage. + - Probably none. + * - Low + - The damage can easily be tolerated or absorbed. + - There would be a CVE at most. + * - Medium + - The damage will have a *noticeable* effect, such as *degrading* some functionality, but won't degrade completely the use of the considered functionality. + - There would be a CVE at most. + * - High + - The damage will have a *strong* effect, such as causing a significant reduction in its functionality or in its security guarantees. + - Security Analysts would discuss this at length, there would be papers, blog entries. + Partners would complain. + * - Very High + - The damage will have *critical* consequences --- it could kill the feature, by affecting several of its security guarantees. + - It would be quite an event. + + Partners would complain strongly, and delay or cancel deployment of the feature. + +For both Likelihood and Impact, when in doubt always choose the higher value. +These two values are combined using :numref:`tab-sra-overall-risk` to determine the Overall Risk of a Threat. + +.. csv-table:: Overall risk calculation + :name: tab-sra-overall-risk + :header-rows: 2 + :stub-columns: 1 + :align: right + + ,Impact,,,, + Likelihood, Very Low, Low, Medium, High, Very High + Very Low, Very Low, Very Low, Very Low, Low, Low + Low, Very Low, Very Low, Low, Low, Medium + Medium, Very Low, Low, Medium, Medium, High + High, (Very) Low, Low, Medium, High, Very High + Very High, (Very) Low, Medium, High, Very High, Very High + +Threats are handled starting from the most severe ones. +Mitigations will be devised for these Threats one by one (note that a Mitigation may mitigate more Threats, and one Threat may require the deployment of more than one Mitigation to be addressed). +Likelihood and Impact will be reassessed assuming that the Mitigations are in place, resulting in a Mitigated Likelihood (this is the value that usually decreases), a Mitigated Impact (it is less common that this value will decrease), and finally a Mitigated Risk. +The Analysis is completed when all the Mitigated Risks are at the chosen residual level or lower, which usually is Low or Very Low. + +The Mitigating actions that can be taken are defined in the acronym **CAST**: + +* **Control**: Put in place steps to reduce the Likelihood and/or Impact of a Threat, thereby reducing the risk to an acceptable level. +* **Accept**: The threat is considered to be of acceptable risk such that a mitigation is not necessary or must be accepted because of other constraint or market needs. +* **Suppress**: Remove the feature or process that gives rise to the threat. +* **Transfer**: Identify a more capable or suitable party to address the risk and transfer the responsibility of providing a mitigation for the threat to them. + +.. _sra-definition: + +Feature definition +------------------ + +Introduction +^^^^^^^^^^^^ + +Background +~~~~~~~~~~ + +:secref:`introduction` provides the context in which the |API| is designed. + +Purpose +~~~~~~~ + +The |API| separates the software responsible for providing the security of the data from the caller. +The storage service calls on firmware that provides low level reads and writes of non-volatile storage medium and the access to any required bus. +The |API| is to provide a consistent interface, so that applications do not need to account for the different low-level implementations. + +This analysis does not address the engineering requirements to create a reliable storage medium from the underlying physical storage. +It is assumed that the implementation will use the standard techniques, error correcting codes, wear levelling and so on, to ensure the storage is reliable. + +Lifecycle +^^^^^^^^^ + +:numref:`fig-lifecycle` shows the typical lifecycle of a device. + +.. figure:: /figure/lifecycle.* + :name: fig-lifecycle + + Device lifecycle of a system providing storage + +The storage service, and the |API| are active during the operational phase, implemented within the boot-time and run-time software. + +Within a boot session, it is the responsibility of the secure boot firmware to: + +* Set up the isolation barriers between partitions. +* Provision the firmware implementing the storage service. +* Provision the credentials for authorizing the storage of data. +* Enable or disable debug facilities. + +This SRA only considers threats to the storage service in its operational phase. +The security of the boot process and of any data provisioning service are not considered in this SRA. + +Operation and trust boundaries +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:numref:`fig-boundaries` shows all of the main components in the storage service. +Presenting the context in which the |API| operates aids understanding of the threats and security mitigations and provides justification for some of the aspects of the API design. + +.. figure:: /figure/callers.* + :name: fig-boundaries + + Trust boundaries of a system providing storage + +|API| is a C language API. +Therefore, any implementation of the API must execute, at least partially, within the context of the caller. +When an implementation includes a trust boundary, the mechanism and protocol for communication across the boundary is not defined by this specification. + +The operational dataflow diagram is reproduced for each of the deployment models. +Although the dataflow itself is common to the models, the placement of trust boundaries is different. + +It is helpful to visualize the effect of these differences on the threats against the dataflows. + + +Deployment models +^^^^^^^^^^^^^^^^^ + +:deployment-model:`PROTECTED` + The storage service and all physical storage is within the :term:`Platform Root of Trust` (:term:`PRoT`) partition. + The :term:`PRoT` partition has sole access to an area of non-volatile storage, thus that storage cannot be accessed by any other partition or any other means. + This means that the storage service, any driver code, the storage service and storage medium all reside with the :term:`PRoT` and are protected by the :term:`PRoT`'s isolation mechanisms as shown in :numref:`fig-protected`. + + .. figure:: /figure/dm-protected.* + :name: fig-protected + + Trust boundaries in the deployment model `DM.PROTECTED` + + The storage service is the arbitrator of access from different applications and manages all data accesses (write, update and deletion). + Therefore, the storage service is responsible for the `SG.CONFIDENTIALITY`, `SG.INTEGRITY` and `SG.CURRENCY` goals of each caller, including maintaining confidentiality between different callers. + + An example of this deployment model is the use of on-chip flash or OTP with an access control mechanism such as a Memory Protection Unit. + +:deployment-model:`EXPOSED` + The :term:`PRoT` partition does not have sole access to the area of non-volatile storage, thus the storage medium can be read or written by another partition or by other means. + This means that the driver code, or the storage medium resides outside the :term:`PRoT` and is accessible to other partitions or by other means, as shown in as shown in :numref:`fig-exposed`. + Therefore, attackers can bypass the storage service. + + .. figure:: /figure/dm-exposed.* + :name: fig-exposed + + Trust boundaries in the deployment model `DM.EXPOSED` + + The storage service is the arbitrator of access from different applications and manages accesses that write, update, and delete data. + Therefore, the storage service is responsible for the `SG.CONFIDENTIALITY`, `SG.INTEGRITY` and `SG.CURRENCY` goal with respect to preventing access by a different caller. + + The storage service cannot prevent other partitions or other means from reading or writing the storage, or accessing the link DF3. + Therefore, the storage service is responsible for the `SG.CONFIDENTIALITY`, `SG.INTEGRITY` and `SG.CURRENCY` goals. + + An example of this deployment model is the use of a file system on a flash chip. + + +:deployment-model:`AUTHORIZED` + There is a separate isolated storage medium that can only be accessed in response to an authenticated command and from which all replies include a means for verification of the response, as shown in :numref:`fig-authorized`. + The isolation guarantees that there is no access to the storage medium other than by using the authentication mechanism. + + .. figure:: /figure/dm-authorized.* + :name: fig-authorized + + Trust boundaries in the deployment model `DM.AUTHORIZED` + + The storage service is the arbitrator of access from different applications and manages those data accesses (write, update and deletion). + Therefore, the storage service is responsible for the `SG.CONFIDENTIALITY` goal with respect to preventing access by a different caller. + + The authorization and verification mechanism provided by the storage medium controls access to data (reads, writes and modification). + Therefore, the storage medium is responsible for the `SG.INTEGRITY` and `SG.CURRENCY` goals. + Attacks on these mechanisms are out of scope. + + However, the communication between the storage service and the storage medium is observable by other partitions and any other means as any data sent in plain text can be observed. + Therefore, the storage service is responsible for `SG.CONFIDENTIALITY`. + + The storage service and the storage medium are jointly responsible for protecting the assets required to authorize commands. + Attacks on the storage service that expose these assets are in scope. + + An example of this deployment model is the use of an RPMB memory block. + +:deployment-model:`SECURE_LINK` + There is a separate isolated storage medium that can only be accessed across a cryptographically protected secure channel as shown in :numref:`fig-external-secure`. + The secure channel protocol provides authentication, confidentiality and integrity of data in transit. + The isolation guarantees that there is no access to the storage medium other than by using this channel. + + .. figure:: /figure/dm-secure-link.* + :name: fig-external-secure + + Trust boundaries in the deployment model `DM.SECURE_LINK` + + The storage service is the arbitrator of access from different applications and manages those data accesses (write, update and deletion). + Therefore, the storage service is responsible for the `SG.CONFIDENTIALITY` goal with respect to preventing access by a different caller. + + The authorization and verification mechanism provided by the secure channel protocol controls access to data (reads, writes and modification). + Therefore, the storage medium is responsible for the `SG.INTEGRITY` and `SG.CURRENCY` goals. + Attacks on the storage medium are out of scope. + + The communication between the storage service and the storage medium is protected from observation by other partitions and other means as the data is sent in encrypted form over the secure channel. + Attacks on the secure channel protocol are out of scope. + + The storage service uses the secure channel protocol, the storage service and the storage medium are jointly responsible for protecting the assets required to set up the channel. + Attacks on the storage service that expose these assets are in scope. + + An example of this deployment model is the use of a Secure Element, or a secure flash device. + + +.. _isolation: + +Optional isolation +~~~~~~~~~~~~~~~~~~ + +Implementations can isolate the storage service from the caller and can further isolate multiple calling applications. +Various technologies can provide protection, for example: + +* Process isolation in an operating system. +* Partition isolation, either with a virtual machine or a partition manager. +* Physical separation between execution environments. + +The mechanism for identifying callers is beyond the scope of this specification. +An implementation that provides caller isolation must document the identification mechanism. +An implementation that provides caller isolation must document any implementation-specific extension of the API that enables callers to share data in any form. + +In summary, there are three types of implementation: + +* No isolation: there is no security boundary between the caller and the storage service. + For example, a statically or dynamically linked library is an implementation with no isolation. + As the caller is in the same security domain as the storage, the API cannot prevent access to the storage medium that does not go through the API. + +* Simple Isolation: A single security boundary separates the storage service from the callers, but there is no isolation between callers. + The only access to stored data is via the storage service, but the storage service cannot partition data between different callers. + +* Caller isolation: there are multiple caller instances, with a security boundary between the caller instances among themselves, as well as between the storage service and the caller instances. + For example, a storage service in a multiprocessor environment is an implementation with caller isolation. + The only access to the stored data is via the storage service and the storage service can partition stored data between the different callers. + +Assumptions, constraints, and interacting entities +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This SRA makes the following assumptions about the |API| design: + +* The API does not provide arguments that identify the caller, because they can be spoofed easily, and cannot be relied upon. + It is assumed that the implementation of the API can determine the caller identity, where this is required. + See :secref:`isolation`. + +* The API does not prevent the use of mitigations that are required by an implementation of the API. + See :secref:`tab-sra-remediations`. + +* The :cite-title:`PSM` assumes that at least the code in the :term:`Root of Trust` partitions (:term:`PRoT` and :term:`ARoT`) are verified at boot, and on any update. + Therefore, it is assumed that this code is trustworthy. + If any malicious code can run in the RoT partitions, it has achieved full control. + +* For the purposes of this analysis, it is assumed that in deployment models `DM.AUTHORIZED` and `DM.SECURE_LINK`, there is no way to access the stored data without going through the authenticated channel. + That is, an attack that would expose the physical storage medium is beyond the resources of the attacker. + +* The analysis ignores attacks that only result in a denial of service. + There are many ways an attacker can deny service to the complete system, with or without involving the storage service. + +* The analysis only looks at an active attack. + However, data is also subject to accidental modification, for example from cosmic radiation causing a bit flip. + Therefore, standard engineering practice --- such as use of error correcting codes --- should be taken to protect data. + +Stakeholders and Assets +^^^^^^^^^^^^^^^^^^^^^^^ + +This analysis looks at the security from the point of view of the applications that call on the service to store data, and on the overall system. + +The following assets are considered in this assessment: + +Data to be stored + The purpose of a storage service is to securely store data for its callers. + +Caller Identities + To ensure that data stored for one caller is not revealed to a different caller, each caller must have a unique identity. + +Implementation Secrets + If in order to secure the data, the storage service uses encryption keys for confidentiality and integrity, these mut be considered assets of the storage service. + +Goals +^^^^^ + +:security-goal:`CONFIDENTIALITY` + An adversary is unable to disclose Stored Data that belongs to a different Stored Data Owner. + A legitimate owner can guarantee their data has not been exposed. + +:security-goal:`INTEGRITY` + An adversary is unable to modify Stored Data that belongs to a different Stored Data Owner, to a value that was not previously stored by the Stored Data Owner. + A legitimate owner can guarantee that data returned is a value they have stored. + +:security-goal:`CURRENCY` + An adversary is unable to modify Stored Data that belongs to a different Stored Data Owner. + The legitimate owner can guarantee that data returned is the most recent value that have stored. + +Adversarial models +^^^^^^^^^^^^^^^^^^ + +Adversarial models are descriptions of capabilities that adversaries of systems implementing the |API| can have, grouped into classes. +The adversaries are defined in this way to assist with threat modelling an abstract API, which can have different implementations, in systems with a wide range of security sensitivity. + +:adversarial-model:`0` + The Adversary is only capable of accessing data that requires neither physical access to a system containing an implementation of the feature nor the ability to run software on it. + This Adversary is intercepting or providing data or requests to the target system via a network or other remote connection. + + For instance, the Adversary can: + + * Read any input and output to the target through external apparatus. + * Provide, forge, replay or modify such inputs and outputs. + * Perform timings on the observable operations being done by the target, either in normal operation or as a response to crafted inputs. + For example, timing attacks on web servers. + +:adversarial-model:`1` + The Adversary can additionally mount attacks from software running on a target processor implementing the feature. + This type of Adversary can run software on the target. + + For instance, the Adversary can: + + * Attempt software exploitation by running software on the target. + * Exploit access to any memory mapped configuration, monitoring, debug register. + * Mount any side channel analysis that relying on software-exposed built-in hardware features to perform physical unit and time measurements. + * Perform software-induced glitching of resources such as Rowhammer, RASpberry or crashing the CPU by running intensive tasks. + +:adversarial-model:`2` + In addition to the above, the Adversary is capable of mounting hardware attacks and fault injection that does not require breaching the physical envelope of the chips. + This type of Adversary has access to a system containing an implementation of the target feature. + + For instance, the Adversary can: + + * Conduct side-channel analysis that requires measurement equipment. + For example, this can utilize leakage sources such as EM emissions, power consumption, photonics emission, or acoustic channels. + * Plug malicious hardware into an unmodified system. + * Gain access to the internals of the target system and interpose the SoC or memory for the purposes of reading, blocking, replaying, and injecting transactions. + * Replace or add chips on the motherboard. + * Make simple, reversible modifications, to perform glitching. + +:adversarial-model:`3` + In addition to all the above, the Adversary can perform invasive SoC attacks. + + For instance, the Adversary can: + + * Decapsulate a chip, via laser or chemical etching, followed by microphotography to reverse engineer the chip. + * Use a focused ion beam microscope to perform gate level modification. + +The adversarial models that are in scope depend on the product requirements. +To ensure that the |API| can be used in a wide range of systems, this assessment considers adversarial models `AM.0`, `AM.1`, and `AM.2` to be in-scope. + +Code in the RoT partitions is assumed to be trustworthy --- and any untrustworthy code running in :term:`PRoT` partitions already has complete control of the target --- therefore, in `AM.1` this SRA only considers threats from malicious actors running in :term:`Non-secure Processing Environment`. + +.. _sra-threats: + +Threats +------- + +Because |API| can be used in a wide range of deployment models and a wide range of threats, not all mitigating actions apply to all deployment models. +As a result, various mitigations are optional to implement, depending on which threats exist in a particular domain of application, and which deployment model is used. + +:numref:`tab-sra-threats` summarizes the threats. + +.. csv-table:: Summary of threats + :name: tab-sra-threats + :class: longtable + :align: left + :widths: 1 3 + :header-rows: 1 + + Threat, Description + `T.INTERFACE_ABUSE`, Call the API with illegal inputs + `T.SPOOF_READ`, Reading data for a different caller using the API + `T.SPOOF_WRITE`, Writing data for a different caller using the API + `T.EAVESDROPPING`, Accessing data in transit + `T.MITM`, A Man in the Middle can actively interfere with communication + `T.DIRECT_READ`, "Directly reading stored data, bypassing the API" + `T.DIRECT_WRITE`, "Directly modifying data, bypassing the API" + `T.REPLACE`, Physical replacement of the storage medium + `T.GLITCH_READ`, Glitching during a read + `T.GLITCH_WRITE`, Glitching during a write + +.. threat:: Illegal inputs to the API + :id: INTERFACE_ABUSE + + .. description:: + An attacker can abuse the |API|. + For example: + + * Passing out of range values to the interface to provoke unexpected behavior of the implementation. + * Passing invalid input or output buffers to the interface, that would cause the implementation to access non-existent memory, or memory that is inaccessible to the caller --- including accessing assets of the storage service. + + .. security-goal:: `SG.CONFIDENTIALITY`, `SG.INTEGRITY` + .. adversarial-model:: `AM.1` + + .. mitigations:: + :mitigation:`ValidateParameter`. + **Transfer** to the implementation: check all API parameters to lie within valid ranges, including memory access permissions. + + :mitigation:`MemoryBuffer`. + **Control** by API design: input buffers are fully consumed by the implementation before returning from a function. + An implementation must not access the caller's memory after a function has returned. + + .. unmitigated:: + :impact: VH + :likelihood: VH + + .. residual:: + :impact: VH + :likelihood: VL + + +.. threat:: Use the API to read another caller's data + :id: SPOOF_READ + + .. description:: + In all deployment models, an attacker attempts to read data stored for another caller using the |API|. + + The API does not require that the names used by caller for stored data are globally unique, only unique within that caller's namespace. + + .. mitigations:: + :mitigation:`ImplicitIdentity`. + **Control** by API design: caller identity is not provided by the caller to the API. + If caller identity is supplied by the caller in the API, the identity can be spoofed by another caller. + Using authentication credentials only moves the problem of storing secrets, but does not solve it. + + **Transfer** to the implementation: provide caller identities, to isolate data that belongs to different callers. + The assurance that the storage service can give is limited by the assurance that the implementation can give as to the identity of the caller. + + Where each user runs in a separate partition, the identity can be provided by the partition manager. + Where different users run within a single partition, **Transfer** the responsibility for separating users within that partition to the operating system or run time within that partition. + + :mitigation:`FullyQualifiedNames`. + **Transfer** to the implementation: use a fully-qualified data identifier, that is a combination of an owner identity and the item UID. + The implementation must used the owner identity to ensure that a data request to the storage service does not return data of the same UID, that was stored by a different caller. + + The storage service must also ensure that if a data item with the fully-qualified identifier does not exist, the implementation returns the correct error. + + .. security-goal:: :SG:`CONFIDENTIALITY` + + .. adversarial-model:: `AM.1` + + .. unmitigated:: + :impact: VH + :likelihood: VH + + .. residual:: + :impact: VH + :likelihood: VL + +.. threat:: Use the API to modify another caller's data + :id: SPOOF_WRITE + + .. description:: + In all deployment models, an attacker attempts to write data to a file belonging to another caller using the |API| or create a new file in a different caller's namespace. + + This threat is the counterpart to `T.SPOOF_READ` except that the attacker tries to write data rather than read. + It is therefore subject to the same analysis. + + .. mitigations:: `M.FullyQualifiedNames`, `M.ImplicitIdentity`. + + .. security-goal:: :SG:`CONFIDENTIALITY` + .. adversarial-model:: `AM.1` + + .. unmitigated:: + :impact: VH + :likelihood: VH + + .. residual:: + :impact: VH + :likelihood: VL + +.. threat:: Eavesdropping + :id: EAVESDROPPING + + .. description:: + An attacker accesses data in transit, either between the caller and the storage service, or between the storage service and the storage medium. + + In all deployment models, by the definition of an isolated partition in the :cite-title:`PSM`, transfer within the partition, and transfers between one :term:`Secure Partition` and another are isolated from eavesdroppers. + Therefore, if the caller is in a :term:`Secure Partition`, there is no possibility of an eavesdropper accessing the data. + However, if data is sent or returned to a caller in the :term:`Non-secure Processing Environment` (NSPE), although the data is securely delivered to the :term:`NSPE`, it is exposed to all users in the :term:`NSPE`. + As previously noted, the implementation **transfers** the duty of separating users in the :term:`NSPE` to the OS. + + For deployment model `DM.PROTECTED`, the storage service and the storage medium are isolated. + + In `DM.EXPOSED`, any adversary that can obtain operating system privileges in the :term:`NSPE` will have access to all the memory and will therefore be able to eavesdrop on all data in transit. + + An attacker that is external to the processor, `AM.2`, will be able to exploit an eavesdropping attack if the bus to which the memory is attached is accessible via external pins. + Otherwise, the attack is limited to internal attackers `AM.1`. + + In `DM.AUTHORIZED`, an attacker with access to the bus, or to intermediate data buffers, can eavesdrop and obtain the messages. + + In `DM.SECURE_LINK`, an attacker can only eavesdrop on any data transfer not protected by the secure channel. + + .. mitigations:: + :mitigation:`Encrypt`. + **Transfer** to the implementation: for `DM.EXPOSED` and `DM.AUTHORIZED`, the data at rest must be encrypted. + The storage service must apply the encryption to the data before it leaves the :term:`PRoT` partition. + The encryption mechanism chosen must be sufficiently robust. + The key used for encryption must be sufficiently protected, that is, it must only be available to the storage service. + + :mitigation:`PRoTRootedSecLink`. + **Transfer** to the implementation: for `DM.SECURE_LINK`, communication with the storage medium must be over a well-designed secure channel. + If the secure channel is not rooted in the :term:`PRoT` then any adversary in the partition (`AM.1`), or with access to the partition (`AM.2`), in which the channel terminates will be able to eavesdrop on traffic leaving the :term:`PRoT` before it is encrypted. + The secure channel must be rooted within the PRoT. + However, the stored data does not need to be separately encrypted beyond the protection provided by the secure channel. + The private information required to establish the channel must be suitably protected by both the storage service and the storage medium. + + :mitigation:`UseSecurePartitions`. + **Transfer** to the application: for all deployment models, place callers that handle sensitive data into separate partitions. + To ensure that an attacker in the :term:`NSPE` cannot access the data sent by the caller to the storage service, or the replies the storage service returns to the caller, place all code that needs to use the storage service into one or more :term:`Secure Partition`, with one partition per service. + + + .. security-goal:: :SG:`CONFIDENTIALITY` + + .. adversarial-model:: `AM.0`, `AM.1`, `AM.2` + + .. unmitigated:: DM.PROTECTED + :impact: VH + :likelihood: n/a --- except for transfer of data to clients in the :term:`NSPE` + :risk: n/a + + .. residual:: DM.PROTECTED + :impact: VH + :likelihood: n/a + :risk: n/a + + .. unmitigated:: DM.EXPOSED + :impact: VH + :likelihood: VH + + .. residual:: DM.EXPOSED + :impact: VH + :likelihood: VL + + .. unmitigated:: DM.AUTHORIZED + :impact: VH + :likelihood: H + + .. residual:: DM.AUTHORIZED + :impact: VH + :likelihood: VL + + .. unmitigated:: DM.SECURE_LINK + :impact: VH + :likelihood: H + + .. residual:: DM.SECURE_LINK + :impact: VH + :likelihood: VL + + +.. threat:: Man In The Middle + :id: MITM + + .. description:: + An attacker can actively interfere with communication and replace the transmitted data. + In this threat the SRA only considers attackers between the storage service and the storage medium. + An attacker interposing between the Caller and the storage service is considered under `T.SPOOF_READ` or `T.SPOOF_WRITE`. + + For `DM.PROTECTED`, the storage service and the storage medium are isolated. + + For `DM.EXPOSED`, any code running in the :term:`NSPE` has access to the storage medium and any driver firmware, and therefore can act as a man in the middle, by for example persuading the storage service to write to one buffer, and the storage medium to read from another. + + For `DM.AUTHORIZED`, a man in the middle eavesdrops on data in transit. + + For `DM.SECURE_LINK`, a naive secure channel is vulnerable to a man in the middle attack. + + .. mitigations:: + `M.Encrypt`. + **Transfer** to the implementation: if data is encrypted, a man in the middle cannot know what data is being transferred. + It also means they cannot force a specific value to be stored. + + :mitigation:`MAC`. + **Transfer** to the implementation: for `DM.EXPOSED`, apply a Message Authentication Code or a signature to the stored data, or use an authenticated encryption scheme. If the storage service checks the MAC or tag when data is read back from the storage medium to detect unauthorized modification. + + :mitigation:`UniqueKeys`. + **Transfer** to the implementation: for `DM.AUTHORIZED` and `DM.SECURE_LINK`, use unique keys for securing the authenticated or secure channel. + If the keys used by the storage medium are unique to each instance, as an attacker can only learn the key used on this specific instance. + They cannot construct a class break by discovering the key for every instance. + + :mitigation:`VerifyReplies`. + **Transfer** to the implementation: for `DM.AUTHORIZED`, commands and replies are authenticated by the storage medium. + Therefore, the man in the middle cannot forge a valid reply which indicates that the data has been stored when it has not. + If the storage service validates replies from the storage medium, it can verify that the data it sent was correctly stored, and the data retrieved is the value previously stored. + + :mitigation:`AuthenticateEndpoints`. + **Transfer** to the implementation: for `DM.SECURE_LINK`, use mutual authentication of the storage service and storage medium when setting up the secure channel. + For example, this can be achieved by using a single key, known only to both parties. + + :mitigation:`ReplayProtection`. + **Transfer** to the implementation: for `DM.AUTHORIZED` and `DM.SECURE_LINK`, use replay protection in the communication protocol. + This can be achieved by including a nonce in the construction of protocol messages. + This enables the storage medium to detect attempts to replay previous commands and reject them. + + .. security-goal:: :SG:`INTEGRITY` + .. adversarial-model:: `AM.1`, `AM.2` + + .. unmitigated:: DM.PROTECTED + :impact: VH + :likelihood: n/a + :risk: n/a + + .. residual:: DM.PROTECTED + :impact: VH + :likelihood: n/a + :risk: n/a + + .. unmitigated:: DM.EXPOSED + :impact: VH + :likelihood: VH + + .. residual:: DM.EXPOSED + :impact: VH + :likelihood: VL + + .. unmitigated:: DM.AUTHORIZED + :impact: VH + :likelihood: H + + .. residual:: DM.AUTHORIZED + :impact: H + :likelihood: VL + + .. unmitigated:: DM.SECURE_LINK + :impact: H + :likelihood: H + + .. residual:: DM.SECURE_LINK + :impact: H + :likelihood: VL + + +.. threat:: Bypassing the API to directly read data + :id: DIRECT_READ + + .. description:: + An attacker might be able to read stored data through a mechanism other than the API. + + In `DM.PROTECTED`, no attacker should be able to access the stored data. + + In `DM.EXPOSED`, all attackers can access the data. + + In `DM.AUTHORIZED`, the attacker cannot form valid requests to access data. + It can, however, eavesdrop on a legitimate request and replay it later. + + In `DM.SECURE_LINK`, the attacker cannot form valid requests to access data. + It can, however, eavesdrop on a legitimate request and even if it cannot understand it, it could replay it later. + + .. adversarial-model:: `AM.1`, `AM.2` + + .. security-goal:: :SG:`CONFIDENTIALITY` + + .. mitigations:: + `M.ReplayProtection`. + **Transfer** to the implementation: for `DM.AUTHORIZED` and `DM.SECURE_LINK`, use replay protection in the communication protocol. + + `M.Encrypt`. + **Transfer** to the implementation: for `DM.EXPOSED` and `DM.AUTHORIZED`, encrypting the data prevents disclosure. + + .. unmitigated:: DM.PROTECTED + :impact: VH + :likelihood: n/a + :risk: n/a + + .. residual:: DM.PROTECTED + :impact: VH + :likelihood: n/a + :risk: n/a + + .. unmitigated:: DM.EXPOSED + :impact: VH + :likelihood: VH + + .. residual:: DM.EXPOSED + :impact: VH + :likelihood: VL + + .. unmitigated:: DM.AUTHORIZED + :impact: VH + :likelihood: H + + .. residual:: DM.AUTHORIZED + :impact: H + :likelihood: VL + + .. unmitigated:: DM.SECURE_LINK + :impact: H + :likelihood: H + + .. residual:: DM.SECURE_LINK + :impact: H + :likelihood: VL + + + +.. threat:: Bypassing the API to directly modify data + :id: DIRECT_WRITE + + .. description:: An attacker might be able to modify data stored for another caller. + + In `DM.PROTECTED`, no attacker should be able to access the stored data. + + In `DM.EXPOSED`, the SRA assumes that any attacker capable of running code in the :term:`NSPE` can modify the stored data. + However, assuming it is encrypted, the attacker cannot create the correct ciphertext for chosen plain text. + + In `DM.AUTHORIZED`, although the attacker cannot form a valid command, the attacker can eavesdrop on a legitimate request and replay it later. + + In `DM.SECURE_LINK`, although the attacker cannot form a valid command, the attacker can eavesdrop on a legitimate request and replay it later. + + + .. adversarial-model:: `AM.1` `AM.2` + + .. security-goal:: `SG.INTEGRITY`, `SG.CURRENCY` + + .. mitigations:: + `M.Encrypt`. + **Transfer** to the implementation: encrypted data cannot be modified to an attacker-chosen plaintext value. + However, an attacker can still corrupt the stored data. + + `M.MAC`. + **Transfer** to the implementation: for `DM.EXPOSED`, integrity-protect the stored data using a MAC, signature, or AEAD scheme. + The verification of data integrity must be implemented within the storage service in the :term:`PRoT`, otherwise the result could be spoofed. + + `M.ReplayProtection`. + **Transfer** to the implementation: for `DM.AUTHORIZED` and `DM.SECURE_LINK`, if the channel protocol includes replay protection, the storage medium will check the nonce for freshness, and prevent replay of old messages. + + :mitigation:`AntiRollback`. + **Transfer** to the implementation: in `DM.EXPOSED`, `M.MAC` is insufficient to prevent an attacker from replacing one version of stored data --- or the entire contents of the storage medium --- with a previously stored version. + The previously stored data would pass the integrity checks. + + To prevent this attack, the storage service must keep some authentication data in a location the attacker cannot access. + This location could be stored within the :term:`PRoT` partition, that is using the `DM.PROTECTED`, or in a separate secure enclave using the deployment model `DM.AUTHORIZED` or `DM.SECURE_LINK`. + The data could be the root of a hash tree, or it could be a counter used with a root key to generate a version-specific MAC key. + + In the case of a counter, some consideration should be given to the expected number of updates that will be made to the data. + If the implementation only needs to offer rollback protection on firmware updates, where a low number is expected in the lifetime of the product and the counter could be stored in fuse. + If the implementations needs to ensure the currency of a file store that is regularly updated --- the number of updates could exhaust any practical number of fuses and would instead need a 32-bit counter. + + + .. unmitigated:: DM.PROTECTED + :impact: VH + :likelihood: n/a + :risk: n/a + + .. residual:: DM.PROTECTED + :impact: VH + :likelihood: n/a + :risk: n/a + + .. unmitigated:: DM.EXPOSED + :impact: VH + :likelihood: VH + + .. residual:: DM.EXPOSED + :impact: VH + :likelihood: VL + + .. unmitigated:: DM.AUTHORIZED + :impact: VH + :likelihood: H + + .. residual:: DM.AUTHORIZED + :impact: H + :likelihood: VL + + .. unmitigated:: DM.SECURE_LINK + :impact: H + :likelihood: H + + .. residual:: DM.SECURE_LINK + :impact: H + :likelihood: VL + + +.. threat:: Physical replacement of the storage medium + :id: REPLACE + + .. description:: An attacker might physically replace the storage medium. + + For `DM.PROTECTED`, it is not possible to replace the storage. + + For `DM.EXPOSED`, if the storage medium is integrated with the chip, it is not possible to replace the storage. + But in many systems, the storage medium will be on a separate device. + + For `DM.AUTHORIZED` and `DM.SECURE_LINK`, it is possible to replace the storage medium. + + .. adversarial-model:: `AM.3` + + .. security-goal:: `SG.INTEGRITY` + + .. unmitigated:: DM.PROTECTED + :impact: VH + :likelihood: n/a + :risk: n/a + + .. residual:: DM.PROTECTED + :impact: VH + :likelihood: n/a + :risk: n/a + + .. unmitigated:: DM.EXPOSED + :impact: VH + :likelihood: VH + + .. residual:: DM.EXPOSED + :impact: VH + :likelihood: VL + + .. unmitigated:: DM.AUTHORIZED + :impact: VH + :likelihood: H + + .. residual:: DM.AUTHORIZED + :impact: H + :likelihood: VL + + .. unmitigated:: DM.SECURE_LINK + :impact: VH + :likelihood: H + + .. residual:: DM.SECURE_LINK + :impact: H + :likelihood: VL + + .. mitigations:: + `M.UniqueKeys` and `M.MAC`. + **Transfer** to the implementation: for `DM.EXPOSED`, use device-specific secret keys to authenticate the stored data. + With unique authentication keys, data stored on one device cannot be verified on another device. + + `M.UniqueKeys` and `M.VerifyReplies`. + **Transfer** to the implementation: for `DM.AUTHORIZED` and `DM.SECURE_LINK`, use device-specific secret keys to authenticate the communication between the storage service and storage medium. + + In `DM.AUTHORIZED`, the attacker will not be able to find a new instance of the storage medium that can form the correct responses to commands. + + In `DM.SECURE_LINK`, the attacker will not be able to find a new instance of the storage medium that can complete the handshake to set up the secure channel. + +.. threat:: Glitching during a read + :id: GLITCH_READ + + .. description:: An attacker with physical access might be able to disrupt the power or clock to cause a misread. + + In this threat, an attacker with physical access to the device causes a power or frequency glitch to cause a misread. + In particular, it might prevent the storage service from performing the verification of replies or causing it to ignore the result of any check. + Thus, causing the storage service to return an incorrect value to the caller. + + .. adversarial-model:: `AM.3` + + .. security-goal:: `SG.INTEGRITY` + + .. unmitigated:: DM.PROTECTED + :impact: VH + :likelihood: H + + .. residual:: DM.PROTECTED + :impact: VH + :likelihood: L + + .. unmitigated:: DM.EXPOSED + :impact: VH + :likelihood: H + + .. residual:: DM.EXPOSED + :impact: VH + :likelihood: VL + + .. unmitigated:: DM.AUTHORIZED + :impact: VH + :likelihood: L + + .. residual:: DM.AUTHORIZED + :impact: VH + :likelihood: VL + + .. unmitigated:: DM.SECURE_LINK + :impact: VH + :likelihood: L + + .. residual:: DM.SECURE_LINK + :impact: VH + :likelihood: VL + + .. mitigations:: + :mitigation:`GlitchDetection`. + **Transfer** to the implementation: for all deployment models, active glitch detection circuits can raise an exception if a glitch is detected, permitting the computing circuitry to take corrective action. + + +.. threat:: Glitching during a write + :id: GLITCH_WRITE + + .. description:: An attacker with physical access might be able to disrupt the power or clock to prevent a write from being completed. + + In this threat, an attacker with physical access to the device causes a power or frequency glitch to cause a write to fail. + + .. adversarial-model:: `AM.3` + + .. security-goal:: `SG.INTEGRITY` + + .. unmitigated:: DM.PROTECTED + :impact: VH + :likelihood: H + + .. residual:: DM.PROTECTED + :impact: VH + :likelihood: L + + .. unmitigated:: DM.EXPOSED + :impact: VH + :likelihood: H + + .. residual:: DM.EXPOSED + :impact: VH + :likelihood: VL + + .. unmitigated:: DM.AUTHORIZED + :impact: VH + :likelihood: H + + .. residual:: DM.AUTHORIZED + :impact: H + :likelihood: VL + + .. unmitigated:: DM.SECURE_LINK + :impact: VH + :likelihood: H + + .. residual:: DM.SECURE_LINK + :impact: H + :likelihood: VL + + .. mitigations:: + `M.MAC`. + **Transfer** to the implementation: + + * For `DM.PROTECTED` and `DM.EXPOSED`, if the implementation applies a MAC, a subsequent read can detect that data had not been written correctly. + However, MAC's are not error correcting, therefore the implementation can only mark the data as corrupt and the data is lost. + + * For `DM.AUTHORIZED` and `DM.SECURE_LINK`, if the implementation relies on the channel to provide the MAC or tag, there is a brief time of check, time of use (TOCTOU) window, where the storage medium has verified the command but has not written the data to physical storage. + If a glitch occurs in this window, and then a subsequent read occurs, the storage medium will apply a new tag to a reply containing corrupt data, and the storage service will not be aware that that data returned has been corrupted. + However, if the storage service applies a MAC before submitting the command, it can detect, but not correct, this corruption. + + :mitigation:`ErrorCorrectingCoding`. + **Transfer** to the implementation: for all deployment models, if the storage medium uses error correcting codes (ECC), it can detect and correct a certain number of incorrect bits in the data it reads back --- at the expense of extra storage. + If the storage medium does not offer ECC capability, the storage service could apply it and verify the coding in software, although this is generally less efficient than hardware. + + `M.GlitchDetection`. + **Transfer** to the implementation: for all deployment models, glitch detection can reduce the risk of a successful glitch. + + :mitigation:`ReadAfterWrite`. + **Transfer** to the implementation: for all deployment models, perform a checked-read after a write in the storage service. + The storage service can perform a read operation immediately after a write, while it still retains the original value in memory, and compare the two before reporting a successful write. + However, this has performance challenges: therefore, the implementation can decide to do this on a sampling basis. + + +.. _sra-mitigations: + +Mitigation Summary +------------------ + +This section provides a summary of the mitigations described in the threat analysis, organized by the entity responsible for providing the mitigation. + +Architecture level mitigations +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:numref:`tab-sra-architecture` lists the mitigations that are controlled by the architecture. + +.. list-table:: Mitigations that are **controlled** by the Architecture + :name: tab-sra-architecture + :widths: 1 2 1 + :header-rows: 1 + :class: longtable + + * - Mitigations + - Description + - Threats + + * - `M.MemoryBuffer` + - In all deployment models, input buffers are fully consumed by the implementation before returning from a function. + - `T.INTERFACE_ABUSE` + +Implementation-level mitigations +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:numref:`tab-sra-remediations` lists the mitigations that are transferred to the implementation. +These are also known as 'remediations'. + +.. list-table:: Mitigations that are **transferred** to the implementation + :name: tab-sra-remediations + :widths: 1 2 1 + :header-rows: 1 + :class: longtable + + * - Mitigations + - Description + - Threats + + * - `M.AntiRollback` + - When using `DM.EXPOSED`, the implementation must provide a mechanism to prevent an attacker from replacing the stored data with a version that was valid at a previous date. + An attacker can use this attack to reinstate flawed firmware, or to return to a version with a broken credential. + - `T.DIRECT_WRITE` + + * - `M.AuthenticateEndpoints` + - When using `DM.AUTHORIZED` or `DM.SECURE_LINK`, the storage service must authenticate the storage medium before reading from it or writing to it. + - `T.MITM` + + * - `M.Encrypt` + - When using `DM.EXPOSED` or `DM.AUTHORIZED`, the storage service must encrypt data to be written to storage, and decrypt data read from storage, inside the isolated environment to ensure confidentiality. + - `T.EAVESDROPPING`, `T.MITM`, `T.DIRECT_READ`, `T.DIRECT_WRITE` + + * - `M.ErrorCorrectingCoding` + - In all deployments, to deter attacks based on glitching the power or clock, the implementation can implement error correcting coding on stored data. + - `T.GLITCH_WRITE` + + * - `M.FullyQualifiedNames` + - In all deployments, the implementation must identify which caller each stored object belongs to and must refer to them internally by the combination of caller identity and name. + Otherwise, it might return a stored object to the wrong caller. + - `T.SPOOF_READ`, `T.SPOOF_WRITE` + + * - `M.ImplicitIdentity` + - In all deployments, the implementation must identify the caller. + - `T.SPOOF_READ`, `T.SPOOF_WRITE` + + * - `M.GlitchDetection` + - In all deployments, to deter attacks based on glitching the power or clock, the implementation can implement detection circuits. + - `T.GLITCH_READ`, `T.GLITCH_WRITE` + + * - `M.MAC` + - In `DM.EXPOSED`, the storage service must apply an integrity check, a MAC, signature, or authenticated encryption tag, within the storage service before it is sent to storage. + It must also verify this on every read. + - `T.MITM`, `T.DIRECT_WRITE`, `T.REPLACE` + + * - `M.PRoTRootedSecLink` + - In `DM.SECURE_LINK`, the storage service must use a secure channel rooted within the isolated environment to ensure there is no opportunity for eavesdropping. + - `T.EAVESDROPPING` + + * - `M.ReadAfterWrite` + - To deter glitch attacks on writing data, the implementation can read the data it has just written to verify it. + - `T.GLITCH_WRITE` + + * - `M.ReplayProtection` + - In `DM.AUTHORIZED` and `DM.SECURE_LINK` there must be protection against an attacker replaying previous messages. + - `T.DIRECT_READ`, `T.DIRECT_WRITE` + + * - `M.UniqueKeys` + - In `DM.AUTHORIZED` and `DM.SECURE_LINK` the keys used by the storage service and storage medium must be unique, otherwise there is no mechanism for detecting that the storage medium has been replaced. + - `T.MITM`, `T.REPLACE` + + * - `M.ValidateParameter` + - In all deployment models, check all API parameters to lie within valid ranges, including memory access permissions. + - `T.INTERFACE_ABUSE` + + * - `M.VerifyReplies` + - In `DM.AUTHORIZED` and `DM.SECURE_LINK` the storage service must verify all replies from the partition that implements storage, to ensure that they do indeed come from the expected partition and no errors are reported. + - `T.MITM`, `T.REPLACE` + + +User-level mitigations +^^^^^^^^^^^^^^^^^^^^^^ + +:numref:`tab-sra-residual-risk` lists mitigations that are transferred to the application or other external components. +These are also known as 'residual risks'. + +.. list-table:: Mitigations that are **transferred** to the application + :name: tab-sra-residual-risk + :widths: 1 2 1 + :header-rows: 1 + :class: longtable + + + * - Mitigations + - Description + - Threats + + * - `M.UseSecurePartitions` + - In all deployments, if the caller wants to be certain that there is no chance of eavesdropping, they should make use of caller isolation, with each caller in its own isolated partition. + - `T.EAVESDROPPING` + +Mitigations required by each deployment model +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:numref:`tab-sra-api-mitigations` summarizes the mitigations required in each deployment model. + +.. list-table:: Mitigations required by each deployment model + :name: tab-sra-api-mitigations + :widths: 1 3 + :header-rows: 1 + :class: longtable + + * - Implementation + - Mitigations + + + * - `DM.PROTECTED` + - `M.ErrorCorrectingCoding`, + `M.FullyQualifiedNames`, + `M.GlitchDetection`, + `M.ImplicitIdentity`, + `M.MemoryBuffer`, + `M.ReadAfterWrite`, + `M.UseSecurePartitions`, + `M.ValidateParameter` + + * - `DM.EXPOSED` + - `M.AntiRollback`, + `M.Encrypt`, + `M.ErrorCorrectingCoding`, + `M.FullyQualifiedNames`, + `M.GlitchDetection`, + `M.ImplicitIdentity`, + `M.MAC`, + `M.MemoryBuffer`, + `M.ReadAfterWrite`, + `M.UseSecurePartitions`, + `M.ValidateParameter` + + * - `DM.AUTHORIZED` + - `M.AuthenticateEndpoints`, + `M.ErrorCorrectingCoding`, + `M.FullyQualifiedNames`, + `M.GlitchDetection`, + `M.ImplicitIdentity`, + `M.MemoryBuffer`, + `M.ReadAfterWrite`, + `M.ReplayProtection`, + `M.UniqueKeys`, + `M.UseSecurePartitions`, + `M.VerifyReplies`, + `M.ValidateParameter` + + * - `DM.SECURE_LINK` + - `M.AuthenticateEndpoints`, + `M.ErrorCorrectingCoding`, + `M.FullyQualifiedNames`, + `M.GlitchDetection`, + `M.ImplicitIdentity`, + `M.MemoryBuffer`, + `M.PRoTRootedSecLink`, + `M.ReadAfterWrite`, + `M.ReplayProtection`, + `M.UniqueKeys`, + `M.UseSecurePartitions`, + `M.VerifyReplies`, + `M.ValidateParameter` + + +In implementations `DM.PROTECTED` and `DM.SECURE_LINK`, the stored data can be implicitly trusted, and therefore it is not required to be encrypted or authenticated. +There is no more secure location to store verification data, therefore, any attacker able to access the stored data would also be able to access the key. +However, it is possible for the data to be accidentally corrupted, therefore standard engineering practice to guard against this, for example the use of error correcting codes, should be used. + +In implementation `DM.EXPOSED`, the data can be read or modified by an attacker, therefore the storage service must provide confidentiality, integrity, and authenticity by cryptographic means. +The keys used to do this must be stored securely. +This could be a key derived from the HUK, or separately stored in fuse in a location only readable from the :term:`PRoT`. + +As the attacker can always read and modify the stored data, even if they cannot decrypt the data, they can attempt to subvert a change by resetting the storage medium to a prior state. +To detect this, the storage service needs to have some means of authenticating that it is reading the most recent state. +This implies some form of authentication data stored in a location the attacker cannot modify. + +In implementation `DM.AUTHORIZED`, the data can be observed, even if it cannot be modified. +Therefore, data stored does need to be encrypted for confidentiality. +However, provided the authentication protocol is strong, and prevents replay, it should not be possible for an attacker to modify the stored data. +As the store applies a MAC to each reply, the storage service does not need to apply extra integrity. + +In implementation `DM.SECURE_LINK` provided the secure channel is rooted within the :term:`PRoT`, the data transferred cannot be observed, and any modification will be detected. +Therefore, no further encryption is needed for confidentiality or integrity. diff --git a/doc/storage/conf.py b/doc/storage/conf.py index 58ed9db0..09f5989f 100644 --- a/doc/storage/conf.py +++ b/doc/storage/conf.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright 2018-2019, 2022-2025 Arm Limited and/or its affiliates +# SPDX-FileCopyrightText: Copyright 2018-2019, 2022-2026 Arm Limited and/or its affiliates # SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license # PSA Certified API document configuration @@ -8,42 +8,34 @@ doc_info = { # Document template - 'template': 'psa-api-2025', + 'template': 'psa-api-2026', # Document title, MANDATORY 'title': 'PSA Certified\nSecure Storage API', 'author': 'Arm Limited', # Document copyright date, default to year of 'date' - 'copyright_date': '2018-2019, 2022-2025', + 'copyright_date': '2018-2019, 2022-2026', 'copyright': 'Arm Limited and/or its affiliates', # Document identifier, marked as open issue if not provided - 'doc_id': 'IHI 0087', + 'doc_id': 'GPD_SPE_087', # The short X.Y version. MANDATORY 'version': '1.0', - # Document quality status, marked as open issue if not provided - 'quality': 'REL', - # Document issue number (within that version and quality status) - # Marked as open issue if not provided + # Document maintenance revision 'issue_no': 4, - # Identifies the sequence number of a release candidate of the same issue - # default to None - #'release_candidate': 1, - # Draft status - use this to indicate the document is not ready for publication - #'draft': True, - - # Document confidentiality. Must be either Non-confidential or Confidential - # Marked as open issue if not provided - 'confidentiality': 'Non-confidential', + # Document draft revision + 'draft': 1, + # Document status + 'status': 'DFT', # Id of the legal notice for this document # Marked as open issue if not provided - 'license': 'psa-certified-api-license', + #'license': 'psa-certified-api-license', # Document date, default to build date - 'date': '23/09/2025', + 'date': 'September 2025', # psa_spec: default header file for API definitions # default to None, and can be set in documentation source @@ -55,9 +47,6 @@ # 2 : Sub-elements of API - parameters, fields, values 'header_doxygen': 2, - # Declare a watermark for the PDF output - #'watermark': 'DRAFT', - # Optional ordering of return error values # This list is used to create a standard ordering of return value responses # throughout the document, irrespective of their ordering in the source text diff --git a/doc/storage/index.rst b/doc/storage/index.rst index d1c878e7..10c1a824 100644 --- a/doc/storage/index.rst +++ b/doc/storage/index.rst @@ -1,19 +1,11 @@ -.. SPDX-FileCopyrightText: Copyright 2018-2019, 2022-2024 Arm Limited and/or its affiliates +.. SPDX-FileCopyrightText: Copyright 2018-2019, 2022-2024, 2026 Arm Limited and/or its affiliates .. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license .. title:: - .. abstract:: - - This document is part of the PSA Certified API specifications. It defines interfaces to provide secure storage services. - -.. front-matter:: - - about - .. maintoc:: - overview/intro + about/about overview/architecture overview/requirements overview/operation diff --git a/doc/storage/overview/architecture.rst b/doc/storage/overview/architecture.rst index f6b7bf7b..edae69d8 100644 --- a/doc/storage/overview/architecture.rst +++ b/doc/storage/overview/architecture.rst @@ -66,7 +66,7 @@ UIDs ``uids`` in the |API| are defined as ``uint64_t``. This is expected to be larger than would be used on any system. This large namespace is chosen to allow a :term:`Root of Trust Service` to easily manage assets on behalf of other services. -For example, consider a cryptography service running as a RoT Service. When a service running in a :term:`Secure Partition` requests key storage from the cryptography service, the cryptography service can concatenate a numerical identity of the requesting partition (for example, a ``int32_t`` in the :cite-title:`PSA-FFM`) with the key identifier (for example, a ``uint32_t`` in the :cite-title:`PSA-CRYPT`) to generate the ``uid`` of the Internal Trusted Storage entry for the key. This allows the cryptography service to easily manage isolation between the key namespaces of its various clients. +For example, consider a cryptography service running as a RoT Service. When a service running in a :term:`Secure Partition` requests key storage from the cryptography service, the cryptography service can concatenate a numerical identity of the requesting partition (for example, a ``int32_t`` in the :cite-title:`PSA FFM`) with the key identifier (for example, a ``uint32_t`` in the :cite-title:`PSA CRYPT`) to generate the ``uid`` of the Internal Trusted Storage entry for the key. This allows the cryptography service to easily manage isolation between the key namespaces of its various clients. Requirements for ``uid``: diff --git a/doc/storage/overview/intro.rst b/doc/storage/overview/intro.rst deleted file mode 100644 index 0289a772..00000000 --- a/doc/storage/overview/intro.rst +++ /dev/null @@ -1,29 +0,0 @@ -.. SPDX-FileCopyrightText: Copyright 2018-2019, 2022,2025 Arm Limited and/or its affiliates -.. SPDX-License-Identifier: CC-BY-SA-4.0 AND LicenseRef-Patent-license - -.. _intro: - -Introduction -============ - -About Platform Security Architecture ------------------------------------- - -This document is one of a set of resources provided by Arm that can help organizations develop products that meet the security requirements of GlobalPlatform's PSA Certified evaluation scheme on Arm-based platforms. The PSA Certified scheme provides a framework and methodology that helps silicon manufacturers, system software providers and OEMs to develop more secure products. Arm resources that support PSA Certified range from threat models, standard architectures that simplify development and increase portability, and open-source partnerships that provide ready-to-use software. You can read more about PSA Certified here at :url:`www.psacertified.org` and find more Arm resources here at :url:`developer.arm.com/platform-security-resources` and :url:`www.trustedfirmware.org`. - -About the |API| ---------------- - -The interface described in this document is a PSA Certified API, that provides key/value storage interfaces for use with device-protected storage. The |API| describes two interfaces for storage: - -.. csv-table:: - :widths: 3 7 - - Internal Trusted Storage API, An interface for storage provided by the :term:`Platform Root of Trust` (PRoT). - Protected Storage API, An interface for external protected storage. - -The Internal Trusted Storage API must be implemented in the PRoT as described in the :cite-title:`PSM` specification. - -If there are no :term:`Application Root of Trust` (ARoT) services that rely on it, the Protected Storage API can be implemented in the :term:`NSPE`. Otherwise, the Protected Storage API must be implemented in an ARoT within the :term:`SPE`. - -You can find additional resources relating to the |API| here at :url:`arm-software.github.io/psa-api/storage`, and find other PSA Certified APIs here at :url:`arm-software.github.io/psa-api`. diff --git a/doc/storage/overview/operation.rst b/doc/storage/overview/operation.rst index 0558fda4..48be5c97 100644 --- a/doc/storage/overview/operation.rst +++ b/doc/storage/overview/operation.rst @@ -11,7 +11,7 @@ The Internal Trusted Storage service that implements the Internal Trusted Storag Internally the Internal Trusted Storage service should be designed such that one partition cannot access the data owned by another partition. The method of doing this is not specified here, but one method would be to store metadata with the data indicating the partition that owns it. -:numref:`fig-crypto-storage` provides a simple example of how an Internal Trusted Storage service can be used by a service that implements :cite-title:`PSA-CRYPT` to secure keystore material. This is illustrative and not prescriptive. +:numref:`fig-crypto-storage` provides a simple example of how an Internal Trusted Storage service can be used by a service that implements :cite-title:`PSA CRYPT` to secure keystore material. This is illustrative and not prescriptive. .. figure:: /figure/storage.* :name: fig-crypto-storage diff --git a/doc/storage/overview/requirements.rst b/doc/storage/overview/requirements.rst index 6bb36b4e..b5af72ee 100644 --- a/doc/storage/overview/requirements.rst +++ b/doc/storage/overview/requirements.rst @@ -41,4 +41,4 @@ Internal Trusted Storage requirements 14. The `PSA_STORAGE_FLAG_WRITE_ONCE` must be enforced when the Root of Trust Lifecycle state of the device is ``SECURED`` or ``NON_PSA_ROT_DEBUG``. It must not be enforced when the device is in the ``PSA_ROT_PROVISIONING`` state. 15. The creation of a ``uid`` with value ``0`` (zero) must be treated as an error. -The lifecycle states are described in :cite-title:`PSM` and :cite-title:`PSA-FFM`. +The lifecycle states are described in :cite-title:`PSM` and :cite-title:`PSA FFM`. From dd4d790c44a67db032b9ce2ea14ac680aaa1d6f7 Mon Sep 17 00:00:00 2001 From: Andrew Thoelke <andrew.thoelke@arm.com> Date: Mon, 8 Jun 2026 18:17:14 +0100 Subject: [PATCH 8/9] Add Audience sections for each specification Signed-off-by: Andrew Thoelke <andrew.thoelke@arm.com> --- doc/attestation/about/intro | 11 +++++++++-- doc/crypto-driver/about/intro | 8 ++++++++ doc/crypto/about/intro | 23 ++++++++++++++--------- doc/fwu/about/intro | 8 ++++++++ doc/status-code/about/intro | 9 +++++++++ doc/storage/about/intro | 8 ++++++++ 6 files changed, 56 insertions(+), 11 deletions(-) diff --git a/doc/attestation/about/intro b/doc/attestation/about/intro index f4a4122b..6f553cb9 100644 --- a/doc/attestation/about/intro +++ b/doc/attestation/about/intro @@ -17,9 +17,16 @@ This document includes: - - A set of common use cases. See :secref:`use cases`. - - The associated Application Programming Interface (API). See :secref:`api`. + * A set of common use cases. See :secref:`use cases`. + * The associated Application Programming Interface (API). See :secref:`api`. The |API| can be used either to directly produce verifiable evidence about the platform state in the context of a challenge-response interaction, or as a way to bootstrap trust in other attestation schemes. The PSA Certified framework provides the generic security features allowing OEM and service providers to integrate various attestation schemes on top of the Platform Root of Trust. You can find additional resources relating to the |API| here at :url:`arm-software.github.io/psa-api/attestation`, and find other PSA Certified APIs here at :url:`arm-software.github.io/psa-api`. + +.. audience:: + + This document is intended primarily for the use of developers of: + + * Root of Trust Services and security frameworks that implement the |API|. + * Root of Trust Services and Trusted Applications that implement attestation protocols which build upon the initial attestation provided by the |API|. diff --git a/doc/crypto-driver/about/intro b/doc/crypto-driver/about/intro index 7ef70793..5b853555 100644 --- a/doc/crypto-driver/about/intro +++ b/doc/crypto-driver/about/intro @@ -31,3 +31,11 @@ There are several projects currently implementing the |API|, see :url:`github.com/arm-software/psa-api/blob/main/related-projects.md`. For a practical guide, with a description of the current state of drivers in Mbed TLS, see the examples in :url:`github.com/Mbed-TLS/TF-PSA-Crypto/blob/development/docs/psa-driver-example-and-guide.md`. + +.. audience:: + + This document is intended primarily for the use of developers of: + + * Software cryptographic drivers to be integrated into a framework that uses the |API|. + * Software drivers for cryptographic hardware to be integrated into a framework that uses the |API|. + * Frameworks that use the |API| to integrate software and hardware providers of cryptographic services. This includes implementations of the PSA Certified Crypto API that provide extensibility via the |API|. diff --git a/doc/crypto/about/intro b/doc/crypto/about/intro index 2a9c8244..2cd5ad2d 100644 --- a/doc/crypto/about/intro +++ b/doc/crypto/about/intro @@ -15,12 +15,17 @@ This document includes: - * A rationale for the design. See :secref:`design-goals`. - * A high-level overview of the functionality provided by the interface. See :secref:`functionality-overview`. - * A description of typical architectures of implementations for this specification. See :secref:`architectures`. - * General considerations for implementers of this specification, and for applications that use the interface defined in this specification. See :secref:`implementation-considerations` and :secref:`usage-considerations`. - * A detailed definition of the API. See :secref:`library-management`, :secref:`key-management`, and :secref:`crypto-operations`. - - In future, companion documents will define *profiles* for this specification. A profile is - a minimum mandatory subset of the interface that a compliant implementation must - provide. + * A rationale for the design. See :secref:`design-goals`. + * A high-level overview of the functionality provided by the interface. See :secref:`functionality-overview`. + * A description of typical architectures of implementations for this specification. See :secref:`architectures`. + * General considerations for implementers of this specification, and for applications that use the interface defined in this specification. See :secref:`implementation-considerations` and :secref:`usage-considerations`. + * A detailed definition of the API. See :secref:`library-management`, :secref:`key-management`, and :secref:`crypto-operations`. + +.. audience:: + + This document is intended primarily for the use of developers of: + + * Cryptographic libraries that implement the |API|. + * Root of Trust Services that implement the |API|. + * Root of Trust Services and Trusted Applications within a Secure Processing Environment or Trusted Execution Environment which use the |API| to access cryptographic and key management services. + * Client applications which use the |API| to access cryptographic and key management services. diff --git a/doc/fwu/about/intro b/doc/fwu/about/intro index c754f8c6..6988753c 100644 --- a/doc/fwu/about/intro +++ b/doc/fwu/about/intro @@ -12,3 +12,11 @@ The interface enables the software and systems that manage and deliver a firmware update to a device, to be developed independently from the hardware-specific mechanisms required to apply the update to the device. Reusing the deployment and delivery system for firmware updates reduces the complexity of providing firmware updates across a diverse set of managed devices. You can find additional resources relating to the |API| here at :url:`arm-software.github.io/psa-api/fwu`, and find other PSA Certified APIs here at :url:`arm-software.github.io/psa-api`. + +.. audience:: + + This document is intended primarily for the use of developers of: + + * Firmware update services and security frameworks that implement the |API|. + * Bootloaders that provide secure firmware update services. + * Firmware update client applications the use the |API| to access device-specific update functionality. diff --git a/doc/status-code/about/intro b/doc/status-code/about/intro index b1d41cd2..e4a24eca 100644 --- a/doc/status-code/about/intro +++ b/doc/status-code/about/intro @@ -10,3 +10,12 @@ The interface described in this document is a PSA Certified API, that provides a shared set of interface definitions used by other PSA Certified APIs. You can find additional resources relating to the |API| here at :url:`arm-software.github.io/psa-api/status-code`, and find other PSA Certified APIs here at :url:`arm-software.github.io/psa-api`. + +.. audience:: + + This document is intended primarily for the use of developers of: + + * PSA Certified API specifications. + * Implementations of PSA Certified APIs. + * Frameworks that provide access to security services via the PSA Certified APIs. + * Client applications and Root of Trust Services that use any of the PSA Certified APIs. diff --git a/doc/storage/about/intro b/doc/storage/about/intro index ab4c0fa7..797c4723 100644 --- a/doc/storage/about/intro +++ b/doc/storage/about/intro @@ -20,3 +20,11 @@ If there are no :term:`Application Root of Trust` (ARoT) services that rely on it, the Protected Storage API can be implemented in the :term:`NSPE`. Otherwise, the Protected Storage API must be implemented in an ARoT within the :term:`SPE`. You can find additional resources relating to the |API| here at :url:`arm-software.github.io/psa-api/storage`, and find other PSA Certified APIs here at :url:`arm-software.github.io/psa-api`. + +.. audience:: + + This document is intended primarily for the use of developers of: + + * Root of Trust Services and security frameworks that implement the |API|. + * Root of Trust Services and Trusted Applications that use the |API| to access storage services. + * Client applications that use the |API| to access storage services. From 7fa419db81ae8eb6d3117cc00d3e2b6a59399a36 Mon Sep 17 00:00:00 2001 From: Andrew Thoelke <andrew.thoelke@arm.com> Date: Tue, 9 Jun 2026 14:43:18 +0100 Subject: [PATCH 9/9] Re-render graphics using Roboto fonts Signed-off-by: Andrew Thoelke <andrew.thoelke@arm.com> --- doc/crypto/figure/encoding/aead.pdf | Bin 7841 -> 7847 bytes doc/crypto/figure/encoding/algorithm.pdf | Bin 7696 -> 7700 bytes doc/crypto/figure/encoding/asymmetric_key.pdf | Bin 7275 -> 7281 bytes doc/crypto/figure/encoding/cipher.pdf | Bin 7921 -> 7925 bytes doc/crypto/figure/encoding/dh_key.pdf | Bin 7100 -> 7105 bytes doc/crypto/figure/encoding/ecc_key.pdf | Bin 7176 -> 7181 bytes doc/crypto/figure/encoding/hash.pdf | Bin 7535 -> 7539 bytes doc/crypto/figure/encoding/ka_combined.pdf | Bin 8018 -> 8022 bytes doc/crypto/figure/encoding/ka_raw.pdf | Bin 7557 -> 7560 bytes doc/crypto/figure/encoding/kdf.pdf | Bin 7853 -> 7857 bytes doc/crypto/figure/encoding/kem_encoding.pdf | Bin 7731 -> 7736 bytes doc/crypto/figure/encoding/key-wrap.pdf | Bin 8171 -> 9595 bytes doc/crypto/figure/encoding/key-wrap.svg | 2 +- doc/crypto/figure/encoding/key_type.pdf | Bin 9441 -> 9444 bytes doc/crypto/figure/encoding/mac.json | 2 +- doc/crypto/figure/encoding/mac.pdf | Bin 9449 -> 11422 bytes doc/crypto/figure/encoding/mac.svg | 2 +- doc/crypto/figure/encoding/np_key.pdf | Bin 7018 -> 7023 bytes doc/crypto/figure/encoding/pake_encoding.pdf | Bin 7672 -> 7676 bytes doc/crypto/figure/encoding/pke.pdf | Bin 9094 -> 9097 bytes doc/crypto/figure/encoding/raw_key.pdf | Bin 7450 -> 7454 bytes doc/crypto/figure/encoding/sign.pdf | Bin 8995 -> 8999 bytes doc/crypto/figure/encoding/slh_dsa_key.pdf | Bin 6866 -> 6871 bytes doc/crypto/figure/encoding/spake2p_key.pdf | Bin 7394 -> 7399 bytes doc/crypto/figure/encoding/structured_key.pdf | Bin 7805 -> 7556 bytes doc/crypto/figure/encoding/symmetric_key.pdf | Bin 7255 -> 7260 bytes .../figure/encoding/wpa3_sae_dh_key.pdf | Bin 7082 -> 6962 bytes .../figure/encoding/wpa3_sae_ecc_key.pdf | Bin 7152 -> 7041 bytes doc/crypto/figure/encoding/xof.pdf | Bin 7710 -> 7710 bytes doc/crypto/figure/multi_part_operation.pdf | Bin 26763 -> 25920 bytes doc/crypto/figure/multi_part_operation.svg | 2 +- doc/crypto/figure/pake/j-pake.pdf | Bin 26850 -> 24564 bytes doc/crypto/figure/pake/j-pake.svg | 2 +- doc/crypto/figure/pake/pake_primitive.pdf | Bin 7617 -> 7621 bytes doc/crypto/figure/pake/spake2plus-reg.pdf | Bin 35297 -> 33921 bytes doc/crypto/figure/pake/spake2plus-reg.svg | 2 +- doc/crypto/figure/pake/spake2plus.pdf | Bin 29672 -> 27429 bytes doc/crypto/figure/pake/spake2plus.svg | 2 +- doc/crypto/figure/pake/wpa3-sae-pt.pdf | Bin 33711 -> 32412 bytes doc/crypto/figure/pake/wpa3-sae-pt.svg | 2 +- doc/crypto/figure/pake/wpa3-sae.pdf | Bin 43068 -> 42256 bytes doc/crypto/figure/pake/wpa3-sae.svg | 2 +- .../figure/sra/dfd_caller_isolation.pdf | Bin 19049 -> 20197 bytes .../figure/sra/dfd_caller_isolation.svg | 2 +- .../figure/sra/dfd_crypto_isolation.pdf | Bin 17875 -> 19026 bytes .../figure/sra/dfd_crypto_isolation.svg | 2 +- doc/crypto/figure/sra/dfd_no_isolation.pdf | Bin 17187 -> 18414 bytes doc/crypto/figure/sra/dfd_no_isolation.svg | 2 +- doc/crypto/figure/sra/system-entities.pdf | Bin 8204 -> 8820 bytes doc/crypto/figure/sra/system-entities.svg | 2 +- doc/fwu/figure/arch/components.pdf | Bin 27898 -> 30432 bytes doc/fwu/figure/arch/components.svg | 2 +- doc/fwu/figure/arch/trusted-client.pdf | Bin 32155 -> 35918 bytes doc/fwu/figure/arch/trusted-client.svg | 2 +- doc/fwu/figure/arch/untrusted-client.pdf | Bin 37053 -> 40346 bytes doc/fwu/figure/arch/untrusted-client.svg | 2 +- doc/fwu/figure/arch/untrusted-staging.pdf | Bin 35608 -> 38963 bytes doc/fwu/figure/arch/untrusted-staging.svg | 2 +- doc/fwu/figure/intro/context.pdf | Bin 19605 -> 21726 bytes doc/fwu/figure/intro/context.svg | 2 +- doc/fwu/figure/intro/fwu-api.pdf | Bin 26585 -> 29340 bytes doc/fwu/figure/intro/fwu-api.svg | 2 +- doc/fwu/figure/sequence.pdf | Bin 33483 -> 31173 bytes doc/fwu/figure/sequence.svg | 2 +- doc/fwu/figure/sra/lifecycle.pdf | Bin 19265 -> 19828 bytes doc/fwu/figure/sra/lifecycle.svg | 2 +- doc/fwu/figure/states/default.pdf | Bin 33040 -> 31473 bytes doc/fwu/figure/states/default.svg | 2 +- .../states/no-reboot-no-trial-volatile.pdf | Bin 29833 -> 28518 bytes .../states/no-reboot-no-trial-volatile.svg | 2 +- doc/fwu/figure/states/no-reboot-no-trial.pdf | Bin 29696 -> 28440 bytes doc/fwu/figure/states/no-reboot-no-trial.svg | 2 +- doc/fwu/figure/states/no-reboot-volatile.pdf | Bin 30712 -> 29306 bytes doc/fwu/figure/states/no-reboot-volatile.svg | 2 +- doc/fwu/figure/states/no-reboot.pdf | Bin 30243 -> 29017 bytes doc/fwu/figure/states/no-reboot.svg | 2 +- doc/fwu/figure/states/no-trial-volatile.pdf | Bin 31115 -> 29543 bytes doc/fwu/figure/states/no-trial-volatile.svg | 2 +- doc/fwu/figure/states/no-trial.pdf | Bin 31653 -> 30192 bytes doc/fwu/figure/states/no-trial.svg | 2 +- doc/fwu/figure/states/volatile.pdf | Bin 32934 -> 31298 bytes doc/fwu/figure/states/volatile.svg | 2 +- doc/storage/figure/callers.pdf | Bin 23026 -> 24778 bytes doc/storage/figure/callers.svg | 2 +- doc/storage/figure/dm-authorized.pdf | Bin 30316 -> 32575 bytes doc/storage/figure/dm-authorized.svg | 2 +- doc/storage/figure/dm-exposed.pdf | Bin 29011 -> 31456 bytes doc/storage/figure/dm-exposed.svg | 2 +- doc/storage/figure/dm-protected.pdf | Bin 29015 -> 31445 bytes doc/storage/figure/dm-protected.svg | 2 +- doc/storage/figure/dm-secure-link.pdf | Bin 29695 -> 32078 bytes doc/storage/figure/dm-secure-link.svg | 2 +- doc/storage/figure/lifecycle.pdf | Bin 18655 -> 19242 bytes doc/storage/figure/lifecycle.svg | 2 +- doc/storage/figure/storage.pdf | Bin 23476 -> 21697 bytes doc/storage/figure/storage.svg | 2 +- 96 files changed, 36 insertions(+), 36 deletions(-) diff --git a/doc/crypto/figure/encoding/aead.pdf b/doc/crypto/figure/encoding/aead.pdf index 44c0845c35dc6f2c24aebbae144035a2cbd2dc49..92c086e18fa3b97857eab9c499b0f7b69f84229c 100644 GIT binary patch delta 348 zcmV-i0i*t*J*Pded>nsF8EBIFXD!l)DwHt>((Y~SA;e&XVI+xT{q{?=c8tJ<`{SOR zbGZ~GpgA%UFwl$!w7{m=24#ul{W?k{4ez8003@${Yw!UEf)hSxRH<pOpuv7WD;llZ zNl1-Q@Lns>m_ElT!i%+|*(J$LJI%*SFHEd-7e&iAT5{W~q2_;9BCL0eu$<&%ODSQD zJQ4axNVJ;##lnNL_WFiv>2vsGGkBA2&kyRy#U<{gSsoV|Qs(QLe6UVqklsZ{t)>xW z=^NiKMl)T}*-_00GkQaDUGWR7p5)q9ZmO2wy^yEl!9y3^^OH1c(n1<+?w)5S6n4pP z+$sL;SaHk0RCg|0(VgM8p&R-I9&vBh3T19&b98cLVQmU!Ze(v_Y6>wpATS_rVrmK? uARsb0GLxhoECD!^(H)-*Gl62V8yFY>mN5s#lX@N<3N|n>3MC~)Peuxbke_t` delta 320 zcmV-G0l)sIJ)u3Yd>ntEFKXhSmLh$qLK$Nqc26672r<~eFp|Wve)}a_J4PVk{<!C! za|uBjkP<~2P>{R~$PU>q52^~u+iem^S~dt107zbBZ}0(%6dgVnRI7QkAi?ptC|a%h znG21OGpQ9wO!hHFc(ryiha_3(pxJbl+{8)`QM8WHf?27?hFO1susP6_7HLKZDcrk% zkGA=LiSXoHy|iUo_y|7K0$xQg*-8Dlq^Uc3QO3IhIraAzdbCbskUvCct>y_;<qKc0 zMho50#Zk>hGkHUP+we22p2b$xuB#E>l8f$q^3VnMyc0&vnhS&M;dyaFZrA+A{ldQ; zYi8M(8tyB)AGir`=$d{3f*NlglZPE20yj95s2wZ;Hj}Rx8I$fEh6*4FS)eummIVjB SlYkx_3N<-43MC~)PeuymxsT`o diff --git a/doc/crypto/figure/encoding/algorithm.pdf b/doc/crypto/figure/encoding/algorithm.pdf index 72925d0b0d21392e5e84a3c47fce81018b32a69d..c22ddb2d5f3c8deeb22ca6be26d3d1b9d4e879c0 100644 GIT binary patch delta 315 zcmV-B0mS~0Jd`}J=o^1b8EBIFXD!l)DwHt>((Y~SA;e&XVI+xT{q{?=c8tJ<`{SOR zbGZ~GpgA%UFwl$!w7{m=24#ul{W?k{4ez8003@${Yw!UEf)hSxRH<pOpuv7WD;llZ zNl1-Q@Lns>m_ElT!i%+|*(J$LJI%*SFHEd-7e&iAT5{W~q2_;9BCL0eu$<&%ODSQD zJQ4axNVJ;##lnNL_WFiv>2vsGGkBA2&kyRy#U<{gSsoV|Qs(QLe6UVqklsZ{t)>xW z=^NiKMl)T}*-_00GkQaDUGWR7p5)q9ZmO2wy^yEl!9y3^^OH1c(n1<+?w)5S6n4pP z+$sL;SaHk0RCf(q(VgM8p&R-I9&vBhlkXfK0yr|05FO17tUxhY83qOb<5&o*lj$8E N2{kebB_%~qMhdkimMZ`N delta 337 zcmV-X0j~a(JdixF=o^2aFKXhSmLh$qLK$Nqc26672r<~eFp|Wve)}a_J4PVk{<!C! za|uBjkP<~2P>{R~$PU>q52^~u+iem^S~dt107zbBZ}0(%6dgVnRI7QkAi?ptC|a%h znG21OGpQ9wO!hHFc(ryiha_3(pxJbl+{8)`QM8WHf?27?hFO1susP6_7HLKZDcrk% zkGA=LiSXoHy|iUo_y|7K0$xQg*-8Dlq^Uc3QO3IhIraAzdbCbskUvCct>y_;<qKc0 zMho50#Zk>hGkHUP+we22p2b$xuB#E>l8f$q^3VnMyc0&vnhS&M;dyaFZrA+A{ldQ; zYi8M(8tyB)AGj)S=$d{3f*Nlg3T19&b98cLVQmU!Ze(v_Y6>wpATS_rVrmK?ARsa~ jIFl3|%?yk{F<A))1_0wM2&0qj9UciZI0_{tMNdWw4N;Wc diff --git a/doc/crypto/figure/encoding/asymmetric_key.pdf b/doc/crypto/figure/encoding/asymmetric_key.pdf index 3ec7e03a7843df5917b1ec9d68a6b5b1a43b5158..5381867b27534eeb240f00b7507e8968d5bd2233 100644 GIT binary patch delta 362 zcmV-w0hRviIPo~JIvRgpYlAQp#ozrD=VeS8Xp;J8Ez*Z7lraX<?rrQL#9)PCB#C4F z_Di&OjKGEa<DQ&zxfCRzIWiJ3(2NGOz^2#+Wr^hdI!YuB@1zL;B(HsI@Bs#b6Fz5D zscEpF!G1q08m-z%NR3eNUMtX;KF2A-i?yTKCCN-X&BseGOss!&7e&iAT5{W~q2^X1 ztapsCoaAInDPfE}5&B3-w3__I!h^H+`i5)ibNFO4c$00<59-IoCGN2ejf)H^^L0%= zSf?>a@1mnt(}=S4jqewunXc&UsOEziy`i|S_ytx^a_uTNRm<;Q$kXxQp$qQ$Ng6e2 zAq_Tn&$AN>yW|)*?iBxathnW0s=KY|&T!k%4gCTa8*j~%OB){oI5LxL8!Q1ilfM-i zld>CzH0dOum~<rr0|4X72;mB4Ze(+Ga%Ev{3T19&Z(?c+b97;Hba--QW(qejGcyV$ IB}Gq03QC%*?f?J) delta 331 zcmV-R0kr<{IO{mDIvRgLYlJWmh421~cPZ#alc;OE$R1W<DWxE8Pc1!!7+j$kNn+{# z`zE?>DS?Ffm^beYp&$X>AtwO?&2|ATkQP}`mPp>NlSI<+UYY<v@-lP=A7CJ8@wuQ% z&7%bk4u?h2Xw}U^YJ`FhT7ky&F=hxa)=p-hBn#~|pDu$ivC@Bi6s=>l<aSVF&8<XO z?-^k^Nhzhdd!OE;ZT?>(JUCY`ZMc>`f)BNTSJ@5xsD4~h;toq`T;#}@zqin%bsB^0 zE;?y7Pbf=Y_<A*3=!VXYYCf9D8;a|OpJDYZx2keowfr80Y)?lIU2xA^Y1FKRG)V8B zXD1YP&2QW<{M!?;;+B7@{<fm~f!l_z=@)y{Zx)kK8y^BUH<NK2ECD!^zZDsiw;P5G dX^>IUB@7Gz<C6&2lS&*O2{JeeB_%~qMhZjvl<xol diff --git a/doc/crypto/figure/encoding/cipher.pdf b/doc/crypto/figure/encoding/cipher.pdf index b1999d9018a428be8fa2d081f9b9ffd67e469f9a..97420df16ab59dd8ff0c9e541cd9dcb6ee099ad0 100644 GIT binary patch delta 325 zcmV-L0lNP2J@q}Xz8rsFYlAQp#ozrD=VeS8Xp;J8Ez*Z7lraX<?rrQL#9)PCB#C4F z_Di&OjKGEa<DQ&zxfCRzIWiJ3(2NGOz^2#+Wr^hdI!YuB@1zL;B(HsI@Bs#b6Fz5D zscEpF!G1q08m-z%NR3eNUMtX;KF2A-i?yTKCCN-X&BseGOss!&7e&iAT5{W~q2^X1 ztapsCoaAInDPfE}5&B3-w3__I!h^H+`i5)ibNFO4c$00<59-IoCGMqJ9v2x>=Ife# zuufx;-bF{PrV(Z78{aQRGhNZyQOyT4dP8wt@e8b;<l0qks+Qlqkf-CpLl@lhlQe45 zLK<xDo@XZ%cF7oT+$sL;SaHk0RCim^o#D2j8~Ozvac|a>&>bHFI5Ly*9nB2SfMT+L X85jWES_&kS${rsGHwq;sMNdWw{yCk- delta 347 zcmV-h0i^!*J@GxTz8rteYJ@Nph4((i*%Wl6iGR}$GK*0dN-2obRZABk1}9LAB(Zef zzKM=gN+98W+;h*lgn|ULL_vZSG%o|XL$=F<szUO1odlAW4Z;Kfk{8(<d>{ouhtCDo zY91|Ua5yZAR;zyILL=l%Y6Tk8$2diJv34^1Bw6U7*>sWI#7ch;QM8WHf?27?hFO8I z*{38eNJc3w-23z%ZS(&U;la6jY0I?m5qzixyoz43qxx}4i92~w#=8P}>hCS|Xr0C& zzl%;<%@eB17rtJN7P_IcqneFo@`n7n;b&Mqi><0%S0lb97v1UTp$qPLCybgk7Y5ng z^X!D&uKA7og?}|W*37amHQZKoKXBX7HT?pEDsLYOWo~41baG{3Z3<;>WN%_>3Nbh! tFd%PYY6>7AATl>Nll2|V43B_fvOgIZ0NgGL9Fxu-9|$uFB_%~qMhZuVo__!U diff --git a/doc/crypto/figure/encoding/dh_key.pdf b/doc/crypto/figure/encoding/dh_key.pdf index 4b78e383e6ef461c4685f1f62eccf4947773ae97..6e121e91484cc59579b67802b2fba3d962c1ff89 100644 GIT binary patch delta 326 zcmV-M0lEIXH^Dcsi5Y)iYlAQp#ozrD=VeS8Xp;J8Ez*Z7lraX<?rrQL#9)PCB#C4F z_Di&OjKGEa<DQ&zxfCRzIWiJ3(2NGOz^2#+Wr^hdI!YuB@1zL;B(HsI@Bs#b6Fz5D zscEpF!G1q08m-z%NR3eNUMtX;KF2A-i?yTKCCN-X&BseGOss!&7e&iAT5{W~q2^X1 ztapsCoaAInDPfE}5&B3-w3__I!h^H+`i5)ibNFO4c$00<59-IoCGN2ejf)H^^L0%= zSf?>a@1mnt(}=S4jqewunXc&UsOEziy`i|S_ytx^a_uTNRm<;Q$kXxQp$qQ$Ng6e2 zAq_Tn&$AN>yW|)*?iBxathnW0s=KY|&T!k%4gCTa8*j~%ni?MhI5LyF8qEzh0>z|G YFfafB^TP@<la(7E2sR2OB}Gq03bg*7s{jB1 delta 321 zcmV-H0lxmhH@r8ni5Y)EYlJWmh421~cPZ#alc;OE$R1W<DWxE8Pc1!!7+j$kNn+{# z`zE?>DS?Ffm^beYp&$X>AtwO?&2|ATkQP}`mPp>NlSI<+UYY<v@-lP=A7CJ8@wuQ% z&7%bk4u?h2Xw}U^YJ`FhT7ky&F=hxa)=p-hBn#~|pDu$ivC@Bi6s=>l<aSVF&8<XO z?-^k^Nhzhdd!OE;ZT?>(JUCY`ZMc>`f)BNTSJ@5xsD4~h;toq`T;#}@zqin%bsB^0 zE;?y7Pbf=Y_<A*3=!VXYYCf9D8;a|OpJDYZx2keowfr80Y)?lIU2xA^Y1FKRG)V8B zXD1YP&2QW<{M!?;;+B7@{<fm~f!l_z=@)y{Zx)lE8Xp2TH<Q2`%?;K7#iR~1FaQAa Tj0z}|nj0SoF$yImMNdWwcdU{> diff --git a/doc/crypto/figure/encoding/ecc_key.pdf b/doc/crypto/figure/encoding/ecc_key.pdf index 5bdfb282bec20826ebcf1499963044643e85350a..66743c22aa6e451ef6e4a051657a1556093e003d 100644 GIT binary patch delta 326 zcmV-M0lEH&IE^^4)){|aYlAQp#ozrD=VeS8Xp;J8Ez*Z7lraX<?rrQL#9)PCB#C4F z_Di&OjKGEa<DQ&zxfCRzIWiJ3(2NGOz^2#+Wr^hdI!YuB@1zL;B(HsI@Bs#b6Fz5D zscEpF!G1q08m-z%NR3eNUMtX;KF2A-i?yTKCCN-X&BseGOss!&7e&iAT5{W~q2^X1 ztapsCoaAInDPfE}5&B3-w3__I!h^H+`i5)ibNFO4c$00<59-IoCGN2ejf)H^^L0%= zSf?>a@1mnt(}=S4jqewunXc&UsOEziy`i|S_ytx^a_uTNRm<;Q$kXxQp$qQ$Ng6e2 zAq_Tn&$AN>yW|)*?iBxathnW0s=KY|&T!k%4gCTa8*j~%=NcaZI5Lw68_f*=fMU|3 Y3=9DLaS6wh;Ts+aGcyV$B}Gq03bX&95dZ)H delta 321 zcmV-H0lxl?IEXl~)){|6YlJWmh421~cPZ#alc;OE$R1W<DWxE8Pc1!!7+j$kNn+{# z`zE?>DS?Ffm^beYp&$X>AtwO?&2|ATkQP}`mPp>NlSI<+UYY<v@-lP=A7CJ8@wuQ% z&7%bk4u?h2Xw}U^YJ`FhT7ky&F=hxa)=p-hBn#~|pDu$ivC@Bi6s=>l<aSVF&8<XO z?-^k^Nhzhdd!OE;ZT?>(JUCY`ZMc>`f)BNTSJ@5xsD4~h;toq`T;#}@zqin%bsB^0 zE;?y7Pbf=Y_<A*3=!VXYYCf9D8;a|OpJDYZx2keowfr80Y)?lIU2xA^Y1FKRG)V8B zXD1YP&2QW<{M!?;;+B7@{<fm~f!l_z=@)y{Zx)m68Xp2TH<Jw;%?v+*V$uQ(3;_H( T3B8l%8y*QVI0_{tMNdWwOF@zD diff --git a/doc/crypto/figure/encoding/hash.pdf b/doc/crypto/figure/encoding/hash.pdf index 0bcbf40910f3283ddc3dbf22a3b13435622691fc..347e7daf141daa0f21b8b9d25f7d515c9475d8b4 100644 GIT binary patch delta 326 zcmV-M0lEI~I`cZPI~#vrYlAQp#ozrD=VeS8Xp;J8Ez*Z7lraX<?rrQL#9)PCB#C4F z_Di&OjKGEa<DQ&zxfCRzIWiJ3(2NGOz^2#+Wr^hdI!YuB@1zL;B(HsI@Bs#b6Fz5D zscEpF!G1q08m-z%NR3eNUMtX;KF2A-i?yTKCCN-X&BseGOss!&7e&iAT5{W~q2^X1 ztapsCoaAInDPfF05&B3-w3__I!h^H+`i5)ibNFO4c$00<59-IoCGMqJ9v2x>=Ife# zuufx;-bF{PrV(Z78{aQRGhNZyQOyT4dP8wt@e8b;<l0qks+Qlqkf-CpLl@lhlQe45 zLK<xDo@XZ%cF7oT+$sL;SaHk0RCim^o#D2j8~OzwhHuxCO&lKrI5LxN9L@}6pqNY* Y0|Nl4MF<;{NF5#tIWP((B}Gq03a9m&l>h($ delta 322 zcmV-I0loh7I`2BLI~#w^YJ@Nph4((i*%Wl6iGR}$GK*0dN-2obRZABk1}9LAB(Zef zzKM=gN+98W+;h*lgn|ULL_vZSG%o|XL$=F<szUO1odlAW4Z;Kfk{8(<d>{ouhtCDo zY91|Ua5yZAR;zyILL=l%Y6Tk8$2diJv34^1Bw6U7*>sWI#7ch;QM8WHf?27?hFO8I z*{38eNJc3w-23z%ZS(&U;la6jY0I?m5qzixyoz43qxx}4i92~w#=8P}>hCS|Xr0C& zzl%;<%@eB17rtJN7P_IcqneFo@`n7n;b&Mqi><0%S0lb97v1UTp$qPLCybgk7Y5ng z^X!D&uKA7og?|(~*37amHQZKoKXBX7HT?pEDsLZ?Q5+uvH#n1W9L@}QpqNY<0|Nl4 U83+@TOdTExI5r9;B}Gq03N<d2R{#J2 diff --git a/doc/crypto/figure/encoding/ka_combined.pdf b/doc/crypto/figure/encoding/ka_combined.pdf index d6f10d877369037ddb8f5ea4e259ca1e5aee45d4..3f05d72f03e57c79b227ccc94cd2b4c90e2277d1 100644 GIT binary patch delta 325 zcmV-L0lNOuKGr_4A02;RYlAQp#ozrD=VeS8Xp;J8Ez*Z7lraX<?rrQL#9)PCB#C4F z_Di&OjKGEa<DQ&zxfCRzIWiJ3(2NGOz^2#+Wr^hdI!YuB@1zL;B(HsI@Bs#b6Fz5D zscEpF!G1q08m-z%NR3eNUMtX;KF2A-i?yTKCCN-X&BseGOss!&7e&iAT5{W~q2^X1 ztapsCoaAInDPfF05&B3-w3__I!h^H+`i5)ibNFO4c$00<59-IoCGMqJ9v2x>=Ife# zuufx;-bF{PrV(Z78{aQRGhNZyQOyT4dP8wt@e8b;<l0qks+Qlqkf-CpLl@lhlQe45 zLK<xDo@XZ%cF7oT+$sL;SaHk0RCim^o#D2j8~OzwhHuxCF&-ZRI5Lw`9?cBgfnsuT X3=9D7Q3*qnD<2;SGzujpMNdWwy$hQ5 delta 321 zcmV-H0lxm$KGHt0A02<qYJ@Nph4((i*%Wl6iGR}$GK*0dN-2obRZABk1}9LAB(Zef zzKM=gN+98W+;h*lgn|ULL_vZSG%o|XL$=F<szUO1odlAW4Z;Kfk{8(<d>{ouhtCDo zY91|Ua5yZAR;zyILL=l%Y6Tk8$2diJv34^1Bw6U7*>sWI#7ch;QM8WHf?27?hFO8I z*{38eNJc3w-23z%ZS(&U;la6jY0I?m5qzixyoz43qxx}4i92~w#=8P}>hCS|Xr0C& zzl%;<%@eB17rtJN7P_IcqneFo@`n7n;b&Mqi><0%S0lb97v1UTp$qPLCybgk7Y5ng z^X!D&uKA7og?|(~*37amHQZKoKXBX7HT?pEDsLZ?H69-VH#n149?cA#fnst|3=9D7 TB?&u|FCQNWFbX9lMNdWwMo5%5 diff --git a/doc/crypto/figure/encoding/ka_raw.pdf b/doc/crypto/figure/encoding/ka_raw.pdf index 2c86eb0d08c98dcc1344db6d5d9f27ea2fe5550e..3dd5185ed2ec4bc65eeaab79e0c359152f7d8dbf 100644 GIT binary patch delta 361 zcmV-v0ha!SJBT~5QX79?YlAQp#ozrD=VeS8Xp;J8Ez*Z7lraX<?rrQL#9)PCB#C4F z_Di&OjKGEa<DQ&zxfCRzIWiJ3(2NGOz^2#+Wr^hdI!YuB@1zL;B(HsI@Bs#b6Fz5D zscEpF!G1q08m-z%NR3eNUMtX;KF2A-i?yTKCCN-X&BseGOss!&7e&iAT5{W~q2^X1 ztapsCoaAInDPfF05&B3-w3__I!h^H+`i5)ibNFO4c$00<59-IoCGMqJ9v2x>=Ife# zuufx;-bF{PrV(Z78{aQRGhNZyQOyT4dP8wt@e8b;<l0qks+Qlqkf-CpLl@lhlQe45 zLK<xDo@XZ%cF8$!+$sL;SaHk0RCim^o#D2j8~OzwhHuvjWo~41baG{3Z3<;>WN%_> z3Nbh!Fd%PYY6>7AATl^IlZ6~C0XUOU1Rayl9D@rWS(%9p3;?HM2knzy9UciWGYTao HMNdWw=3b>i delta 332 zcmV-S0ki&yJB2&2QX7BGYJ@Nph4((i*%Wl6iGR}$GK*0dN-2obRZABk1}9LAB(Zef zzKM=gN+98W+;h*lgn|ULL_vZSG%o|XL$=F<szUO1odlAW4Z;Kfk{8(<d>{ouhtCDo zY91|Ua5yZAR;zyILL=l%Y6Tk8$2diJv34^1Bw6U7*>sWI#7ch;QM8WHf?27?hFO8I z*{38eNJc3w-23z%ZS(&U;la6jY0I?m5qzixyoz43qxx}4i92~w#=8P}>hCS|Xr0C& zzl%;<%@eB17rtJN7P_IcqneFo@`n7n;b&Mqi><0%S0lb97v1UTp$qPLCybgk7Y5ng z^X!D&uKA7og?|(~*37amHQZKoKXBX7HT?pEDsLZ?XdE8`H#n1t94rAjlTid6lhYi7 e3}rwunO+740H-zw<&$9@9tkix3MC~)Peuwcz?UWf diff --git a/doc/crypto/figure/encoding/kdf.pdf b/doc/crypto/figure/encoding/kdf.pdf index ea2d9f30dbc20ccc68efb9fea0761b4885a21ab4..6ce65f590f8ba7e6cbe92a48b18d1473339f8e93 100644 GIT binary patch delta 325 zcmV-L0lNOJJ+VEodK`aWYlAQp#ozrD=VeS8Xp;J8Ez*Z7lraX<?rrQL#9)PCB#C4F z_Di&OjKGEa<DQ&zxfCRzIWiJ3(2NGOz^2#+Wr^hdI!YuB@1zL;B(HsI@Bs#b6Fz5D zscEpF!G1q08m-z%NR3eNUMtX;KF2A-i?yTKCCN-X&BseGOss!&7e&iAT5{W~q2^X1 ztapsCoaAInDPfF05&B3-w3__I!h^H+`i5)ibNFO4c$00<59-IoCGMqJ9v2x>=Ife# zuufx;-bF{PrV(Z78{aQRGhNZyQOyT4dP8wt@e8b;<l0qks+Qlqkf-CpLl@lhlQe45 zLK<xDo@XZ%cF7oT+$sL;SaHk0RCim^o#D2j8~OzwhHuxCj2#~WI5Ly19nB0PpqT7V X1_l70j|dNwh8`aXISM5uMNdWw;E$WO delta 321 zcmV-H0lxmRJ*_>kdK`bvYJ@Nph4((i*%Wl6iGR}$GK*0dN-2obRZABk1}9LAB(Zef zzKM=gN+98W+;h*lgn|ULL_vZSG%o|XL$=F<szUO1odlAW4Z;Kfk{8(<d>{ouhtCDo zY91|Ua5yZAR;zyILL=l%Y6Tk8$2diJv34^1Bw6U7*>sWI#7ch;QM8WHf?27?hFO8I z*{38eNJc3w-23z%ZS(&U;la6jY0I?m5qzixyoz43qxx}4i92~w#=8P}>hCS|Xr0C& zzl%;<%@eB17rtJN7P_IcqneFo@`n7n;b&Mqi><0%S0lb97v1UTp$qPLCybgk7Y5ng z^X!D&uKA7og?|(~*37amHQZKoKXBX7HT?pEDsLZ?kR2ZaH#n2A9nB0ppqT7d1_l70 TV+aS6iXI;bH3}sqMNdWwb*7bh diff --git a/doc/crypto/figure/encoding/kem_encoding.pdf b/doc/crypto/figure/encoding/kem_encoding.pdf index 82434ce54bd8b28fe19d0a53f56d62c5c4857838..b700ca5647bd562ef94d21c2629bd7f76c064e3b 100644 GIT binary patch delta 357 zcmV-r0h<1^Jh(it0UUo{YlAQp#ozrD=VeS8Xp;J8Ez*Z7lraX<?rrQL#9)PCB#C4F z_Di&OjKGEa<DQ&zxfCRzIWiJ3(2NGOz^2#+Wr^hdI!YuB@1zL;B(HsI@Bs#b6Fz5D zscEpF!G1q08m-z%NR3eNUMtX;KF2A-i?yTKCCN-X&BseGOss!&7e&iAT5{W~q2^X1 ztapsCoaAInDPfF05&B3-w3__I!h^H+`i5)ibNFO4c$00<59-IoCGMqJ9v2x>=Ife# zuufx;-bF{PrV(Z78{aQRGhNZyQOyT4dP8wt@e8b;<l0qks+Qlqkf-CpLl@lhlQe45 zLK<xDo@XZ%cF8$!+$sL;SaHk0RCim^o#D2j8~OzwhHuvjWo~41baG{3Z3<;>WN%_> z3Nbh!Fd%PYY6>7AATl^IlQbPH0XdUl9iR*~fnu@_3=9Cy!w6@S3?3f{I0_{tMNdWw DS4E?7 delta 326 zcmV-M0lEITJhMEo0UUqLYJ@Nph4((i*%Wl6iGR}$GK*0dN-2obRZABk1}9LAB(Zef zzKM=gN+98W+;h*lgn|ULL_vZSG%o|XL$=F<szUO1odlAW4Z;Kfk{8(<d>{ouhtCDo zY91|Ua5yZAR;zyILL=l%Y6Tk8$2diJv34^1Bw6U7*>sWI#7ch;QM8WHf?27?hFO8I z*{38eNJc3w-23z%ZS(&U;la6jY0I?m5qzixyoz43qxx}4i92~w#=8P}>hCS|Xr0C& zzl%;<%@eB17rtJN7P_IcqneFo@`n7n;b&Mqi><0%S0lb97v1UTp$qPLCybgk7Y5ng z^X!D&uKA7og?|(~*37amHQZKoKXBX7HT?pEDsLZ?7abo0H#n0x9V`JjlVu&C3sr$) YvOskJ&X)*ZlMx;t2s8>MB}Gq03bO{4ga7~l diff --git a/doc/crypto/figure/encoding/key-wrap.pdf b/doc/crypto/figure/encoding/key-wrap.pdf index b708f0c9808ae31ec9b2fb694262514e47b2bae4..2821a1ee4cdbf54c501f4ec83772e37c5c9edb59 100644 GIT binary patch delta 8607 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 literal 8171 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 C*S`z^ diff --git a/doc/crypto/figure/encoding/key-wrap.svg b/doc/crypto/figure/encoding/key-wrap.svg index 8170d07c..b80bdd43 100644 --- a/doc/crypto/figure/encoding/key-wrap.svg +++ b/doc/crypto/figure/encoding/key-wrap.svg @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" ?> -<svg baseProfile="full" height="57" id="svgcontent" version="1.1" viewBox="0 0 609 57" width="609" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs /><g font-family="Lato,sans-serif" font-size="11" font-weight="normal" text-anchor="middle" transform="translate(4.5,0.5)"><g stroke="black" stroke-linecap="round" stroke-width="1" transform="translate(0,13.0)"><line x1="0" x2="600" y1="0" y2="0" /><line x1="0" x2="0" y1="0" y2="26.0" /><line x1="0" x2="600" y1="26.0" y2="26.0" /><line x1="600.0" x2="600.0" y1="0" y2="26.0" /><line x1="581.25" x2="581.25" y1="0" y2="3.25" /><line x1="581.25" x2="581.25" y1="22.75" y2="26.0" /><line x1="562.5" x2="562.5" y1="0" y2="3.25" /><line x1="562.5" x2="562.5" y1="22.75" y2="26.0" /><line x1="543.75" x2="543.75" y1="0" y2="3.25" /><line x1="543.75" x2="543.75" y1="22.75" y2="26.0" /><line x1="525.0" x2="525.0" y1="0" y2="3.25" /><line x1="525.0" x2="525.0" y1="22.75" y2="26.0" /><line x1="506.25" x2="506.25" y1="0" y2="3.25" /><line x1="506.25" x2="506.25" y1="22.75" y2="26.0" /><line x1="487.5" x2="487.5" y1="0" y2="3.25" /><line x1="487.5" x2="487.5" y1="22.75" y2="26.0" /><line x1="468.75" x2="468.75" y1="0" y2="3.25" /><line x1="468.75" x2="468.75" y1="22.75" y2="26.0" /><line x1="450.0" x2="450.0" y1="0" y2="26.0" /><line x1="431.25" x2="431.25" y1="0" y2="3.25" /><line x1="431.25" x2="431.25" y1="22.75" y2="26.0" /><line x1="412.5" x2="412.5" y1="0" y2="3.25" /><line x1="412.5" x2="412.5" y1="22.75" y2="26.0" /><line x1="393.75" x2="393.75" y1="0" y2="3.25" /><line x1="393.75" x2="393.75" y1="22.75" y2="26.0" /><line x1="375.0" x2="375.0" y1="0" y2="3.25" /><line x1="375.0" x2="375.0" y1="22.75" y2="26.0" /><line x1="356.25" x2="356.25" y1="0" y2="3.25" /><line x1="356.25" x2="356.25" y1="22.75" y2="26.0" /><line x1="337.5" x2="337.5" y1="0" y2="3.25" /><line x1="337.5" x2="337.5" y1="22.75" y2="26.0" /><line x1="318.75" x2="318.75" y1="0" y2="3.25" /><line x1="318.75" x2="318.75" y1="22.75" y2="26.0" /><line x1="300.0" x2="300.0" y1="0" y2="26.0" /><line x1="281.25" x2="281.25" y1="0" y2="3.25" /><line x1="281.25" x2="281.25" y1="22.75" y2="26.0" /><line x1="262.5" x2="262.5" y1="0" y2="3.25" /><line x1="262.5" x2="262.5" y1="22.75" y2="26.0" /><line x1="243.75" x2="243.75" y1="0" y2="3.25" /><line x1="243.75" x2="243.75" y1="22.75" y2="26.0" /><line x1="225.0" x2="225.0" y1="0" y2="3.25" /><line x1="225.0" x2="225.0" y1="22.75" y2="26.0" /><line x1="206.25" x2="206.25" y1="0" y2="3.25" /><line x1="206.25" x2="206.25" y1="22.75" y2="26.0" /><line x1="187.5" x2="187.5" y1="0" y2="26.0" /><line x1="168.75" x2="168.75" y1="0" y2="26.0" /><line x1="150.0" x2="150.0" y1="0" y2="26.0" /><line x1="131.25" x2="131.25" y1="0" y2="3.25" /><line x1="131.25" x2="131.25" y1="22.75" y2="26.0" /><line x1="112.5" x2="112.5" y1="0" y2="3.25" /><line x1="112.5" x2="112.5" y1="22.75" y2="26.0" /><line x1="93.75" x2="93.75" y1="0" y2="3.25" /><line x1="93.75" x2="93.75" y1="22.75" y2="26.0" /><line x1="75.0" x2="75.0" y1="0" y2="3.25" /><line x1="75.0" x2="75.0" y1="22.75" y2="26.0" /><line x1="56.25" x2="56.25" y1="0" y2="3.25" /><line x1="56.25" x2="56.25" y1="22.75" y2="26.0" /><line x1="37.5" x2="37.5" y1="0" y2="3.25" /><line x1="37.5" x2="37.5" y1="22.75" y2="26.0" /><line x1="18.75" x2="18.75" y1="0" y2="26.0" /></g><g text-anchor="middle"><g><g transform="translate(0,13.0)" /><g transform="translate(9.375,10.4)"><text x="581.25"><tspan>0</tspan></text><text x="450.0"><tspan>7</tspan></text><text x="431.25"><tspan>8</tspan></text><text x="300.0"><tspan>15</tspan></text><text x="281.25"><tspan>16</tspan></text><text x="187.5"><tspan>21</tspan></text><text x="168.75"><tspan>22</tspan></text><text x="150.0"><tspan>23</tspan></text><text x="131.25"><tspan>24</tspan></text><text x="18.75"><tspan>30</tspan></text><text x="0.0"><tspan>31</tspan></text></g><g transform="translate(9.375,30.0)"><text x="515.625"><tspan>0</tspan></text><text x="365.625"><tspan>WRAP-TYPE</tspan></text><text x="234.375"><tspan>0</tspan></text><text x="168.75"><tspan>B</tspan></text><text x="150.0"><tspan>S</tspan></text><text x="75.0"><tspan>0x0B</tspan></text><text><tspan>0</tspan></text></g><g transform="translate(9.375,52)" /></g></g></g></svg> \ No newline at end of file +<svg baseProfile="full" class="WaveDrom" height="85" version="1.1" viewBox="0,0,809,85" width="809" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs /><g font-family="sans-serif" font-size="14" font-weight="normal" text-anchor="middle" transform="translate(4.5,0.5)"><g stroke="black" stroke-linecap="round" stroke-width="1" transform="translate(0,20.0)"><line x1="0" x2="800" y1="0" y2="0" /><line x1="0" x2="0" y1="0" y2="40.0" /><line x1="0" x2="800" y1="40.0" y2="40.0" /><line x1="800.0" x2="800.0" y1="0" y2="40.0" /><line x1="775.0" x2="775.0" y1="0" y2="5.0" /><line x1="775.0" x2="775.0" y1="35.0" y2="40.0" /><line x1="750.0" x2="750.0" y1="0" y2="5.0" /><line x1="750.0" x2="750.0" y1="35.0" y2="40.0" /><line x1="725.0" x2="725.0" y1="0" y2="5.0" /><line x1="725.0" x2="725.0" y1="35.0" y2="40.0" /><line x1="700.0" x2="700.0" y1="0" y2="5.0" /><line x1="700.0" x2="700.0" y1="35.0" y2="40.0" /><line x1="675.0" x2="675.0" y1="0" y2="5.0" /><line x1="675.0" x2="675.0" y1="35.0" y2="40.0" /><line x1="650.0" x2="650.0" y1="0" y2="5.0" /><line x1="650.0" x2="650.0" y1="35.0" y2="40.0" /><line x1="625.0" x2="625.0" y1="0" y2="5.0" /><line x1="625.0" x2="625.0" y1="35.0" y2="40.0" /><line x1="600.0" x2="600.0" y1="0" y2="40.0" /><line x1="575.0" x2="575.0" y1="0" y2="5.0" /><line x1="575.0" x2="575.0" y1="35.0" y2="40.0" /><line x1="550.0" x2="550.0" y1="0" y2="5.0" /><line x1="550.0" x2="550.0" y1="35.0" y2="40.0" /><line x1="525.0" x2="525.0" y1="0" y2="5.0" /><line x1="525.0" x2="525.0" y1="35.0" y2="40.0" /><line x1="500.0" x2="500.0" y1="0" y2="5.0" /><line x1="500.0" x2="500.0" y1="35.0" y2="40.0" /><line x1="475.0" x2="475.0" y1="0" y2="5.0" /><line x1="475.0" x2="475.0" y1="35.0" y2="40.0" /><line x1="450.0" x2="450.0" y1="0" y2="5.0" /><line x1="450.0" x2="450.0" y1="35.0" y2="40.0" /><line x1="425.0" x2="425.0" y1="0" y2="5.0" /><line x1="425.0" x2="425.0" y1="35.0" y2="40.0" /><line x1="400.0" x2="400.0" y1="0" y2="40.0" /><line x1="375.0" x2="375.0" y1="0" y2="5.0" /><line x1="375.0" x2="375.0" y1="35.0" y2="40.0" /><line x1="350.0" x2="350.0" y1="0" y2="5.0" /><line x1="350.0" x2="350.0" y1="35.0" y2="40.0" /><line x1="325.0" x2="325.0" y1="0" y2="5.0" /><line x1="325.0" x2="325.0" y1="35.0" y2="40.0" /><line x1="300.0" x2="300.0" y1="0" y2="5.0" /><line x1="300.0" x2="300.0" y1="35.0" y2="40.0" /><line x1="275.0" x2="275.0" y1="0" y2="5.0" /><line x1="275.0" x2="275.0" y1="35.0" y2="40.0" /><line x1="250.0" x2="250.0" y1="0" y2="40.0" /><line x1="225.0" x2="225.0" y1="0" y2="40.0" /><line x1="200.0" x2="200.0" y1="0" y2="40.0" /><line x1="175.0" x2="175.0" y1="0" y2="5.0" /><line x1="175.0" x2="175.0" y1="35.0" y2="40.0" /><line x1="150.0" x2="150.0" y1="0" y2="5.0" /><line x1="150.0" x2="150.0" y1="35.0" y2="40.0" /><line x1="125.0" x2="125.0" y1="0" y2="5.0" /><line x1="125.0" x2="125.0" y1="35.0" y2="40.0" /><line x1="100.0" x2="100.0" y1="0" y2="5.0" /><line x1="100.0" x2="100.0" y1="35.0" y2="40.0" /><line x1="75.0" x2="75.0" y1="0" y2="5.0" /><line x1="75.0" x2="75.0" y1="35.0" y2="40.0" /><line x1="50.0" x2="50.0" y1="0" y2="5.0" /><line x1="50.0" x2="50.0" y1="35.0" y2="40.0" /><line x1="25.0" x2="25.0" y1="0" y2="40.0" /></g><g text-anchor="middle"><g><g transform="translate(0,20.0)" /><g transform="translate(12.5,16.0)"><text x="775.0"><tspan>0</tspan></text><text x="600.0"><tspan>7</tspan></text><text x="575.0"><tspan>8</tspan></text><text x="400.0"><tspan>15</tspan></text><text x="375.0"><tspan>16</tspan></text><text x="250.0"><tspan>21</tspan></text><text x="225.0"><tspan>22</tspan></text><text x="200.0"><tspan>23</tspan></text><text x="175.0"><tspan>24</tspan></text><text x="25.0"><tspan>30</tspan></text><text x="0.0"><tspan>31</tspan></text></g><g transform="translate(12.5,44.0)"><text x="687.5"><tspan>0</tspan></text><text x="487.5"><tspan>WRAP-TYPE</tspan></text><text x="312.5"><tspan>0</tspan></text><text x="225.0"><tspan>B</tspan></text><text x="200.0"><tspan>S</tspan></text><text x="100.0"><tspan>0x0B</tspan></text><text><tspan>0</tspan></text></g><g transform="translate(12.5,80)" /></g></g></g></svg> \ No newline at end of file diff --git a/doc/crypto/figure/encoding/key_type.pdf b/doc/crypto/figure/encoding/key_type.pdf index 9cdf9ffb8fe0566d4ebe55808aa09895d1ff7492..a0d5072553831d160141078a9e03dbc96f8d1db9 100644 GIT binary patch delta 324 zcmV-K0lWU;N#seem?D2sYlAQph2Q-Z=VeS8XcDzui}axiWsHH?y^TGD7_2aiByp_& zeu>tO5x8(a?#VfqOF;sbB6k%urvb~5Zg)XZAbG!z5=qTFX#xPrYu_4tfPtXF=Zs1< z4Hh&w9A-tWRXYi(5enXG1sc=mI74``b~O7WnQ5o_c<F_SmF|C{X!%A<ZhJLU+)9Mi zo)NYo8?vL6Fh-vUeIz7WP5xrx!C8BK&9(G7e6kt5$+qW5_2c3a_gG5fZH|ojx+Wj2 z(->rT(MhXmL{a$0_lwa?S9Eq%^TCYXP+V910;?yvcBPxD<aaM*b2@tHf_vUbqb4n+ zL3;N*JE5>ke&ZHS@o&eHTmGfG+luZCw+-FUFA;)o%9E)h9|AZqlgcCG4fg@Xl&>-{ W006PP4tSHgBp(Pf3MC~)Peuwei<rd# delta 321 zcmV-H0lxm^N#RMbm?D2cYlJWmh421~cPZ#aP1J6?$R1W<DW$NuJ#FbB#NZ0WND@o; z-*=+xmJ*mSAM<A3FbrwHGZYlT^2dPZ$ToRUmPp>Oqe5~Now5Od<h5@tKERQp!RL%B zJq->l*zIP;(dc%P${>`YHySKvPccV$ac;ERB$;Vv#CYkYjkSO2qG)MjlyJQsYT*>Z zddpK@q#0wZp#S+Ct^NNT;en=l=}{QvEqGHicvEdJ_WFmMru2Bm;!S~^`?#7O9BC}_ zyXau_G@>kh;`3$DOjmRwYQ$hiKTuv*`~qhtwPqDn)#|&KsyXaEB;%ep%Ie8TWs%)y zo=7O&;@{F0{_PW32`9dEcUzGzaNCfIegSnlZxWNNBOd}cH<QgH;|+HM#gs2GFaQ9t Tn+|f5y(Aw9FbX9lMNdWwLBE^4 diff --git a/doc/crypto/figure/encoding/mac.json b/doc/crypto/figure/encoding/mac.json index 9d024995..c0324253 100644 --- a/doc/crypto/figure/encoding/mac.json +++ b/doc/crypto/figure/encoding/mac.json @@ -11,7 +11,7 @@ ], "config": { "lanes": 1, - "fontfamily": "lato", + "fontfamily": "roboto", "fontsize": 11, "vspace": 52, "hspace": 600 diff --git a/doc/crypto/figure/encoding/mac.pdf b/doc/crypto/figure/encoding/mac.pdf index 28c03bb74076056599f694ad092eede70ba10f3b..721bf6b6cfc941415ea18a4a2fd842d0c16c6311 100644 GIT binary patch delta 9167 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 z%0A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 delta 7205 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 diff --git a/doc/crypto/figure/encoding/mac.svg b/doc/crypto/figure/encoding/mac.svg index 0b578cdb..4983f317 100644 --- a/doc/crypto/figure/encoding/mac.svg +++ b/doc/crypto/figure/encoding/mac.svg @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" ?> -<svg baseProfile="full" class="WaveDrom" height="57" version="1.1" viewBox="0,0,609,57" width="609" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs /><g font-family="Lato,sans-serif" font-size="11" font-weight="normal" text-anchor="middle" transform="translate(4.5,0.5)"><g stroke="black" stroke-linecap="round" stroke-width="1" transform="translate(0,13.0)"><line x1="0" x2="600" y1="0" y2="0" /><line x1="0" x2="0" y1="0" y2="26.0" /><line x1="0" x2="600" y1="26.0" y2="26.0" /><line x1="600.0" x2="600.0" y1="0" y2="26.0" /><line x1="581.25" x2="581.25" y1="0" y2="3.25" /><line x1="581.25" x2="581.25" y1="22.75" y2="26.0" /><line x1="562.5" x2="562.5" y1="0" y2="3.25" /><line x1="562.5" x2="562.5" y1="22.75" y2="26.0" /><line x1="543.75" x2="543.75" y1="0" y2="3.25" /><line x1="543.75" x2="543.75" y1="22.75" y2="26.0" /><line x1="525.0" x2="525.0" y1="0" y2="3.25" /><line x1="525.0" x2="525.0" y1="22.75" y2="26.0" /><line x1="506.25" x2="506.25" y1="0" y2="3.25" /><line x1="506.25" x2="506.25" y1="22.75" y2="26.0" /><line x1="487.5" x2="487.5" y1="0" y2="3.25" /><line x1="487.5" x2="487.5" y1="22.75" y2="26.0" /><line x1="468.75" x2="468.75" y1="0" y2="3.25" /><line x1="468.75" x2="468.75" y1="22.75" y2="26.0" /><line x1="450.0" x2="450.0" y1="0" y2="26.0" /><line x1="431.25" x2="431.25" y1="0" y2="3.25" /><line x1="431.25" x2="431.25" y1="22.75" y2="26.0" /><line x1="412.5" x2="412.5" y1="0" y2="3.25" /><line x1="412.5" x2="412.5" y1="22.75" y2="26.0" /><line x1="393.75" x2="393.75" y1="0" y2="3.25" /><line x1="393.75" x2="393.75" y1="22.75" y2="26.0" /><line x1="375.0" x2="375.0" y1="0" y2="3.25" /><line x1="375.0" x2="375.0" y1="22.75" y2="26.0" /><line x1="356.25" x2="356.25" y1="0" y2="3.25" /><line x1="356.25" x2="356.25" y1="22.75" y2="26.0" /><line x1="337.5" x2="337.5" y1="0" y2="3.25" /><line x1="337.5" x2="337.5" y1="22.75" y2="26.0" /><line x1="318.75" x2="318.75" y1="0" y2="26.0" /><line x1="300.0" x2="300.0" y1="0" y2="26.0" /><line x1="281.25" x2="281.25" y1="0" y2="3.25" /><line x1="281.25" x2="281.25" y1="22.75" y2="26.0" /><line x1="262.5" x2="262.5" y1="0" y2="3.25" /><line x1="262.5" x2="262.5" y1="22.75" y2="26.0" /><line x1="243.75" x2="243.75" y1="0" y2="3.25" /><line x1="243.75" x2="243.75" y1="22.75" y2="26.0" /><line x1="225.0" x2="225.0" y1="0" y2="3.25" /><line x1="225.0" x2="225.0" y1="22.75" y2="26.0" /><line x1="206.25" x2="206.25" y1="0" y2="3.25" /><line x1="206.25" x2="206.25" y1="22.75" y2="26.0" /><line x1="187.5" x2="187.5" y1="0" y2="26.0" /><line x1="168.75" x2="168.75" y1="0" y2="26.0" /><line x1="150.0" x2="150.0" y1="0" y2="26.0" /><line x1="131.25" x2="131.25" y1="0" y2="3.25" /><line x1="131.25" x2="131.25" y1="22.75" y2="26.0" /><line x1="112.5" x2="112.5" y1="0" y2="3.25" /><line x1="112.5" x2="112.5" y1="22.75" y2="26.0" /><line x1="93.75" x2="93.75" y1="0" y2="3.25" /><line x1="93.75" x2="93.75" y1="22.75" y2="26.0" /><line x1="75.0" x2="75.0" y1="0" y2="3.25" /><line x1="75.0" x2="75.0" y1="22.75" y2="26.0" /><line x1="56.25" x2="56.25" y1="0" y2="3.25" /><line x1="56.25" x2="56.25" y1="22.75" y2="26.0" /><line x1="37.5" x2="37.5" y1="0" y2="3.25" /><line x1="37.5" x2="37.5" y1="22.75" y2="26.0" /><line x1="18.75" x2="18.75" y1="0" y2="26.0" /></g><g text-anchor="middle"><g><g transform="translate(0,13.0)" /><g transform="translate(9.375,10.4)"><text x="581.25"><tspan>0</tspan></text><text x="450.0"><tspan>7</tspan></text><text x="431.25"><tspan>8</tspan></text><text x="318.75"><tspan>14</tspan></text><text x="300.0"><tspan>15</tspan></text><text x="281.25"><tspan>16</tspan></text><text x="187.5"><tspan>21</tspan></text><text x="168.75"><tspan>22</tspan></text><text x="150.0"><tspan>23</tspan></text><text x="131.25"><tspan>24</tspan></text><text x="18.75"><tspan>30</tspan></text><text x="0.0"><tspan>31</tspan></text></g><g transform="translate(9.375,30.0)"><text x="515.625"><tspan>HASH-TYPE or 0</tspan></text><text x="375.0"><tspan>MAC-TYPE</tspan></text><text x="300.0"><tspan>W</tspan></text><text x="234.375"><tspan>LEN</tspan></text><text x="168.75"><tspan>B</tspan></text><text x="150.0"><tspan>1</tspan></text><text x="75.0"><tspan>0x03</tspan></text><text><tspan>0</tspan></text></g><g transform="translate(9.375,52)" /></g></g></g></svg> \ No newline at end of file +<svg baseProfile="full" class="WaveDrom" height="57" version="1.1" viewBox="0,0,609,57" width="609" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs /><g font-family="Roboto,sans-serif" font-size="11" font-weight="normal" text-anchor="middle" transform="translate(4.5,0.5)"><g stroke="black" stroke-linecap="round" stroke-width="1" transform="translate(0,13.0)"><line x1="0" x2="600" y1="0" y2="0" /><line x1="0" x2="0" y1="0" y2="26.0" /><line x1="0" x2="600" y1="26.0" y2="26.0" /><line x1="600.0" x2="600.0" y1="0" y2="26.0" /><line x1="581.25" x2="581.25" y1="0" y2="3.25" /><line x1="581.25" x2="581.25" y1="22.75" y2="26.0" /><line x1="562.5" x2="562.5" y1="0" y2="3.25" /><line x1="562.5" x2="562.5" y1="22.75" y2="26.0" /><line x1="543.75" x2="543.75" y1="0" y2="3.25" /><line x1="543.75" x2="543.75" y1="22.75" y2="26.0" /><line x1="525.0" x2="525.0" y1="0" y2="3.25" /><line x1="525.0" x2="525.0" y1="22.75" y2="26.0" /><line x1="506.25" x2="506.25" y1="0" y2="3.25" /><line x1="506.25" x2="506.25" y1="22.75" y2="26.0" /><line x1="487.5" x2="487.5" y1="0" y2="3.25" /><line x1="487.5" x2="487.5" y1="22.75" y2="26.0" /><line x1="468.75" x2="468.75" y1="0" y2="3.25" /><line x1="468.75" x2="468.75" y1="22.75" y2="26.0" /><line x1="450.0" x2="450.0" y1="0" y2="26.0" /><line x1="431.25" x2="431.25" y1="0" y2="3.25" /><line x1="431.25" x2="431.25" y1="22.75" y2="26.0" /><line x1="412.5" x2="412.5" y1="0" y2="3.25" /><line x1="412.5" x2="412.5" y1="22.75" y2="26.0" /><line x1="393.75" x2="393.75" y1="0" y2="3.25" /><line x1="393.75" x2="393.75" y1="22.75" y2="26.0" /><line x1="375.0" x2="375.0" y1="0" y2="3.25" /><line x1="375.0" x2="375.0" y1="22.75" y2="26.0" /><line x1="356.25" x2="356.25" y1="0" y2="3.25" /><line x1="356.25" x2="356.25" y1="22.75" y2="26.0" /><line x1="337.5" x2="337.5" y1="0" y2="3.25" /><line x1="337.5" x2="337.5" y1="22.75" y2="26.0" /><line x1="318.75" x2="318.75" y1="0" y2="26.0" /><line x1="300.0" x2="300.0" y1="0" y2="26.0" /><line x1="281.25" x2="281.25" y1="0" y2="3.25" /><line x1="281.25" x2="281.25" y1="22.75" y2="26.0" /><line x1="262.5" x2="262.5" y1="0" y2="3.25" /><line x1="262.5" x2="262.5" y1="22.75" y2="26.0" /><line x1="243.75" x2="243.75" y1="0" y2="3.25" /><line x1="243.75" x2="243.75" y1="22.75" y2="26.0" /><line x1="225.0" x2="225.0" y1="0" y2="3.25" /><line x1="225.0" x2="225.0" y1="22.75" y2="26.0" /><line x1="206.25" x2="206.25" y1="0" y2="3.25" /><line x1="206.25" x2="206.25" y1="22.75" y2="26.0" /><line x1="187.5" x2="187.5" y1="0" y2="26.0" /><line x1="168.75" x2="168.75" y1="0" y2="26.0" /><line x1="150.0" x2="150.0" y1="0" y2="26.0" /><line x1="131.25" x2="131.25" y1="0" y2="3.25" /><line x1="131.25" x2="131.25" y1="22.75" y2="26.0" /><line x1="112.5" x2="112.5" y1="0" y2="3.25" /><line x1="112.5" x2="112.5" y1="22.75" y2="26.0" /><line x1="93.75" x2="93.75" y1="0" y2="3.25" /><line x1="93.75" x2="93.75" y1="22.75" y2="26.0" /><line x1="75.0" x2="75.0" y1="0" y2="3.25" /><line x1="75.0" x2="75.0" y1="22.75" y2="26.0" /><line x1="56.25" x2="56.25" y1="0" y2="3.25" /><line x1="56.25" x2="56.25" y1="22.75" y2="26.0" /><line x1="37.5" x2="37.5" y1="0" y2="3.25" /><line x1="37.5" x2="37.5" y1="22.75" y2="26.0" /><line x1="18.75" x2="18.75" y1="0" y2="26.0" /></g><g text-anchor="middle"><g><g transform="translate(0,13.0)" /><g transform="translate(9.375,10.4)"><text x="581.25"><tspan>0</tspan></text><text x="450.0"><tspan>7</tspan></text><text x="431.25"><tspan>8</tspan></text><text x="318.75"><tspan>14</tspan></text><text x="300.0"><tspan>15</tspan></text><text x="281.25"><tspan>16</tspan></text><text x="187.5"><tspan>21</tspan></text><text x="168.75"><tspan>22</tspan></text><text x="150.0"><tspan>23</tspan></text><text x="131.25"><tspan>24</tspan></text><text x="18.75"><tspan>30</tspan></text><text x="0.0"><tspan>31</tspan></text></g><g transform="translate(9.375,30.0)"><text x="515.625"><tspan>HASH-TYPE or 0</tspan></text><text x="375.0"><tspan>MAC-TYPE</tspan></text><text x="300.0"><tspan>W</tspan></text><text x="234.375"><tspan>LEN</tspan></text><text x="168.75"><tspan>B</tspan></text><text x="150.0"><tspan>1</tspan></text><text x="75.0"><tspan>0x03</tspan></text><text><tspan>0</tspan></text></g><g transform="translate(9.375,52)" /></g></g></g></svg> \ No newline at end of file diff --git a/doc/crypto/figure/encoding/np_key.pdf b/doc/crypto/figure/encoding/np_key.pdf index 3fd01139506709fe3b1f38d691e7eda1213b0c9e..7c3ec8ffd1984a2df00e02b0b6114365a985cd6e 100644 GIT binary patch delta 355 zcmV-p0i6EoHt#mDI2nJzYQr!PMDPBJxs=)zY^`EDO)xnmflx}pB)yd$ge)9Gv5X{_ z=I<*xaY_*^>|;kW%Mw^bB?=aCP(cwbu~@F6szUaD85FWww8};Rve&M$_y7mP5uX#< z>9Kd9XtS9Vwb9Kel|d{;XEZ3K=QKxrc5bliESqR+#BlDUO|^e%ljQo1QNne)-wUS@ z@7J91l9g;l#5kuXMvsgov&mm9Jb3G%uZ2+|M@Tk-H`R1vtABi4<{w{Bx-5|MQ0L^m z^BRl%E;<-J4ydZog#KzY(HWgQHKMmeFqD@WzrdMM&E3vV?bUZD)$y<m&<79vsH`51 zR2GZ7=gAADyXF|T{uKXq+zBVXbbDLTpW(KlANmCtFmKM2Ar=#pTpA1lI5LxJ8qG5j zfMQbR3=9C?00`6yWo~41baG{3Z3<;>WN%_>3UhQ}a&&ldWo8OCH#ap3B_%~qMhft! Bp<Ms~ delta 332 zcmV-S0ki(^HtII8I2nIIYlJWmh421~cPZ#alc;OE$R1W<DWxE8Pc1!!7+j$kNn+{# z`zE?>DS?Ffm^beYp&$X>AtwO?&2|ATkQP}`mPp>NlSI<+UYY<v@-lP=A7CJ8@wuQ% z&7%bk4u?h2Xw}U^YJ`FhT7ky&F=hxa)=p-hBn#~|pDu$ivC@Bi6s=>l<aSVF&8<XO z?-^k^Nhzhdd!OE;ZT?>(JUCY`ZMc>`f)BNTSJ@5xsD4~h;toq`T;#}@zqin%bsB^0 zE;?y7Pbf=Y_<A*3=!VXYYCf9D8;a|OpJDYZx2keowfr80Y)?lIU2xA^Y1FKRG)V8B zXD1YP&2QW<{M!?;;+B7@{<fm~f!l_z=@)y{Zx)jw784FQATS_rVrmK?ARsa~H<ND~ e%?zS}Vp2s63;^B92+EU48y^TT3MC~)Peuxta+B)- diff --git a/doc/crypto/figure/encoding/pake_encoding.pdf b/doc/crypto/figure/encoding/pake_encoding.pdf index 96f947448414c804756207580ee249c1ea805e05..214de73498527b93cda094d819153a474d967a8b 100644 GIT binary patch delta 325 zcmV-L0lNP9JN!Ga#T$QLYlAQp#ozrD=VeS8Xp;J8Ez*Z7lraX<?rrQL#9)PCB#C4F z_Di&OjKGEa<DQ&zxfCRzIWiJ3(2NGOz^2#+Wr^hdI!YuB@1zL;B(HsI@Bs#b6Fz5D zscEpF!G1q08m-z%NR3eNUMtX;KF2A-i?yTKCCN-X&BseGOss!&7e&iAT5{W~q2^X1 ztapsCoaAInDPfF05&B3-w3__I!h^H+`i5)ibNFO4c$00<59-IoCGMqJ9v2x>=Ife# zuufx;-bF{PrV(Z78{aQRGhNZyQOyT4dP8wt@e8b;<l0qks+Qlqkf-CpLl@lhlQe45 zLK<xDo@XZ%cF7oT+$sL;SaHk0RCim^o#D2j8~OzwhHuxC*Bl=LI5Ly?9L)^g0>xxm X7#INQ%n6p0(H$QMI0_{tMNdWw8~>hh delta 321 zcmV-H0lxnHJNP@W#T$RkYJ@Nph4((i*%Wl6iGR}$GK*0dN-2obRZABk1}9LAB(Zef zzKM=gN+98W+;h*lgn|ULL_vZSG%o|XL$=F<szUO1odlAW4Z;Kfk{8(<d>{ouhtCDo zY91|Ua5yZAR;zyILL=l%Y6Tk8$2diJv34^1Bw6U7*>sWI#7ch;QM8WHf?27?hFO8I z*{38eNJc3w-23z%ZS(&U;la6jY0I?m5qzixyoz43qxx}4i92~w#=8P}>hCS|Xr0C& zzl%;<%@eB17rtJN7P_IcqneFo@`n7n;b&Mqi><0%S0lb97v1UTp$qPLCybgk7Y5ng z^X!D&uKA7og?|(~*37amHQZKoKXBX7HT?pEDsLZ?+Z-PPH#n309L)?~0>xw*7#INQ Tpb3tX)g2!QGzujpMNdWwn5CCe diff --git a/doc/crypto/figure/encoding/pke.pdf b/doc/crypto/figure/encoding/pke.pdf index 3a26571f7f213ef7d24f60b2e242b4552a97454b..1a2b2eae1c792de67ac463cbc86091b85193bd96 100644 GIT binary patch delta 333 zcmV-T0kZyvM~O$UJRyHkYlAQph2Q-Z=VeS8Xp*X3i}axiWsHH?y^TGD7_2aiByp_& zeu>tO5x8(a?#VfqOF;s*LFOuGMgx{&v)u(nf#m%<N+dP!qzM2duYGIq0S1BwpED}e zG+5B!aF`XfR_!FDMksi%6=+PK;}qe=+R^NjWTu_w<E0lSR=R(SqU9Scx$V_ZaVrs4 zdq!AJa<Ze8Fh-vUeIz7WP5xrx!C8BK&9(G7e6kt5$+qW5_2c3a_tGqnw;59A>zaJ9 zPGgYXMJKJM5k=t}-!DcpUD4T5%?C4jLvda43#^{x+LdmqlHa|M&FSc&3+{O%jheKO z2AjL**$IVR@*5X-ihnzn-10Bg-BxsGxNYc$egPQRZ_|@aA|C=cF_Ug0Edeo;9|Reb fwIZGiWT2Q5&=dgcP!7P8Un3s~HVP#rMNdWwotm7C delta 352 zcmV-m0iXVfM}|kRJRyHUYlJWmh421~cPZ#aP1N0Xkv*)!Qc6K~dur(+#NZ0WND@o; z-*=+xmJ*mSAM<A3FbrwHGZYlT@=d^VWZOI_OC)dCQ6XtWr)&TqdFfk=4{)S7;d4fn zo(2aN?Dw;xF}j_kG6<#UjRuR^W6Tj=oEz;fNoLv^F<yFUV{L!BC|cSWC0wtES~!KU z-tm+dX~q~U=zn^T*8YEv@IX_&v=K&m3*OWWURB$RgZ?3>DZRYd#M=Tn_i;5nIMP_; zchS-4X+&B2#OKSPnXc$e)QG{3exSUr_!-VjYRxLDs?~Qd)#-Tfkc@kNQdUn!DvRts z^GrhN7XOy6@NW~xN;vVQyW5I%f!l^u^b35DZyS?QA|C=bH<NNAEder<pdz<3c%Yb4 y83O|V>m&}i3T19&b98cLVQmU!Ze(v_Y6^37VRCeMa%E-;I5;vg3MC~)Peuyqs-y(~ diff --git a/doc/crypto/figure/encoding/raw_key.pdf b/doc/crypto/figure/encoding/raw_key.pdf index c6e94514217d56cac21d03ca5b7237d2c82417a8..12bfdbc8b21c7e5c7ee1f9954ec8a57c9f9e4c82 100644 GIT binary patch delta 362 zcmV-w0hRumI-WYP=Nf;(YQr!PMDPBJxs=)zY^`EDO)xnmflx}pB)yd$ge)9Gv5X{_ z=I<*xaY_*^>|;kW%Mw^bB?=aCP(cwbu~@F6szUaD85FWww8};Rve&M$_y7mP5uX#< z>9Kd9XtS9Vwb9Kel|d{;XEZ3K=QKxrc5bliESqR+#BlDUO|^e%ljQo1QNne)-wUS@ z@7J91l9g;l#5kuXMvsgov&mm9Jb3G%uZ2+|M@Tk-H`R1vtABi4<{w{Bx-5|MQ0L^m z^BRl%E;<-J4ydZog#KzY(HWgQHKMmeFqD@WzrdMM&E3vV?bUZD)$y<m&<79vsH`51 zR2GZ7=gAADyXF|T{uKXq+zBVXbbDLTpW(KlANmCtFmKM2_!}PrI5LwN94i7hIg@b~ z8IxZehciH?$fz+e008++2^tDzZe(+Ga%Ev{3T19&Z(?c+b97;Hba--QW(qelFg6M$ IB}Gq03XCJ8r~m)} delta 332 zcmV-S0ki&|I+{AL=Nf-OYlJWmh421~cPZ#alc;N1WDl#blu{74r!GB&7+j$kNn+{# z`zE?>DS^Oz%$xUyp&$X>AtwO?&2|ATkQP}`mPp=jlSI<+UYY<v@;Y<|7cdaC_*_t> z=Fx%%hr^<1wCZLdHA2A$tw3Y?95aMhYbUc$l7;q~PuD@1Sm}R0iq<h&ayzK8=2jxC z_l&Tdq?FQ}<&=Cx+x)*ocyg{@+Hfs>1RrVvZ?YTsQT@22#66bMxX6()|8Jp3>of-0 zLv+$=o=}#)@bzl6&<&j()qFIQHx#!GzrgBQZdK*FYWY0~*`AIby5OF-(x_PrX^=iV z&rT@pn%}r9{M!?;;+B7@{=TBSz<op4^b2!UZw{0F8y^BUH<KP5D*`w$lW`UqlVlu+ e4S<F+$|y20008+F2@sR_93KcV3MC~)Peuxpf1DHm diff --git a/doc/crypto/figure/encoding/sign.pdf b/doc/crypto/figure/encoding/sign.pdf index 752da30a92858dab7aeb6e859973c553b9616915..1c34df95596844282503d493f442375ffb663cb1 100644 GIT binary patch delta 314 zcmV-A0mc5KMyE!w<sg4d8EBHKU5oUg3T2Fe*u9NCgcz(aj3jZa|9*+qjuE(UKkmsn zmrFqcwn649Xhs8;Vzb=^MS<k~I!Yup@1zL;B(HsI@Bs#b2A?x3)ihYp;Bc4~wN~vU zq(&%suN7!apW_ta#oE#AlVqly=HsOoCRVzOqU9Scx$V_ZaVvijR(nQRPI9uNlrTo0 z2z?|ZT2209;lWvZea*G>IefAiyverbNA=_468F+9kGC08=Ife#uufx;-bE*^rV&Nq z8{aQRGhNZyQOyT4dP8wt@e8b;<l2>Ps*>Nmkj?4np$qPLBaNE0kOrH(=h+E`UGf`u zihnzn-10Bg-Bt{AXSi+XhJFDU*l*L5>meTkI5Cq9BI6BW1d1t1FfafB`P~iLll&qd M2sjEQB}Gq03SGLEi2wiq delta 309 zcmV-50m}ZTMx#cs<sg5cFKVJ`N0B~Mp^Pyoc26sN2r<~eFp|Wv{`)0bJ4WEb{kZ3z za|uBn(E`j@ka82z62-QRstVcrZIsAPyq7itkiDwT;sS~sEk0*d>uGQx(SAQGPDXc= zkOr~f%4m?3Jf{@#)w$8`vTUZk;p0^an`+Z1$+E^s?vx%H?j(QWW=C_%@`4b;C?okt zvhM#&geUJBq$h4<h!8@};7xXlAM}q;n)_F>O}b?$X{c-H!Fi2E`4AnAo<>wvXhOdj z&2&X)PYoaJ7!1X2#V>GXl51D{sYZS)A=~32Kp#BtR$4t7AuWoB=h+K|Tk>1~3;%Ac zx#M5Dzn|!T;C=|9ANmD!5pNTd?;#%oH#d_IBI6DG3lvilVPF6N0k;m(k|Q4oGzujp HMNdWw(*2KY diff --git a/doc/crypto/figure/encoding/slh_dsa_key.pdf b/doc/crypto/figure/encoding/slh_dsa_key.pdf index 9da4f4376ad899e8f6e8e9040108002b03108855..4168683c1c0050b650ef7456a4156f5658870bbf 100644 GIT binary patch delta 343 zcmV-d0jU1cHP<z;pcsF_YQr!PMDPBJxs*B-Y^|I)O)xnmflx{zIK7n~ge)9Ev5X{_ z=I<*xaY_*^>|;kW%Mw^ZB^E5<pamtgM6p~YRfYWh(ktXg(JGe!$X|8i@Bt2n8lNND znW6KbWV0C+M{AlvDvMMKZ4D@+=WLGj?0xUnc|OwCivFyn%Zz_*XS3@!Rtc|7w-;U^ z-LE<0B`evAh;h!J7(FsJn@s*<;UQQ@{ZUvIbHrpLcvFoQTk{j*vha98*>Zt7k9A7k z`Ji!_-$e&&h8|TFo7i8CMmnKWpjLFQkB0Ix;TL#2sHxk9slEEvQq_lTgduq3wQ^># zQaKcN&r=Xef6W;0!YTgkxD#G{nfA6~IKyqjF!T!<MQ_iOkrfjTI3O?}Z(?c+ARr(z pI5Lyd87u)gk{X~4CxBv-_Zb)f%P$EpldBpY2{JPZB_%~qMhb_Tn0o*K delta 335 zcmV-V0kHnpHPSV(pcsEoYlJWm#qWNKcPZ#allW)LB70bcrIdoWJ$30J#NZ0WND@o; z+c(j5O9=$#$GmxO7zz^50yzm7XjTMthjf<(Wr^hdHc2E6@1+R<B(FnfZ~+5Bi_ZmB zY91|Ua5yZAMyqZXQX>?6&<ZrB&oM)IwRST5Bw1*$`E(tGiIsouqi7wYCAWhbYi=dN zdd~>UNlGcrS)LXj(Ki1t5uTi@mo{8WAHj!Oz?<v_epEj$DRGabG~VUNnE$uXqjegC z>>)a7HBTr@U-)`8TIhz(j%q%d$s3B>hF@UyEVrt1UA6okgltbo4_$E2TWQp+g)~SX zo@XZ%cFk|x75)_MSaHk0RDWO5UEsc<Yx)Iy*KZb+krfk@$r%g+H#n2m87u)flWYSW hlOY;|3m|Qhw;31!%L54~ldu{d2{AbeB_%~qMhX#3j_3dY diff --git a/doc/crypto/figure/encoding/spake2p_key.pdf b/doc/crypto/figure/encoding/spake2p_key.pdf index 84aab3376b1395de84d7a5bb0285b826e151beee..f200a285122a7becfacc6eca49f06a96e69a7fa5 100644 GIT binary patch delta 326 zcmV-M0lEI-Ip;aBuo{2CYQr!PMDPBJxs*B-Y^|I)O)xnmflx{zIK7n~ge)9Ev5X{_ z=I<*xaY_*^>|;kW%Mw^ZB^E5<pamtgM6p~YRfYWh(ktXg(JGe!$X|8i@Bt2n8lNND znW6KbWV0C+M{AlvDvMMKZ4D@+=WLGj?0xUnc|OwCivFyn%Zz_*XS3@!Rtc|7w-;U^ z-LE<0B`evAh;h!J7(FsJn@s*<;UQQ@{ZUvIbHrpLcvFoQTk{j*vha98*>Zt7k9A7k z`Ji!_-$e&&h8|TFo7i8CMmnKWpjLFQkB0Ix;TL#2sHxk9slEEvQq_lTgduq3wQ^># zQaKcN&r=Xef6W;0!YTgkxD#G{nfA6~IKyqjF!T!<MQ_iO!5bd}I5Lys8_f(ifMU|` Y85jWB6$yxwyBr<~H8Bb$B}Gq03K40RKmY&$ delta 321 zcmV-H0lxm{IpR66uo{0sYlJWmh421~cPZ#alc;N1WDl#blu{74r!GB&7+j$kNn+{# z`zE?>DS^Oz%$xUyp&$X>AtwO?&2|ATkQP}`mPp=jlSI<+UYY<v@;Y<|7cdaC_*_t> z=Fx%%hr^<1wCZLdHA2A$tw3Y?95aMhYbUc$l7;q~PuD@1Sm}R0iq<h&ayzK8=2jxC z_l&Tdq?FQ}<&=Cx+x)*ocyg{@+Hfs>1RrVvZ?YTsQT@22#66bMxX6()|8Jp3>of-0 zLv+$=o=}#)@bzl6&<&j()qFIQHx#!GzrgBQZdK*FYWY0~*`AIby5OF-(x_PrX^=iV z&rT@pn%}r9{M!?;;+B7@{=TBSz<op4^b2!UZw`~j8y^BUH<RZZ%?y`;V$!b|7y#Jb T34W8n93BZYHVP#rMNdWwn9iIY diff --git a/doc/crypto/figure/encoding/structured_key.pdf b/doc/crypto/figure/encoding/structured_key.pdf index a27a2c8abe75167f2d340126092205f1b9024497..5bf0483a13f75f017d9bcca239c3d16dc98942bc 100644 GIT binary patch delta 6430 zcmai&bx>SekcS!E-61fz2ABZ`o8ayq+}%BB1`WX>xCM8D4I11v86arz5J(;xB)BYj z``+$W?N)8w>eF3)&-vZHr~9w(9vUfz$)YJM{~W|4l!7S_6LVkXBa94sz|OEK5`1;7 zn~kbY$b^2Ui9P5+G}HhXd@0OvdMTsKELUNGhVjeo4gU>$zHE`eHNPbtt<?GH52Y?F z_(vi0@5=;C1uz^Py9dlPihw=2RS88Dd2wtu-ksbb!R~|(xBguLYRS`6=9pQBt_kCS z=ZVU>rBnl2urfP8eDfQ7!ADaW406Xxz3oCf+-c03oIVUub}dv@N8S@=Rm+4|x<Ur} zD!v9n{zj!_@Gm+2U!0sO1S2Z0QCV>*dTF2^%KeP^{d2rgsxaTbBM~dYeE1m<*t-3w zn-D=AsJQLAg7?}}u!XmQ3i=6Hdg6ABu2EB!zkr*O0b`7}*Jn}r3eMMIQHdcRxC$2d z<mFTukz=RyI`^=&`ug43zGz^TqhEmFT;`%cuPb9bjjNUdfmr*iR|n-A>8%ta_4e1E zL{$g+`^L8Sa#<D^tv)0cKI9Q5>fa6=!8%3U8sE&Q@-HpxH6^$ytR~ot6=!xMxRU}z zUA}0I2HRhg9f6W&wpXnbbF{~z8+TSXeDrQxB(DYSOqUPXBC}3+t=rbq6TQ9m;1^0E z?RPh72(vXkd2tLHcAt?$uaf+m2gez}yzZNwqdgPE=hP<SQJFrzAeZz&FT4B~=0h!4 zI0d>PNU0!XdVp}M7P2`&D76up?1eCp59n^?gbjrPd36IkY=OKQR!%xTuGl~zkXO~# z&ECfWDDt#N`|pH05cIc~cl7f10Sct{qfn(t;tKKW@NLHK#_k{^p$h{{v2ERKynVcE zEnWXaf5iU?{P9nkAjrQ-5Gd7>f&>6g?MC5%2?+@ZV2g`m|8vei@6a&F$9OoqAUmj@ zStY~8kawjipUZsTa$nic%D8DelhLp>=5Q%dhH+S((eN|QO3YbtKsZVmHOWtM10YBH z^T?NDM`j|W3~A&8MchFdYjDlLi@e#g!!W$&=(X}mj!w1{>)wucs>oPD>WCv4jLTMF zV=9>cETs1s#E(CK$sm{`iTjPj`s9S*?n?)z<0uj1K1tj0PG;xl2Q+DsW2D8h=iA1k z;*i%KR7I<qgtO3A-}AnV7NdE6O0fvdi`*5+Xf%AUi-19Q4lSg|b-L)DiFH~W{jkZ^ zI_T2fyhvZ>Ho$=(@kn)uC=eeuW<~zm%KGGf`%31}b(-!CM4~6?>`MLj#m;p38847L zfY7SWi!J%td~x7h<UknE3X>I=P9cjWYYh+|Da8z!%8T70X6I5NlEaoOCaKb$VAtl1 zPB&Fc2n=~&qgu(%sZ$fT_QtL}&=3nm<?Dh^o|kCX+B(9Jw)a+ZPhbvqHETWXWs$qS z8|_tA*wZq)()2sylsKtg+2S__d|5iFH@3H|r|Yv`DaV+)z{_mY;lPl_Nt1c#qs%V7 zedcp(Vz@@r?Np*wHz8%^*(Id?ncw6^NZGtw=BtjHk03;z{rhess_D!$W9~ZQ5S*aB z34MAt#%fY0lPji`;qFiv?pRC)YAhjxKawSMHii-%4{4Hp&#S}4wpMf_Awf1eN}HFp zMKItKr9fZ61T}Awa&|mRX`ms$W#>&|FQj#wZ8Rt->Ct9%$$9ja=Sqkc7o7nA=02i% zeUt6DOZ3s5SB{a_a<Hb}YP&=6`|6#2{rj8WHZp_X>oxLkk{9S<jFB@O4U=R?SfvVe zp{5n6ahvHti{ezYeT!zgQX2U=j&nu#`F)X=VOODLC)XS5UhU}acH(WP7v8q`TTXUT z#tsk<->czcb#-;{aqN2n0ovRT2P2(z!SbGzrtMQaX!LxAWtF0uw*6I~B(cN$4_t~< zQ7Y`vkutQ(aZ1Wy>3;o2h2zrbE}E4IZel;pg7C=W@wsf@&dOg5R3egcJyBTu6GQIl z8r`9Djctg-y>&-^%#L{sv4#BAFJC>+SC=Y%*ykid6?|2$|FT}6-|lZUeL<#jJ4!v! z`7&tCrDv2|cyF|)m&NlYG4WUaj}f7VZ%7ZOW`GtpbZ>@M7~T0;>IW<%St?Zq;~`Fh z9jg4=uLmQnCDJjzO9@h(y&vXgBA0JycUH}vyA!dR%#72-?B^)F*aB6C^J?y+{QN!^ z4p_|7D;~m$E;vwotE4B9(}zRfVQ@=V2H3>QiyDUFC`g4{;(A~~Qp2pZ$m+h^G)xUI zWgth67oxM)z=q;LGHF0P!80k(zg(Q_=pIAvM=Y|rx@LaRyVPsjXRZkSyunu^z*jxS z)Bix{nAf}5^7TZz%C~uZb9NhMAP)WrFSFG-Bkp;vS7x#06-~FIy}xoZHnM(;zp*Y1 zi<alwZy<MhPauk_Wm*Wq;CCS!g8uB2K8LF!d*;ysV1zh-RZ<R{;{8^s;p|Rq3ii&H zcKygY7Sn`kuX=cXJC#9PF1k(9vgr6%m&#($&)WzTwpS1wF7*8*iRpkva~3}d!F8=^ zQ|<bBQRB8t-=jUBwAzQySDQ29op9d>L>r)aLG-XT#z~tb_rU$xUmqs9ZgV?HzKGH6 zMIZ0)w7`}ZiuImNX4J*%@g%i$Bw8tWG}Hw&G%_auuA0zX7EpTn8Td~zoYE{nUE1Ru zltZB<Kq&XE2)mf-M^fxaQoE>So2hw6ct1j9EZ9P{wn85sc8tXFv)}bQJ5#UCatCjg zJ5@Zt#?&)@a(KY^0eB?Si>Oa`CifX8XLoHU09f4X&;Tz#-I3R{4Q#+T3PH3Cv1gGD zf$<zyp->e{VNOC7!rV~iNx6Pvtej-9JYhUf|5g*nyuQ$dDUCG})RhO>yjoKfPuHOT zjXTYT@M}8_8N_{kV#~o=*TOD>3&OMiHd^$u{<mn5+wsYvGxdhd`<mJUcRTza7?<kq zOR)RXHCHsUo_BQvEQu_7GlOeIGj*}hk_6RyFK#p_A|gIW3PX^yPz%V0`70k4uM;50 zd0^m|bvUtLk>(DfVThox;YgvbNheh{RL0nJP^<yUC_^qbI@E)=rpi=OVXs`|R@xpf z>QpGk<Cow}{u|>RRHsUl>pHp71#9#<uv^mBjK)$gT}dXKbPU>N3>T^&e3M`;r03RJ zlw;C{fmiGfJc}!;5GP3zamkNAKKJw=Sk`}bF8@LILtQn(&Ej<(*@7-3Nj2_U!cW|0 zN`lOUyE08Bp<kvq<;QFUe)<}<U}vQZP*{z`<zus;*hdYHFHwq&>hjOJ&)c<(-@%M` zhZS%F=DWQWj`Y&Vp~^Yy%<{8llztc2yJp$9wbO4G5fZsCnYq~Z%d?QbzJZ3tN<Z(% zEwxpBL7w2f$zDjOnD*HfGPI)F)BHO8plY+cOx*<{1rN+#4p(VFYkKzSd2H1e+-xBu z&N$BJXHLU^9g~tfp3pZvcWN<=<F$oR$n14Cr9X%0kxi-lL#G;z5c5gxBu<kD5!ZtH z&aUF{$zro1dU_-(DjUr2;V1md`UNUL#8(UZ;LQY~N@+0fStD&k)t#y(^Y<J$?l;x? zifgJw@C#aVdc?!sw=WvrY<1N;-J9!!uQAUODup$(@PzxQxwZsMR&}}O`8{BS+V>~F zsRzf;j%d6K3V66@HWRyu6Ur5nR^V6R6iS1u2t^clW1sM)cah`xJJvA&b2*N+aGcES zB%nfT;jW|%&WH(?onuxw9$z@0t-)BXm?WkfQn62@D3l5*nuf(x4UdecUtbqfOEHP& zdM{aop6suhq%XYm?_5N!$XZ~6pCXk%LEqU<%mfXd{EC&WY-V`<^JkI2%;xm++Ni`) zjgFy@k#Q6+?MbwPm?>W4AW5_}9$x2rs^v$x`h~Q*x?@1q^wP`aC7qW%H;c6KZo#`2 zE4wWbIkY6ln`((3wU%<QeE4eH#n19Oj8~|gqLK*WK40mJSI)qKKwVatpACI<;dr{c zq}SNo*QJ>2>bSG?1H#*3J;B@IFIAnS34`Vn*OHPwk}Y_vr1iSfEsC66W0d{B(Ix>{ zBK@i|3N;;C>PXFb9??p+%Tq+wt;q|53X3raiAQmMpYm3VhxT>DhhK7cnW^s2T<fUY zJ2%`|=+j@hIcK*!AC+{#zIlb8s(Dv*kUY2&5coV>>6x|g3adkK--V$Zzp2$DZvZtN zPk#}$7K)EYH*M7p!}b7Vc6<%xvO5B$aWi}un%O?ti+e%P3p-f4O*%KJO_cCx@;smU zJ+-h*620+g#(dg+Nq`dKbzf4V*6^b|YBCT1PO-Gj8RZH$LL|@}78*GYcA(V^-v_iY zZHsRz(q<}MQi>c7F9gHI6~-Be;y4O3HhFnVdcb=E6Z<Br;%Il`7ul-^M`QEZsc?Q7 zV;+msp_mN?6l@tcvrjo<=&yQ$5fev2pIr%DOcxy&tutF;lSe6W2A6X>2A3ma(>d(4 zAN4*TMX!tb9S3c|4kxxUGj>CH6ciy;3>q>AI~b~jSd?qA+L_NHJ9VT8q7x4>A1<$< zr{~sjB46>coE;!h+1#TIo`LmmCzK?^wwj1cRgtMni(-uGbt&2pm2>lI94*)UF93E3 z6M~b^-9j($sseisP6Fb(P=smbmOWhR!at(!NGIX1#gKczBoeppukh~(1LE$mr3+)t zKNmEn^KegJ65asJ60G@NGrw>PJ-Hb^$%Q#g-C-9DX>2-PJpk`RaC+Rg+j>3AIbIY< zHt9$XRk70vZGMpiNrRX~W*9%*)u22}3C^0Cbm1|1z;k@ab6@@aDDk*haQ3U4eoccw zbXNoOQ*YrNZ064B2+iNp3+FM#$#ils--3rXSR5ugIQ#-5xS-<tDEyd^T3b@xj*hjr zB1G~rxuf82(s#RLYH;!7!1ky&@%Zb#S%-S{<SJK_Nzz!bqBJ9KkulR2JK|MOyiZ8} zyJA>~Y;~h@or4RGgs-zK<HZ#kS-UeM1FoSf1WS$uMoMgC-<K)VSg0^iJT%(s&&+r_ z*mWLQKP0+<Xm1cDRgZj0AnOwTNtA4>Y<>N$8n*0*E?tGHj}B=X<yqeb-{E|meQs7= zysejZ_In+ZKw5P;KxvI8Mv6dVbS~{wYk~qkQan?sH*n;jo2=<><1Mh4LYWfnYY;?> z`c1l<2o^&U{!SV*{7MUJ6iUp64Wy9B`~D^z`b^1H9mc{#uCAyWg?A%!M=F8l%vK{T zRyj`*^V?{<ri6$AyCm!Z6W6dx`>*^L#B9nF$wBDhCU4{cY7Fd1L(+UaDMinT)%zZZ zUv8zOF=|B3MH2JE9o|-ODTW!OH4PcrGU$Da*M>z%Z&^gS5*=`#1pb<@(rciR#S9w( zi9=b2su*lalhcbiPV@=EOl3n$QU1<OIG@zYRc!fi410ACzbY*k*G|XFe~M&+)L6vn zFG1hws}d7uyxIOhr^JTLgiu*7O7{^Zl;-1fbaWPMZk|3>6lqYc!^I-NWVSF@qKG}w z0l~~>0S<H=FAq#el$r)V%z%|T4VR8n&aLdtOW_jpjxAEXQb!1qRCYEWXXflwl6M|Z z_MP^s)bM@u)a7#p90_7b1Pf)5JF`+hife?9h1o~fD78>Ws;@cJ6*_&FjvAx_ju_V~ zMVEm(YeS(*k+{f(WbZW3a90IwjHzVPWMRx*tc*LDQsUf>eH`=1SH{Un{TDyHyg}cu zEj&0grgYlNLfo7=`fO0waNUw@h*Pr`?E117$U)=NqUNei%{+vuv>$MWOT!oRK~<%` zDOtKR9}QIPW<HvH?<QW~OyRV#%2e>09CAz2Wn@&^f8e(<K?Y~^eT9xGI@63P?!&Z` zQx=e)0`QafdouhdQ-3m^Co3KknyA|)vRqlEq({CTl5P?K2Fvcbn`xc4vk=H?vj}^N z!AMjvPejAY8{NMny*yRai`(tDt7>8#x6~0vc6`g(er{ybBi^O@-PtyvCX67uw+Bmh z2~Vive(dgDaB?#Q2j)9&yM#(TANm0Nm9T?0nz$HHYBb~Qc&^y<7(<rF2RL}mhXq~< z;N4J<peXFJb*eUXh;~SlG>UG<Bsv^ivWdLk2To=&NNyHPG1^A0=2mneBZSoZjeeWs zpRLbP6XQ4|Q}7NubYa{u+G8PpEx?ERN#!F1FsgyM*x<Hl82SvwjT8H@1D!HU5OFLX z4lzkA!5|;j@CV6J2mG78JmI&fF@_E(G}sL?G(XYOyKrh>MW{vUwpugv0fO*pV{gA! zH!#kR@!$Y@yQ{b_cg!qKcSup_0)-W*QHqEP9g{m*$WRFoZCHms{7xU_sle5e)LPA~ z-*#xWTuO;6U}6EBD(GHO&y3nkf^N!jeVGW<jpYm7R?{+oX&|+DI)u3%$a=y~YqOiQ z1)?~WpyfUrmp~Z$JZ`Of(GR2UM-Kx6TdUf8!(*n9eZI58!g`Mzc(@qQ$89!_Q(GiQ zFj=UQuY&aQQaZUb!#S!HAaaNB7`}LXeq8eH%iSzHOcJ|eWWCkFXoL@qsRTwdzrk7x zP~2~<^b)IdQAT6SJ0grmuh&IsT=GnPFb4jxDv_#23oK*5F4`-ti~_vu!AoqyRX1hy zRj48vbMr($#U-o>?MwSfWZ$s*1t)U#i$cJFWNkS#?Pmov%|IrA-IHs_5HMskArs@9 z7EMe9dkWZhumFwkPc^MVpDg*wP<9+qteAF+hFG88QtlMV=AEL3Q5Hkf6gBCTadqgF zUC7IJ;`rQ)@T#aPKY-_v=OD`kg+!qvep*fj-+K}uHb+F+#j7P?Im1!eD$f*O4A-$* zG27Ut#7R=yH5O&HxY|xf8M`$moivzly{gti$hT$g3>zK|skYLu+#uWTTYmdkjPZJ- zfjjulU2D0TNCHe6Z30$oKh#+u&inXssI&Ksx8r8JLt{=s*ZOS_b_`VJedfpI8uQMZ z?Z>;Q8^w>0lSxs&j09pa)J1vW;2a*BqS`2{Fz{#AnE*f3{2%&^QC?`G8r87EPm<So zj4mYDO&Z0-7v`3Cg6Fs|qai68(?l0;H|v=aaNyW>AySw7xY#eA>abID%*KL&ARAuk zSW))+h|*u5^~A%HIgxBhC#W>bFm0j(_VC#=w?v@0h+9tf=GQt4BjMt2D1LeR%aP2* zS^YGgex-Dlb=QXEKh)Jt&EpTdk`kWLj`4=ZkoMCb8f@%x?P#L8qBd<;yXmDCo7if3 zRr@TywaRCl(&zG5Kbl2_<w#g&jb&?UO!s1!aQ~dddmu$4@AabRU(MkjObtmUVP*1~ zlrpZbWF@piNsSToVuNZGhaE&#E6f*r)L^HX_zh3`Z_&ksAmQ&UFbfH;VsqXJrS=c+ z{%?2&0{=HX6A%XT{TDyu|C^r)Jn^$<PY@3No<bV{5J)|tBnJqlVp8#->*;B!$!MiQ zsicSm1t7rZV2Cgf#4i8_g7}0|<Edm({`grcPUI&NmxDr+N=eQ8?-?~}nJ1AHY86x= z5RYK$I<@c<p?fL=@+83r6ciHT5d;cC1fN#Erw1(jXMM_p_@6Q&VBvrA5I(-YBM2Ds z<OK!5e^!w{IU)Xk&pv5_1%Rf1(BKn*bk}opw05_#eX8?GPx}uM{0AXQg8qEr|09*4 zKjr<4Dh2)rss!`@!zy8VDg91^e1x*c53wC-qNFY#@`Tm+M3}=gl^KM))9E6)X{8$D znKO5fxkNmbiMS7}75FEK4WwDfxwi_@Sej)UO<44z?(S!~zAMadW+IK5`)>aN;J=|R zVEUR}bXI5sry^5u&XMAb)5UhhV=wvPl6Za)a=Z{AKD!Y6P+JC@jCZw%?+fW;)vL8p zm@%x?i)^!SEyup~{9Hi!0u0GjeX!bMFi^PHG9dFFvSISqNgy{qBl*_!%U^2QD@-KG zS9$%q&@*d84#W8kogP{4l6iu>Xpv5#zE54!n^W)>g}+#3)k;)V_sxR#e6(vMga7vy zFS`b95z<!(9YSRX*r($Gj)%i`60_j!i&iV)LDxaPa~vu;cf|iOdjHblr{;i#!T<IG z^e@l-Z)j|wZEN@Ub^n8mg+!k2`x#8fG0+zHG_rr1`x0mj0)m0yzkAKA?e6Xa1pS$* z|7@3%o1Oa;9R9cK|HXl=EiA4c3u40J!T_>-Ag~;Wj}QC{1&fs;nGz$Jg$nN*9R~5# zdr9d%s<&hq%tNeUZ}lXl2e4&PrBy9ag@~r&!DW)5Y&vvwq=P0b+5i2E-aeLIKK@=$ R)eG_S31hRc$Z5!9{|5!)p+Nuu delta 6868 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 NAq@}^P}5Tf{117n)0+SQ diff --git a/doc/crypto/figure/encoding/symmetric_key.pdf b/doc/crypto/figure/encoding/symmetric_key.pdf index abe4e207309fb9333e8306dff1c419c640f8d045..31369b87b8b5e9ce45e4bb55f072ad48ab5a80e4 100644 GIT binary patch delta 326 zcmV-M0lEIyINUg}B^rOhYQr!PMDPBJxs*B-Y^|I)O)xnmflx{zIK7n~ge)9Ev5X{_ z=I<*xaY_*^>|;kW%Mw^ZB^E5<pamtgM6p~YRfYWh(ktXg(JGe!$X|8i@Bt2n8lNND znW6KbWV0C+M{AlvDvMMKZ4D@+=WLGj?0xUnc|OwCivFyn%Zz_*XS3@!Rtc|7w-;U^ z-LE<0B`evAh;h!J7(FsJn@s*<;UQQ@{ZUvIbHrpLcvFoQTk{j*vha98*>Zt7k9A7k z`Ji!_-$e&&h8|TFo7i8CMmnKWpjLFQkB0Ix;TL#2sHxk9slEEvQq_lTgduq3wQ^># zQaKcN&r=Xef6W;0!YTgkxD#G{nfA6~IKyqjF!T!<MQ_iOHX9!TI5Lx08_f(~pqO+D Y0|NlSlL!ivFdQBUF)|7zB}Gq03Iyen?*IS* delta 346 zcmV-g0j2)jIM+C^B^rN0YlJWmh421~cPZ#alc;N1WDl#blu{74r!GB&7+j$kNn+{# z`zE?>DS^Oz%$xUyp&$X>AtwO?&2|ATkQP}`mPp=jlSI<+UYY<v@;Y<|7cdaC_*_t> z=Fx%%hr^<1wCZLdHA2A$tw3Y?95aMhYbUc$l7;q~PuD@1Sm}R0iq<h&ayzK8=2jxC z_l&Tdq?FQ}<&=Cx+x)*ocyg{@+Hfs>1RrVvZ?YTsQT@22#66bMxX6()|8Jp3>of-0 zLv+$=o=}#)@bzl6&<&j()qFIQHx#!GzrgBQZdK*FYWY0~*`AIby5OF-(x_PrX^=iV z&rT@pn%}r9{M!?;;+B7@{=TBSz<op4^b2!UZw`|?8y^BUH<Mf&%`*?6m~=b?0|3BW s2mlIYZe(+Ga%Ev{3T19&Z(?c+b97;Hba--QW(qejFgFS%B}Gq03IyVzQvd(} diff --git a/doc/crypto/figure/encoding/wpa3_sae_dh_key.pdf b/doc/crypto/figure/encoding/wpa3_sae_dh_key.pdf index fbfb90f20924efe833b2cbe32525dcb06d9d43c3..2d53f77e1e34676ad1fba9b9aca8b97104eb7d74 100644 GIT binary patch delta 5894 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 Wjq&!yTwehx3Kt@QLX~usN&W@)QKqT@ delta 6120 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 diff --git a/doc/crypto/figure/encoding/wpa3_sae_ecc_key.pdf b/doc/crypto/figure/encoding/wpa3_sae_ecc_key.pdf index 00cf969085d32c19775c1dc4554b9ae40c56e20e..f085fc5b8cf6156321cdd07e9732fca3688c25fa 100644 GIT binary patch delta 6023 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 YVd3WC<90JCAz@Jj5gQvyLy_qJ0CLmV*8l(j delta 6178 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 Ye}PYX4DMHfVG4>cY7r4F6K(4M128S5egFUf diff --git a/doc/crypto/figure/encoding/xof.pdf b/doc/crypto/figure/encoding/xof.pdf index 672035799feec013966eb4879b4675eec1d9272f..5d04a89284871b4f93e5d9d6869aff1bbe07f0f1 100644 GIT binary patch delta 267 zcmV+m0rdW!Jf1wT=No@tYlAQp#ozrD=VeS8Xp;J8Ez*Z7lraX<?rrQL#9)PCB#C4F z_Di&OjKGEa<DQ&zxfCRzIWiJ3(2NGOz^2#+Wr^hdI!YuB@1zL;B(HsI@Bs#b6Fz5D zscEpF!G1q08m-z%NR3eNUMtX;KF2A-i?yTKCCN-X&BseGOspAn7e&iAT5{W~q2^X1 ztapsCoaAInDPfE~lYbl@V5M0e7a3CK>zaJ9PGgYXMMtfs5oPHc-!DcpUD4T5%?C4j zLvda43#^{x+Es3<mfyXQr{lpx7u@rcG-}d98f@;KXD1YP$#2{#{_R+C%fD22ThX22 RwxJvP1t6Pm*t7i{Apt`yf-?XB delta 267 zcmV+m0rdW!Jf1wT=No@fYlAQph2Q-Z=VeS8Xkv}7Mfy;MGR8pKy^TGD7_2aiByp_& zeu>tO5x8(a?#VfqOF;sfgOMNwWi+4#HpMn5OC;~tQ6g!0Crtn#dF@++52PSC;d4fn zng$CR?Dw;x(W;$<)CdLdwE~UlbDSZ(SUZ|slFYQze7y9+#7Y@=QM7!cCAYmAYHlUM zdY6)vku6PWPFa>elYbl@U}Y?i3x+K9bxl54r!mOxqN7&Rh_dvJ?-!$)uITKj=7Sl% zp}4O21y)aT?J74_%kN&u)A8V;3-0+z8Z~Jl4K{brvl9xt<TvgV|8}gn<zK41t?15h R+t3aD0xXPg<Fox7Ap!M1gCPI_ diff --git a/doc/crypto/figure/multi_part_operation.pdf b/doc/crypto/figure/multi_part_operation.pdf index ae33870189dfb23d8dd6eac1963f968465317c34..7952baff5037e5d9e121c51500590bf94a671a78 100644 GIT binary patch delta 20665 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 AcK`qY delta 21583 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 diff --git a/doc/crypto/figure/multi_part_operation.svg b/doc/crypto/figure/multi_part_operation.svg index c4b63b5f..bb52fcab 100644 --- a/doc/crypto/figure/multi_part_operation.svg +++ b/doc/crypto/figure/multi_part_operation.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="STATE" height="496px" preserveAspectRatio="none" style="width:340px;height:496px;background:#FFFFFF55;" version="1.1" viewBox="0 0 340 496" width="340px" zoomAndPan="magnify"><defs/><g><rect fill="#FFFFFF" fill-opacity="0.33333" height="496" style="stroke:none;stroke-width:1;" width="340" x="0" y="0"/><rect fill="#FFFFFF" height="40" rx="4" ry="4" style="stroke:#000000;stroke-width:1;" width="50" x="106" y="120.8"/><text fill="#000000" font-family="Lato,sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="39.21" x="111.395" y="145.444">inactive</text><rect fill="#FFFFFF" height="40" rx="4" ry="4" style="stroke:#000000;stroke-width:1;" width="50" x="52" y="236.8"/><text fill="#000000" font-family="Lato,sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="30.09" x="61.955" y="261.444">active</text><rect fill="#FFFFFF" height="40" rx="4" ry="4" style="stroke:#8B0000;stroke-width:1;" width="50" x="133" y="366.8"/><text fill="#8B0000" font-family="Lato,sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="24.282" x="145.859" y="391.444">error</text><g class="entity" data-entity="N1" data-source-line="20" data-uid="ent0005" id="entity_N1"><path d="M176.42,10 L176.42,40.8 A4,4 0 0 0 180.42,44.8 L329.578,44.8 A4,4 0 0 0 333.578,40.8 L333.578,16 L323.578,6 L180.42,6 A4,4 0 0 0 176.42,10" fill="#E8E8E8" style="stroke:#7D868C;stroke-width:1;"/><path d="M323.578,6 L323.578,14 A2,2 0 0 0 325.578,16 L333.578,16 L323.578,6" fill="#E8E8E8" style="stroke:#7D868C;stroke-width:1;"/><text fill="#000000" font-family="Lato,sans-serif" font-size="12" lengthAdjust="spacing" textLength="136.158" x="182.42" y="22.844">Operation object starts as</text><text fill="#000000" font-family="Lato,sans-serif" font-size="12" lengthAdjust="spacing" textLength="109.458" x="182.42" y="37.244">uninitialised memory</text></g><ellipse cx="131" cy="25.4" fill="#222222" rx="10" ry="10" style="stroke:#222222;stroke-width:1;"/><!--link *start* to inactive--><g class="link" data-entity-1="*start*" data-entity-2="inactive" data-source-line="18" data-uid="lnk3" id="link_*start*_inactive"><path d="M131,35.68 C131,54.19 131,90.05 131,114.69" fill="none" id="*start*-to-inactive" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="131,120.69,135,111.69,131,115.69,127,111.69,131,120.69" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Lato,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="44.928" x="132" y="87.644">Initialize</text></g><!--link inactive to active--><g class="link" data-entity-1="inactive" data-entity-2="active" data-source-line="23" data-uid="lnk4" id="link_inactive_active"><path d="M105.87,144.86 C79.15,149.61 38.16,161.49 19,190.8 C6,210.67 25.5931,227.5699 46.6831,240.0199" fill="none" id="inactive-to-active" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="51.85,243.07,46.1331,235.0502,47.5443,240.5282,42.0663,241.9394,51.85,243.07" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Lato,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="31.038" x="20" y="203.644">Setup</text></g><!--link active to inactive--><g class="link" data-entity-1="active" data-entity-2="inactive" data-source-line="25" data-uid="lnk6" id="link_active_inactive"><path d="M79.15,236.56 C81.18,223.22 85,205.3 92,190.8 C97.19,180.03 101.2187,174.0199 108.5687,165.4699" fill="none" id="active-to-inactive" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="112.48,160.92,103.5798,165.1373,109.2206,164.7116,109.6463,170.3524,112.48,160.92" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Lato,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="31.698" x="93" y="203.644">Finish</text></g><!--link active to inactive--><g class="link" data-entity-1="active" data-entity-2="inactive" data-source-line="30" data-uid="lnk11" id="link_active_inactive"><path d="M102.43,238.76 C112.63,230.43 123.29,219.47 129,206.8 C135.44,192.49 136.0534,180.5316 134.7434,167.1216" fill="none" id="active-to-inactive-1" style="stroke:#0000FF;stroke-width:1;stroke-dasharray:1.0,3.0;"/><polygon fill="#0000FF" points="134.16,161.15,131.054,170.4963,134.6461,166.1263,139.0161,169.7185,134.16,161.15" style="stroke:#0000FF;stroke-width:1;"/><text fill="#0000FF" font-family="Lato,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30.978" x="134.48" y="203.644">Abort</text></g><!--link active to active--><g class="link" data-entity-1="active" data-entity-2="active" data-source-line="24" data-uid="lnk5" id="link_active_active"><path d="M102.27,246.99 C119.77,244.01 137,247.28 137,256.8 C137,266.32 125.6849,270.5972 108.1849,267.6172" fill="none" id="active-to-active" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="102.27,266.61,110.4708,272.0641,107.199,267.4493,111.8138,264.1776,102.27,266.61" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Lato,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="39.498" x="143" y="261.644">Update</text></g><!--link error to inactive--><g class="link" data-entity-1="error" data-entity-2="inactive" data-source-line="26" data-uid="lnk7" id="link_error_inactive"><path d="M166.44,366.54 C170.09,357.62 174.17,346.81 177,336.8 C189.16,293.77 195.01,280.96 188,236.8 C184.62,215.56 183.53,209.55 173,190.8 C166.96,180.06 162.4179,173.9197 154.5679,165.3697" fill="none" id="error-to-inactive" style="stroke:#8B0000;stroke-width:1;stroke-dasharray:7.0,7.0;"/><polygon fill="#8B0000" points="150.51,160.95,153.6503,170.2848,153.8915,164.6331,159.5433,164.8743,150.51,160.95" style="stroke:#8B0000;stroke-width:1;"/><text fill="#8B0000" font-family="Lato,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30.978" x="192.02" y="261.644">Abort</text></g><!--link inactive to inactive--><g class="link" data-entity-1="inactive" data-entity-2="inactive" data-source-line="27" data-uid="lnk8" id="link_inactive_inactive"><path d="M156.27,130.99 C173.77,128.01 191,131.28 191,140.8 C191,150.32 179.6849,154.5972 162.1849,151.6172" fill="none" id="inactive-to-inactive" style="stroke:#8B0000;stroke-width:1;stroke-dasharray:7.0,7.0;"/><polygon fill="#8B0000" points="156.27,150.61,164.4708,156.0641,161.199,151.4493,165.8138,148.1776,156.27,150.61" style="stroke:#8B0000;stroke-width:1;"/><text fill="#8B0000" font-family="Lato,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="31.038" x="197" y="138.644">Setup</text><text fill="#8B0000" font-family="Lato,sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="20.238" x="202.4" y="153.044">fails</text></g><!--link active to error--><g class="link" data-entity-1="active" data-entity-2="error" data-source-line="28" data-uid="lnk9" id="link_active_error"><path d="M70.85,277.03 C66.65,293.93 63.54,318.59 74,336.8 C86.53,358.61 107.2777,369.617 127.1577,376.697" fill="none" id="active-to-error" style="stroke:#8B0000;stroke-width:1;stroke-dasharray:7.0,7.0;"/><polygon fill="#8B0000" points="132.81,378.71,125.6736,371.9224,128.0998,377.0325,122.9896,379.4587,132.81,378.71" style="stroke:#8B0000;stroke-width:1;"/><text fill="#8B0000" font-family="Lato,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="39.498" x="75" y="319.644">Update</text><text fill="#8B0000" font-family="Lato,sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="20.238" x="84.63" y="334.044">fails</text></g><!--link active to error--><g class="link" data-entity-1="active" data-entity-2="error" data-source-line="29" data-uid="lnk10" id="link_active_error"><path d="M95.35,276.93 C103.18,285.64 112.08,296.33 119,306.8 C131.72,326.07 140.6307,344.5919 147.7407,361.0519" fill="none" id="active-to-error-1" style="stroke:#8B0000;stroke-width:1;stroke-dasharray:7.0,7.0;"/><polygon fill="#8B0000" points="150.12,366.56,150.2232,356.7117,148.1373,361.9699,142.879,359.884,150.12,366.56" style="stroke:#8B0000;stroke-width:1;"/><text fill="#8B0000" font-family="Lato,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="31.698" x="136.85" y="319.644">Finish</text><text fill="#8B0000" font-family="Lato,sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="20.238" x="142.58" y="334.044">fails</text></g><rect fill="#E8E8E8" height="53.2" rx="4" ry="4" style="stroke:#000000;stroke-width:1;" width="246.658" x="39.96" y="423.8"/><text fill="#000000" font-family="Inconsolata,monospace" font-size="12" lengthAdjust="spacing" text-decoration="line-through" textLength="18" x="44.96" y="440.92">———</text><text fill="#000000" font-family="Lato,sans-serif" font-size="12" lengthAdjust="spacing" textLength="194.778" x="66.032" y="440.644">Solid lines show successful operation</text><text fill="#8B0000" font-family="Inconsolata,monospace" font-size="12" lengthAdjust="spacing" textLength="18" x="44.96" y="455.32">---</text><text fill="#000000" font-family="Lato,sans-serif" font-size="12" lengthAdjust="spacing" textLength="159.096" x="66.032" y="455.044">Dashed lines show error flows</text><text fill="#0000FF" font-family="Inconsolata,monospace" font-size="12" lengthAdjust="spacing" textLength="18" x="44.96" y="469.72">………</text><text fill="#000000" font-family="Lato,sans-serif" font-size="12" lengthAdjust="spacing" textLength="215.586" x="66.032" y="469.444">Dotted lines show operation cancellation</text></g></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="STATE" height="500px" preserveAspectRatio="none" style="width:342px;height:500px;background:#FFFFFF55;" version="1.1" viewBox="0 0 342 500" width="342px" zoomAndPan="magnify"><defs><style type="text/css">@import url('https://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic');</style></defs><g><rect fill="#FFFFFF" fill-opacity="0.33333" height="500" style="stroke:none;stroke-width:1;" width="342" x="0" y="0"/><rect fill="#FFFFFF" height="40" rx="4" ry="4" style="stroke:#000000;stroke-width:1;" width="50.1309" x="107.15" y="120.13"/><text fill="#000000" font-family="Roboto,sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="40.1309" x="112.15" y="144.2316">inactive</text><rect fill="#FFFFFF" height="40" rx="4" ry="4" style="stroke:#000000;stroke-width:1;" width="50" x="53.21" y="236.13"/><text fill="#000000" font-family="Roboto,sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="30.873" x="62.7735" y="260.2316">active</text><rect fill="#FFFFFF" height="40" rx="4" ry="4" style="stroke:#8B0000;stroke-width:1;" width="50" x="133.21" y="366.13"/><text fill="#8B0000" font-family="Roboto,sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="24.6387" x="145.8907" y="390.2316">error</text><g class="entity" data-entity="N1" data-source-line="20" data-uid="ent0005" id="entity_N1"><path d="M176.83,10 L176.83,40.125 A4,4 0 0 0 180.83,44.125 L331.6015,44.125 A4,4 0 0 0 335.6015,40.125 L335.6015,16 L325.6015,6 L180.83,6 A4,4 0 0 0 176.83,10" fill="#E8E8E8" style="stroke:#7D868C;stroke-width:1;"/><path d="M325.6015,6 L325.6015,14 A2,2 0 0 0 327.6015,16 L335.6015,16 L325.6015,6" fill="#E8E8E8" style="stroke:#7D868C;stroke-width:1;"/><text fill="#000000" font-family="Roboto,sans-serif" font-size="12" lengthAdjust="spacing" textLength="137.7715" x="182.83" y="22.1328">Operation object starts as</text><text fill="#000000" font-family="Roboto,sans-serif" font-size="12" lengthAdjust="spacing" textLength="111.2109" x="182.83" y="36.1953">uninitialised memory</text></g><ellipse cx="132.21" cy="25.07" fill="#222222" rx="10" ry="10" style="stroke:#222222;stroke-width:1;"/><!--link *start* to inactive--><g class="link" data-entity-1="*start*" data-entity-2="inactive" data-source-line="18" data-uid="lnk3" id="link_*start*_inactive"><path d="M132.21,35.32 C132.21,53.67 132.21,89.04 132.21,113.65" fill="none" id="*start*-to-inactive" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="132.21,119.65,136.21,110.65,132.21,114.65,128.21,110.65,132.21,119.65" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Roboto,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="46.0078" x="133.21" y="86.2628">Initialize</text></g><!--link inactive to active--><g class="link" data-entity-1="inactive" data-entity-2="active" data-source-line="23" data-uid="lnk4" id="link_inactive_active"><path d="M106.87,144.12 C79.92,148.8 38.57,160.63 19.21,190.13 C6,210.26 26.3713,227.3045 47.8913,239.7045" fill="none" id="inactive-to-active" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="53.09,242.7,47.2889,234.7409,48.7577,240.2037,43.2949,241.6725,53.09,242.7" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Roboto,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="31.4004" x="20.21" y="202.2628">Setup</text></g><!--link active to inactive--><g class="link" data-entity-1="active" data-entity-2="inactive" data-source-line="25" data-uid="lnk6" id="link_active_inactive"><path d="M79.96,235.87 C81.73,222.51 85.26,204.59 92.21,190.13 C97.36,179.44 101.3124,173.5509 108.7524,165.1109" fill="none" id="active-to-inactive" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="112.72,160.61,103.768,164.7163,109.4137,164.3607,109.7692,170.0064,112.72,160.61" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Roboto,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="32.5488" x="93.21" y="202.2628">Finish</text></g><!--link active to inactive--><g class="link" data-entity-1="active" data-entity-2="inactive" data-source-line="30" data-uid="lnk11" id="link_active_inactive"><path d="M103.65,238.09 C113.85,229.76 124.51,218.8 130.21,206.13 C136.66,191.82 137.2734,179.8616 135.9634,166.4516" fill="none" id="active-to-inactive-1" style="stroke:#0000FF;stroke-width:1;stroke-dasharray:1.0,3.0;"/><polygon fill="#0000FF" points="135.38,160.48,132.274,169.8263,135.8661,165.4563,140.2361,169.0485,135.38,160.48" style="stroke:#0000FF;stroke-width:1;"/><text fill="#0000FF" font-family="Roboto,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30.041" x="135.69" y="202.2628">Abort</text></g><!--link active to active--><g class="link" data-entity-1="active" data-entity-2="active" data-source-line="24" data-uid="lnk5" id="link_active_active"><path d="M103.49,246.32 C120.99,243.34 138.21,246.61 138.21,256.13 C138.21,265.65 126.9049,269.9272 109.4049,266.9472" fill="none" id="active-to-active" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="103.49,265.94,111.6908,271.3941,108.419,266.7793,113.0338,263.5076,103.49,265.94" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Roboto,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="38.3789" x="144.21" y="260.2628">Update</text></g><!--link error to inactive--><g class="link" data-entity-1="error" data-entity-2="inactive" data-source-line="26" data-uid="lnk7" id="link_error_inactive"><path d="M167.21,365.93 C171.08,357.03 175.36,346.21 178.21,336.13 C190.4,293.16 194.79,280.31 188.21,236.13 C185.07,214.99 184.5,208.86 174.21,190.13 C168.28,179.33 163.766,173.1722 155.896,164.6322" fill="none" id="error-to-inactive" style="stroke:#8B0000;stroke-width:1;stroke-dasharray:7.0,7.0;"/><polygon fill="#8B0000" points="151.83,160.22,154.9876,169.549,155.2184,163.8968,160.8705,164.1276,151.83,160.22" style="stroke:#8B0000;stroke-width:1;"/><text fill="#8B0000" font-family="Roboto,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30.041" x="192.26" y="260.2628">Abort</text></g><!--link inactive to inactive--><g class="link" data-entity-1="inactive" data-entity-2="inactive" data-source-line="27" data-uid="lnk8" id="link_inactive_inactive"><path d="M157.52,130.32 C175.03,127.34 192.28,130.61 192.28,140.13 C192.28,149.65 180.945,153.9267 163.435,150.9467" fill="none" id="inactive-to-inactive" style="stroke:#8B0000;stroke-width:1;stroke-dasharray:7.0,7.0;"/><polygon fill="#8B0000" points="157.52,149.94,165.7213,155.3933,162.4491,150.7789,167.0635,147.5067,157.52,149.94" style="stroke:#8B0000;stroke-width:1;"/><text fill="#8B0000" font-family="Roboto,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="31.4004" x="198.28" y="137.2628">Setup</text><text fill="#8B0000" font-family="Roboto,sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="22.0488" x="202.9558" y="151.3253">fails</text></g><!--link active to error--><g class="link" data-entity-1="active" data-entity-2="error" data-source-line="28" data-uid="lnk9" id="link_active_error"><path d="M72.09,276.35 C67.91,293.24 64.8,317.89 75.21,336.13 C87.49,357.64 107.6843,368.5912 127.2843,375.7512" fill="none" id="active-to-error" style="stroke:#8B0000;stroke-width:1;stroke-dasharray:7.0,7.0;"/><polygon fill="#8B0000" points="132.92,377.81,125.8389,370.9647,128.2236,376.0944,123.0939,378.479,132.92,377.81" style="stroke:#8B0000;stroke-width:1;"/><text fill="#8B0000" font-family="Roboto,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="38.3789" x="76.21" y="318.2628">Update</text><text fill="#8B0000" font-family="Roboto,sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="22.0488" x="84.375" y="332.3253">fails</text></g><!--link active to error--><g class="link" data-entity-1="active" data-entity-2="error" data-source-line="29" data-uid="lnk10" id="link_active_error"><path d="M96.1,276.32 C103.74,285.04 112.43,295.72 119.21,306.13 C131.83,325.48 140.737,343.9878 147.887,360.4278" fill="none" id="active-to-error-1" style="stroke:#8B0000;stroke-width:1;stroke-dasharray:7.0,7.0;"/><polygon fill="#8B0000" points="150.28,365.93,150.3587,356.0815,148.2859,361.3449,143.0224,359.2721,150.28,365.93" style="stroke:#8B0000;stroke-width:1;"/><text fill="#8B0000" font-family="Roboto,sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="32.5488" x="136.99" y="318.2628">Finish</text><text fill="#8B0000" font-family="Roboto,sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="22.0488" x="142.24" y="332.3253">fails</text></g><rect fill="#E8E8E8" height="57.4785" rx="4" ry="4" style="stroke:#000000;stroke-width:1;" width="251.4824" x="38.5595" y="423.13"/><text fill="#000000" font-family="Roboto Mono,monospace" font-size="12" lengthAdjust="spacing" text-decoration="line-through" textLength="21.6035" x="43.5595" y="440.7042">———</text><text fill="#000000" font-family="Roboto,sans-serif" font-size="12" lengthAdjust="spacing" textLength="200.8418" x="68.1396" y="441.0265">Solid lines show successful operation</text><text fill="#8B0000" font-family="Roboto Mono,monospace" font-size="12" lengthAdjust="spacing" textLength="21.6035" x="43.5595" y="456.5304">---</text><text fill="#000000" font-family="Roboto,sans-serif" font-size="12" lengthAdjust="spacing" textLength="160.4766" x="68.1396" y="456.8527">Dashed lines show error flows</text><text fill="#0000FF" font-family="Roboto Mono,monospace" font-size="12" lengthAdjust="spacing" textLength="21.6035" x="43.5595" y="472.3566">………</text><text fill="#000000" font-family="Roboto,sans-serif" font-size="12" lengthAdjust="spacing" textLength="216.9023" x="68.1396" y="472.6788">Dotted lines show operation cancellation</text></g></svg> \ No newline at end of file diff --git a/doc/crypto/figure/pake/j-pake.pdf b/doc/crypto/figure/pake/j-pake.pdf index c253f31e22f05a67281d545b547947dabc132a47..b837dd7cb8c470a089f92db66b6d0246d4ec6fcf 100644 GIT binary patch delta 19606 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 Ormg~!mNu|B2l*4GFR*$5 delta 21928 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 HgY5qRs~+uh diff --git a/doc/crypto/figure/pake/j-pake.svg b/doc/crypto/figure/pake/j-pake.svg index 504f90f2..39035190 100644 --- a/doc/crypto/figure/pake/j-pake.svg +++ b/doc/crypto/figure/pake/j-pake.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="SEQUENCE" height="647px" preserveAspectRatio="none" style="width:617px;height:647px;background:#FFFFFF55;" version="1.1" viewBox="0 0 617 647" width="617px" zoomAndPan="magnify"><defs/><g><rect fill="#FFFFFF" fill-opacity="0.33333" height="647" style="stroke:none;stroke-width:1;" width="617" x="0" y="0"/><g><title>UserPeerUserPeerShared information: cipher suite, secrets,UserId, andPeerIdpsa_pake_setup()psa_pake_set_user()psa_pake_set_peer()Generatex1andx2Compute public keysg1andg2Compute ZKP(V1, r1)forg1and(V2, r2)forg2Generatex3andx4Compute public keysg3andg4Compute ZKPs(V3, r3)forg3and(V4, r4)forg4psa_pake_output()forg1, V1, r1, g2, V2, andr2(g1, V1, r1, g2, V2, r2)(g3, V3, r3, g4, V4, r4)psa_pake_input()forg3, V3, r3, g4, V4, andr4Verify ZKPs and computeAand ZKP(V5, r5)forx2*sVerify ZKPs and computeBand ZKP(V6, r6)forx4*spsa_pake_output()forA, V5, andr5(A, V5, r5)(B, V6, r6)psa_pake_input()forB, V6, andr6Verify ZKP and computeKaVerify ZKP and computeKbIf both sides used the same secrets, thenKa=Kbpsa_pake_get_shared_key()to extractKa \ No newline at end of file +UserPeerUserPeerShared information: cipher suite, secrets,UserId, andPeerIdpsa_pake_setup()psa_pake_set_user()psa_pake_set_peer()Generatex1andx2Compute public keysg1andg2Compute ZKP(V1, r1)forg1and(V2, r2)forg2Generatex3andx4Compute public keysg3andg4Compute ZKPs(V3, r3)forg3and(V4, r4)forg4psa_pake_output()forg1, V1, r1, g2, V2, andr2(g1, V1, r1, g2, V2, r2)(g3, V3, r3, g4, V4, r4)psa_pake_input()forg3, V3, r3, g4, V4, andr4Verify ZKPs and computeAand ZKP(V5, r5)forx2*sVerify ZKPs and computeBand ZKP(V6, r6)forx4*spsa_pake_output()forA, V5, andr5(A, V5, r5)(B, V6, r6)psa_pake_input()forB, V6, andr6Verify ZKP and computeKaVerify ZKP and computeKbIf both sides used the same secrets, thenKa=Kbpsa_pake_get_shared_key()to extractKa \ No newline at end of file diff --git a/doc/crypto/figure/pake/pake_primitive.pdf b/doc/crypto/figure/pake/pake_primitive.pdf index b0be8d75a0702efa3e617e651fafc08bd666cde0..a46ad08816ffae2db3feaa11c6c35d4742bbb99f 100644 GIT binary patch delta 326 zcmV-M0lEIcJH=Ife# zuufx;-bF{PrV(Z78{aQRGhNZyQOyT4dP8wt@e8b;?6&UNlGcrSx(7Ew9WrZgeT|fr4858NARH*@Fu%~AJvabO5DrxBHrc5nE$uXqjegC z>>)a7HBTr@U-)`8TIhz(j%q%d$s3B>hF@UyEVrt1UA6okgltbo4_$E2TWQp+g)~SX zo@XZ%cFk|x75+8tSaHk0RDWO5UEscWN%_>3Nbh! uFd%PYY6>7AATl>Nlf@j(44Z&rGA9`r0Kgv!MU$Q#9tk!%3MC~)Peuw;43|s* diff --git a/doc/crypto/figure/pake/spake2plus-reg.pdf b/doc/crypto/figure/pake/spake2plus-reg.pdf index eba88a3b44e7160bbe2beb83b83ce59f87bc2da7..7a69320a2bf7388588e83a579e6cbf9390d348c5 100644 GIT binary patch delta 27226 zcmbTdWmF_hv#yQ%;5ImeTjMl3xI2TpyAAG*ySux)+u-ib;66AE?)LFK?>>9)bAEm+ ze^gdPWW*g=RcrNHSLaRwgkKm$tQ=^?7GM0@yUUO$L}20Xi#imz;jjj$3)rA4wz@=c zPZ4zle2qlnKG@S^)rnQGV{AcGhps-PAbLe{MSJ<_Us5`n*G#5IG6J&l%&PD$1l8T? z^N{P6#AM>X2-*czVbZpT`_5O^W0zrMVo5U0hHdm}MI6y^y{xA2#)+I(tYRQ7A~m=^ zr(i?@iEjPm6u7d`+zD1mT-i*Pw6fUWH4`4bkLn^Pezppg0fcc-`$aO5Z0$G0L*5K4r(yUNJ* z@O4YPJ7Q3`er7lFYmZ+y9SCIkT>YRh9leKcan+M=3g19b!1TOo9h+41-#^#6X{1H)2KdTexVklgGchXH zv+Mn7btuxpPkIS32yO*+XboQ)$4q&1(9j;6hP9e_m zL$e^nv{i6YDov$HKUn(|xgToTRpDk!RJTy_cW3RKHF9=Tk*XPCW#8qT*t@ej_+P+N zYCT5(h%l?^C^IHUJb8dpurC|8t)#lSUW!B^wPl+$rWh%G-o_hZ!jtXd$L5H+ZvN zzp3f2Gv5Z-EcL~{mNqCSZ=jgFa2ig?r53fuBY!{!KX^b4K|WU5zYD0D1gbK*HlC)XA-d5L$8~prT27 zoZcLE0UGq@N_arDj9RPiSRxD*@~bcks4|dB{=|6MxAEb{F%9)cwA!b@Od~c00dmPu zLFvl*%ewQR#fm$_mQ(;0sbr|_W@!rG_fp2%qEpLqNn;5`hl=fK#nmqFY2 z#lnOMN-FKuliR0L_?AW2E&0@Px#sybc;KRwbBbZ`Uo_CnNyVnGu-w}5#zy}T?2HO> zc5h{QP%0TZP%|Y-CWu3 z7a|tiR02>5{ z_QGlV*=SJxf_7|>o19}gskwE8Q!vq~WJHU?)TF{`27ShNt=6HJ%m4}*!$reQdm0H( zaL0LJ;7}3n(txHxCH~%zj29i3Sl5!RE}v0(Mm*4-!OU))s0l!V$01UoJ;*8Ap z0J^})3LF3yd`KDx}{> zVO|T6No`!fl3tT1wp_;J-O`(VYieiO1IJs#wLqBtkVI{gpZ>4Q%=Gb?n*YOa1k+}i zI!swKLM%Dk-|dhu69No2j8>>Dsb8O%NCPU%Pfdga$--*`+fqDK+3GBrL-fb2oCZMa zw=-W%MMr7E)Nt_3&?_EOEKj53iB3*()pqkL=Euf{ot&S4>gc#omyRl6XBI20`R|iMGE(><7qUd0tpacWn(_yL7u+~+V*{zY;Fgj`jQ4@Jklvr6w4@C z9bbx@OP2mVAo;rDmT2$tUXJ7N+Yb=RQ$~#aLu__GP2YAeL@_rDbpD+A{0XI z3(VVy-%EzM`F6g9!8{B>PU zR&qs8Ja&nOdgqd-p&_+pXyorD{%-{MqYK80PWm1c3$lgeeV!z z(AjGuJc;Z?pDjB*UrPfdO!7+E#jCHX?;JF$yB;*Esp5Zoddg5^to?N{<mOaA4mW3MbJUs{R`ew(VI;)is6E^c+k#SP8o@gFq4Xft0jM%TdO-g~Yt7*y z9`oFNg{EU)Lq~)LjEyiDXcHhc)xo(&Q_31 zt(Q)A%$Q({Q6FS2f)qWFP0lnBs^8pwY8V&u0@w%yaJiehUVuWv{zL`i$BKe z&emwGX+qjG;vo)o+rI9O%4k!d3wC3#fM!d#S@NLICZJaK`d~wTe*Wy!^^!mD;(h08 zzjEv2%BpvP-7vcq*s5zwl>Hqp7Xg^xBg};afvJt72W7|xDY(6q;Xp2t3VeVN)Z8h_ z4vbTcPuK8wqkOP;2+mI&V$<%uSoFQsMRlVw!enc5f6kvlwZsyc07uQ;e!Es3^gz)`4f}@jz ziGdA*TjoBOg`3u5(nHt7ExE?E?WoJ2KYUN5qas&bYjp)~aV_+^7^Bkk?y{kTJW_@{ zq@;2rh~Myy$r7RZdXT`m-H|CcZ6y=HSqd>z`{ zeqB57y=E#X#-x~tZzG*=kXkQOi-lfLtvI>e?lv_o;vZ)2&_d|2wH-}ha2W_7tmlY4 z(9&w}q>(2;)C<}hbEm4hWh=mk zb>xO)R}n?XI$R3IVo@UGn<9O?qh|0ADTh<(UfQRhnLO^#_6eC`RS_i|1;{rDp?YByPAG@iwebVX?#`xWgt*mCV)Q>+h726DHGR;gpWx zAJ!3grc%-R3n!UMlsx01St&lgYI~2r4!PQCt-YeFeu7Hq03m!1j;VCJdJ1(kiyMQ8 z?Yhf9N`l;119BYOm}0DOeS1ZXb`^6EGOwk!H_wT8W%}=XmbdD}ySs+4Hnd+b?R!ee9=Tq&Y5_dx1d4BU zsWDMuf??cE7l6Va%V<{4F2=^Hef17@449QE6`;zA+)8#v{_p+iCcHI9(#DiEl*MO?%1;;OE)jZbUgE| zcCNj>Mep|iYEK(lu03rF&uBsjD1Ts?p|-YWL|8XmR(ULDKxA8e9! zJ%OB0hI{<415yW0m23RA#Qnc4?lkCLyCm;^vz8-zgyzgkv>vP|{&s!ifQaaLbKUkW zpM}0KIk|XMS_+Qw+9Ls&YkmnAAdF+S?Y+Z$Z!i|a9i$dMHA?onTefx8L7E-7xFXFU zZ;P6OU=Y0SKFAR9J*#V^vv%J)LCjHUun5$W{Dkb6sGpLu!!Bl|{DE%hl`0nfje_V` zd7#e7$BKOEM@Hz!Fw+&cI`%T-pO4vzpttAZzeM* z?f+D@wU#i+u=UBILpWN=Q$wb2sp0DKX-|C`PJX}5?|K={T-`pLuv}D%o%A&%Tx9~m z!9@FM^wJ(1?~^ADn2Ha7jar~{%a^kP%yYh7H%X7W3wgP4a;Tc9JdU;H3y0J`p8{_X z4I9rSo!vI4!23X`Ue~PZ3Gi5XzX)Mo@}ZldMMdM9WwIDanI}qAMCV4vl`={Acr>q| zOcZm?B*W|qz(qoV5~^0#ymvoDNp?Xc^hu$yb?s+e+=uPE(ht^8nW*9v){gyc5C_6Klut) zvr<)3k~T6mIyvS$YikOO7yGL!9$M#nl4AlG)UHBT<3&lw1FhRE!^MFlR2ZN$VYn+T z;pPb;Q}NpkW*JR~>lXTS*~n)?)uz&Jo1-xrE(99Z3XlH?%>@;c!+s3dBJ3w`^?6utr#(M~g~g_Fg_@+Rg_aZs)ZC&6 z7}H6zCh9~Exmn1W8c2-?SE$rm-i{U9Fh*hH#B?><9PSH((G!;2tSEoyFY}s*bkCy5 zHuF%+a&xxd*{+~cy^}{uL7`{ZdemR+qy4bwnmzaP4Z$e2J%Z-FzL{~*FP@IW5MP|~u*UKyX*U_9 zHFR^U;HdHaRt2gjO>8>u$(N%P^8+Kb`G2d|z2w`uon3d8C&hF;)#mM7ZpTLkzrXf0 z-fVJ9TsK_Fc$*OY;RSiK86gEY1e=bp$gmA>GN+>W@FZhBv>$gE(Hkwmb3CIRQKT5F zV}y^iYaK?!C`=dngjN*wY$gv)EyLu~VVde^xS{%%BjnR$VEgeVC;hIm^KJ#!*l*M| zZzSlXICxqmyRLq5*BQU>n9=5SD!;jG>Y}OkaonkY=cO-H#s=XTI$C;;5q?)weJP7x zNcO)yNrXOb{&NI9xu&WX)mZqzx7a>mBl&ZV;GJaTg}KU`a^#l*XZiz0ZDsVcGIx_c zqeuv5264SU;C5FiUh)UVO>)USZ-{q62}I(jB1 zv{b)>yCS)y0AxPLV+R#HMVsqZ{WxalE!giZ=)*PXt|h1JQn;dFFd84O<0RfIr*SbM zp}6dhtJ!|;>+vS?`th?sKv973araJdJG-Wad7X8>qD(f@k6RTcV;~<&DPT7WMzx>( zvP(kNxKs%=974-3+rgnljnaQF5_Lt#d8er_YJ5s3X-vgX@ z|6@g3RKTS+oz+w6?#}h_I610D*P0|U?FosPhVkmLY-CCKsGgWD=W58zJSGQ~_|>Rz zFvZ~Bh40xqsmjgD&cfp2x1rWzLyQaaR4qy^PDmE0#YUR%#$r1MAg+zvaia%HV7BIo zX=;tQYytmxMg36EzSgr0HNv%g!>uKPjEl2l8yaAG8iO+OE;2b4b4-Fi>Hm(D3I96n zzGi>2vbAlU3T6g!ahVlcd+N!7koQ%QIP-?SPaBooF^y(DA)zbt#tphhJ7y({GHceo zg2@LBt}sv@F$1G0Hv13c`G8pp^;eB87YolyowlRT!_PeOcJyg1Jg_IL;uU+hWh!q| zCINCczsei&L&G?%K{s(pDldSTrWoB#twp!9XW`&rVMq$Pq0_Fh3%e0@7B}2k+*ru& z;Up)<{7zro$hnljaJBuPNw0@2?<|jCD;J;-D06iEB}y(snVZH+-J1El!U3qLX*eF- z6Szk0A9m*HD}O5%P1n{PeZRg=+arJM9)A$naJB&$6(+V-tlp;T1BCrPTE{q`r?iLP zXxk1Kh54qfrC2hnS9F)W^!B3|Q;pm_lw-^Z?_e~Sw}j;)L|qG%j2%Qw)t$QX-7P_S zP$tu40iy8ECMev#y)9zKp*pYM|R z&sME2CK6U9cNMsNOr#<1ick2a#EmU7@G>FvbIZPWV{Q8X}!$6I%E@`EvJlSdE zd^#=)_w2f5QrYOFa^A_i`d&46m*l8sG}=QtC?A?R?T0d>LuzbFxVI;{8o)3Pbdq&+ zkk~jgQzLph*{)+Ge*Sqgn!TAYN&8fMevASG%kP%{_K?A`Rd;e?^u6AJN2nb1Kr&oP zf+60APUMbhS#&hrH*_jFy>9$yU!ekuJ++$q79e|3l$y!hIw-r)S6p-cK(o z`_1Myx`!RGi<97IwYJr-*e9{Q7f5&39F|dFFRpkfLaan zZ-u{}!R)=d@|1MRg#|IVm~d+-RyA51)K zwtX==v&H`C3EBM<_F3c-;PAC8!0b;8$q<*#xy=okgMWe5_Qi;74AczBAKtngT*FBJ zFqC8|I6$>e05}`EkgPuAM6gUe)e);Tl5|UW{l?!R&;%3O#(6E^H9(5_>U99`<_{{o z3ia;>pHrK`a>9Ero{@ZPnBCO9CA;MnAQHaF!^8kOJf(b4q-tMQ@F8JMraKV+21SF1>KGgtlO(Qm&kNW!=^C z#0>)bJ}^BXILFO#Rw2D&1Yam}L&fh(@uTtxk9>TIz@JM5;z45k!>Xwtg0XvS9x!jd zJaC%<1WhGGeC~!@n|vti-JVO2Q!g&o-L7lD>t^E^GJsDU$S5EiTmp5_bbHgAcPHP5 zj;{P+dh~s>YKzrfdGbMV@N*JfGGj$WRavz|F`S~os;HX~jw&GOA-D)2gkivKexih9 zkj9v@h)G@37*Su)Yf^3Hq@tQSVcH_eGLD?qpd3HEws(;&*y;xz>0j5AUoBZ~W$ql7 zfIZFT9NIv%Y%laZspb~l;c^<0x zi^`L*t$LVN{I9ck4Tn33^FWy6$;oU7^J6nj^-757U1Q7>{}Rt8wlLu;)f9S<=k-N_ zDBK8{i(<({x+of(7~ zB-)JF%lBY-*v+kl6aO;fpP+_Qh=4Q)`83a6Ku;T`C^-*xBB=rdIbocW0wK(}wmw_p zCfl*VHRqrMrohWaEds)iPyiRn4`+E61bV5o5h+RtBuHGjUQW|eE?*1GCd4>rpE7ck@aYWe4$`u}F96IKfu#t$0OyXAAcNA^j0{?S_X@tM zpG}gBJ(zmfFTQ8U%z%W8G@~Ex;0N}mgB3JGRW;5X+~Yh@Au*25S#ck#p%1X(a0-K? zUgH2!Q|sB&B$?8r9KQX#zF<_;oR9L-{qk@4f+%RkJliP*W6^e?)K(b2f$%IbH zSDL}BN$D@#WYM5Xnlwz#r9cR#!fjHfG%CnHlqyq_Q9ry$ZtpoHxU2U0k+X)_VG{Bu ziK`4W0Y%lu5*iDI6j7QfKzCM~&VAXQbpOl&CtdF~dr^Z*MUc6;c24nzz$((t9~e(d zyY48a9PYESbAAsdT9knRCtx?{s4S*ja0x zuzb$(w6UQ)%tRz2To$3+a;->B$V@)Qu;C55^cOg~me4`)9oRdseP09j7GTGrT#P?H z!kMq>RxLjRN4R$LG{*Ltpuca$q7uAg`|&FJjWvH?2>C7-vPJLjhpFqi z^^znJiaCSq6;@gUx}Ia&zNgH!@7j0i-K61PBHg$YSdxE4Vb$V>$trT0H_s`KL#etz zu)dmLq1Av(UHzlmM>AgJ;Ge%&(*At8x2p{#56>{L91=<Sq)cE@>Xia*UTTr{4uy0bCCT&BYPrVc%_%oKceWYRy zWs}-fps|d8_8qrd{V0TY5u7Hu!KLO}fE2Yrq(nmY99o`Is+5!u$fN|J5s^m7a~IRi`c}h2BX7so*@UfO1TH*IFp`_QXw21; z3AReo$P!$%ON;2sAwv<&gWobc@xDK2{2X_CJNXWRt|GWARL3yS^F+p(In+U zq8pZl?%bvKiYRCwpqkhp!f zm5)(M7aT9`X-u^acC$2RXgY_Jl$``5g*pC6sT(V}kHw+8KzpJ0NgOEj5KF-GznT7~ zlDJX2i~oDZbD+9ykGlJyCPN0JzPPf8Gd`*^{USSD1xdLgwIW%ObBWeHKY5^WOI~SB zL>wwip_3hNo0&wD6ix#d6p!xIKqyj1^}~uf(1mn;L4;t?8k>+L-}kW}%#Te? z76EHLp_e2{D^E2M%ppVrlOH8dxB%;dpy^lMK6wnRMCKoO(Rcu6(eqlpPiUv%k8@z$ z96hVjQISS;A<*xx_H5kP*%Gi!cj(I4A5&CzLmBwJ?JFAPBoi|&du#sH=$1fMKMDr78B}ro>y`)7MA`C^s ztflBZm8mSYPcHnj6-r!#I-`l5ktY z*ereqEtU%LE^l~-Ds_0$jmHO}JAyxG&y0_C^fgh|z;W5;Y>i;LYDdnVd6pMZ~odQJ}QdO{9K^mW7le=CF5+ULKywX_t}jmv-0({0Lx5=^3I z%;6EfBp(KOSShGm5aOt=V__ysyBMV1b|_Fm2WeU)DL}rR{K-|IfPpSK!l0cL%g{UWP;Gx~=f?hj}Nf{qXW3%>A zSy;VVpzApXbHbEA-ZS)I!2bj`R!ubC|ls7>(I z#HTw_Q*%ul1DDw0g3AqclCdHohOG@y3zu#mu0MvajX~f!(rLk3p8$f5y(pg4k_d6a z0<)m8<2{T4V`_s(_+beBczz&rszqHSUSl^mp$!lBM!eqo(3ZeONdm#b*`P&<3Gqc- zQ&>_|hEB=O(9X#&q1Wgu)IZY%a}iQ>AS;lBfd$A!!pzLZNy5y;&XJHILQ2U3L?9s{ zVH7cOG%~Su`ix*>`_~|BU@u`}VP@|1pHLJUXT<-NJRyq4pPZGA1;E0|&dkn1!pg=8 zU}j@uXJsZ~`W(z$8~`8?$jZi+;AeslV)+bY<^;0;>-)$5e+CCT6Mz%Q$;HI+-zFv! z79cZ#3&_IpnfCw0{d47D{fuSjV*NJ_2QvqNg_((qmGj>ij?eOJ|9Ci9KMViAr4ph{ z;6dzctN^Zm1hSB@b1(zgSyF-W&P2in{1o&*kKyxKe%^k{V<$<#pfdzj=d z+4k2-&9AlJmK$?h&F{ZOSzNmvFUY@H{`$C>^v=BT-s0MF?K%W;VFaQHiLv?PlDpi) z!hYO^&2t3qf+A2Y&IwlOlf8D9!xRi@6hu8?JYRBtZzO~$pxZXr( z)4?cPH&2USkQ@)~kQ@2`7~yVRNmme;M`WIuE}Mv#$#7k^Px-~iJwXHr4Z!Vk3S!3M z>Bac?fa7yHL7ssfC|H1Me!(=tk6fb@58E?8yWZ%7pvWkwa9Y=^*}ezualw9f-0w>| zrr_c-X{G1+mB{dZji(jK>WHncot~u={4=f`qvo3G0B8;A@U7SASawL;K?!|~=_(fw zLniBRLYjVTRIii8wc1si6=`~Hox5dxr&Wb-LG^LokIKUgU)^ZWJ4F~jrb&h)%~m%@ zM3rd>bX;+o(F{DmRR$!~a-IOBYc|-H(wXGAEl05vwxq&&tfttoK9YdqR;U!g*?D z>q9T1+LTRoSk1;y+x~Edh&d!-oRFv6A{FUoPzx5b3Q&Ayw=@lkkyxuY7Wx!rAu1^r zh*Pa0F!Ji`3VGqM&p)cTAvEJnD|L?>8CHxc?aNb2JuJD1!VTW6t*PmeJwEBEt;+E; zq2Q~Lo$>3_t90aST+)F|1je|HY(?>v^;K^`>c=%h*-WteL13@%&%M9tSM2dQ4U@G) zAhvd~DgBwE%RG2#o||jR-{v8)vC4=&nm2RyM+-r8EccYf+&^&cf44D+7QZ&X@XTdS zbY=8g*X?j6_p@5HhnH}8eZ-%$vd3V2vcVee$c&0&#qDuRYqGy=$Ii_Ko8lvru-|rvtPf9v|}Z zEiA^1WHooi58Y3tIiz&*x*J>;ytlD#eVgc2*1qv>_-Jb>#%%Q{=X`S?L(@ zTtq&LeRvAl8t92Cnt)Wk+Zv9FTt|D5TmFRF~L*TZKSZ?`l`umf@H+= z?L_!rE59w=R(uS-ZopeH_pJ}#1<2}&@Q1%^-hHHvm7HOq{t(^%fEN?@xB9DHLdr%% zLE)!plOdinkpE3z9tSyHAptU{s2yv#%mbX=LQ{%Z9_#c=L&gh&C5oNy$SIGUwzm7y z8tFTNUdN;wsCB$>+U9twn!mkF24r{SaXVKYefXey3^+AqLrPvE)Qe~VT&GORq-)Q% z)l|LgWb^jjc6Y(nEVre``oAZ~AMAdG|9!F<;MaxGYwbTSB!9aT-jw7b!_? zZPtwYI_x{gM>%j@=ZDDbQDC}6-X3o&v51~9A&s;d(EU+RhvLd5f5OpC1!6TwC$p{g z!5#Xskw`M28?v4wXZ8(uI0Hk1T37x}VGj*BVbHhcRB#b2Fh&lk$=#4UU*>V->o-prS(jfN-yTdu}ct9hWgS>b&h-!5VKa7zOtbrLLcGUe#&KWa0Ff8GC!lTd3Xp{=Ea3^>!n1|I zPwIK29k+z3%0syE*x0xuBU4GnIset*I((zxuJ6R2CXti4bP=|@wE=&0qN>~Q>$^3D zhgC(0pHNE@Mu8`z)5sfMktbiQ?^w54zsicL$`hztNqGtNDWj*OH>hZ1$ny~0ueGhv4zwvPS zR)@CdQ&%4QyU%s5W>N|^()AaDPtsQ!Fg#&mVdhAg(`9N6SxBP}_!Ak7RcjI1`?p4r^DZ!Io|M@2}muhAzeVwe<=Z<-pV=|R6sH>7mAe?l;iz086| zEZ{MJJuwNU`oxSOnUo3XLVHb^CktZ~B7*eRMrF3VO;?t9A;uv~-cD!@@^K90Q#?+# zKORVPvLfWITW?_TVgA<0d3;emwASJP{4`lm|6%$UnPnIzRX?l^!1WZSNlq10LaHk*jWk?z)6t(aVI~_8RC;PZ zyE-xB!Im>hHQjW5k1fB`ZgOzbagmLo@)pCMo{l8L>kb+XY$?ok{8Cdh>!@*e)8Y9m z9*2T)tG=b@AtftO3zbU?h0zidLC2`Y!#^VIV8=X`e}+jn$2;JucGa|cv1bwQY5ne_Fw8L{6ZudUp`N(T_or_b`nYF$CoRcM)?$Pv+njpqgjX&Lc3f3T51=v|iGcs%9RfK=JB1M)R zu*{4ynU_JW@`58{m!H{{?j(5Jv0ICYqyn*Af?xMu0L1t~4)ij+v@QHCZFZo3%&Ejy zBo0rj3%&GrqrOwqMu5%wR#Ng{DB>zYMhkG?r!>Kq#8BeghBHW8=<|`A6Fw>cFvPtj0noJUes9U&yS?*h0jgKkF*RFhKFN zIdsWCI4M`|R8+&x^Oh4WBsU3b{_3@K_Xf*04~!Ak1TPVqrv`s)2fpd57P#&cN}Hvb z3a-s=>ohrz(wmNk2ovkA^u)J&PIa}u7UXSpHbzrOixI_$fP72-e6cysoUWC9$SR9^ z2e`UvT?hs1_-xZZ9)D4AXt2eULjfHi65#h8EU)-uOSEKJyzlnaT9;6pKKLYzP+joqYUoarMU0`?8Cax7l*#**N56EdSz=i%&Hq)0}fM~v&^Umg( zr{KrJ19>Rdx#1#^Pu9McRU){V$mNwcUsL)cr2dt^lSHl1KcQ#__8R9%`N{e<3?^|J zJR9MhAN-i^h?W}~lrr=4aU7)N={bw#giJy;%QzEpWbmrxBy-LeAZrfvK+Y0;nN_@H z@qnSXhuY?uc{^ghjYHrM0t}gQA>QyJ-)M{Q`_KNG70mS_=mc{l5<@8Yyf-Njq-;x zC|l%k1#;nmmmMXC)8}ln)AMhe=YtN}ufOZ=!_nt!!7a!(D;+eAKkfB}Kc1bfmTvFv zom`z=pdc&Ms;up-?p{>s?JR69OKY^6og{5!omET*k$Mf;CWg=w>a=MuIHuB~zKLP5 z$vT=ErO~ChV^J@0iLQX=w;L8Yo;xC{I5M_qSBzsORy%LuU4nRq(R@-N#Cp|J^P45h zZOre&HthxeL1$KcU-UTrBASeqHqR31GG~4j>6P76wX3w`RSeI@Qx`njx6=9J^7Qci zhEv6FzkYeEMeine<)p~?a|*K>N|a_Z>E~dcHms#y8TfTj5fOCaTjChR7H(9fnnMrc z@v0&a6{@3pQLM-&kN0~OT;mK=G_66J@UE*?b_jeF?-ckfV8m(uWsN-J=plx-##G62 z6vh#)k^0+?_ZKvj&83ACNY(n*nw1BL-a_8m5#lst&aKi=;}`@AOew!cvN`1PLH#tG zP~D=IXpdOld_#~1R_;BI0T!(cna2ubT8(3(Ia9>Yh~QW7V6fmtrtF`V*!mt{IPw*z zLlsZKjq*}c(0V0Q<5vG6XKs<)F`Gu0sgeZXS_(6WU~N#&y}q*%rUW5XXsHc~&@sDl zp}j_gDrT0EiqT*cK~XY20uE9x<03usT5jWNbmkU!ogi~DrtW8$aM9az)-`<6@yt0j z+l_6=Q+G1AG*+-`*1L3&O7xHxUPe+*!1 zIg9gWp<}2QQ*VU(W{e&z>PBXshN1ccQCID-(k`I3a2%(9XV7qE;`t7JqO;94a6SQNI+^mk zvjs-g?j5|*HE7JwS9lcZF;({L+DgvQE5?OJA zJ3g=lFo9cV--o_HEWgXv;a;ZS%)OGE+pnvMu_8ZNYbjmY3ET^Hksb#Hz;aO;IVz}6 zx9RSo${c4!v}&qKi0b*g{C6mEBg{wCK_)~FKJv9%^@2Xh7O9r2B`ozMgqGK%BY4Qt z244e0?-59Xj|o{0ON)tHVY8HK@gpUk!g_6;t)W9JEJLPD@1!{RV^M#VODhok2|<27 zK?(ql(UGn?-4EC+sna6}XKTXKBs)6+P(IligJDoPu*Xi`aoT7U=N zwu&mZW};*RqbZTI7dxRPAuyE#iNrF$C}@TQP$QY3W;9mTqS5)qMZ*qOc$|JDH_yF2 zv*urT#u2PIxQGpAqfar!bOI8Bs6)28P+cm-5{RReS;m8+cvcrrs<>0|gGBd!^%>Kx zVaX?3DC=JxP}U(3^~s<$%xqi}xv+GGZ}E>hnXF*>k=abXv4llDPb7ggpUL2&n3Gr0 z0mM$KYdviq^Y$@I;Ruf~u}5Q}HU2vV;|!XGnI&0q8!@W&3Z+%FbpQ#iC@i_u6ffd2 z@F>&_V4;_T5r?zuXE2hLA zMRKwz`q~(YP*vo_I#3qOQQAzHUskqK(opZSXhLwUYBmwk^bqR^(Va9z&R;FbHyA_} z%kA7=m2SsrctKk7t_2bgy88f{KBuyq1cVo?jO2a1RN_twu&1|KhH^MYB~w|N%Y^i^ zHHoSY&BL+tpo3>a%X_K}Pfzal9i`r{Y5{MEv z)lcq7g!onNhpHvSnpn5+V3N?@hM+j(aM7}-=1SrW-G;KA zQwa-07R{rgu&)-3{*$$*CRN|3BJ`qzH7!`j(l zDU}k3g74qABW-M4l}`VvmaLs)4zm9@KMPK#jZ-=$w2VjW4>pr!Dm@^*+h&2kSBi4t zNAmO;{kE&5TuuloTpoq61haZb(u{bukH=L3eILEGDhn5g3n}5E4^I{m2pS~k)Ex0t zz8kWSM+l&u;xbfrg7zfgWap;sObfKi5P-i$GNo_CJ8rXmm2mERdYJh}h@xSMc_-P= zQ68b#D76Z+7UUp_J?J74u5cngJ0}C;M517)pS_uP$hj|;;0a_B|P~Dc++W9$DQ2L;?qV&nn()W6+s!cEj*^}7>)x{%S zTlv-zKJl4c(V5ZpjE`5bUKTVIw-B_D#G7-3!6wLU)M!nWD$ysp(&O$SZ0RFj;^Rk@ z4=6XgZHMTkC{Mc^UXB9Btr2nP>a+l4%GnO~y`AW?h2{9MH$GPg)lqQaqSAmVXBDztAPiDe-Wd&EC%L8jMg-&fs=!seZ~3Qq{@YG_&VWC>W|S( z3Z-!P>lJ}M4?KMyE#E2~r_p|c+Nt2J5HRx?<8uu0Y0sQ=X^CE{jGB5)~~)74}~$ zhKsNv&C^y06#Wqchgd@EZx;TIendI2KAtRFK4>l;BF{~?L*Wksd{8xa?|C|9>j5F! z^$l;|`g&|^f({v{nR{R*lB)f(8Qi^>mDtPesHA^kM&|5y24OU7!!#0XIVmd~%1N~1 zV!FOWHqjB8J!mT*G1Ij|kbmPu^Jrs|oL1S_oB3=@+3bvkc+RD{_&+U=dk7N@?GVj_ zXJ&5@ztSn-&j9z_?a^>*;^uvV)e@xBJscYDNgT{iNIlf*boXg&R z5f@Bbqbf-L&7lXi7x2ypi=0anVYx3X+l7M*CCf<|dkv!(XoCC*DwXFaL!6>qz+Nj?rKsvAR~hJzqr}w;{W1i z?7;sY+>9mxQB?MSXV(|?<7Z`M0WkdwfLK|9fPVnkC!_ff?PB5J1Tb;@LzVtDuzxZf zE|!0h*8fcZp=t@SCNP#9Ol$zQf83n^v<3L&RsUeK|4qTzKZ)4C9O)lM^`F7P#0g;K z`VUZIVfmy-|IN`pDH}60fb(Cb^`GjW_=@>op!Qjk0Q5_OF5Ee{MNH*%|vk6z`L8eOfvG!>ZWXSph68{}R9d>G5;v zC;kF({0D-uGcf_!s5v?R1!BxV0P8=qe_CSW-~#*$3t32jEL;F4Cf3i*Oc)R|{3L## zDD!`xIy+a7P{Th=%CQqesdbk)f{u@6!;>t4MTf|ng$xWN-$a4r*v8?|??EMkF=A?7 z`iW1xw1PSuQ+P`G=$B=E(z+bG;PS;Lz1d}h+%`JHI)S6gb-I16!OW4Pq=d@Tqq#1w z!^w2LbV*1O?c~fz}p3L%uIl~Mdht2~$ zJx;T;o*}rihnad0z4@{>DuS~=&k5!02@}u55>{-AMB!4(1vFRNnJ@i8i7??0Y9?GQ zfpN7ywRUNFhhOaublFol`~#=z*MUo^D5S+&-(Xf4^YBV)4oVToh}l^#GKU?Ww&-zS z#;M#zl`3K>TTmQn#T`1PXPJS4EZVzQ%-J)0cGZzzz1HeS zy1J{ns_(wm{pr*CD%G-MYfB4=Mi($tR}dFWE(85?NHmkJ30HF~SztsDgN!($4X$bq z$#%q@s>knDs-a8Zkv>S7xR}+h%ggJFHI1O;BJ)9i>?gnZBJTtH*~tO>=}jc+CE9CW zXG7`DIH*`nDjm@%cHqYJa8>ow^Tt$$vksy9!X)6>;y4fy90xBH=)9Tuq2xIqjm zP}w-vEW{$ySTf56Z^YVsrCg3^`oUDJRw>W6Lbg>Mjk+T=jt(oZ&Ytc$(X!TW8LL*j z^08l6TIKF#A7x~OE))8;SOeI@t}Xs3{Y}!2Z5$y;w49CPBn7Jp=^ES5871Jwb+(qP zbpCVw3B$sJ8C!u&t_`i_@Mx`%wV2zQ&HIFK@gSLUKqWPvh$}5%S?BUD&DafjEl^(Q zc(1A&etN<=4n4}-YV+rC{1mv!74Cq0c!&||C>#hi57j^lo=Ef!TLCUNlm%N{m_0lu zx5*#aMh0E;38qyiQETs5Il8xs+v;%JG7(XyqIPeV1{uaJ^FwAf5;%W}= zbh)-rPn35~RCh&AlLP=2VOtipvTJSz-qRUVyDP~U|yf@L33Z`y}ip|;(a zUD<+AT>)b*oUdP=Gxsf!J+HZ4rzAN`i;f99$?{1h6V=hm%_0UE%_rKW&bvgsF1nKk z`wE(y%^`$_rA;=CZ1?l z+jM(RFGL-p`h25V{Y+as&u5l`*=?BNin~vr7J>r!+_ioxSZO;t-<;r3T1T~{2+Ojx zlsIH&8|fSVfSDe74<;m)18zOTanvO_x5%5z zI2|{>2csmGhnHy3dVxWZXdqFRH~2ZHJtQu)i*gxy&riTK-<|$?2h-o*?auf*TI!%~ z`BqbV#gdmc9x;>7S=g*ZgN}1wtuCD)bX^F)dB&S^@{^48mMj~xgN9?Xm%V~ZElDNc z$Vvy!f(;CVBg>$P;4=c&DDlo8IfwxHH^9 za^X1+osr^SN#&vW2>xzvlY;7q0&aKEw@@QP7&z{zO0iNuXpza3mnn$T`_-KEeS&?n zr&FaL-Mu1i=2Rz|B>Z^8arnf=)-q7*BrGk=ejQArSCn4Y_h{M$ZP2;D^GhCasYvH| z|1s@1d3hLbt*r5y4c_z?IWZh$_KMFi0aymLhx;>Kq%o4;9TIGqFS0*xJheXKO+FdP zZU7%sK^g6u%j)_s3tgM&M?0=yg92;ra$V$M+cpVHwNk<=QUeL$e2LN2u`Sk2xMh_n zFncX|1JK`)-{D!6&RY_`+f*Mqa>zV76FPHnzj%!N-MM3HI(L+f0MmHn#Gz{rb~MrB zK~$9m!EQo)uIKfEwP=@0S z7Of@7x5h@(TeD`-QtFsq+KYUV3|zMTc6Gw>LoaY`B2Ts5j6y?|Co={M?^>6?o#yhY z-10#7qvR((8E+!WV#(h}`^a(h3FU%{))g|5#?@ViFZlZ}^UvT0krf+X*TiByr;`8* zyUxf?>}5Hg^XJ&fUl#^zcH-H!Jc_+*XesnY_pC(|i)5Hz}ZjzSME_Z3f@)Is9@Fd^_x%+_S`6taG1C4 zKHwLAzi8YB3A{U7fj`q3$CvE?IP8Hz68^GZCWQOTs!2Dy~YOpcR>pkNJ*LHu2IV;f*dL{g=6ab zH!UycNy!4;;rc^TH{7)-;b2!9s?DUh~M*n1zq$I2#I*+g*0EGZg@^?#m8EJ zCtI^r!u=}O4=Y~Mcc)y^q*O+Kr6lzz zo06M~2{Z}YpEfe&^Uj(CcJB91C>*Iey2uOiVM=5hK1s{aB{#z4%}G1unkrfy_|-Hd z;|^%t_xD}GY=2CyDaXIy-x;rPV1d`x}y<^4Kgb4D=AsP*w} z*vOV99xXYUL3(GvYE0D3jV6>Qtzkrp(DGRV>YOw)IMt*|3jKQrZC;;*X@e_! zXd0StYD2x)kK#eCKyQ)#C^l1}IbK0SHG%<E5jVeN!rX4o5}_s#8s9lz zpptI!cw9ztFeol5`T0~HzZ~4<=;`B{C&?-eI~<2jqW`+y5vWPqc*Dl2fv%v2Fm>#^ zSoWb8n^hDKy+!-%4E)mIC$=gYPP|9S8ypnAyBr(y;8nCM;7GaZ2e>nY8cW#O8$-4H z+te&em`q=A^KoV1eWp(NY-D2#-}{lkU;gXcjzo_Yk1|{5dK-%#1ACj5(%Vg%5&~hYKIy-3U7b;x}QtPpFC{$_y?#jc$ifL&zB1fh#{qLYs?C0 z_hW)y74%HBfDXyNqbq*pmMUL0ZFcC?EAb>@Lz?+}f4S~9h0^u?V8!>vWG3}Gl+2BD zNHK(G0lMO?!p*!C?5d;;GfducDelEQnZe@5Muo~rCSybBxxO@6 zl{T3qfjkpt&eU-xP(?hcuRMNd7)>JINy^FyXAZ3TfYd?d4^{`e-yfJBpVimysl=AQ zF>dTOEK`q$ZZP6`bdtQApAYf3yBSz$hF((Z;r)0{AWnNA4vQUXm-Q>$mv89;d@7&F zt#|S;woJm|$2DidXjYurL}clRm4Vdw>=A5<*bk3(qHssrDa7lREW;aL{p{qH7!6$= zUcS16Kwz*{BUg!4H&5>eYt6Kdxc9|#Y;L*skoD`YVPE3b zJwybREqJS|Tcp`?XBL;NSl9E4cEoX4@uWcwm|NlxbQ5fr_|rvnu~k7XiPd2{i`L(8 z@cM1^oPBzS-#Sp5N>z_SQuE5)ZLY+A=zH-T2H2xTcoIjxo|vd{ z=XXpVch*@rhBGt|34kj!=y(do5Cr`Qja>^LhdE0l5k&gwcUBjRULFm%6;mq}s$nL! zR!Z`I01=$AFVyKs*Nll}0YrX*QEFEk8w0^@(W_7vzg7kuL({jFm+|scDxh2AdtZwk z@S<&LQVC$jyw>+cdX1IJ`Poh3=0*Q1aQYw!qv=)E7wPj=6VFriQp8cvP_kN<)RFYN zaG}UA5#)eCkwPAloKH>bFb5Fs;HJz&W-;_E3y_Ph!sZxkM0WXLA5TboNij&}Nf(86 zguTMW7-a&v*mc6jYCxOwOH z45Y4=`5_^{K$2Cjkg1clDgT4a@rQ=}BWt{=9PE(XTpYDQMsyHp5+V|svhx3cg5~XO z{{n*%{$_+p-{$dF;-sh?pnu@O+&mm_DhEe=nm8HF+ws5S!Q3qWfd_NMZ;8{#2b;>F z{`XGtQSa&Ek<2t%xZXbBSwMe_6aO{*ry%jq<9|i{g$=){5&sqY|2h0q`d?E2ZSrsH z{}~AUkInzB!rvGEA9en-*8f=QU-JH^A@EN*JqPN zZVbH1GXE~SypeoP1cUDEt%$y)!st0r#1Q>@U!axHDc4D*V#vw#x5<<@tr&_SN!|8y z7!cxUM_Me21T|C`WH0gPWAz#v=)da^g~_)n7&kYV@HMQq@!WX27w;rcI)Sxeaim+QpwRg1FEMf|%@h5qmNqQ9u%SjDOj z1Vn$F351~5j6tY7czrS+oDJT=g3~t2a9-^D`EnsCn_<)?@KtGLEU9|mazLYiAlIM6 zSKSWW*GzkW*^n^sB94*oc8sIV95>*CHbR%$bs(<+r)DGMVithvq~K-m*RO7e-*Gi! zkn0~Tybala^+pf`_g#Btsk#MO0!EEhSXXdL zMomG-SYD@@ln7M1gx<=8j80%?3uYd33f^u32KQ6fXF2aBPAncVH}IwPo#3bzLuLR`<1&;!%({_vk9?C~F8xP?}^jffi$j!#_|( ztX5Z{g3ZtS7{JS38w&P+7@n-Wx2EpoY`E{J4jvl|u4a#|MqIV7+N3owSj8*;xzztc z49FMp-vJoCJ*A=5Amo?dHndKslCxB;`mI89o-gI`QNILK+^?=%Od?HAWa)b!yP~Xx zCq=8GaV|tw`ygyS#$-lbii}bXL45L0x?PzW87CMW(G_7fkWq$p`>{J4`E#oNX3sy5 zB4mSidD-PS@!&`D9kY2^zY-j;^)h85SC({4(ae-e*d%<#8U$Y-ZB zqro1z;H8SC#V&L#q>d8w;35kL)DwJMFBmT?BmFD8Ru*DDg3`w2LzBB`xsOYyiZ5)9 zUfzJbp20l%f)e^c#R-#Z)oR5{^48v>ptD@(m9WA7i>BS3Vy8V&^mxo?L0InDyPI`8 z{q||?sY@497}kkrsxD-7%3kNcfLupvsnDpqO$h1X4=-CBWmpBx^w^U@_=z@Onc>pS zYi!#3(nM>h@|>q#dr3g6{{C8r>HM^H=@NiuD%UbJ6sj`k$_j^keUEy1H-`Fj(x=?bLxX9=5}2SxspAnIx6t@AN?F z?eeP=OYPU{ttGpT<;$sdDoMJikQN%qMIDV34`Z*(V`>8pjpw1~{QT%aO(Ub&&PtbO zOXxvN4U~oX+k3>OuDwpsYvXEi8Pb!Pq4PnpyeCqb^r#P4~AY z1O;6l2KnMhz7qM>a5d)J=$))L4{wgC>JmQ;yVzKKDkw>tFh1U;Z(Ck|IXwZ&8QBTE z#c(8&xp7*bDxQqHt%h}7ZFCk(aS)pG%_PLqAA)0=NLO)to=B_-C) z*7G$B0qLcW*@77i$u5kIl{|jHjm1|Pg0)j#&H0r)zNDbV#JkK@jxSzK2@mmQ#dr%p zeMihZtHEZ2%pKl@C+fmxQXQtU0)zzeC8KVl@d)3u@J;{jK z;wHB=ub)S|$i@n8D+NiuQ5+}W{cbj$^bY10e0ugriHvl5#fN$p;%@T`kEKY-I;*Ny z`hsMx)zzB#C4Ov1G>{g^(32Nsr&%np%A#wWKYm=Y?ojl8nUlovfbDpmZfExLVPn7d z%k_D+T%6N!oleusm3J*0cy&9?HqU1^{I$LGVXTA2;mKek1chUvud~*|c(I_}`KHdt z$XM}~y~=`B4d-b4$%~eWFl5XLg%m5|RK0JRX*{Px&1T~pmg*sJ#MrN7W4;b@`dx{_ z#X;zGKNZ&Ky7Ln-wo}wIu?+grz;?Y}Q!(OZT=wcm(vNfYG7b5>v(Z`0dwhj-X8Uoi z$)X5>Or8QeHa-r^{#}Nh5?Kv6B?gfQ-D$5fe*nr(?O6I4GgPz^HB_L5-iH#I36_2G z(|)url9>xcFatgy`gI2f2CuU#dVBD^ann`#wH>~*@m$vcbOkt?{g|@ofDxz`DO_(9 zt?foO^lik8RW&^{R))!#-;{#0;Fx`lEqqmEW{HPX2u76Nfv_YKJ)|j4iYUqkUju&z zAZO00^O37 zNMB`aqalY`RCb3TQ$=%pc!<>4z@x`B{Jte2r>7avmHrwvQjIAJfz5*W3*u{qV0Ebl zEkoT1S~!%{t2_mg0ekeUC&KI+iN;DBON&ukaMWJNNn;M5ilwrWl2no;MyN9+|Gu2z z3M)r;f+1C0QH0xvWL#p%6><{Rin20RyAuM4rE zJ23R@KpN^oz+21+wE*t!I)s@$#VU$JI*iH}aS~n%UWHaH2TBSC0xyT@T~_nhH)W5# zkEri!F-Mibhz1R@FbmPzF$2>u(@i*1qblSnJ*J1*q8*tjZ8)Mcg)E zF|F&zI$R(ZUd^cnc#jVJZ4mtDK6qA?=^r%?&|yqu3{jvD@2kJ$^3NmK^oh^yhq;+C z4oO*tHGn};ADxDVeMS=n4})-p^)(I<6~_y6%cWmh`N@S2t1KGnfd1}C!EhpyKnYT7 z#8Q2xznZ$AoNL?!UpYUR6+J@QM&(NsV7{kOtv<9$H`s?3+H6S6zeSjw*QE;|t{jAs zo&k@{DH8nCNK4!r!r9Y^QxDbos6E$6>dgj2BuO_=JmyN=M48RjUZil8SH{LF*7j{f z{g4a`{#URMrQ%^^cVJ6&5<$vU^b9yQ^E9HamZ4(@BnYDm%Jynd=`aBfm`Nv?fN`8^ zlJVRC3yGQ-y(VtOB1JnPE9K~qYI`?f@(A%hG$i563yr0|a$ozL7Bp%Xbo=Yb1Km?h zT}eOxy8WUa(TL_iWoblo%)G?yX!I?DP^k0wW=yMxDimeWhG30la%=o+Y(h2^j1U_1 z)5agR_$e29n9R~uQxn>*D3#4z0Pz^;bX?To00n(99dTA+3odM`-61Js6tGM%)E)}d z_O2>M^6%uxh4xwQ(jzD9=~|*_{m-On_VK&4wPa-E@Ud{hWCkAR|V^ipd;sp44satXc=_%zok1&WpQ^+?#SU(fYlr>n2fPGs?W5YA$ zh%Dqwf6ozmiNUTg@hnuLe8*K`y-#lr7|V1ml%z&$b4i9gMJN#o2cUhncCAEi`1(2+1?_5)^C2$M=m z8NnV%Wu{o2$k4pIng{pO>X4L3p)sOhlw&#eG9Es`xon0?rBR|?SOIFNsUq5=_$J0o z6e2#U@13MqK9jk^>h(l!I(eiQO+bBT9R5(e0Iy$veEffKRcVb+jOc-;lT7ssDIoIw+t2x%Ky0xFaYY<7PZF8a3i@ZA^ zN`MRzt|p3y^`Apu#exBXuLLgG0=}eaiRqhHQ+FF;sClYH*x+fmz`}dPI(`tMxnT(`PG;c*7?)vp()2ircUNQC5RCi{Z>cCWghpg-s2c- z5@!CB$gqx{Y}L4k5|z04cV##t(U#Ou-n7*g^Y~dB*bb5tIgj0}ufrs^6 z8k+E#QzP~suTFOPhdsecsCKRya^V??v@B_C0on3KHSf&!U#eH*QubMR%lrNAQKku9 z8ay`+3XoFQa9k{artiuuWJ!+}GG*0pJ_arv_zv<=4VC(<^gRII!Hz1RKrY>Zl|u*t z_*Sxa5XQUEa|HN1Gh2*x!Ye6;T$}gL$W1Vt+Ofrh(SpAcdx%wnu6gVOjA%o@ZAVV= z8+)pjP##|w{wh4?Qc%^&_C%}`@`B6hQ?ZN56z@Lga{CB;1BD$FaiH(;wLeVXqF$UT zkDL~1qBit^O7VKF5V=OmO-s??oYO+EL3qggy7|gFA^Rb+#2E!1!|u2fPkHiPH%0o7 zPiQyHh)a+>u1)LO^xesQ84s1vaT+DKOFwgOM*R(IA!V>@wq`{^BIBhy;s^nHYx~p1 zLkJ4O4xa!gaZh>**PFLjHMf>WBzvaUVu4^W@vRS*4(U~{%y=&2cEr~uW8}~1cfIzx z+G;7Af%IwWD`GJK6BtMWI=`PDQSa)NMdTo_@B2Se)G1X88VXk;bf{Z zW5p;I966k2B)6jcjLXVE=MSOoP-B1x@s~jpuQ>sXj&Lp}%Bq1^`!%~rm#AK(5H&HO zi#KFDV-R5u;6W2;K{2<mqrIMVg$>*6i-w{G}#7GYMb5LG%Q#zO;(YYJjFkZx+QI%}@ z5o1r`dZSrp*=E4t{4D3vH2aWWVJtjHU9QSCt>~DL#R(PAiC7X+ii|{PqjV4HOa~0o zC2knt{Iob!_c3^;^I5UjzJpQoQ8e`5&;wetq8Ce^Dn2D| z`y_6h8VuWA?Oo`Ws`~m%Bl&fu#MU=so%>N z?EQ|USNG{fNF=!}d78SsbF*q52}!m%Z)8-x?=GMdQfdo4W7Z$OYv#Uaw@o~=HvqQ9 zh!YLYQg>UEi=KF=M=P$B#Ui!m1m^<5)9;dCAz|wy5&+cTR>(v#xakn-}i&)3}Q^SGZXKj zd)?JR(7j)!n3Jyw?~y$SpWJ)Bw@vC1O><4_O|wH>_}m21xZ0G7>4ayd)$TBsb)2<%f1XN9y`US=NwXEU)P8Qwqi35vmb)w3ddJJQ-cT z31-4(zfW%$GVRJ4{AT-_gGl39*i4hLxnw8RdPmB9AC2vPwqBe3Zb%6-ChNA3`w0## zK0SwpYQYy+lD~NYD~Q~8W=E7i91+_Gz|6a#SmGtziJ>@IxVdUA-ABM_BoyRyMAiPG zLo@ZI!PFPwz6?2rTrsH|Ls=6#`RC?4#fKZOx;a-x*+~bw|E7w24YSQ zCN>b)zq?Sdf!^>p9+o$T>>orO+#BNd2DNc=zAe2e$Nx6@qw4;F*4{X`zhFI1HWnrj z=x;j*E;c66-*6fy$D7jqhe7+x6XMOvg6%K5?@uu*BcJU@z+Ih zzMXxur(pQo6oQTE4-UxA^}k&%I9b`5{y0Ot;dXyqBG~^j&4^F(Hb-TB^Q%y2@$JPF zV*+Emg8Uf|??Vj1##Z~@#|Q$NV`e6_C{YBdWBtL8sKnaCjb;;a2Jkp3`w z|M+L{mc{00{Fe20OSu2aY7O|4#mV*0224_r2l0e~e>LC_G=YHPdAlQTk(q$9bpQ)y z(8e>?o|zn;W#0S>xp$E$o(bvajR9iOcN(}7aXbq^r+BH!&jX*ect_-9e>bb}1UFVo znRX7bn(?+gVW)N!2<35|Tmi6Y-9<|;QkZVMYz(^HB?6_hFDaPyapOZl{*&6@DJ`Y0 zzCga3kLBDcb4+VgZ!Opp$;<;V-A|F|V@@@dDQM@V-g4U!rlyisakEcBQx>BB{Xdzp zv&!mc7vYYdGO>aSw+J<)5i^>&y( z?pxTM7g;3xfFr@%smIHOl0fjV#D5ND1m}qdmn4dB3Ka+15k$aoVK&cr3dMY6PP;C+ z@gfq?Ve!oyg&5i-~m0Zovlh*fljJKnYY-rl{dkKW|QtH>8&s3CcJ zA22T@jN;Z}e6wAF2tIY-(Oyxkz&EgP;x|-bGM~QO@ sHVYfI#UL2p97cr5{^n?cKt=UIQ3BzA0du3LUjP6A delta 28535 zcma%iV{~Ofw{2|OePY|TZ9D1M==j8TI=0cVZ6_UD9oy(QdFk)o_wKm=-l#G6TD4TQ z_xW@7n!5rbz;=?r;uU~44)`NCukVqs9?)t>zJieeq4V|-Q*0&MVj*IDFj-|RbQKjc z8fX8vr>XPvOTsH*l^BFlf8w-m+{?+S^UlXnSty_+fj|*v%;JHM{+r4*+NZr>%Jlcj zHxJEik^wUvmkuh%NDJ0jLr*bBa(oB#Hio9O38$b6&)!dus!lJUSar9ZN(X`yhB8F9 zV!1}yHPGFAy?=nog09(|9+pOwMfO?CJH1j3!PMI>$?mA)B8P;tvo(cBBGSAwbNSh%V4XXzbkN^ii= zm>(>RJr|A5r9ky%cFo0_r@GcE!7QIRc+ZYnfw>g* zD_Xr5lO~{^-eSpGksC?XYiON=qTgx4*3yRh@-OkbK$2>h@wkIdPDL9m841mu}_4A#(|@w;-Q708uWn(KefbzN@D8!3IXCaPSNsJW+GBMfkg?1 zP)U90BzT=twNnAHlT^X&GKGEKrA$_i)a1kH*j~WYzE5>sL@WaXy3)yWy0m9~dSlGi zpyO6ij=K}iKhAN@L@YR*95#G+vE|NB{zM?FD6AOYY4VdtK0!$(vcZBN5vTfRt0!P= z5=;}ealEoZNSBzSi9N0-a7ta6*lol_AV#(UY0@x|!elHB5ahokw8|w&IrF~rq|H!h zTXq1E#-Sb>4{+6Ylxu0Y{3S`^8I+6K!lnxlpqDli3Ae}0^eJDOrr@lCjswk*3I3&!lF+} z%`2Q3L^4mmyZ?ApDqI>p<&#`DlNj2KvFZ!D(F-S{oWX+?X7`Y4?y4Z)L+F%Ln77)p zoM*@+nT)NMb^cS^8%eIge~4n>855BA745#7bg3Wv!9|84G_VTikuJ-*_ASisG_v3O=xBhv4NiB^cFdFN=E>AHy$ZsW05(f|UB=1)p;&(e9GTr`)Yjgivwr!zB zlWUZG86#zRoUA3DH#D4VLBPH%x1@*)Fg=_D@)1z4>`cj+P}fN z7FLk5(D5kS26&i{`OOsXttPrJQ|qMZeEugK@v|Du0c$iaNM{(y*eiF2HGKoM5`-GY z!0M2oCOwTFM3`EX(>f8DHaky`)xjMTCf)_f_|{+09Az;|n37ng%0AlzLz{U4Sknc@ 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 diff --git a/doc/crypto/figure/pake/spake2plus-reg.svg b/doc/crypto/figure/pake/spake2plus-reg.svg index 9793195b..c4390d03 100644 --- a/doc/crypto/figure/pake/spake2plus-reg.svg +++ b/doc/crypto/figure/pake/spake2plus-reg.svg @@ -1 +1 @@ -Prover //(Client role)//Verifier //(Server role)//Prover(Client role)Verifier(Server role)Initial information : cipher suite,PBKDF-params,passwordpsa_key_derivation_setup(PBKDF)psa_key_derivation_input_key(password)psa_key_derivation_input_xxx()forPBKDF-paramspsa_key_derivation_output_key(SPAKE2P_KEY_PAIR)Compute key pair (w0,w1)alt[Independent registration]psa_key_derivation_setup(PBKDF)psa_key_derivation_input_key(password)psa_key_derivation_input_xxx()forPBKDF-paramspsa_key_derivation_output_key(SPAKE2P_KEY_PAIR)Compute key pair (w0,w1)[Connected registration]psa_export_public_key()ComputeLand outputw0||LRegistration record (w0||L)psa_import_key(SPAKE2P_PUBLIC_KEY)fromw0||LImport public key (w0,L)Use key pair for authentication flowUse key for authentication flow \ No newline at end of file +Prover //(Client role)//Verifier //(Server role)//Prover(Client role)Verifier(Server role)Initial information : cipher suite,PBKDF-params,passwordpsa_key_derivation_setup(PBKDF)psa_key_derivation_input_key(password)psa_key_derivation_input_xxx()forPBKDF-paramspsa_key_derivation_output_key(SPAKE2P_KEY_PAIR)Compute key pair (w0,w1)alt[Independent registration]psa_key_derivation_setup(PBKDF)psa_key_derivation_input_key(password)psa_key_derivation_input_xxx()forPBKDF-paramspsa_key_derivation_output_key(SPAKE2P_KEY_PAIR)Compute key pair (w0,w1)[Connected registration]psa_export_public_key()ComputeLand outputw0||LRegistration record (w0||L)psa_import_key(SPAKE2P_PUBLIC_KEY)fromw0||LImport public key (w0,L)Use key pair for authentication flowUse key for authentication flow \ No newline at end of file diff --git a/doc/crypto/figure/pake/spake2plus.pdf b/doc/crypto/figure/pake/spake2plus.pdf index 2089c01602a2d9ed3b3885d9df45a0ee6f0048d4..bc9376bc1f3fd7409cb5fc75e5dabc1491d34975 100644 GIT binary patch delta 22452 zcmY(qb9fz5+clmvwrw>&v2EM78aHX&Ozg(C8k>#P*hXX9=9lMr-ygoe&YpGdYpu2K z*?Z=iS?3%cfd5_qkCg}J32Yq+q|RU7BijZ*IVa3Q3kP9D8+E`Br-T`rvdt zVFGEt-BkjK$Ki1r}D#8}{*tSN!1-eIymbdQ~60F1p6nmKkoYH;rMz=`8&!c(s45Itj5pAIJ?H> z>zBrS1>cB6FCB(X#kJSlZL$rjvAO=S3m1YLvEI)gF?j>*-SZsHi;-OQ%C4bBUPM*+=JbX<V~Ze z88wR9d|8JWM+zx*WiX0W{Zclz<0ZJxFHt&UyGRLGREn#n8874eqqk_n#U;j*x@y+a z9k0^ruuCFCpI1&pdjyty7G&b%@09QLTkdD{Thy`gAd-7})VH>@u2nEKmH*4o@o{r{ z+$cg!uU=>B8KRDAf2mmk3FaV?6L>^5k=eESF1e1o>(Do`>2l`8@MT{gW|6B_S6K#d zlm`Nt;)6%Ihd5j*1>flx`P({{LB2V(({?%CHo>g11;Pxf#^JEq1b!#5#@)YQ2YX@U zMV@)9lR|RkNzV&qUy^MTplKi+C5dnQzt(}JAO4hv`sX*~c&9-U!5#$L8=%Ln^|0&f z3Udb65Iw^aPYsq^fc4nOaVhhS23A>zTD2CSJJfcS$?M}U)ug4p8(O&he&zO~c`bKM zf;z)k5BILe|DgGiW&GC$yV(GZ!A%^}SUa9OH}fh-_KI&=b}!D*p64bvjAM1SK@55{>oQL7`uX`m-?uWD1%P)%XxE8 z{paX2m5~2v(v}O_$>ns2l|d=LvCKbeW-N!>3cj#K)0`iKkvviFhW8ghhf-n2RyZwT z@Z-{FlaXDWm~2nGO8?=ikb-?lNwNS$hxG>9OsIP8oI-;_qgZQH!{>=zxCe_^YTU)g zz6VuhPRelCxj66;QuI(W;DFLvMn>P?&$nOS`rG=S)=Xcv-ZCZ-ugh}HJf-_iFt`U1 zM*m>k9a+r#=-a0x$cOOv%HMZk1VKV&Z5_RjlDwLgJjY9Ywe2Jx(gAv zpycP293oDfY;_$nwOUX4ngNog3n9C~%+S6N*kUi~`}=m7XbGy>jy??R=JD4+4}=`52w`Zf2%5$#;dv= zr#iMRxg{dt(qKFY7CAo{u?h?Pj5$f~EjPiV{+zPVg^Umr5#Bb8hjskXfTf_RGM+$@ zqbnd-kHg)}Fzh+^8vy8N4yVx7X&8=}p@L|FjyqI{(gx4P)8tQ*m-)+tIW6)?JqMqH zX@sNPc#IZpATjD!GBe)q^0Lo#>1*t1`jp)tuPDwy5LK|rKH+F=TuGdDcqa1gA; zVV?@=FS=NTm@mxE;nSc4La4&2AZ_IEB609x{SyC>2Qq+YicT z3K23?-rtDl+w`v*zq(=el>F}FifV+AaB=QvJ^gL(U1`W^X(2@sq{=w(cftzJnNk#S zsD?dn#C&&7%so@7U*4Xf^L@3Ih zei+%(G8HgCRjYghrjd0lF^^J88h}V`YsZNo7#*T zdKffd8P_Z4%?u}ji;hR27oc@l6{3V4aJXlH2;W%U`9-tQY=&7fPjLr?m{gpr zuf@S!jD5O_kCNPE1n24227RKRICe(DW|DD(cd&NP?K|3wQ*C>?RAIZoBuKDfWJ0>$ zO#`ewEm>SYdtAz5eGAs0Czf5P#jPZ*h5EZorlwH9FP9~$ zj96GM_|T@$n%X{`7bYKTB_El>3?G@D-MCY$2ksrbeI&CAPN{tDb}J2uP8>Q|WAw23hEOZv8ynHZr4X`7OHO$hGU_w#A*ZyFVQh z3vpL`RqtxEcWJ27-)6bcJKc^|e^67mP@Trl0E8<-z}n?8sux^E`8G!ienTf7M7+Ni5DHq49mi3%Whu0|?_y@*?>nvAmqnDk1|Fa?TDCQKV^M z7KFy+lw=(zg-{;NGF$L=%l8VK_0{RJ?xF{@#(ik~-N=|sqQ#fcM3?+4_yDg#N+f!; zb&8R1RT$+0`v#fwj|pha-h+h&8R#|~VizF^ov#Rr=gX$W4O@*t-5~EZ7e)o))n+6i zbI8!4XqDx3-d2wQnJ^oB56qO9g?XtM=0U<2!2?u#(qgkWHIZJzn?SO>y~;(YNwUv1 zaVh9)tZ&*l*nR+`iDtm$wcJF`;*PqL#LfDlQrN2;P6o!_fsVYl|GIDvEBE4i$TtV)NlrZEqR+CqY zE_*qaisK!~n1s~8o}rri392a~L$qp#9`5Ij;4k8^)8g&mxlf@ARGoJaE-glZ!GuAW zzk(2XvRFPX*#NBn!{1AszMNOZ8?!s3#JetVcnb$}7uW9=CiedsIhuZh=OAS!{m&;U zDJdHp7wi86v;8m3&;Orqm?S)0>yeNvzyVfPZg@dK`2Xeb$UNf>2QU`XF2G{-xfquYK}|RM@FN<(T7T$#__^^?^&kMz3&4^g;Y+b^ z^TDi&k-Q!5qM*WmaEPkA91MANZdUJC!b&88C0AROxNqY1za7C!hzZ##IerXe%dG}` z;CdtPGn}5dxgWiM1&K+6;nTFCfTc&0Ig+xc_`k1q`rnzMypuQJq~GKUO$#j@RaI6z zqdu!mRTDbJAWaJ)cSXd81DiKu+2?t`qDeYY-dac}QP3h=QS%RI#bY(Y8)y(E^0b4J z4}a<4p@{~eWz$%jF>JzS`rF*yhLL4>QSiBW1zjuVj20gkrihMBbn29&{mzEAZJ2YhETwtM~70UJ4j9VXd1S~J>q*>Mrr{d3= znchw_$i0<2vaNSGe8f||EIwtoi1z0^%?}M#mjqz!?c8ZREUvw(l6h5~Edf~Uel)IN zhJ&dVVInLv>)5?z^AXm+LoEdoLoVxziltBug@yVGAr-^(5>?Z5q%8^ujbDOsuHXs1 zHyHG!!h^>f<{aI{0jn8|=8#mMdmbo(>h^kL#X*<0^11Hf`46ZBD4*M*h+ZSbuqiKw z3Uuy5y;-$c{5r}A7n%-1-b8ftgi^wvw}gI}syaGp!n1UmM3r`?nemz3yzI_Mv^V|H|&ii z_rpFT1B+|NyDVsU+{UM_+z)~U3yDm|b}smOmAE(>!}8lP3EecpT1{`gZ@RP$^e6YC zJzhH3Be&POK)s8p811*^))e>Ul(Q#?(dYWNv}RvPBvw4ze>l~Kyc;Xbtqo>I1F=&8 zd8^ll#pLTtwUYV*aqG5?2YZ804n_He_2BDqhrm-~{{+LL=x|egPiRq3=(#>M)QS39 zhoby~jQ!xo%k*urluz;Has|a~&YJN$b?1}D3=%0BFwGZ+YWUj&;#CmQt^_gdDxRch z6eMb88EE8(0UvJJ{%UHi=%#6CsOg5BprjtsQrO!|d6F*?gzeeUcdP>G5wu?PYoR_H z72CT;Tl!3@z9L9?4Cv9^*mcUdLIbU;hn6F@5b)v=`3dWl&uxg zW(4HFefNDp_I`MW=TB5I8_nrkyj|UxW3ROYwiax&pU<#@%jM$B?Ut{4uQ|LkGBE^r zTEwiN%NCY?wfyY)Qz&Gz6>RB$=8C2s1>K829%R8xSHKY5u&X>Zk+_4geJ#wWT2JuH$Nk`)nWOlXYpQ3Pm5TG%|Q4~Pt8%*cM{a=2=@Bua%l!JBK5Eg z+%7=5Ft}Xb^fB1zD(SZm6ley?Os9kR6lEoYP6g0JEZ{`$B*X{*9z)gh&}m+u9j4;u zvtQcdXZAAKq%Bz9sxNC{>1+Qv508#Z@hZr#3JSTIqvz1W$DwRaVn3@WvP}%`fFZP< zY)Fji;`Z>Dt!uO@0?Ca$H0;e~uN;?BQGq63>K>yl%cF7`Gg-+ zJUCr^M9tP~aPE^=9KpP2+Z-`>O*z`lhxya%M)SP7#FcV%Cyh)*H3S=KlpErJdXVoZ zAIf6lSqJ+9ua}LI&Kt!d@!TTOsZoPn`*93U$B)uT805TvZpqix{?d3d{olwcgh%}H zMB0tte_z-fyM%8vaI86Vc6t`@!F20HI{1NnYXOdMWH~t42R$sTm~_pz#qfmY zoE#-w2D=}xy%mk9goTZiL@(ZdxVNRi^a~p^s-sB<{1(Z3v#`x6b?V2|ZOu2{M>Wo71%@Q}~b!|qGlUxEh zVx!rdm_2ps%;jhU+e%qQ*9~jmw%toNcB?$w+a7jTsCW&gyLSWxs9#(_Uy~~hzFjaX z%}A!iG^!&dQq7b*zDrzf-QqmQ*~ZMJobq4b;kPw3SL|=O6VEIHMEKg7x{Db*8BLB= z0prQLM(99wK&FoQ0ZZ=G?Mp-UlCp)9T;g@r^6SG5h$<5KeiXLQKv%oI=qc~~v|S^n z;WYF3Pwc#b%9_Kxl{>@Qo4#4k=GDEJmN$sC@#H4?-qOs$&?Z}uuD-5(Y2Uf9nb=Y8 z+lT^f4i|NQJT41R>^vJ$7gv;+Jv%O!RpjYLi%bIM=_t+N4}MR96m2Zv%w9PU%@rwJ z6gC3q05gT)0NdL?tTQiTP`tQ!s+;EAld5G&dQIB8*U9uHus2W$CaR{?x~y z;mIgGa@q|z*VH34N%t{uRLd@mmBQNCi zclkVbNuCfJB%RUcUS11UcN})-Uf^gQLT?P){?Q_H>+r2P8FLDF7w=Cl8?gV))m2E` zGh4tL-)s%+-g8U?UtT2hUX;mLmwHtdbd}y2ep4qR-H>v|nouc0N(|>&565u@R)hhh zTbhFP@6YS2QY5l2DTJj?Q7H?9? z{VNZGep&I-n~qL$&AS)}NU_Ws2Dx&0N2>h2^f-WF$-G3&Qo3JJiRG-Yn?tyzsCgv< zM1$G1^_X_2AcoU*ZDU&ReQg+vMW3)WZI_8U+M`{oPM{0ZYuNp5QRz3b&V&iaIq7{9 z*jpyp8;xdumpF-nN_;;BnVE8(FF8diVOo#2lF4-0G((z5FAtHAB=cN&phdS==V9V!K09#^ex`J0fl%s;0HBm(l3bfqU zBV)R^tpumxfLZ#zAmFYFO32@gv;RquNZ_t5tg^FQ{*bBIN2|F#rmqEUTg_5@!S7kVmxMZ2Bne?YH5UM#aaO~Z-}+Dj$2Meiqs1HkIt>e4{{NZ- zKe{^ygQV|%;Roj~H^FL_Y8y z_7CS|^LVi1@b6zt8^yOjpZ1xY7qzr#_s4GGX{*e9G#X&N!UIbD-#9oWmC8%F7chzd zcm(wxa0%m5;acr4ckm^m;a9fYM`eyW+AA|0Ni0-(+Eg?+eAxZ+n~!sAf|ICk_gbs% zO#=)>E|{|e$EN#NdTP}v%p5@%EIwiHv7MkSG%+L7q&Rl0XlyHniP&aZM3lF!N;y|F z{zav%>lUS~`0L)UC3=p+Yu|!X;cF*=oa(T}(An%3_(sYz6jt)RdZVCB!eLDeTC8EC z4ckI0aoqY;f{?fqrL*^bwTa^b65_`Rz#*m`UG=9^$qSm6Y|qM$eaFt8N~g=5QW3yc zU7vpj6_um=fGNq;fYjAdU}>fB`{CDk-@htBZBSv4&V@7OFbqk%eqF}-@3ilLIwzX? zYaJErI&Q^|RSh!2aM3k>Y(p4{dACAcZ}VA_xbN5V?@Nyd2Lpg>L)H1?yV3(2{>(l>#_^;ajX&hs~?Hrs2*K@#5g<^uyg!Sq8OeZ7{8ndd%RLjmpPQxoz* zAJjXdnl9||x?nmyB+I#m5Cp z7i&PrY>pBT74xjA=2D6)>i*?hFxoBg)O@?}=x^a~D~Ch}IpG1Tt6#2N3mJ6c7mTk9Ts26PiiOGVde$Lw7d-C5QT|Ns zDDSZS!ifoy9n>6*{AjsoLwKyXqq zTXGU&Jao$WRv_00&Zut|{fyNW(Q@cErhwY7F3c@=P51%Lx(gD(tu4X+k;+vu`Ah`u`e*W|F=ZnLv=I23Z% zm;FO5&=%%-vBGeE@!#y){PLDtW3`>Fy^R~MCWGTQyOQ!s9nFr0vby~CF~Jyw#S)xN znaUz_={zaKB>w)srozz-=k`^96qG<&Z5_~$N89cE|qHkFXU;5;B}%m)>5Ha#xC1G zj~2$&;=k{WVd<8>{u9NKm7laW|qUsV@gR2{TxzfRz=nCc#XqyjcaNeDHmp%I#0Z z)NbDyV90j`!PO(ll7MNS{x=E^Ctq|5vmAp%)IF{QE5cF|yP*FXR!%ZeG%n1{Tp$Jh zx6dk_WAPNYpjG*gTYRrfhg`-L$mStf321IlERmqUCfedhl)9F|^XmSK^V+t0qzuE? zp4H7kISnk9?!_6ma#5&9>)o-+s@v^mlC&3Cfc?25j&UL{m3f!|STejrC&DfKD3k#Q z?3A6uR~P&YB140eDJnljd(LWtWcy9NEa>WbwHcN%m}%viFa2jen9@?1;osG)P})gR zdG$p@5lOE+xGEkTgi(yw;4tXm_>LlfS2wHDoP9yO{?jIo?=v>!&SOC>(x_VW*e3mm z3{Vo=(V;zr;6QqFPX!{c8rD9XtaYYUW$}Zibn8y($<4lY?lVV}Bbj#1@&;~W5Au01 zk$`p)cBvFV6ftt@!e;HW3NvVOJ}6*GV4Flln;pVa=hx5z$VDvsc#7M)CyUae=>5OC z(^=#8!gda>mXQTxgslC0(>@!>)_8Fn8~*W+uDA&xS?vz zAm>@qU_~hk=gG%|M4V$uc!$bo5!Pv%L>g%2(blDzat?y|=b>qnS=>SHJ(As_z>S+B zYa;=F8cklnZKklaq9CN55>(UOT8LJV)v`YJ!yAK&9$O5QEg*|=L3o9slbO|d2` zW6AoJN#^QDKTHFRDipgFqW)j2A-V_Xd{$KVHR#$&o3nVUT7Sd|G0EUDU`>a59)}SX zDL@6z6EPV@r9To$bBVLC@hquPm(~hqJ820-%J-<83l0N?2Dg{mjvAD#3{suSvVoga zgH_yW*)72SPEA`8WTzCb;t__7-qAcePvtnCYmsQHEgeCo$=aY>cLpn?@C!NE-&q!9 zhAmYI&Xl}Cv5bi(rJR+E>%(HJ#k(3&SF{S$05qLD)@fav{K4rf2}nu`T42p%aq>T~5NNb)=nYWC&)hW?p3Kr-Jh7v5hr8V>(Cn8M_=o}4VO;(9*tR>*CSbJ~x3xZM)hjEiWz&Vufg zhIWwwwUUQyyYSI1?B%P?RM|p^UF=tR;nAO6^ynVdmFwx5A7+0hfhar8%22lf(EA0&*i}rR9rR z@RI9&1|zDdjW_D(mRsMs-&1+@bDpk#X~LDa)I&p<`J57j>AyaLkX0S?B*rY%2XA{k z*zk?r^4u(ucyrCC0_SA7G2Xz>ELBwq>XFW@qL`cD1^iG7md8>K8M;^JY^_m#An9o1 z>o}tv17@Pr;LrFGCaqH}{md(n{KQ)3c`VP>)`CfXUxkZY=K_hva*VOLwizGUePd*c zHPtSrEmtJEWC4+nBwBM~OF=D4I&3;OIzcO|+N4vFd-fN9R@JnM)gmA5C;tf5akxW! z5O3tIH6*PF{T2-r4aISN4brY-2ElISYElrd{i>=+0joNSe zz|E^W&w-E7K`Kda<)6t(#+-wLbOx6eNjdaIW8LBTj92}vBb};+(}QngJF9gqzE!$4 z-{pd>TIhNvHQ+~E;15%%pIcbhCzm}@w7%WCP)VX_jXkyG^Mtlgxx8lDH|6MMZXRG` z5jOptU}PBDy{;E+X}3d3$uQ{KGpGK(4CsWmM7a{ABp+|7#?$kh_z+lyfBw|WhS+L^ z`ETYr3i5GXtY3fuDf@^1lNe z1~POmHZD>|RxV~z78Z7HQWj$Hc>O+?pBdMu zA`d5si;Ihmojrj}jsRf&EM(#4`cEvzOv>?D%FW8n!umgl|AClEIXRd?++5r|%$)x{ z`~C~YuP?)Ie6Iq%g4#W31Veo=3(O|{e(dOtHH_kssH~fCVZ7c z1vuE*Ks^63$ofh6Nep8D4*>_~C(6mr{VBuoNz3|a`ICu_oeRXt!TITsgOdgH9~b|j z|Fp>UU)!voR4knA%$)zFV&(*KvwdoFlm7p3ZZ1v`&ws=|DL6j6#13#W^L%P>F@ydG z{Qr2FKQqG5j&OeZ{S^6}4hsw0XM0H5Sh+r1%KbmmEFf0S|L~E10-*mG=i*=ivHy>8 z_RnU2HsBLv=lV4EKWD+WJ__VK z#v`hr+xXkXuV)4>WQ&FwMKUgV4<}4ra&XD#83xO^(q3;Lg<11s4?o#%It~Z`h+bGS z0elfebiQXFh>!P~ono{IFI=*jRh9-FhR2akh`hrtFpV1T+~SLdeSi5NQ)9x$Vym|W zhbP%J;_ePV<=q^wHlHjsm%TmMaYATqMJBM@97%p?GrWO%uNO{~n1*kBCa;1~B-$Gr zTlCL+rf6itNIO(NJGa31af;{x<`5of!b^7~yB}RI#8FJ(LKo!7J^GeSlF$yG=E5p8 z*lB3GgpLNWSd0>SdHtd!W^htF3}c4_p$t5`cZ4^OsBlpq%sF$kOusS{TnaQP=Bv&i-b=R% zA)i1}^?UPK=5=z}uzv zG9Co409$xB|ZJEeJy;ppcW_$8#8g*T0d<+yQ z%p!(lEMg4HN($KmKkWOOp4o{;`}clmH4}nPW&Zsjk7g(8Tsk}ac{2Acq=DGGv11FD zQ{z-eCUxX2RPLbFt&*OsuxAfsFQ>5!)1~2I5eG%pLT(zi3`PfLsKLmcU!PyEE@93> zOIJLFaue>|>GD34Hm(sj|8LSxn@2k{m!Oq-EF(pOVQnEE7*t;+G`k6u-1fdZlnr6f z1#&Ih{qzmmEz!sj7S~X`Q-abuiQwZX*N&QtciYC`8QF? zYlJ2=bNO6=^*e9Y*XRc&-IcgB9@+vVQBhR}usX}H#vj8sDdzh4L>FO3t7<#!dw6xa z#NU*hn7tj5>z`V2bdV=YkH>OU9$v|~3W7UEM04sar>yw3H*UYPh9&l1l}+0~hS(Dg zPo*kXw#Ra3@qE*sV;(4aO9_2d`Z2zc5QYTKt)(hjDpSv=V zLc45C5<6N-|8oac%+A}MQ$xwh74_HS{#ak^(}~K4A}3|woc&W(NWI?bldT9rhB`o{ zZdM$ItIdqZz!oDXCCsUd{R@V}@;7^1UOFtCj1&EW?3;YvOKqF^xmNbA+L=LRs<{MyY9sgQ1zD+uhc9q^JGM z6+-#B_rFP_?VILSTNHQvh9d=o(#9A&x|w5MfTV3{;k{1)D_x7D{sda~TXbc=UW9;z zi)m5Pk5l_2uLiyZ=AYFU1N80;WRz{yrMWDCTjKA!gWTqaKTJuRbi z=KxOOD4(AFz>mY&Weed<>=SOGg86c{UwQGaB4x>`+J>f=4zI6D1J!4)nNxPYMwVaL z0jX8}H=42HR$Ae(4&;^%c`b5WDg1&kAyv6IJI=3}?|>+aiSTI176 zq>w5T1UsJMui69?p*7rOJ1GP6VnH*kKndaX6KbI(wnE@4?6j%HGGyQeI374fu-rHP zST5|{{*B$q?&lz(1e6aavd2BP9dLA&&a?jUj+c`nmypA~ScV0`hOyVlpv5ra=?pp+|}rHoDivCLFjwk%|Tpl zq2dfDIyR&j?M?h8Xa%-E*Dp)&Bt3iDF9XY)lhs=!p`zlKjyrtfw!gblqhEEy=&Jcc& zJCM)~!PyJoZrD9(R*IUCc7KbkO@GRWIIrJ5Ig!^pyKayYp9Z97qIHNp1} zhw-qwuPNAq(`*iCpUEy;vA?TlDHUi%KA4|`X)Ygg=dQfcby>cjC?fjdCXcV^@HbMR z6nB!QOM{Q*#{zq7H?9Kuty4w*u$e|J+ud3lLg>Z}>sajLcv7Hl)*8c0(}@3h7TR;7 zXF_Fg85PO6b3fnyxO7@v4oOnH$tCsIqc>iK#QZ^d4)8+2LZV!U)J-(Fy-f9zgKhGk zi|JEh+NM`#nQTcL<~+!}ZYXlRy>d9I&7tLr@WOY~Lt-Q0E(DqgL&lJEv*(eGr|+b^ zL0|SPU`8OTw!fAh`XRA_&}N(aqSobHOM0cZ$u8hb?#6j-p%qh}UkMSiapE0nn!E9r zwVTOod&oABneK^ua1Xk|d{~_5Gk@}L%6|LBnNG3ko9FBoxRy-O&GKWV%_Zo1bI@`7 zKnM>&;Cf}{Ca!o-WPmfA8rr#td)m3bYN2$0rF+6?DSM<}jbYcRX-d|O-eVEZb?ZGS zWb$ehogB;MXY5;;E3($LHKq*X2L3o^YaVY^$)Rwu7Fv(5TkP2ER#J6H z1YuS!Gp=X}@TrPOPp?4S?Rf55{qBHD9jgLv0|;Yt*ni0S&g8)+p0YZ(iE0=useSN*EjM;dtn?m-_s#i57I1H&VuM13}~NL8yZu z+`F4mNeT;n`fM~h^t9<;nD7`DJ%{rqLZPaqXDGL?$iic`ej(Gj4fO0ueMO3dVFs;0 z{nX#Qo=q11)k-huz{By?Fzqi7HZ`Geq;b~N@LSNQeSMFHuSDO2eP~wtU0IBLdU)9| z^W80PA*%)ryDwmO%)oQF!awd&LIec=QeT=qIzI}cy&L*pX!zWLzM&o7HH&O-hFk)` zP@-=kxt5OyW?nne$UjJXe2?|Y7%)ZvPM0-v48MdKRTgrikOW#GG^$wb88yxcS*5Z+ zKNaxH_y{Gr?D7Z;;2F%G8y+lVF>RmzXSe3Wq|Yaan-YbI#5 z557FZjjabGf7zqGMX&J06^QT!qyNC|3LZ>q9G!Mf&8zyLc_yx4D0rE2(0(vE%z=St zE0Z9y#yt~$fVf4S%K4(WE=6L(ciM&W$PM@7oaY|wj$UiNU@(U0r_tF_bub$fbvgU^1BOJ&oZu2db^LOVnRM_S7 zW^omDa+dbL8=iO}h%jJL7{Kd|K@2Kuq#BDHZT&NTS|VQxubSc_CbRwm!QQO2Hm;)< z$hZo4DfBzTCjCT*BXA9rBPE=uhlCPQNSmNh8cp8x_)vb*aH;rzMDZHm-NDaFu<D!`;}g)4_B8Isr+X(gIies*mB{$ zu6s9~S+zM_%*k3V%V|9%P!X?j>oFi&O{Mm27~U35ou6*2<3|Cgy*Y0gNpE<2UGhN= zG6CJO*2)!obJdJI-T*#PnFeacUmB(aKhVOETsL@~bzk&4EWiTGkM$gk7Bf}$HUfdw zXb@M$J6Fi%_!R3xcMoKk7?yqL$r?DgLiC?}z zWy^y7s6g%b-nIyCFs+VFQ{cNJEq5qG@(%yqi7dCx6s?PA3E*VMniqaBIx6qV3 zV(Ygl9(9QqC`q>eFNZ&JDUr{F#>siDtG7>0(`md9D?OGTAgQB{h!!6v5;mjKunIn- z9=JHq{p~ZKD}6L2tq~{uQR`+D8WWwOO*R8zlGtD#ZZ#66%0k-aLu8msb4T+R)fFh3Wu1+>o?otu~X zXFexe^r%VBA1n=-K^F-l4~0QNNZbRK?YHXkQse$zTQUQuA-U{1Vr-?fx~1}3H?ne0sLjm?{$Z5sqc!h#$ptu&3lEmxM%0dj&2R(#l^?mN_I@~P z7b*H*au8(%fr+hY!S)bEWBwwASI1{QSF0_Z-_8DT*Pwe`KKiZLR zel;MMrU!jWw~|->`GTMvMmkJknu-SbT8!`K56EtUJq=WQd_7mvucZ4>q)L?mn4>Fv znjTxEs0yZOC8;Yg+44!sGE&6a(o}QHG-P91#BHkwxCZ_I97Ga}H}cSJlQjJ6y_)s; zM0)8_Tse8oO(&ozv4|J@JbURv@<(Qu=tO`H&?Oy07UM|aG!bVEYgfEtqdcyB7Bni= z^i1FsZ%?(zp4M8T8gaq(p$V?M5IN!*77VT}*owy0;u(Wt&5Lvd(|98@;6F^tK+)t~GFV$#bAy0z zj;usbsd2~kCHy32aYSK@!IjAwxR%MdP9MoJoB9Y$p9)@d8z^%1#M!m1{*Mzh4q1Wd z{&|VoaU^ya^zeunF~k*FnRrVN_+SY6zrZrh^0`yt4)he65=0-GRsZsks6u#oBUn+n zvRF7oYVR32NR!G$Ilxu*oTi80+#5)bl1G!2zV%0TEcRj#OjfD-9g8iNX=+oh3D&)p0)fnM*5tpzA<{KO7g$_=MaHc;_ud7&YHq6G4@4B zdTI-_-08ngSGu~e3h+y0Ikd1;w5n8Z#Ib%I3Huc_O>4xli~hQ|_8SDV_3Q@B4O8W& z#s#`%8P{~ng%inw2$Ysp#x2>vdLbLCORMa`3gP~Ej_0fPuwlc~`jpR=q5C;@DBRsJ z^YZK6O)w&(+>Th^e38Mk-;!nxDwy+-T0mi{UQu`FQ%%>8BEFs3jc{d;_@#VThmCY< zjiZoTcRaGQc+Enywhd2dqihi_= zx>vLg`hu*-V|tzPrEe>jDGrIM!8gw;A(~g1ZpnR+U@NmA5kn2Lz|WdSG5D+M+6@M6 z-UbVcyQt%utaRwXI=H>-1sKiz9KkJR9LwvsQ_U3y^&cY+bAvBLTQhC|OyfDoqQwAN zMIYjaCS1rj1mqEp+Y)rz#)T@%7BEbHTOUCx6k41V@si)iHUfwoUFPV{WOVA)LaL9J z;8tL^E;zc^{7wnD2tU(LRn)Nj#fWvygfSJS{oun`oEl@@>5q|iD50Q>xvfytRN&mi zoXT7iy(!?-x%|)%iR5zt+v!>FwZBQne|9eNBzQ^c=5UXbLMqj9%t{ni;P*tsDI-nk zDJ8g%2dC=Hl}N#)z6s|)6k|EuDa3go{-&ON_FG_0xSdVda^u7@mM@AvAVA2HDbo6_ z_p;8_a)G^+a{mQ`ASN%{aW%P>&_RU=g;*k)1+uudkhOQE&l^S;fEafYf!sxG{h3O_ z8!dlNQw}C3MI#1F3#^%@0>1=x?r!E)f{n-{HJ@Joo&e!RAFa`Xg36<-PSGE-TKQ{` z&FE{pM$yK^U4qs@#BSzR5hi%UC7 zb(u9aCzN%`Ht%8iV9I78XylLkG~zvldUsUNc^~8LM_;b|9MY9H)EiXF7R)8?djMuU z__ZVD&@Ss}+U!^xgNd4skayCXeBU=-j^aPuRjDU?6IbEDt7_-3jf%seh-|SdYuKw? za12>7YE*I{3cnB_aSc8nU!QiJ?2WDIAf>dUhlkTc(C>9JkzP{OrbJ}i4DR_qo!e(n zQ{C18U^>#ffOMovfFvXkKtOs&>Am-kNJk7El`5e~2Lb8QyAZk{RZyh&D$rNnYe{aI+oIO3UZwRVmwvu>d>BqGpUd=)x!F) zP?2fcoN-2Shwpbg4)j^fQ&vcmlx#yCxY@K6c|w(FbO#9WRxK2`D1J#5LD>M6=V9b5 zY?Q+=RscMcjNE8Uy5r4C+#@Zwt{*9n^x}9|_@7fAxL-)Qs6{Ufq;RhQV60ZwO`%a9 z$haf}cGy}|Xabu~#k37U9Y9%QtJEG8oR^aHSww)FO|P3(azItZj*5JpKwyBy+)qkD zL2UtBSx3WN*}_Z8y&p0qFlO>}v?J6u%~HT3^$lD=MHR$|;AEYi$m_F7i((wVTT!A< z-o0a0Uag{KXoX-gobR%Iq6))=%K9BK4pk#M?Tv`O4uc{azRak_NM=G%OefJ4Lt|W5 z_o9zO)qrIGmKBsm-HNkOjizUHH1LW(o{r&*<g5@VQZ5e=XZ~%w{DU-duo86C@c$XDCLS(wz7C zn2Z4o;KJwWy0^EpBeTnwAfh2&Kc@1Oob256om2J&f?J*m9a60*Plds)D5)W*uX6)& z9f}l_d%m=)&Ce$lveAlw}H*mXlI0&CG_y);-4-t#@cj1BpAU+g@m=o+MOhe30F1hy>j@Awxsf#pir!G?fr20?kGr|d z^}RxXf3YD{0JSb8d`*>L0VwJMs1yI26aSdPP^<^N=0p^}p@IY<5S?phgF*%Pz+muy zo&iea_yqs$a!??U4+6UuOlASp%?R9BChAxa)Uy}5P5?6tfra^iK!Iz`grFSrM&!VV zLuCs%6aBZ!Z0HZ2bo>oGaQN5aP_^ zith#CeIRugppp(`s}049Qhmz>W|?pz!|`>m2(nf*;^r_EO-TV5QfZu7YNk!4rk175 zf(j?U#z(CZ9)7qGD|@B`H-*Eq&KZy={^ijugq`sfwjhkorf^ZYU2WBemU?oxI`_s~ zbAGif^7oaScdHXpnC|XwZkPyM41fsx(}RSYm^j9bB%^_syiw7=I{lB0Q?zFS_oZo& zpql2AT(x<GSxgXYs+Lb+wTkS8rV+RU$-YJ6+YqH_~Iwbd>w;wz<>&1mVKOfsHb zc27;MrGF=Ec5q$6J%gW95Nc-f4g)ln`}}n7C1TsH!NMyV zbTO#6s+um6CkyU*I|=4g*8-(#v7xw2 z?Pv{7)>+o(N-)T;>Ub0|vdHDWy8aN0$B&DGmr4^q43{;?(srrN*JsPag~X0u(E};^ z>9+41T2M1>Snwz(&2|#O8GF}?g!RYZ?zzovv2~g{EZ&XJ-*{E})G~%n&nEak_Lqo- z4HXS$G6*{6zf^!PyL=jKY;3$!yY2HcpK#o2?v?rc!`!RcW6g-!p(%!Cc0agIl2S&A z1Hg%!s{(nUWjC6%tD%t3mpF%fn22Dgnh2isn?*V*n=ypq`TzWcwuwc6zKs#9rY6Ef zoGIdo&#^FfKm1j5C`}SR=89ZzpbU9P7q2Az!H3I8iX2DyNn`a->f0k(!ep0_roIf{ z%!ZoKoR;^g-2#RE3Z68XX7ch1xp=8%`g+`rlqEh6L+iWmey~lm`+Mjwsv#AMe@dd~SZ*O6->Z^HG zGnGpWNgUq0uPN;ZqKc*8TPTj8(V=9{Y;9n!D~Zk!hd)Fp<>UL~6PVghdS-I8kX#Kv zV%1$MB0Lu}+)rkWI7SXvWfllN(DQ@Qfw<|r2KKTOYs?u7^ax#e>e^rUedj2S%<*m> z80Vm%(y%#vKDjcI;5hh>EOir{^8NH2`hkg&a@} zqhoY!Te$VA1TnGLN)8zsL+X-9=}NtwaL6jiWN8>6@{Z_J&A5VR)lp%8Y02oS(0ZST zu>MP>kMAdKytZvN3W*aP)vg|!ow|Ek7dQaw+l|GAM%{K5&c{sayxwavZhVd^5-Gk{ zPDmu@8Cc3jfbQx}gZ6H~hOsb~oAg3bAU~Ela-L^ zQ>ZRNsYF@v7c-P0a_uMjbA5pe6XG?TIn{v`?V7aOm!0Hzrw_OmuDZKUYXc=H4{%R; z;LMcaqRT`?6l;YM9N*}U+pt}9ROX6Grm?jAZ8bn=`o_k}1Qk087QYl1Cf&n@8%-+F z`7q(=4J-RKx9aL1m~b4XZu*e=d&J8^K4vhREDqsSPU5Z#2m~J&GGw(){R;L4V2-to z>v?rs=3$a3dQ_5jvxXkCsID6UCq_sKhdkYrfTLL9yf)3V7PR;a(B6JvH74ddZBHb> za~rZ<-zuljxZN!4lbsxBXoBDw9qG(@{~dUoUIV#9pl~}}-(}3S2%S2zbR1m-qW-9j z11+7jQIcW(^g;0QYL3C83=+}*T%FHD&_-*~o8MMWos(?1OL z;Yc3>LkyZ^6O)zIdxAz{#=6^!JEYbfGZz85$SPxVsba-M`u>% zeQi1wcs#uHlT`v6X%rkF5fUJ=rg0zJ7|GNa%X-q7WXTi|dIhM;a9fUGogZGl!uSba z2=F61zTG}YDUS5G&np|&K$p@k@e~e|y-&g2Zae%2o@O%TcAL}k^cUK3R41c;!e(5W zqy%w`{E}Lf*fWeGS5}wGnrXWlL9Nht$L_peuL>*%96VuVb!1F)^o{8+W4X4{hg!be z-5q%_8W^-D^cWX>Ckj)$oiQXx>XYp*2B8NU4wn-{`M!JMaw56fnY-C?jq(`W<_s*_ zz2EWmg>}{QTiYT? zeA=Ll93xetC=iYA8G7KvAw~t?ms(aao_(Um*$E@aDk%~D>XY->&$r_YpmMQk@d?&> z{Ca>mV)Ao8czGvs2b8o4N~8CJBN`*jKfLil5_s1@RcjZxHZQH{{~+8W?tb%2mIn<-|ULr zR6lImMM6(gV76ugVyyY3&Ba?cA+eRNb{{-Z7_;aa=IW8zUl`^eOS3vB=^T7EiOXqg z(>q&z;m75dM>38nvB`#m@vYSGrNTV_i{7OOB%52T*=2h{o~u13t&dxXsVT{pY1A5J zEb5IfwS#V4?~wvs?3A%FW%w0uZ`5OD&eE+Qk<_lQ>f#{-y@8G~IeYRm$tmPJhp{=2 zE{op;yJ6rIwC&zo=mh}aRB+pU>{Gn&y!ylg39;70o?cg&8Apc|>sIn#2@Q>IkJAw~ z)73Ko?~v3$qiCZ1X4vL2@3(MM(o2Y@J8Juz$B@vPLHFl%8NJ`tVm+EoM)bnI~@++CJzk-(5 z{&xOoY7z@aOEuZ20mA*;8k5S(+ro7ofeNV;IDYT(kYZc|A8I}^%6vF6!|Mj+(1qB( zc}P71s2|Jz>UA2>sS^etO|*2VsmU^*0PpZv-JKIPVfyyP0djCO_J%Tui&klA@>%Pb zMN5)r-qN$7#k9NLVkI<}{Gv!0ZdW{}M1%FH*=M_`p1wh+h;}pCCz7sxPCwhXti@p; z-!aYHH`dXKT#L(i<0Wp|2iE*jSFEe|b~JCyncGQxk^A1XLH*7+JllE0X11w}{apvO z!*`>{lrqTe&&F+M{#_1Rme0Gpa* zMz=kDRaD7IMq^5(2_kn5b%lDEVI{>d^f2Z`7h;N(*^W4#I$vat=XpA`Oeu@}%9X#k zLaU(t95uCgnR6PzJ;VR(=~X$?t<1+HEn!31_NN0~67`GlC%Ch|9p_f9A!lhZgrwLC zHctm~wL83L^aPJ+pDqKsyGB5k7imMW#I3wR-YU-@^KoFQ{uoJKY1a$Pmn~C^_T#}G z;m3HV)lo|~wb*>~VGWi1e(sLIm#{ zy9}-AWb$WP_!%^GDKY|M$J*TUD4Cq(yESH9OoN%m$^LHh#mPrj2S)7 zfQAW8AL|UuieG`Emp#srnJMr)Mk5jUmOJeVOhHV6vzJoA^XXOEzW+rkSzPY^)+4Rz z!3o|K8SxqhW10CSS|5Q+oJ*F<@DXyu7ouI>Y-+{5;yMSqD?-89+1fxpAAL8uz37F9 zQn_v=d%=5-i}7|w9_k+a4xlh&bV?@lm9jdfgC8P(N2B+B34g*>s(AYl3)YNS*OhTK zh7Ah_sieG)f|BxI1;47R3qlNV2miXj_i$yto*Dp{$sodiHQ@@uAgC%IB82L}W#+mb z-2650y9-wcc(d?l7cMGz#LkQCzqfHk=-CHS38KnSpzuwR{(Fcj-+58x^X~;zUHZ?H zn`YYIm-$=hKV|)~{>SjoRQR7e{zDAvSbzWgbKD=_{BJ|}e?OEz&-3R&|CjYYw*05m zKSFMXT>oePf5=31I@pkcP;JNBz`#yQX+AXGL(CO~pd%v&7+kI6XpVsmfeHelh(>2$ z(n=r@r2AJG9}DI>Lc--H%+$pK6^81^7D9!wBR1T8;13-`fs|dl&t5hr+{0GAsP}p$ zR@$MVBZUzGA|cY zXr3{`7`RdE3Kb^}S%?~@)pox_Sm+HKcq!NCwItQPUaCtD$&-EEfxIK|Er4>cM$_s2 zu~CGECtR}PX)cyP3%!F4)`cGv0>&xq`xe4&w=c7Cm!;j|fSQ10d}@>KZD{{u{NRFW zjhN_1Cc5N_7|%3M8ATCoPZ$V)g2V^(-WJg=01qP4|1J^=JiK62Wu>S{vgY8UTvNs ze_KKM$FuZwa;n$&wIw{S`hL=AMm6!+d{SNtYX*DJFC~h1mkF+RBZul8I^F%gjgH4- z?2;gV?LRp7ilqz*U53lfbaOhSrQquWLzB+I8dURA{`vp}7O*q$Wn9yu#~s{H+y}BU zIkEUv3)EPql7B&Vh_=xi`%@!n$XcsGUMry| z1=4iGNIwg*1KdZ!7%WmqN78>oZgQQ!4@S8={~b>%ISkRwz$q#_9s5Fo`8vULwv>2h zJcMu*6NdZ#+8Vo7X-4R2p25WztfmM<*FRk3R6VnkAB~Xr zyLSE8+?W6B@PVIzraR;w9kIb^=7?>&u&yC<#httR7;ugK6-YXqRnd2qyiGPWXZtq*~_fn}a(sY0&1<{hN`j0imVDav!;E zQXy0$9u#VjLuoZr?1X~$-dv>(fh}~o%Pf1C(n>e&=lqXN{uUJjXGSse?+K;S{_V`Yy-CA=~SUPgl zYz_{D-Tqz0`L07tC{baix!9@RY?Faj%Z+ngTZ1^<`i&9iy`Ro_YRJJ8)D`CUW$Kh7 za;aR>!5N;-_V4d`TboWyM?qeIr@LT;$J4X#=mlZx55GRJ$sJtS$Oem<8~?k_z#m=4 zpLM{l8WEVI$PNsSHRGsmL?Wj3j@huICRQNZwblN6y65gMCJJGwpW0D8l1r}ZHIE~Y zhXE*k_s~V(tENqfO9zSF>ujNY44}24=1IqJOp3M^VSI{$J)y|TcpFLa*KBU+8r1_T z;*Wko;?TZoO5SvFVTB5=5|hSDK2r!m_)q~;Cext7Xg_x`e%8z%bBe-_fuWGWI^yA4 zZl!(A6?CD)98rOWWJrJzA{5~rW7?a>Uuuvc*05qe`!W3rzsDXSKZL<9|tek>8u6d zdkpBgBAhdKo^9!l@#a=wxNVOt{@J1WU)*)cW1IH-Fiz0}JElwH3)>U@x*A%{xm-PM zb-gD;McbwQG*B;2ur(yi3ntBD!@n6w6KIV!l%3-%etZI5Ewq;W*76|y`e3Oo1L`|# z7}4wQ?Pca|bqA)_3uZ+Xmouvs7aB!CZyx3vC&Bj?a}Sdg?T#YFHNIbh>UjS7 z_Ce`I%iJU40WFByCwU`cQlWV^W22M@@^go&m;z-{;~6)}F4j6pvwue?*@`1u=RJqy z!s|e

FszqSFu6dSy49dm%Wq;kMuv(^JQ+@2b#v8lr>$fZpgmt-Ze5d;b^#x({Er z?mma!RthLv&%qvBJO@ji;UOWh%I+(&mM->}KI~HGg0+VOjZCF_%{EuJQZ{Cd^qr~y zlxf~da1GK2h+)3Dy9dFKtemgKX&V>x{XKg-K4$*<7`nf=77loOH?GJjmKjEQh$ln? ze&}z5-Cj;zPi{CfQ={}4lMN^X8Y)U;x|;?&%wInML4PUa7>nF56Mm_#pPcAN$zKSt zO~I~~VqC6xT4VyF07)f!4dIdC7i=m^4QkiWC%G$gc+5)mg$OtC)ei83_?bj_Pt;n+ z^1BJQUYw6$_t3mz>U|GRornfZ3xE-q^CcjQo3aidoo!{q#cU!DC&~kIJM1TT&ID9A zo%}dAb$2g@VAYb0m{^byLwd9YZUka7mbr=O;-~EJP=vJ>!)Ri1MF_N$$$bl<6cUlT z0c$vpXN;EB(lZ`@W{xsa(i3PXmi@=+=N6tI2z5@ib|W{5)rW&*X8NLjOFm--CR)%h z)7&bqObw(%u${F!i4ef?9LMpN!DQ+Fi!PVdg?N0{UA=SN;WQk57Vfjs?gvZfd-8FKQsjh4m>tX^ zh>pX54p|Ks!?04sDK0|qixX**@Kf=bbe6sigy7!7FltEEMoOrYiM#y8*vNd7vG~!& zWEEzf@<()S7a+Ixnhvw_A#q}95~t~csDlkP(=C^YBh<^+2&n3@DZ*}y8TGIk!pU|A z@5G`R$8p4v5*o)QXbsJ=8rxkRnQU_ZO1q(lv_e4fOLd! zKc#rAcwJaGj^JBCrEAeJ0zP`3}(sT!BXtbk?7w(By+NT&yi5^dO}L$oo@2c zvml`Xn%{qJ!?SlWg7jd-lWZFQnj-jUPtptfmy63t(cC#A@#+|hW$sLvwv-WuQjjXt z#75Q@4peJi!ip&y_bbx7m`uS&Y8aklNPNSxKxDo0Sa+foE_o{)s`0oK6A!_Y);|M! z(e97Q$#NnnHxuc@c`?Q#!<9lhh!QP0Y9)LC1&T1d1f5HkYe}}s2sSHDF>cCKT%3#i zx3Un2kY60!FNvW=hFeZYN~$9Mo4XW_3d@K`-xg#s$sN9_Q%jk!Q$31V{`7?Ca}D;O zGd3p84n-I3-Id5bh#009T!R%q#NhEdCBA!;3{MwEDr2ofZpO{KgqGsxp(7_fLWAf@1HJ zwl?R%ygScSkJrLFP6~U(7VIKSzD_zrbXxay`@bW}{fe$Vd653bc4@~@JVsJtzYj9k zgtY2^Rj;z0!*p7XW(P8|ugXKV1HW&WG}Fb9x^tlQtVYtQ3EDiAuvY)_RNarZnB3@@ z*?qfRgEmLXZ;wZjTR3q$PQZ?j%7CG+3pBDNr)*g_-7aXyIfeaqzVZjGn?Y#Av(Z$2 zQ6GBRGbMEwX9u(}4>E@YMk3(TqV+hLj&(cK*2$1=$`lw4mFF2zRaU>;0O7{o71Z(L z)D*uHir*Q9gjs#`vDOaNAqg2-CymbsLhHY*Anf<>O#^zrub^wJ1?f2H#ZNlf?uZ{afAzIvqYJVCZk}u zl_-okDgHYIehniu5}UOR0X^94wdB9;!kxr^_d85v_gX%d{)$)5j4$UugR0i#^N}TC zk{7xiBk2nHUUNNq`1XsbZ$jh_bSw1y0QD4#)wIlwvFJTtxM?govsIpQrCNkU99rsy zol%AjMPYDb^u}1bkxChbK6Pdxikkqu|IC8gC$#htWF+0M*-Q;K2&fOBmE7F8o*`ArMXki-sJOLKIPJl5Xk~ zGvz0PgskpO&210vS%ld}HOU34DfYbjA8}zAv?G;OLNuu*2u-SkF`5779B%jy4=cCO zk@GyrbOHSLRm=lWyhy2$r}LEkS*>h{UG>uVh+p)_Z$pya87(TvojzE!e*UVq(G?V< zi@;$&dP>M})uxQ1gn_209`B43i;DC`ZCumMN40?@|IzW&mj^mu+47$v@+;x<7YJF~fZTmEfhKW6(`3a8?(iEr(q+QIemz+bO+NOf?Q&4L zocEPbh+`;#R@^Wwoplw?!stbpl~8PTy1jP+-#(CD+79Xol>*jOM+H9@1-DjjsjyOX z!uS}9RuA4*snOQsM9EoZXpz*hZA&dk;`#0rk>bFngs8jG{9_LK(AL%1za_o=CCd2( zBZjQ9n-CkuodyjNW?=t`=uV|^*OYRQoGb-BQumUS<(e!d?8E3XpU>MvolF%%Kh=N6 z?(+oL^%c$3y-zo5!QwQ=G)}R=`p%7%UC7a_1OdMLuK$}Izq+pY|l3Q)NX1Ns8 zs4fLIbY<8UU|-f1)@}J0ls073rWN|aW%;+LWb+ydAmVtR1;@EUT0dT=ipXz0I)M9a z!Sn0FdxSw4QbxW=n_=r`t8$~aPwT!gl~dpF%Bi&^f`hCVYvIV`eKwU|UcNT>YsyJ` zXVQb7aFsb~uS8;^t#58ggX`!pYe1j9w3WmHS{HKhS)M6V4?LBJvpINtQFxR0%63?k zl8z@VP9NBQQi8G-JIvQ`QZj%Y56oOn5#$c`&0j{ct|b+%_nF(N@wX!s=epqt$KhZ| zL&33CDsx2Iz^QW-ie(qGu!DwUBvdk>wAe*XktIaRlO|45CF|A6k!ILQ zEbVMtv1R=275lbXv!u0{%YQNog>Bh(f(wpSUBj1sR8BWgS^=Tl)=8Uh41}p-dgX1R z{@AA1U+<+_>~yzGpvS4l##u-)8%2#@yr<7vZv8tMHxb)H_{arBjBEVqSn@s)QUuPV}avAUmhX zSKs4-DDQXyHyWX5_*Fb1oB}ATpCgqjv|YlayilpCj8Uv?rg-Xsz;yV*%nZv5F59=e zFb%oR((pl-NfdB01qu|!q}h)ben*l)8!=s}IIU7lm|6u>KRGH949_J$y2tp9vnC%M zM_tCN{scs>?pSbtRPt&OIku3Y#|p2TIxj-)YGnU2^g7R@wK+I^acHltZ`_-@S_VYA z8yw#8K`Te;kAgmj0O9CB<5>KrjiT5*h_}~jT|XB*-Y@ZQ@2&_JhTfKF&lM$BHIU@i zIU|mq*tW^IdAw^lkXdjcs(du=;yl-GT5$<>Ir*KOM17uCZg!ciE$Ybm{Ldm^Kf|ws zA}{$}Z%4(M^L0A!hT)@}dVET*?~0uTUlu#^BCogJ4>~a3fYkx!?eZN-$}vLE5PFkM zX>f6z*2r0yv#1?33%5L+x;m{eNL}64h)Y5qF%9Xyg2}=eOJOH^YgQ&E)f#z^>^~Dz z58YXDBHWRkVLy#TPaah(;@&l`Hgzu-?~5$AY|PpaTt5hh(O(%~+~T(ZZ(C7rAH}>atCpDU%20NucZSW8&}{)Y(4q>@T~Y-38kgGxX0G+0OqZNbHTWlLW1Xo z!r~?%J$>w4$Hx41(&4-l_~%OV5}F7fIlW@Wp`qph(8`TY@(N9Oh66sn+Kuyf=K$V8u5h2Gg17dmM)SoVdIaP1fWn${pa_aS!R8=nS~+n9rs z{Kch`P+KJk3&pIn(%IO!Umc;Lk(B&hq9!tGmMYT*8EmL$3^wNMW+F$sR;*wM^+AWB z@Y|3oK&^v0xsN2R(x?OBi?q&H0{yp`$g(ezZuZG0WllsRSU2)aUIww>jCTThkSJ7v zMpE1-o{HypGdTmx8Hu?I0ac4gmT`JcM1@v%tx=I8r0SMUHPRoi%}N$K?Nip6OgIEn z%hw9pn)~x7LmHUecS6r;D)gK z4(kKz4d+aPaBf*?cP#=p_Y6EGn7SV)cYq_GvXKSCiKfNaW&LS6*w`hDzyG@bNA`_q zezHV;+$1sj5^AU@Q@QHsCQ1d1W6Q!ZhgKNvV%q8H#He6hPM%XY?E+q}t=CtTyuJP+ z;MF@#2=h!qF1Qa1*uNf`b64o=KL^^*6gyL8TO&d#CrI1q>#wwzf0v3!Ad+=_n@`y$ z#P7hstqs6*t~-#d?^(|4^2aR4q@QO0;NHu z!XNmcYB4bkR*oihK?;@0M=0W1e_Sg7&Xb%_tbaY#zMM3#>H3ve8(RFzNpR;@^(Nw3 z-{G_lGo)FB^iv#KGYMYs-C1A)hb#u2-c4l{9cjvsEf8a<%#qaPNw+KzD>GLB_c}@u zx}k;%30GkkCmH4ecT%&!lB)?^3M$ppM;iS$0E02-XCaE9thq%N5dE9@Qgdk$_^oKX z)jf>rfPJR*?9p|^g!J=o3Zl0IQk`ph4ddtMz~!W#cOBg5^v6?8=}?n~c0uoO@c=V> z2I3az7hBQzh2w5jRU0@Xxi!~sLbi1)mCQySyNO<>^qnpUXOCFtvKVdb5%y!tq{t!OPZ z=%{W?u;pisJ~f=z_Yv^)pkiV|c|Yb~@H0=VV*i(MkLTH5PFn%vVyc)BAo2w<_yfUH z*m87u2qP?OOsJe7#+TatXy)0z2RYICMz~=Qcxd}vG5Ixh_484GC@#Q7IU|zjscmV! z;Ys|}a3`Q}@DuJY+&9IUMT{nnVUI#~d;$&xyigkwpE9k1+&w>}G7yZRT~aVhbojWc zN>nUx8WJ5y`;3*kIX=)d01uz;{&aN7;2irNz~fnJ%U@^nYu#LKVO?NxnJk~Zs5f<0 z%wys2VdT<;X1G3+y_%7L%9X>9y515C@4PLaXfNiP=XbO5ealx$sd}2wUuffq`@jj1i98F8}BTzyuM6Oe6*MHNm?@4ej zGnUkpnI*3k1DjU|`XqC05Yl zSdGQs49nR{xil77-17B#?Js2Znm3djv8-=CN?{*oe73>^=xgW{4LK*P<^8S$ZjS<) zH^EgX%tuc*%@t5hXb0l==g0&V{>UkmhW=2(C6j69O`)+++&?H=A4zstza^zegG{xd zgb}O;LF^)ugiGJ$dJEKSMhjrNaUWC5h_B&8Zg{z8A}*bygx1b~DFg9oK7ER&dOh(; zH5nHQrA(jzi~wSI@cevI7dHz?a@``iQfoVOeEoY&nZg)Z~w!OAb9?cUFm(e<1r z*I=boVD{yyUO`f7+M(XmC8lFXUwO8vHBMA5AXQLoVp;He{-`wl}CW?ObBi-QI*w<`^=T%-Zyj*q2b$stzb3@k8^iV!_Xs2dd#}7Jbfg-|GFP z>Gb|YTnuzCb$ilaUhCmiA>T6PL28)xN0vZp9wY_PBxlc-!m6Hi z3D3r2qxha8pScsc(w2U`!Tz(M#FFqQz}gtFvFal}>1H~z{S)(T1)>m+;D&*ax6R3y z`r1}eoDH7#B;|B`T$+k(V;M3p;mS{l^@qp9gNXw``01?8gSyGb+QgX+(|u(07(pOO zP~lc<`_#Ie$$MrVkK=BS&=m4>2w$8^e)j4S7dN4fbZx`a;!UlIc_DvQ(>8_~Xj@u> zj1Tc|e<0jOsivV8>gIjM3rb)Yp>b)U!mMxL)R(*9nhq9kWk}qL&?I=g+GZ`CYouab zK6LX;pj^g@A8qPgL=>J*5H>trUMBYWn4d`^_#DA+AT}uR>@J*6pl@1-o%z)FX-6+~ zT<&jiMThj1fxa4M(tD~qL%~c0!sQ$Nud{Ric$`HLF7hR+PWtb&sq#BdUX=7xTVYegxkOPg{kV@Arko8qzUJ!Jlv^+ z|7xla3IsQC9@#94;8#Ga7;Qs-c|$OiAQ{jBdQCQW~Ho_P|jxL zqt6dgBb2{UjTOn-pHOZ`09-2t-u!rF@ZGoMnMhgJJn4vlwv(Et&clNhiAH2}NfRYV zKa%b#aPY)P1|{&sGkU_JnXUa=hN{^=>P0QxaqcaVaN7F}{t&dZzT55yotjAQ6^i|&g{%(`CVgL=tpF?g5Zl7gOKGyGU(Clju(d?T%ZJW z$}54Z6=+ADLr9{1c4mnhm9~&9=+RaGTehm)k0IuG;h62g07`P8WP?7o6+BI?CoAh%7(yMFD z6wE0IA3WG&u%nFzRvRj?(R4!=*>m;nzJcFm2EqTfSLxfZ4gXjJ^o!&j)*3?d0tx2< z9tU`HDJ@S3$+aal9PKDksuVVoaeQ?kg)kScMsmEFDsMPl#sW4rhpD=exr2_>zM%H?C$r?NlW(YLs*}JByUSoneELoV;c6=g}&#py7^o|9-0vP)A@4JRaV;# zWG&!2b7LY`Q&Zny}5l!y?TOR4ozkg`L1nt@59PHj91B>x@Of(AwsH(gwrXmujBTk`5yBF;U0) zt!-}$&9h~1f!hAgiDxH2T|SCzd4BvzTJlhm=%cRh!Ew{$C7U5;la_=+k8ip+HMOSX1a>Y^j-LsseEls zNKP|LXsMaol8xl)MwIC#a!~J{3B7}cDlv>fU`6%E|>S#*Plu{VM%t02p zgo(Enl56?zat>Y8^mCxxzkj`?z03MMc?h0^H!V{wfKUJK(omBbu=5B+%gmRke4iGL z!KBpe@q!Xl&_aY3C#4FGjnI)QiIk?ykNBYELP^&kQ_g0HwPt3q$);9LE;$7-NM*ez z6{<&YHBn=qhrzCVE$xSEG8!}sL+wK%cx3XA{FUHv&0uuZ$7EY+ZCMS#!O$8+~PuBzn!=RcQ8_JR@Ueauh=ELSgQ&klZs48+&uF|#VFHw*n zDbuob@)T;dsS2F3xhL-__c+*wxhX0TBY%XmvyQ9C=VKUfa~UcGdEAhj;_HMyAyQPt z+=;BO%Ca!8aqVL5wu|jl)u!q9KaVTGQRpJQGe@n}C_a)xJGLpOLdZ6!&qZOua74cFCG=y;l3d&h7ZS#n2O30PtV9h!9VX2z= zqh)O&g|hb86}I!4u?q;clf$-|tw^r9Y8BtT-%nN$^SSxz*%jL&87@I6XLY^)UqV)T;&@`svAbrCmm zyR2u3EtbB2Du}p5KV=-J`=wjh8298m7Z~AHrx!X9-FWV#bd+)_`$BShg`!uE--tZHfo*>Ii_(`5!CdKfIG#2cafos$8|)b@ z8GXVMIY|8E44U2~8r(0OBQZa0@12hTE3o5*R@mlYnuAO`lZ@j-rE;s5JM8b_=$5%> zyUh#8YtAKV#G8D>o7G6JiZF`)`4?K8R?$TU)Ss@92$h1b5I4k#wt=DpP$+~N?hd2c4?Y`6vUW41|pSs0DgW#`2IVEvJY)#{{4W> z;ogEa>*AvTk27w_4_E)fFrNVqTQ>nfWjK_UUm^qMrzL)b;|&=QAEo5pj6 znq&u`O|f1^%OyIgCFdw>DV$B7CMgC;3lPK0;rZ}k5lJn?!qhECEM`gh%eyD0nz;pscZIMpC89xH{_R$FE0^ESyfV^ zR(OKqy`f6%=r+kAd_c;dIlp#f*T2>_#E;&UiMGb`0Rxn$M#$x{2UlKDcQj4N%vsOR&ctJaFspnK*lNyuYbaT*8K%Zz^ z5&J@?n;C8R17X*Sg>#P2*;oK*7(pb@bnJR}m;u7*7xG0GVj#@S8&XCKdBrz;5nIGU zXC+pyQ~yEz4i2Q=n7r%_SM1f9#6o81QJkjUS*mgvYz4!hK}7G#_DArvn;7jx-G_=w z)*xgZq28PC-4~{1o$nlF<&?5$fnqUex)k@|W}akG@(!;^)59H~48<)j4=-kLVXlL|Xcq4eZkyRcNctD^VsuwH*5x~#8;q|{7R66tRVWeey-S(*s7xxHGygs!w2&8(`` zy?)4mL!}sA#3_32{kLB{6yh z)3gG5e6W9FOO6zclY@(dk&TOogq59xjf9njn_^%o#%Rh~si-d>mzY72PIsc9E zU&jB{W9Q-^;b3R~m&x;g(f_N)%0!}-tV;QhyD{ZBLeZ!JieHJmk_Y|Wi5EJ@Ok zm{kETUatRdvyac;z+fro*!5b#G}0Fw`~WEn7wTwQB$%ZKEG;CYKN&=pg`G489DxFk zf6}Nu0A{Cy{El_>E|u?pU=+)F)-xe9w#6rGB|}e`2mhc#p*D+#v;)UI6rN( zW=#YI6O&6pDuej>IxY7c&+U&l&c-$j_E?+`*9&&^RMCdL6q$TR++Gfa!59;RFV?XD!UC*6tkL??dWlK7 zd&0uU3&_(pJh?ggdmxU4B?#`wC4~PdlW^-rp3S*oz($}_W~&Iqut>9XAi}^(THr+c zBK|@quhYVmrdx8su;n=8QL9NiyE;^)N?X$>%fwDU@rV$TXRoWLBjc(GVK-}9T=>mc za~nMZMTV87XJ^L_@MQZoP9DGw-n$wF>MMV1$UzQ1Ea05dbu*ozybd++&^G zH%I2tUv7(~Rn6KrI4A|CeQu3Z)A0q|;%_>2SIkmGLY;;7CI}^MxDH+I*%fim?$$Z6 zZA?AI6={SkNLnIAb&M?z3clWE>KTFMph$gGam%#P;q#^dXRVTP^nqCRsIIG;QUu>7 z?e1h}Rl}E{#J0J4CJX%Jm5hB$e=$7lv~-j6PtLcwd*XhYt_)FMJ2Rqrgq%+c1zKII z){a2+9HhV%sQkDWo~{s*En?^JE_{my5HwjXvCI-z%)@1|_k4c4E6hayvccc;H0YSRni@lIEC!F!`IbLQPzYvwLLccy2ZS+u+w-b zZ`=<5J=AdOIpJ#c?`22dUxfOP$Di-jUORS%?Hz;Nz$r9w!79@=JiD*h%_GbgnU9ar z7!q2d1nekJOgCtGbZ+JJQBAwX!t5!v(miv~CfNKpm>%|_BB&nly7-CpZJZuC87VWQ zZQ_K%bJ@kqo^YH_1XN^P5}Mz932rdRQ6_YJO?%P`@KfQmpw1g_!`sM?CBiGDowdtm z<0Hj#_TvMX)AVzkR?W%G401GAjn2S@xXREbv`1>`7zk>zfPVcxZIp|4?l_r? ze=HB*_zb?KJ_gSaILy8)!tWrg0WSoFJeKMjL%lzGW-TP(T$TO7I0$74%7(DIC{wwpq8Y=DBwqMMj z2-iQW*w#A+BvUoo_toT zJ5H|!tQaxi>!=!S$+NE*eiaL}Qqf^Qj~4zOf=J)BAdl+an=l(g*eeD_qS(UvZkxyM z4!9DmMw`x(NxauiQmx1O8WtjRn^WcI#%AhKBC=F=O+@0q8sQ=%GIgAHS9BvH*3d_B zKVfkEzDVFqf%gt-@;kW-SqnUvEu2}RxYFa#DQ19 zI}NKE;jLyB#nT8b;7TA2;>tMS@Z`Q1WB`oPn{qx=nAo z#RHh!eIl-6phU#{iyqfD6nUPIx!B>Pj5|>s+idfwR=QR>_w<&zot=qzAz}n(3~-QH z)2vkP(f&}y?!thm4=8B~6RQ%xRGq46+U~aX=u!Hy@0@#1w1cm&WOTl>WBU8UXe#Gf zO-Rxnf-^L!2>cB%CE9Pk{xaAxgJlEj5M$@CDb+21Wz>QC8%-Q7G`Y1=q77P`oyD+} zCLeK%LJ%|~FBT-ZyY>6Rblw~I2GHTP)x*@t*zQHAyW;=Q32P~E_x`ypo@5L>=*(d6 zzFm<&?jutn_dKqm#1D1!K5m(Y9~;T{hRld0GUdMx&g!Jm`J*Ldd3t#r0j#4}wA!1{Kn%xcyGXQ%AviRGW!z$?k)GC8Qw z*oZx@U^#vRAtF1rVsDw29-6b^kN`{<^%Bo{lxB{aHl9M1Xj@5rFkKx*cbHIZ2cAOVs3&8wMOm5KfG29pm~^4lct|mLoe^OT86Xws!ISJ|$)ncDIOF9l}Aw^kn%@ z$Q>&Sw;Uc6@i@ufIIS3_(8CaMX0Lv+-PDh_uJ%mc4RYd-FH{B%04+;sA0{+-+O2j zbMJ!o&dBlZ#FM`e;P0_}>gW$si~Do#3|c;hHUUZ%$?lftren}aQs^?*qAUQ90Red| zw9BD#?54uIj>ncRy60jNe~~P0qs>Q(Rmn1w)F}7^G#Ok?I4v&JKo(18P}4?4;<(hF z-;#66f-NI&qW3$Ia#QZ%1jsZ5+I<=cjQ)i#76(n38bv=5pmB%`{}do(w6>$p%Q34S zJwnYL(}^_``KM`@@K>Dv-iDKX($&4BjZ>ZT{YqitPEVih1^s!|yQ{qHr*MSx1(W~P z?_BBY-avOpb4J**`)LTVce&(OxjvlF`}a^|Uj1jCvu*!-xKrPR5N?c|n{GUBCSY%$ z@jWJBQj($;pkp?sbQ#k~7HV)-QrtcumS##vICaQIUAL_9+K|VnQ#(lrSXIO8XZ*o8wyqwfr}>-1ad^ot zz@kj-`d;EnA=gpDUqHUk>~DMhAtx0R$t&Nv9OtVpfKJ%+caT|5uJduNXQ|!I=EE?L zt`5J>*ArjMfe*y@O!DSjnza6IE>$ID>04+bE=RO3rrCQ4lzdz-lTy}XD|BaY^x`nT`xsA*F9AIVF_K}LBQuf0Mm?;t|Ae}=SL&bs}EoZaq}(M+Fq>ZAf1rt*-@1jEkX9B8(isE}*4Na(0(z8#U%ydB>QF0x)q0Kj!Q>rSLjDIaC9Ma@3roestgaaHO}48al#l(e%f~pz}{z?9yxFGM=#apz}J*r;z))_@9=V zMir62_7%^saqV-T!uK@`q(_GeF`KHVOVLgJhVrU%xJR|OKWg@!_m-R$YJ1*{uhw1N zfU=TnkFzP`3!WT=hx}1_w$89bvG^M}YX+|Dkh#bRm_Mk_YGlK8UZP*}(u^%qFFDQv z4=BJMy3plw1B>t<;&2l%d|XbKh0wd{W)cm&#@R^8IV&a>(X4ZmJV?XYSO{NmiYPb) z-E1Md+&b<*J-rfBQ>5ZQ8Kcr})PE@v0RleBpX+)~fMLbnV>Qk8?d^3x_whI5E|9i9 zBF^y8N0UsjlT)F#dPjYO6*>uT$Qs)h?M05ObU ze~*qtb^BtE)R^N`p1#*_*;V@hOs)(%S$`)7P{H6V@Z#njb>3@rjI_GajcKq=kiP59 zjDFzC#Y0F7@BifQ7#kAolb+|LaRWAwV+w(^a(G<&xVTb|FQ_*xhCU6!TU($0Tu zZQpk5!%~D9ivH>eJOE(%iUXmZOZP6?kSyZ+RvKkl^Zndk)>p zmR~d*M6q`&)o36J6zPu@-E6CCb<;g|=@p$#8JP)5pQ+!OYqdbhg(yY*dgR)VOYi#| zL!NiRfolbrOp&%6h=!RyIo9b$3A5q#Lyrb$?SM05X`oCjs1L$ncPC7*FdDNONE6D< zB-iUcMQlnbc?m3}blqtrQOe=}X7=;t_u)JHSbIxez1Bml zlQS&5z;mc###q;0V$shuhJn^4QdK$Id2)tJ(g~4x*j)x#jA)L&ovAZC3Vmfq7Lp?Lc)$zV^RGAkvmL zBxT1eQ4a#e1mmrOUYJ&!p_AkscuSSOa<-{fJzg9WjXuFSrW=$N1h0$`Zy7OOb82dP z^Jn=N+M#rLxe?`CKzRUjtnx;QietEb0;!*$&7{ghC;k;qhxcR+!q3WvKJGmOQg3|0 zxd|U-eNp&L&*_W4kJSP4C?mc}vgaeipKWh`w-Ff!w;mas~rU@?<#$jRAWy~$93EOtYV__Exuq(ps#wg2sthYU&t9ALr~xi zy@7hgarlmVOY(Kmv~*=<#rrD8+NNnl6r#fSsW4dfm@YeEgQ1LehO1lAR-UvxD9tag zM*utQCx%%p4Wpv4I!P>hqBi5JWki&lh!NNHD?)|WrP}))LND?4?zK4IQ@z&dR=SpK z4EXo#ljQnvfKE7@<_g?)Bh)(`!#+0ljxfCI^xMu5(6*%x;ysxX!Sbogu*BcJ$R>RKp(`oFZk<0 z7{R(H@%k6?UevBT+x-h}fYBhcp(GM1ctlt<1%O#i^Ormkfg61Y!8x_OY4ZNoujn= z`!TAf)xuQh&%4N+yBtG9d&vujsj3E2b!Hm~f4%Iultv&rJGhTh#a$~%R#+%+VccT6G;;u!Z15rjXW2sz1tt^qd$EN(p8-uD2SdXHPB3mrv+gUZtHqkbFhb+ z&~VaT zm;Y4oa!@o99;lE_%b+>JrQz91)k)W-xOCc!uIZh+9iGp3n-Dk7!l6-zkEQdBAr#xd z@#b(@4!|l*yVI(7@T_JEiG9&FOj6zeSZ+pWj<@ofw+ zfr&xG8>v_xFKR>qtDtj4VXa8EsAOGO=6RUY4PgxCQ6M2-7-+g1XZSgA(V?>(kp4@? zV(=jkL~PLhU>PLTIz3UZW)(3akjJ)r#V@xklOcFxuOm(|gL`eagV%3%(EnLf=DO3f=^(u~5k{iT5;=GRx%EIF#L%i;=+!%7!O- zZU$NmYe&A%(?Y{ybfj7DHdO2G`lyJ1rbm?D6hF4<;~N>a?7Kjr*jJrPz68ZY z&pv8+69XAgfNsPDYqT`&^uBdFaXYi0uT4JS+u`I!ly~cOhC{NN2HP}J1h;}610``Z zylM2kWIIM1SOQ0(IK5mau@yo3f;VW||C)Hid1L6~h)EX1THC;!xxq1=$j<637{5ki zhZ`GfB5{L`c94gr*6@xNmlvrI(J^?TJugUhZ(0J#n8AO@r-rdexO*(E<;~oh6?#vHXq=V);F3P69+{$Ofk|bB@J?u+&sUxKtOk-!ncE z^c)uv-0Yupm0E!7hmsl!2K|SGe~vsHMShUHf6;nt4g?t%JSYUVTow@Vf03d1NB~s! z9}QL3Nk`?LCU0yC#8LGdR&YDrCqx>Gf>ZLrDC8ObnnW>?I*F8Ey-2)=SZW@YOh;3U zSeIc4&S@DK>pWpZ0x1u=V4X z*n`XGx^(i2o~a(=1vcrmlY0*3lNIidwo15A6y6WCMVX*jzVT;Oa%+(6JpY7GSj&ZD zRsJjq@!`nGA7&T_+v4a4UW?Mo)4gL~n0ix$QsfT|yGW(ll`P!9Vk&`@auv+y{Z8x7 zQk!@paYQ=gix)b)691#1Fyvx(Tq7p1Az74GsKUC5z7A3)aOB;W{hOY!F!jdQ&Ny_1WA=nX%Hl(yAJO6y!+kz zobSgs<`~a&_nc$QKXc6Mx$k83;Wv$q%*z29hW_!7H(kA#*;@&-beDNSC$og2Ne8XC z(;Lx=40%`5Ezx&Wm^U#{fr~Jw~ zo?pI3=9J~C2nZzru-Gkx37)GlXkV1Pru>13dZRVOoLesWo&CGB_PgHP4d}ZZpOwv_$`;W5I%Kr2){s&&c z`!AmHu>KcU`9ol!LP>O{jDP^|pRj*$3$MT*%)(74z$5ekRsJB4zkE;u-hWAdFv=f` z059yXIBwWOslR-GMe_6WKlq_MJP#{B^iOptFYKY#AF#s5`xkC`usmqId=I4PPZBRL z^ntWI&=|fyiLig!{y-^yZte#n^Vb9N3&Q9GdHLubI;@fo&4`ld)t&=9+tVk!|u%+6`r&9G* zgQlxruKp5w<12o&I%qrYX)DOH$M1XS4cpDIU#;hgaN(~QpD5XB{Uual`F>Ndg-(`D zE&a|IaJ2T=xNd)Uxgp}m$3STo9FLqS&rhfmoASIh1K6YwE|0?0_{t%eMVQe6_avcz zkMp8K+-J4FI@_DZK(7A|Q!3`1w&|{@d)nxB(gAh922-C#!s|opcGETuNGg|j#48p> z@|;N+V{a#yTG(rM;vF@QG*aog#`%drj8`hO|>b~T)^azQX z*5k}@lX8okTicOeQQ=akb>KVBJ8|bc0pf20FeA>gYAF!PR~>Fm$qnpCxqK`{V)9U> z*i^x*a3yAx!W$6fvufX zz{fZd^?e5N7K)p>el+anT~}vkyW}E;>)lRVIi$(L%bHSlc5Qq?ihb1J@VR*oXt#cfwJbq%yn-aAd(aXE9NhMP6~S$dh8QlX_Wk80(Jt zET)D!;d}Bh>Voh)9ENttIz}4=N7^<9h`sX^+TwHKp|2}bO;-bz=*|2Xg!3R=EgMs# z^93i<)(lB&Frt=e#u2VMNkIr~VM=57mfY&X7JZegQ&l5Psp3f}#d|w(Ab)9ThWIy* z5(9yryzZXr4O5j1h3uy@PU)V4aj0GeE3qYqVyyHaoS5U>jWJ1GgJd!j+=~JD8ar_d zyq%`;uZP>~VN+_P{c;Rnu)4Z#A(8HmqSoPA%}MW~N7&G9*q=nk_M1+y;dr3em}uzj z+GKB^?ZYt}dZO319Dy>Tao6-Bwj{$ zTzJ<_)0Mg*@K>m@)T=}`@ecu_nxLRg+LE>)K*<*c7SDzF+;1~JqN*Yr#P0qh$CJI( zbDMt$zha;u$c$>r)nAQSpYr-NU;qnMx})nY1%>{88c=_qve=O;{+ZWmNA8qK#q8!X zW*UlLY1+LMi2G6sB@)azw=7q0iZ6>}C(Dx!7a=TcvRb|RE@U}Frvji!Cb++26MpwX zH3AZG=|?})z(+x@e8IDL0bYNteEhrK@l{j>$MLs09r3}YeEPTmTGlhm)JNzJ=RO~Y zN~4S?;eyTO1ZgATzEZq)HQ{U{keA+|dunJvE33cgY$(#0*}|LHl9^U`j#o!rN2UG` zjD$h%r#t54Oa_X|1wlY8U2Lxxs@EX@>rR8zvGJ#`AEO5F1_ zv2bpRsrT>3bXhX;#+Q(}C7zAnVrv_c0~Z86)l-$?7E>*9U1=e;C#Qz-S?^?QtzCXI zIw(Xb zO7ZL8-}*Np@{byU%t!s)*Y2KS1uk(UQE>~E%l%shxB#koSWrKYODHz3!mDY?O>X$+ z2UtVAg&B%M)9Y|E=1VuP^eMi8dNfiBR}e+&7*tQFjAe8?>kHTXXuk(W1M8XhOCpipru&})Bb~*1BgnBru1+Q<*Y+Ylw8tUBP>6aCAw!o!;lva^3 zbX(!Ox@V#lN2w>qz7uh{?hWJ95<32!Pd=6=#TcJe9Gj2vQ?9an)Q*>4u!vouA;oND zsT7VQ;%@`gF$>m_TxSpO+q=1|FzyRc?w@*j&p8yvdJMUSgbKG&eq4c7DlZd>Zl(o_ z-U+)=SPtN1qzGD`rjR`^^S9sAME0f3BI=A9H}w47+9h&^w1+){opWzrMfEtqn=D_D z^w=$2V2YXXOIgw7#S7rr@dtq!**CHUF*7{0<{?hNUHMS5ny1-eY=n?}3ZYjvuvK@( zpjI}#ek9;^CI7{f(;RVD;7XC%^Yc@B+h^vo;hj@~A6*rhcbigp)#SUw7fT=BBU9p{ zrSapKl5~$fL6t5)OZgC}TvaM*zHEJFd-E zTLe0RQJ_c-IkwABw@(8XowanXehE@FrAq8(8kkobbNjV&i|v_4IWifvX7S#~n*99C z&Q84#E51EI8cjiPamG_2zZdiHm~R5h0ojW=dTdi*MO~`G3CB@t0cdN(xL7Qd}DhsKVnpF+J zVojpm)GfD)>ao;9p?Seu(ltEQUKb%DHV4jlA;^vCwELVyj_KvE5xrx*0kNE7 zTe)9bXY!$Q#zuXP{o|wNYUm`7a94~0YZB%-)t=q_HgViC1h-(zm(ej(fQ<_pQMn$tSi#-CZyr+Ycn)beU2C|y7JM7cE0-5bZk0I9 zj7|By8C&()D~@c^L{FD#(rRs$XfrFc-IPVo*U7@|37tzCc4tgC+o43gYi6y$zLec3 zG$?sw9@k17VM-|{SEbpT%xwx9zw?%nV)QE?>a%tX^kbU>mSWwYv62WI$HdTbLmwTqA#32y;kH|06FRXzsK)MIh)#|Jg!Zb^JjIV~--dI7h! z1lr%K$zTqw^|Mlk-^VeKG<{Qm`tM>XgyV+4psNc0HM%{cwIlN)%-93r33|xmyFzv~ z8>up#WYO0Yt!>rM9ywrH{J=pLqQxV<7HZk-73h(ZV4SO*vvdyI>o%I!UioPh#v#CZ zy7yb_b_@CD0&6CgzCNFzaN!g6z-KX2bi+iyy}|)`@vQ4dxNdNUaNy`SAog$uJ7fq@ zTj*0@#erfdIxtw=pa|FyaPG;C5|ewAnMmZ&gc3d8%|(_*zxGKEE17ZAb90kgkTye< zu&kW92tLy$Y-RR?TQW80a|rJx5I?QQqygryJ5gaiFSGd@Ilh4wu&2^hD=k#E=Y)`t z&!mPr{5u|rheEL+Y6s7NuZ6}ZW46!Vah*Q;#9S>jGcVdWGii8IS7R{sQw8m|M5m#p zqGNWFS^q~msc=m0ZkCqwbAgFP!dG>|H3Rle4b}_^Wx`Du&oy;f(VA8KakKngg5PIU zZx%71W=;5Shs}Ehmo_jW(RXgCE*Y{Msb-R!P++cSCeBTcu72kF23#5#kD1%A>CQ~e z{;Ces{2bGuCE*^Q5$Gw9=-cV9AA`X|jEebsrXDXtMLx08HPJ1Cpnh#M%t}qS=r`bV zH#OdIlQ!(L!P4P%q*x&N;x)lN<~{ytj_8k=O1Yrf4YBL9J>0O~zHz?piqGzC0WQ^B z{Or5bRvg~5k+{%OWuO`b?$LOK$uEgff?3$x?3KJ&`;lVau~cPpz~ZY8SNO?&V4rPc zXQL6}am!GqZHLGzHa`sa%+bT8b=X>wu}3AN;X>>?M$#1D#DW+&o%)bkq?s9<5K;NX zlaV*;puxLs&u{&fEgKLj#j_Hh+l)i^;gOiLaJ|~osT?o`0m2#Le6QTmb{ExHtZN0f zA?|J3Hph;}1f(=^YQ5$}qnk2M1<0wFS2I3luKn;;e?Dh}I9*9Kv-tM|-`C;CU*&|lxb=5_ugc|{eB9FkG@ z=0-LgnRecj4jT{+44J;5@+&ewf|~eUx9uLiuYcV|)uhY#dKZ>EH`EQ8Hl3P_F`AjK zDjqG)G)0|?^lnDjU-_-LxEqpEnZ#7R^Yk`wlJVxXIooChu3xj(iryY{}aNMz; zLboj?357$V4`xmIzD0LB$1T4xLb;n2Uc$I(huqQLnY~@JyivR%y`aDFF1R~~UU<_; z+|wMzrvrd%>(c$_CIVP4|KuDetB%km{WDULa@@~*VHsukGMy8&klf#V?t!+AWLJTV)R_GrDC!6w0c(Rp+!a=z-cC?y*4>4BqtrpauDzqtFY{rL(N zk`5z+g@5IY<)f-uKa3+#w!{Aw3D9FCzW2)wCWMUzSSDtPYTHAxdr*Atr6in)y-aFxrr*`m@HdMYx*L z=d5{)sK98evdKxPOjtnH`c&16(bz@f;1punOH(bJ$Pj6|mLln*Wpi6%c+qzXl3p_z zvxUINQu?zDm1|zFo9IA=-91?Ga$0&iSs`u{kSvWICVf2uw0BrhkE}tHInl~sUBF?O zw9~xtn|6@7IxEREV)!z=mMplMmH%P-V9UnTr;Eyvhv{}qAP)#hRslEEfP$?u#9vpB zG(JQ7192`P*cP)OpoqtFLs6-?-(^RiFJu+!Q2(b-Y9;(p!U;0W zD38&pVg?87l@R_#nzp~Rw^EyH9|J-pU2iZn$Of=AZv#>~`SgPX%D!&bFqa0Pyu=?% zdiI7SUNvr1lX>312}vgOOUeuO`Qep9rCI)a9b|-O|x1)i< z1-PO~&kSZE$v=Y%S+&rW+tXPzG?>Two8(4UpygO=^!#YXgdlDc++!Q)6 zoRzB8@aW9aNf&c9$CsMM1bBcHnw2$3zOlQ9HyUEy^QoLbz7dK`5#ZzWO7Dd|?p|cq zk0N>u>%1Codc_EyV7Qx#-dA|RkY37%$r*ZEpyr>4i|Jh>Wa?z9QumFAwkJtGvJ z{2T#>(VD<;xD=v-m=1H4=w{zA?e(Vwchl8nGOHzQC3EStPqOheU=tQ3>snHPIa$j| zCgUY*u04D5kh0l>bRoCzAw~|8s9B{xKaVy>E3C4T3H2bAy^-Y!3O}C&9@S;| z`0_L}y+|FVB`yt={T2@VEOez|DP%bVkruKMH1}!wd<+|H^IJuC)*?v{{r; zZhh*sogKT7P@Ud8FoO=U!a>EEv<$8iDXX+5siGBM-$pr+ zWegB{7ec-4co|QIR-39gRyxHZ41Xq4s~%6FTM?;E9u&DEirEbuBz{v!`iVLm@j*`< zO^xvwYh7AtN%TXRURZSR`WI6InGaRw%G^{rJ(5QTB~tu@*YtC>W{A2H_7iR7x--;e zctOen(+mk(R6HrMZW?`J1Oc;R8768;;1xGP@ZBK8Kwlo>diH=R@`x&~v`g4hYs9Xd zZrDDuY7jMrGLIKn-$rNF7tMNfGr}4R?i~+h`P`}>&K`S0VgavK_lO$<5?$8?sEgcD zBT-r`3~}tY5n89(ESAZA1)^6~<)EN^OWe(zPx_xSlqHee)D8BeIkrnd{=zCu6R<%k zrPEMm9|irSW@>CS@s%8P62+A%#LF!7=%*0{#8DPrnY;kORxXaQ_9NyEbIjv56^(2~ z-{_z3v{I`w?bK;>M&BJwFxhem`Yd?mXfHT_zKZ*TqraYcT3-HZfnH7AAiA=&?X7Si z$p3@?JcrAm?JF*eATkT&KGVy1?Z8(25LFrdxy(}SVl7uXjfi9Lpft`Thhs#1f>6K! zND>}F#ETAmuSmaO45?DvWuk4HX^}G{8OicbDEy4}?4>bVMJXjzkNngb^{34j*4QbI z_O^s)bm*|O5> zapv*KHnyE7G?EO8=Y7R_+K*IAey8V6Bou39yamGm;|f9>!#M|La(H6-GY6E(t7il4 z&8epE@%-6qEZ~_^8tL)&Pc`J-3}-NLK>gyyq4flBNk%qcYAJ!%Z91AKI)&N{{)?ei z6u;cu+Zre`i}PhatShnwC}bsjF_Z7;!<$h~ce=~OCtnT`H()SOwlzY*wiRYX83E7? z602kY4fK{He?}8UJJr!1wC2^^h~{eE z$2*EP&w7m8hovM}p0@=y>j{Ch%u7BdX3F#e2a`&YFNDm6Ed>bI`tna7T7^~@@YuV3 zx!EzNJ7EaoZd;JRAfjJ~3Ewuez~AV}W6|m4uh@^-rpW{|3O5F}$n25wWIIu9p0(jb zoO)yIBBwi=`R{OawVAh_(YEJdYZKcYsgslinpUHfvGaeHm2Q{jamZw0=bz~zFX5C0 zbQ~Ws7PHIO3TjMlp>v}&C6If;P@C3Yn^e(6-|^HxyFyi}$j@JWM_1h=+-%T_6${GG zdy09DL~K^}QeMQj2mYjfqEx|Nvjw#Mp8HUE`y}BQ8TQp~;M&(wcTSD_Qein|8UgGv zkQOT+FV;i%ZQrI%l)fkWn9r~egJ8jcR$W|C&*ZvthM5>yZGsrB?3U(_%{bGtrWpMv zZoUe0yBzHK{!+9I*lhPY()kH9nhW=?IZn%}76pLf-RspbPAj#`yU9%j)kUFPU#VO^ zM`aCQByQ1=Qc~gCS=I0S$sW<5!W;m(5TrY!3QG)e=1T^!lgHJ; z>Q*@?(u$JR&uq&YymKEuJ}T5Vau{m(?qBmxZ>!gjmQWKL7v})r^w8^p(%S6 z=<)t@)q~;}Wj6y8vh9hbhk^y12P}!uJI^EVeft+Q;HgtUhq%Vt$DPu{Y4@oMgfRSO zG&brc;X?n;@dgaAnyl&OwiD8B;MGrGIG6XPnU~!JY_bDxC*TeV17Pj^vxmc+tY1?_ zFX$3@OKWEwI^u>E2%ud-+-M(s$0ofr%k9O(vc8lwOQ6M^ zxbVAY&pw>K5Wkmg2c|pvi+xFJB-XuspzU)W3C~?K*9{9mJ~9UDOtHtiAeS~Dg|*XN zA~9&YK3)o)1db-|u}{NX6W6l++HEDpzKh9nQvplubf(kL?rCCr)C5&lMop`oGCxG0 zD7COCuW$xm5MnzFPgRjst=8y9ghKh!UDCs#9}zRX+Q*52(@fPD=C@3(;i=zx)~xJU zd3)rn-o7(?%>CD&)hIzv;l$*iYKABxyFB%h8OU&S*!t!D& zJR}G9I#JVyzDMS+UYQl&pMSlYZR2fMe#{jwI1jem;3S7Y_95kFHwmlM=kq}~4C6<> zpb!>YH0?$`xO%=z2o(1=VYPoCiA5v%M#Awx1J0tzKvAJNDY$qRrod`p z5#onV@Gy?|>fD(?@QSv%?%egCZlynxgE<_VSKtBt{1F~{Yy_aZeE+sTG!StS)x0o5 zLm^bu(UVbDDD(lQadSVwG&&X` zDD1zxn|NT{|6h00L#(bcdlKZO%Kvn;$d~>Y(1*fM?gxIx3H%ZMAgupf|6BjZ^H!56rG?;V`X8kC6Fjheqd3E*yo&jbD3Vq+a-IG(aw_JI^Niw^a#_ zIU7d4q~=vJ?-$Zv%q_#8LeAt=(j;QSQcumry8UjG z%OUIy|6)^Y%KDMRFO=`$@Xp}#$!+iWQZZ`Olh3FQDU&q`gWx66VH4H`NXO~R3lE}K zOc@trx3@C)0oNgZo21Se4tPmbwzMb@D0kErg3Oon`7wDC8C(Gn!R|7}M_ay3lES|) z7zgResv=g9eM}k7NCGjI5(gIzZFYF<+Cuaq1OoH)!cBRDzV~rgedY9LbXrF4;yDA6 zU3|%!Tz|`+T3c#y#qbq}+%m!g?Duj(-c}Yx6;1XProver //(Client role)//Verifier //(Server role)//Prover(Client role)Verifier(Server role)Shared information : cipher suite,ProverId,VerifierId, andContextRegistration record (w0,L) derived from passwordProver 'key pair' (w0,w1) derived from passwordpsa_pake_setup()with key (w0,w1)psa_pake_set_role(PSA_PAKE_ROLE_CLIENT)psa_pake_set_user(ProverId)psa_pake_set_peer(VerifierId)psa_pake_set_context(Context)psa_pake_output()forshareP=XGenerate key shareX(shareP)psa_pake_setup()with key (w0,L) or key (w0,w1)psa_pake_set_role(PSA_PAKE_ROLE_SERVER)psa_pake_set_user(VerifierId)psa_pake_set_peer(ProverId)psa_pake_set_context(Context)psa_pake_input()forsharePValidatesharePpsa_pake_output()forshareV=YGenerate key shareYpsa_pake_output()forconfirmVComputeK_shared,confirmP'andconfirmV(shareV,confirmV)psa_pake_input()forshareVValidateshareVpsa_pake_input()forconfirmVComputeK_shared,    confirmPandconfirmV'VerifyconfirmV'=confirmVpsa_pake_output()forconfirmP(confirmP)psa_pake_get_shared_key()to extractK_sharedpsa_pake_input()forconfirmPVerifyconfirmP'=confirmPpsa_pake_get_shared_key()to extractK_shared \ No newline at end of file +Prover //(Client role)//Verifier //(Server role)//Prover(Client role)Verifier(Server role)Shared information : cipher suite,ProverId,VerifierId, andContextRegistration record (w0,L) derived from passwordProver 'key pair' (w0,w1) derived from passwordpsa_pake_setup()with key (w0,w1)psa_pake_set_role(PSA_PAKE_ROLE_CLIENT)psa_pake_set_user(ProverId)psa_pake_set_peer(VerifierId)psa_pake_set_context(Context)psa_pake_output()forshareP=XGenerate key shareX(shareP)psa_pake_setup()with key (w0,L) or key (w0,w1)psa_pake_set_role(PSA_PAKE_ROLE_SERVER)psa_pake_set_user(VerifierId)psa_pake_set_peer(ProverId)psa_pake_set_context(Context)psa_pake_input()forsharePValidatesharePpsa_pake_output()forshareV=YGenerate key shareYpsa_pake_output()forconfirmVComputeK_shared,confirmP'andconfirmV(shareV,confirmV)psa_pake_input()forshareVValidateshareVpsa_pake_input()forconfirmVComputeK_shared,    confirmPandconfirmV'VerifyconfirmV'=confirmVpsa_pake_output()forconfirmP(confirmP)psa_pake_get_shared_key()to extractK_sharedpsa_pake_input()forconfirmPVerifyconfirmP'=confirmPpsa_pake_get_shared_key()to extractK_shared \ No newline at end of file diff --git a/doc/crypto/figure/pake/wpa3-sae-pt.pdf b/doc/crypto/figure/pake/wpa3-sae-pt.pdf index fc41d3a9ef9edaac76dc690c295171e9681a085d..4af3540da7ee61e33330f71a304abc9ed912e02a 100644 GIT binary patch delta 25746 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 z zrf*k-}hx`w5BRi~+VjS;M(E;iRZ z-$MS_#n^g^z7s$8z1aothidBm-#R&nITcr#DFOfWQvcD6guq%2*tn+ioj zQ!6IiXu6DrCOhzs4%MrxjJVK8$7#3&&1Q?#!F+z_9HtBzfNR9+ew;N0A@p!D#1$3~ zFc4sRR~oj>rnldZBtg3VY#+Mj?Z;BNw>t5%Vx-AI0^F&%68xq9pa^(EB0ikxYthBl zOYM%RxqlF;`B@jGACl9-l&$V*P#;C48Dsk~U7p7eZITY39fYeU>SjPu6Yx+B1Q(J+ za{hi)PV92zzb3BJ;{@%c20nU&vn+`j%KUn!H5dQ5IS-@i;o)wqY>b`)nzqw7z1ivE zc(9tE@9d_nuTOVYFzfFa0npRZRBMIb!xna|0d=^Vc&hF2TxJ2%JGVoZe~eN z;{K)`!W}VD$y8v{TJ@-PAvSwm!Yp>Rey@Ld%sqW+B(^n#^GzG0uIqWCDB_@jRaQ^DCd54*p-7%2oz3#9#&sqli_0*>i9y?AEnevl*vsN3a!z;Ee* zL%Z=X+D?1B&}2SUSLA-Xvx!~&oWQx*qDL}|gVD@lG_W~;aceochU02YX!M@V(7S#= z){{U1htv0%M!8|z%83#3w?*S{%{Z>3|S^dH2epS?3Av5BTX!QDONqc!Pv86MtgY{}bFl_QS zzAu!JEvf7ixW4`CTUBFVXR{p# zM$Drwew}(naXUu$1B30?B$4gHo3-d& z%9BaIzf~#T^2Zz=p~ENoyWaylp?~_bjZZfEz{iV4b!{-mUGz`7z+IrZ5UrmhQ6}}d zuej*%SpN%?l!5`?N1iwsuZ{6=;MtDN9g}1;*w}vmb-IZNX+QCU!pJnrFe2uVpBV~No z8H7Hm?KtE>fI~B^=>obS=jz))eAZ{kJDPL9X97@O`huGLrR8~6o3|=iop!e!NeWr7 zYuMie*}N`Jhj}C+2+{xzK?@x5z$1I~7GWr2%%`vi&P;Uk! zQAPzfPyvB=%>V&bnovHqp#apZ?qU~r(UX@*Jrph^!w(0krE*i-u~aZ~@dZge6x!d) zDdL-7?0&qxu+yoXDHKm|fy^jbd!U`0%(D#r0lGF}L~eUvsH`*T+mn*2EL3rPkm5$3 zDiryBT)UkC*^HngSo}M6vK+050)H-u#Xv1Hum&+<>@xF~#9gJRo?0--P%kKaK6Ud- zC@Ops>4)hO`OVB1l=tnoK>Z|Uhvi5J&iK=+da_QQyG(WPLzppMIp4)EMbG#RJz#5} z{neT@tXD&BfyTED{?#9=K-HQ9nj3|%K~ZFSXC-juGEClmHNDNL8o&^hHdxR2g@+$s}z`x)o8*aQB2-(c5MiCrJ6q-ZrWMkhO1qv{! zf>6$kGK-$u1gsG2UB#K~K@6q{prSZJ2IOPuUWZC2!kwqUBTfm0>X|TSWBE0^^rUfw zwL92nV9muRF-Xl5Vy_yq&1fZdr0GYT#3{lu06~}7vxH*xKd~b~ehH}=2d{rK0tR5B zeebK$qkk%w478C&z?NYgLT7a}YL5 z?l2s<@)gDm4gH4gf4KMF8uyAc(Cf@DV^uU?W?R`^q*AAk$YB-%KL$6LDv1eaDc}!g zQS>B5?uC&6Vp$H8a&C!1R4D|~3#1z*dGs%k)FZJ*y3)u)r(r(Jt3!7f?Z~>>taS|| zqn?I`ir2&NCiX53$S{i-`F=bxoZpCxWquBtkA^5{29l2f4iGII3JuV&G&LuG7P#ak z&I{eONlkApSN>+K^)iKY(giWO5*Pk3W8OMzq-7}Z zjv2~QNxUGjVi~hMIZSZ#NT3P3ap3joMcnVsFucrHc+sxkUDyrcNigZo!TY_$uqB%_ zD@RFT1=yhrZtKvm&=vHk&e?q%V1Mt0lsHe!1jsjtyxkYB>6}U(?fV+_edS^4HlVa4 zUNqReo5Z6|trcw>Gy!e;dB*5YGb6ZcM>2@~1c{5ojOFd=pfe$5;J~bWY~)$cMc%^I zLTg_zx-S|Z8s5lxl&A^1>_kzKt$ zn-R~AKn?!Ts^eIP@J}(vc+I=Qu(?9Ad;v69xriSzADK7ld_dmmF;Ltw*RLe>C?NGeJBw*EKTFjJzAsvmm?l zkJ;wXL6b#S?|@SEr|K3RHK%90O>AsilBg+xvr#%)@nU)4&3$Dl&e(dQF?x`$&q_cK zeq~=WT`))dtUi9M&@~G2#i1A3@lTwqEWd?4QW(icl6@>S1hun5*^<=1zsbwYyps}= zH&M$<0*Z8+7w2zbH!>zzL16T~O}lHBaPK+nQw)_*rGY~obt?;x>jvVOkMz;ncWbrj zb1%!UwHtX@y$Z74Ie$r+gIoIc@+ZZ$OQu8(z1AxTtWA$k@l}WL9%1_FIZXc;a#;6? zwnf+|gB<|e7l9;kMD!e~JUs52>K`XhH&MKh? zQU)_`e1JA;G|J!rce9On!evE2QfTulbD|u%jf#0;G{}zD*#bv-SQ&l?3oj*4oVeBY zUg$fV35AQsnalPe*>cIvX%bi`9;Gr)R%)3ql6WZB;|3KCd!J7WM*Uy&oE=`auv zu31hxcUfXhbRiz*29I_$cMHlpPJ7KT9aPiM0Yqxn!gibGJdmJ&S88Xu9FV-l4|F$| z)yQ;%kMcTgWZk!`L3gvOXr3TijuMeZS}d5RyBFuZ@`D=W;p(bJ2ug4qC`Xk$=23QF$TUpSD_2dPG#>w6r zfy?T#L)RplH?y+-n8faJgcPbbxv+i&bQ-V9CzzjdJpI35(fAZN#xH3Vo<8z#fp5`l zFk7m*S6w=CL@0QnuwA!{$#-botNZgIIMQKBjKR#cw^nyIB*7~K@t?5)(2tB(Vi z9wOD9r7GUbPdwd@=FCTB(p$D9pnZ3HeO67mR-dX$=FzysyO+3qCIhwAK^MZ)^BZpR zW2@@*UuIL8tubTsPBXRS`4-||JKFtRI;B%nr+W=cSMKmZy4ginZR)s}wBw@}ll0SL z7uuqp@T=n!>N)ocvL50Zj7@|1Qm|_S;s?#Sd6_>}`>j$~4blKe4`VM07uQ(|ues4-MP`_XyI^F@9OxVlZ*006 z%Y zL6;l*e=#~U%l}|>HunD?j82t+&m;9;_KrLeFw6iBdPcxMIQa{c(@6nXzNqa8<%#8nm@@%YM zxcVQ2&cyn~uo?e_?OE9ASsA}*H0!^Nm|57qHgNuf!vBY;vwf8S{|5VPY%KK5%>VHC zFOtqm&&m9sTwmS(-IIxsjggU_m4oA75Ss~uou1{N%YRV$7rSQWq-SJg`9k~&1H51C z`m4)-vFi;rcQ?&HNj;BUC6hPAE6FJ%*Pb^KM%)seBk>sSVaN>E$ZI#)yxd`Ao0+eh z2`FGiUbja)T?dJGs^)4E9d~SL22x3+oQhB!#sdJ7%3cdlggxp zilh}-7A2=0PKG}uJ*)=C2g*I7i8v0Fr<3M`@=vTzbs}c62uaNg&4yUBOQgv?!*E`C~q)awH<$8~rH! zt>3GLy{dK{b97WX9Fx_YYv$a6b0-D};J&D1Ai%%>%iBVZaZ)rcs@NDC4GM=aEYNEc|Q>TWz zfWr2k)CR$KbeaoU!=ijYeJ90-cZ273();_VzQeGss=M{MSIqeHS?Jn9|H$DseC_(6 zM_pkRsMoTzx_$;@LkI7a{Ft@EYG;+23tm8d0`snjnE+}08mW?aN(~ULS3I!i&^9sn zv|#M14SXPtY#|FyNRu@_3b-#zv}&TuAuh<((L%@m%gc09wQ)W86h>ejqr1D-X-wxL zsct%%{Y}wg7i^_9Swtr#JNgdMGb79~Q4fW#>5>j^n^uD>ttTPFYNx z@U%BMt5D{6aLKKW)!~Qsp$B3%Bn!Jit7Tdh*T*{{VT+WKA}f_3%ZD0$-{Mzo?d72y z|6Zc-^!KUg^JI9l43hmRCc1U+63tbGz0&o_Y*rcMrfE2fA?H{F%ZI0aM%KHcDTd($ zmFDp$_e++^jwMj!GgE%+kfZyd@Q=B1{s{vMmw>DbK7C22`D7rwmx z5)@NCAqBHHJHi5n#UH4oq(>@0zc}hRAZ6Y;DKlF2_pkrdrpOuXTc$^Q0Y5(?er2Rb z_dgyKNT-fp!vPk4v^zTT2Hf9&%f_YNsDGSn@b)&{TDMGdzx~+UeBJ8&J;zGYs?{%* zU_6cKU}c1k=R%LJM}7akX7d@!jOe$;Lc0LDxf zeDBZ46a$f!F9_LeE$KQqmSpLmKeudsKy6y(TvnUcjI*?buQ_dRcysH^E@AeR>E=;x z{H%iXSj78$?P|biI2A3|7JAi)P}$nmmEXFOdzOoeJQ%q0&>9xKX~7`M>jnLZ57Z4~ zv2!IXM zQQU(iTL^Ob2|1&gUVqO$JC&68%az_qVcONHVW^4(+)@+zLwU{7o9bl26j%uW#tm^` z_XH|BwqqCfAZxio(Yn`^Hmq{XCH;ETekHFndPwS6QvoN4pmma;Zh5gbLLPZ;lcs6FA=xBr7b^$Q`9m#c(L=;mfS$k%!d4^>9y0BL!`IW1{-!fPjn6I# zBoCgItUEl0)HV0G`Wrt`4K)0yrn(eVe4nDAD3-CkDJ=REm5q(#NvsglMyBk|wqZyg zJXV8SS#?q|X4nb**gltSrqeun*StJUzsPd(c_W~M^l@6f{CSJOLdFfW8{6`Hi1MV3 z>Ik|SPMa#I7}kuS2J<{{hqWZUhh0fgA575*5J-R?74ArtLT?D01j^8S%%f48Bj$TS zm+ahQOIpix$#o>&&|jvhr|ji-RBP*Xwm%V=|IlPtOX?;vI@T(Y3>7=Efv67 zDXD&b@SDB}c2yhNgD!2*5xnZe?*SlSW{J=XqHEgeHd?;9seI*I%_H}ez34v?i$u$3 zSS*4gKD!Ggqfj8H0>t(od!Mdk zKLwWQKNa6>Yud)C$^H(I>N-y$t4$fXFIug4LMoZ1>>yXRk5Xh?3q~<7nJF;Rk|sVo zrj@{s_cku{k!!kN7k+YToiZwi&B4y%X{nb+#su0)k76*H#o)tP9$9y=!BJ@34Ge<)(umZiI2B=(%$A;@Z^KZ1|pRT)I18JoV! z=)=t6W24D-NPDoscF_kDtfTQqQTc*lx;uZgGn{fh1<21QN_Bm7C3)&2F+ey$`k?5I z&j{yYL-o|=Htn6hwE0fDr+q=q*%B?L${KmdHu74V;y|xkJ=&CdJi;6$AoF6Y9QzJ0 z5Lk~z81_^9yPit3v_OEdz1vJsFjed0oT}{G?|GrKoKC05$DiGFbRRf|1JygxydMWN zi_ucXtMxL4p$;5?q426I=&(A0)VkBn0;W!7aEG+}(l%hnJi^yC=J6_kZzT zJuScP>h8~TRrRfkNjeUjHyFjq;6QhqzSDZ&)p<6+sGexPf;oC|tHz@Kxel|x0 zR1pqyMTBcSWG70DH6351-1i10{==X~z{sFq zmnM~**=RgPUn>ylKA1%m_L?vHzRlNocVqS%`<}@k%|E`hZFcPn!G8l)&!#Qm?j{Z1 z_s*PSJy@|$QF8eu7BcKL4Lm?LLs2Q{Tmmp5=^koIuqwx>Hn}$N2o{~Ye0mHr(pmLQ zmZNCryVm@Y#<8Ch}d?LkGQ7AGWwV|yDSQO@vuvA0q3pqK38((Rh=-rcMhD$ia4j_0qw3qf-lY+ zsO*xluHDSMo4aeJ7BJO;K{Q1WLDXaTxR!WLgo9*5@N$jnBfqQ}ttd*Njw=>9{JvZQ z7>CUZu{E50>}koU4|KtI0pkMW6zqG1DSELA>#^*7S5^4ZAydeAcQx>#;W%?isK)ZD zynkemyumJazTRzcdm!>h)u|N|u-bYfY>k?_(%&hst)g#b2|V3YUf5dZX0L#4D-ZbG z&Taadb_JMI`xZWmo;cr1zX>LKUgi}eZjS>a1rM*9VR$vOT&`dAS#{SDgR-%YphwBiiI7T>7Ch_}Il3 zoEw+PC!jAY9=9~=2 z50FBmE=?^)~}y;QQhLU9NrB|AMA%~q6mA{&nvwvO}SZgDqK9KDE|^;0^5mc zl?$aWEx{t-y_S_rlxreO8Dd*k$0?3fZ(7lhJwF6PK#GJo8`2((>Q_Y2 zc)YBAb@9W|R@(&yoOl>PQZ-blU5l_LJe2Fb?G;@5ry7))J^9oV z@4-x1N)#J?o~Iv23DG+$%k;G?WkM?tO|3BB=clmp&YmY`#4!N|kJgYqJEVxv&k9ij zhx#(DAp*DzV*4^AE6QIWZQ74A3pd-`2~=PeE5#ycQ+@|URk5J^x9_i`C9V;uF-%xk z<1=h<`99C&!FZ@=-MhM-o79C0i=XO72H__9EC%r|Q805Y)i z$S6EK2N4|05MgEtF5l@Eg9MyD-S}KqEb7#27SY@RfYs-O{db#6O#6MJOw((qIN9^%6k}EFs0XqB^&S_wmriD5+z^ zKwE_fq}uI8;zQavi};~BX(mhd5^?IZ|7by0&6dVUo+qzAGL6bT6~XToooZo4 zH?eRw>ivsr6kcF%w3@(%J*xPQ zQ)5kMlU&?XbT2y(76W^&YFKf4hqYIzMzZYf;$l+1tk1N)TC^iR^9PR9YgD{W@2?rY zXufVSor3*8>4?)`CsB{T?CRh)w?^PBw6P`sj%K|jM!GpSk}x$zIi^hv77vS&Ts%;J z^|{3|EBe0GOnDzCXA0NAHSuHO^pQs8n(7LV^21Jj)P9@3r8i$jf%tZ!-R2nBS*sQ& z&z)ZXD7m2N%>eF^nexj*y1E|z_esPVhg`5CT7yix(xK83GLX`Ub#Pc&IP2`$-D5*HRho>=S9RmwNMagP=@QD8;Q!mR3RdMP(S zI=-l0nQAb#EhG>s4{qJ(l#g$xe<6~Tj2606;t6hb~CwGgtxu*qCj-x@hj z2}Dv~|2W$(Ph)azL&krm9eJ?1jMVD^oGv>O$62DS{z9u9w*YhZSq80{U7M*Pp*V_m z!aF=`v!HVAI}XZ#7g+X1<7T_Tr?kUx8Ix`?>!T2r9+wNO4mici+Wh%?c zA{$#A&@6qNIwq(sVmR?ZCpv3SKyas(}PbcEw_j+$TyG2A-P|5zn;2uE#1DMvemwCLz>@vzdqpP3i7WL zHh{j*d|L0%k1yo@gmN_LOHOXAJ5IuYslk0WPVfcmsNidCQo5iG^b zF}?K359zm9O0f1qm!!#kL;2Rj^tH)N=zKxtc*7375?0_Cj8yaxeJk<|@iZsCoZgqG z@b}2m66mkar}{1!ZrL70Zee@-7CY{vZnP(hykyVg1eeJ!(5l6R$YXj#^Sq;&Z6Q^WU;GgE(&Zlrlc(d?2K2=x%OAd<;5qC~!D%)Q?ZyzIcelD(_*|)P0z0TSciDp@q)k@^ z8#*}m*qLIN>xa8wn>I&rSMzy=x@sv7RBxN!?S7^Vb|-&gTj)@*6B6yO7jLZ-Gnsvh zv(PC$XOY>>|DDE;mbJ?EY_ziUoPMT3-9&3k&d%?Mcm>h!O_`- zAgD~q;js%H>`P6Po|{N=pJ`g`BiIIf?lS0}XZ_qnn#wL`={20Rhz{R`W4p1hQ!dD8 z3!7P!1Rfquoh#PC$xJIYEyHi}>H-~qZds!*N>-9jT@3qNfoYyxg86Px33e|?PS%+b z(`s=@thybEji*!9ddPU2HcWXTSRdo`#ci`KI0_$9r;GG|GRV&}QDHFV4bfb3e2yNWn^W1rqgMp)}+I15?ZQuvC7+bBrNHIici{_`q<7ebt()BLxi@ zZf!Q(UQxWJ)(91o|3mXNUc>YyTI0&JW=D17Cmsg8t!@f37yf@rMr{K*hr+ zzyad^BMQLx4B7*J!S{gYHO~S*Am1~w4&di~KENLo`mcTe)incB0r~kk0Nh-^!1rGZ zejV*sT;X}aA9Vd+rg?r7a{nuo@r!!r`HS{{2JWA`f1H%-naSsVru#t&J-gY!7p+u#xzsJj`YQBZ;aGdSU~VGPV6UPO zI~uFwJZzKheKb%EYC% zM!(RjcRePNnw~>^a2cD$bT}YhWb$33x>yPQiiEvu1Fj85QH^CHbgqojV@qS*eA^Jc zr9HF34A2|0=%vC#4y8d2Hh=vX%Y9l%z&*Ip_(u3~+WMnp%IwKWYkRc;=U|*Y+jpZ` zf&s!7W#0j!*kJS#dT*t#+UpZLGuwO^88M2r!Lo^&02lSa{rwl;ITrj%>g%P`AsTta zk-qGDZ^2m`-(1YTOY52hcCaSO2D5pf8S~zp+D5_a+G2MO6md<^6`1n&WtLdwNTmx! z66+iWd(vLX(|-y4B27+E8lHiXoT^W}+qiq4LRfQXHtWczk-?; z&16mH*>TU9HsinpsbNumg|^-tPRlsLlD2jB`U8R){QiO$kh3!zmHhM5w<^s`njfhr z3&E5%>^60}C3TbsjY(U4dh<0X?lsq7E%3@K)m3&UJ63KuJd{|?GHW)w;ZaUce{;`p zkx}|IS$z^oqcoXx-1>P*5W=n2ElxWuUw#ed9aH7Y<#~7tT^W$&ol3SKJS>+$C{~?Z zger+^C8;Swba%`gdoQ@-4tPa`C%7#(DkA&Z;$qQdGvy8`{`5=`?(7qs z7ctgn4k&DGiuB-cWqy4fefgx2&E0q3aX4fAJ209I4ce}KZoEQiUaKCSD;;b5lvUg4 z_yO-bKJB9;1cLyOZ#rd56MpQh5=zSwedY88#gdfM>H@P`vx`fPl(&_iJ|*7Q_JbWL z-PyH;?ds+{b2`U+ro_L6PmM*ghFK1Fu7tQSuqF*w<++bJa3*5CZytYg6)H4b>=7;1 z>)&L8-Hwqc=5J>C@~%#I;b_W{Hs9|qG97V+BJI}2<%rHXN`B);6z$$t%pD~e(O<|B z8ATw%DbAy(1uXvvsCS5m5C*Nd^@OTV|zlD!Vc=K>X=b=HNLEd8l>2oMwpSu527#|3lw1|FbIs7 zfVF&%KGIH7X94&i!|8Ug#wv`ZQ+CB90-x1$J)NQ(*KB5X_oiwaCIG5KnBe1f@3Npw zD`-yf$QXi2z`SI%9P{X#YJ-#2j$P+7#BtPI7lV<^loSVzk9K=H>B)}5G$f?7hP@d< z6B97SBD5krJR*}AU-p9Pe8dEpTf*t5BzEIg_pS7A%W?>SQfN(k;HdZH84~Rn;D(?mJBw-RE~W9rNfVmd)a zgcT)TcBdsm3WpVcWXD2N=^CmJ3o}+20)-ur)_0*AC!RE-qlBIM_<+NG5qH1T;nVyu zzDdHx@)-mjcjI{Bwjczbep|SN>mNa=-NSm@3^8p(yC7#&e%FtSJBiaUQ``BbTDM|S z#RmlyvjHJ2>vlcsLTdo8mr-lm#`Vi_hAb<0(@o35QFn}irX5jqU&sL!Ecvc%*8!5^ z4YxSYxjdDJLB;^v7zw!fKF1ct(j(M|Dj=F;X$5)EI3+3k#9f$HVZ_TZA>U zUDKz){cU(9rH)bI4PLv5JfU;b$N?eAF*8@@jLV^BTF;Cff2an?_d;)bEaiZ`96D9c zk)IGtfq)|OXa%jKP>n~bf*oC7yLr2`m3Z{Q=dO3)tq;&L{yn&~`fT`dxJDS<(iVgA zUX`EoC2~nZBRv{(b;6H@hpQFEH=akWwh+J0DccRTkDXtcS*8ttuC~Fe)tpV>oW(m` zB^m~o`9d8WhPhRH#;$s*D{Q_X;iY+RI@A*@8RB95X4Z^pY77fS$z8f^Qk!tmqz(^H zyDT$U3jL?^qNgEvMLO;r`zkYH17_CVC{?cey+!*MMce-#E~DlT?&%9p=_-S z-?8|N4oXYsKn*^ePptFt4)40&j=aTK9&+{}hxR#wea!hFx2bZ9?q$v4WiFd z{rz_C)XD!V*rUV8O!C7qB-S1`CB=R?KPq}SRF4q!;F&l*v4MPx$37WR#k*E1}81R$(E|9(ItQ?d7}(_Q+ys)lj?xtZ2Zv_rXWx^*akYE>_P+Qyz? zGED5MXMH`O@5sNZ^`UY>qYQ7s?Us-G(IH?tTI}Q_cq|a8$QaN!W~S~P z-2jueuDIsptpftRQ&76w@;fZ|v|pF>s2c&!db{DqS>8pF(boqS$G)8Taa|UWiwLNN z{Tkl;6!9pnEwd%9c#Y+m$K3Y0@w$%`fl*;Fh$kj-uY&!JWgc;pe4Q|nx$>Gqar48Y z-2%~CJd!Q6duoHXooqA2<1Uaxor=5XXSR|U^_mL^Vqsv`8o8^^E{k9Vy_P&H{+T?)ylH8D{##YmwQAGpkl|guqPmv5b=Va8@!3FN zm`^ys-T&*S^OQ5AGzZy99StvgmnXIpOW#;MFtk^;IR1b--6t`FB>g0F@fzWReIXPV zEA>#BGL#+A%TF!jnyp&geqQ4B8plNCEC+*}wrUFIlh%7WpEdMOocQ-HL%**}w3ZK~ z8$xWa%u7meO>_>@13c=MjlyKxn9@#{UaBw;>39cg+JA3q^n4;ocZr>@(Wlj7!jA&b zf*&We-zTsZfB%M`)1o}ao@M{RrV<`nf?=6J*mH&V=Flq;?l5##q#J%;jII3iC;f&g zq1$SQ{r$L`_|M(l2T|nejUPKK%M#xQN>yJnaCzk&*4z!WLRoKYjE_`RN##uR+B<&r z&J)3HL>H$n4uUyrSh`t7?!*5|~Zw zx)J`A@05)8+K_qea9b zy33gR*_UR2tZ+=tIcv%-gff&$0Ui;;+qh&;c;HWH<<&Gd76^ahkM-(4-V~N0>zmI6 zdY9BLSk>~Whg4k2=&d|fL{VoBuho7>yq8iiqlqO_od#voPQzAIs_sfATZ5EoY#T958dSPa6i)uMhN+z|>?=pBq%ZZ`#1da~l-?#JOFCr=$w^4jm`_ zUmwV?byQvYI429M$SMaJD;B%eaGDPi$cVAQD3iUnP8QI5Gv}J2RuRk@b06M~GRYC< zGRPH4+&_s);IYzOe~JRfCpwwuUA(I$2na9AS4{W<{o`r+{^@eFXE0JK|JxJrN5ug^ z;VJ61nn@Sslg{C4ZrfnN6Bld5y}oufjAh$9DN4Vz3H%$-hxHmA@e40wH@o7^L3zL4 z(SlMa2-FVL2#g{$84MCE+4~n=b*C+`WAILRMwsnz?QZW50vScYPtamKVnXdm?dSot zP-OwQil4!#c`vF~q)aN5pd6ur&~fxLHz=#TVtO&(wsuVqyZu`b3_GuoL|#e8U~ytK z$TI6l#w9pHu9%p&ihAL6V4A7uJPn-mcJUBG2SZ3hN0A((?+Z>MIif72MDZU4>4kby z5=!vjz?Qy%o4Ib}QEU%i>BYoUe)V$f3EJ;QH~;T7eR+Pv2zmH{d^KTj`CzbRm6bH* zwEy%aC^^k-_m0Fd|DiNGuHD>I+zSK~iY^98v6mYV-8 z_NHToB)Td67h9)p0aE96g6 zoB!|4|0Vg4#s5PF{@uX;(EPjPe~JEa_y6(&|L3v6e|y8<F)gJg0egy#jS)ZB*1i|zd zssVYD!NBtZfBlfgehd&lZ#Ar{=eiLZ|J+d)b`P@TO#uS{)I4~b!oUHa5z%L*CpQll zS7oj0pEC9f*sZ@C=KJ+5|1w+y?{5r)@O&#S5b${idPqz_7`Wj5G>xAXs(DOctskim zl67S#S5kM?;~l*&IjzdoMoyMXBOaX*S_~XBQz5h-wO*RI26fY-Ph`<{EH8AxW?3tV zFBN3$ zG;sy-M0LdXq?Q_G(*(|fLQTo|PiMiojD?9KyN4gPv-eu_8%M973*f%Z`RQ;#)uuy8bTOE2?GQ` zfI;lgK*+cnF$5eW3l>2Ycg90Fb$O-DHD`8;6KwYEEqno0C9B0B713Be%R!LYu^P-& zIP~qkB11a5#o(o|j(@gtwoA^Fp%mL7!wYN^wJbtx>6UgcqtRfNTbM%VetU6t1P0qN z$ABA*#;@(IaM9?cB1o;`bI>%FZxMfB^cx_jePXYMxuN}#Dkn*5MK%eOS03yTmMq4p zgkq#k&G;5p5VFtAFdZ;XCu}C%0hCoo*tz{EPO%AVA@_RI)Z!^#HR28T!)`iqB4sm> W9S8{zCPxKu@$#V1(@U$!p!`4i_Rt{! delta 26971 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 (STA)station (STA)Initial information : cipher suite,SSID,password[,password-identifier]alt[Hash-to-element generation of password element]psa_key_derivation_setup(WPA3_SAE_H2E)psa_key_derivation_input_bytes(SALT = SSID)psa_key_derivation_input_key(PASSWORD = password)optpsa_key_derivation_input_bytes(INFO = password-identifier)psa_key_derivation_output_key(WPA3_SAE_XX)Compute password tokenPTUsePTfor authentication flow[Generation of the password element by looping]Usepasswordfor authentication flow \ No newline at end of file +station (STA)station (STA)Initial information : cipher suite,SSID,password[,password-identifier]alt[Hash-to-element generation of password element]psa_key_derivation_setup(WPA3_SAE_H2E)psa_key_derivation_input_bytes(SALT = SSID)psa_key_derivation_input_key(PASSWORD = password)optpsa_key_derivation_input_bytes(INFO = password-identifier)psa_key_derivation_output_key(WPA3_SAE_XX)Compute password tokenPTUsePTfor authentication flow[Generation of the password element by looping]Usepasswordfor authentication flow \ No newline at end of file diff --git a/doc/crypto/figure/pake/wpa3-sae.pdf b/doc/crypto/figure/pake/wpa3-sae.pdf index a8f84edfa60aa7f475eabbbe77c67ec094dd246f..1fb665650ae17785072cf191f7a7e16121d091a2 100644 GIT binary patch delta 33885 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 delta 34728 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 dVSTA-ASTA-BSTA-ASTA-BShared information: cipher suite,STA-A-MAC,STA-B-MACIf generating PWE by looping:passwordIf generating PWE by hash-to-element:PTpsa_pake_setup()psa_pake_set_user(STA-A-MAC)psa_pake_set_peer(STA-B-MAC)Provide eitherpasswordorPTtopsa_pake_setup()dependingon PWE generation methodpsa_pake_output()forcommit-scalar||COMMIT-ELEMENTGeneraterand,mask; computecommit-scalar,COMMIT-ELEMENTSAE Commitframe(commit-scalar, COMMIT-ELEMENT)SAE Commitframe(peer-commit-scalar, PEER-COMMIT-ELEMENT)psa_pake_input()forpeer-commit-scalar||PEER-COMMIT-ELEMENTValidate inputs; computekpsa_pake_input()forsaltComputeSAE-KCK,PMKloop[UntilSAE Confirmframe is successfully delivered to STA-B]psa_pake_input()forsend-confirmcounterpsa_pake_output()forsend-confirm||confirmComputeconfirmSAE Confirmframe(send-confirm, confirm)SAE Confirmframe(peer-send-confirm, peer-confirm)psa_pake_input()forpeer-send-confirm||peer-confirmCompute and validatepeer-verify=peer-confirmoptpsa_pake_output()forPMKIDpsa_pake_get_shared_key()to extractPMK \ No newline at end of file +STA-ASTA-BSTA-ASTA-BShared information: cipher suite,STA-A-MAC,STA-B-MACIf generating PWE by looping:passwordIf generating PWE by hash-to-element:PTpsa_pake_setup()psa_pake_set_user(STA-A-MAC)psa_pake_set_peer(STA-B-MAC)Provide eitherpasswordorPTtopsa_pake_setup()dependingon PWE generation methodpsa_pake_output()forcommit-scalar||COMMIT-ELEMENTGeneraterand,mask; computecommit-scalar,COMMIT-ELEMENTSAE Commitframe(commit-scalar, COMMIT-ELEMENT)SAE Commitframe(peer-commit-scalar, PEER-COMMIT-ELEMENT)psa_pake_input()forpeer-commit-scalar||PEER-COMMIT-ELEMENTValidate inputs; computekpsa_pake_input()forsaltComputeSAE-KCK,PMKloop[UntilSAE Confirmframe is successfully delivered to STA-B]psa_pake_input()forsend-confirmcounterpsa_pake_output()forsend-confirm||confirmComputeconfirmSAE Confirmframe(send-confirm, confirm)SAE Confirmframe(peer-send-confirm, peer-confirm)psa_pake_input()forpeer-send-confirm||peer-confirmCompute and validatepeer-verify=peer-confirmoptpsa_pake_output()forPMKIDpsa_pake_get_shared_key()to extractPMK \ No newline at end of file diff --git a/doc/crypto/figure/sra/dfd_caller_isolation.pdf b/doc/crypto/figure/sra/dfd_caller_isolation.pdf index 0b335213f645747da681b117a512404bb7fc9eab..bef78359836ee305d8f820c341a3089c6250270d 100644 GIT binary patch delta 15963 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 Gfc;-Qbmk)f delta 14810 zcma)>V{~QBx9(#n9UD8gZQJPB9oy_=$4)x7ZFFqgwmMG7c5dGHf6lq%e7IxWvBy)h zYSuHW)`zt}tob|00zF9tjg<##uiN2CqWa|2q)OiO?sXaX0fg`&dd=d_%t+57edp&t|BXeu{kRW4pccY2(T@w#7Xrz(aYt*bPaoB!r8bnOakKKK+b z9AS0;ygNM=bnou=_PGaM?MkAZ<9_RITWKy_k!c6OY0d&7!Gsm1PZFB6vCWNA=c96% zq8`jtKn*r5>wh`|yM5ZVh8GuKo82!3vgFSaZLp&iRh7&ZXq4|#_Y9gwsfQHT$P|c) z#pFTGb(x+&tTlXQlvNWET@qr3w7s1D`Uz6;!FhO&Kg7ShWB$d zHR}o0M=ySU_HV})*Ih&}cv1q~F1}fb;G?+=YW}Bxzpsq}eM0LrUSA zU4sk)*rhXCix@S?mwO@LIW1M(nuk}S#3l$Ve^2}l zCX@iLSLtl>ry?5A3HJZ)0qR*pFnc_?GEhnj&hLkZduEsL;48!IUL0)~>eeRneVeFl z#rb;wNJ26gBUO`nMri6~~`qv}pGQaRzCxqphe!zzJZh0Gnz`CmvpT&T& zT0Ggy9Y)I(Dxs4Bv%b8#vt+8sRJ554$QG{TQ6oK0O-sj*xPJ75>P1nSPMmgt zsd#3}U7_n)2KFGw%2dPr`%0Gzc?Et5!;7w-<8~heaCj5COS<}-Cb-0Rp4i_E8V1!> zLPQGK%}F*MInghK=YlZ*TThLn{m#HBjBFrD^EO+_bsB{?C?)(eR$VLUm0b>oZM%N$kJ z%WL^nKrWZM_ua^7iGf@{5eVWKbnHwb0hL;I3y^&ibT330M@Ep2q@byvm`W-lHxg+9 zEW!9sTA3<2dsE^Vcm;3{_lYrKBqE{xLLUSOMG95AKQRhA$kn)kI^iVgOco-0(*l^j zh3D7sbd!H!5#COLY!CPS?G@*J^6fIdm%);{z_U53C5mgDsZ~%3_6;P43cYm^_BQ{{ z-}Ah4ws){y|Ti z0=|}j93@5~Xv|$%(lwO1_#n;D-c1JdSKK0*?Vh-Ui3(m8I$uZ$5gIik%zs!0j z!&4+9t*CgO3)Q)>u8cUL*^KVk0Dlku;X*!%%+50`#ZT~Hk%fk4HIZMF)kl|)2NJMK zTDNMtPwnY;FNK68VXybaN73ssgvPLBIp<9><#LX>x#)m6 z^@YZG{b8B|d^?!9knQCSQ`kvC0$$+wHd#5O9e!*9Z@HSV6X1~G{=F7RZiy}g}^5V;G?sU z&b1{=gNbp%I1I=~sbg}%?cp)tg?D>j7q9!IUIFTeJb)8&)Tx{;$&&SC-GhZ*n zfw>s=v~&sSCNi5BX%VMLi)ILCTGDY;d0mP()V1)%{6Hk*uFky-0ZxxaoYUGWQqfLG z$*K?AhFB;3tivgZjSyd%Gy8QLb35wvvfMcOdVY>3;pU2q1|c4q6!*6_o;-0?5WARu z5ZQz~9{#MLSUJwDsbgOP3P#xpfq%COtC)^ufM!Ctlv(pJi)g4)z$Fc%PCCG)1)F7Z z|B8fFSry!O&q$aA4|wm$rmj#AwlKjBuRw_(sHRO2xOtuXLw&uyV)?J}tKta~1V#_` zsb$%a9eh{@%k@%anvsnp_FQ$;Z7hjtTcDgWu+}foScrD)u3tSYo5bv9nbjD=vXruP z5XKi1V&;I&H3kxV1&Qa`gt#|~$nc&e7p}UpkcC~{C6N)!6gYYc0ka~_ek@kF+CTG5 z?Fd4Fuq6NuZK(VmESp^f6pTo(%#g%Ma0g3)y4$-RrChVt8Ez@1iVNtE%9xv2Mn<+ zOjNMv3o*`_l$4<{Q|v-D0k0iCubrwcrRAJWg3Y@8n#-CEVP~JGdqM+mh7HfTP4jD} zUC#Q6OLN9aOvchGN1ai(Gr7^(iga;(xBBl3;PcdTm-p1;N7o*xQBW*YmKenKNnlwK zQ6upB7fjL{D6yI1%U$i`&y8?KaG%y%T!EWG36VAM%?;31N z$xc@9>WP|!-bpKTp8O|-b(far%)8Pvp~z2^32XCjggkBIqkXR(Scjv}gD!A+L|`%9 zz;B0Xfn^1+YkSr{raAiTS6HXyf`3hGu^q zNmJkX;|(|g;`x+}t*0{2aU)j+LI_RCAfB#I)Z1p!p;>&_o%loTpt32l2-^8a979UM zl-KQUI%dlJ{D}>0qP7fu%9b@8PB~tsx_M(>sL$KxyMO{j+S1YtQ(J;(7GDHDa0Coq z#-!H^o0&$xUFakD71x3k`}A}OM&m~^(>jPa6NzkCZK|I>(;)@&@Z=!!I15^s(P3I| zHByOat%f=bJ6!Z&u&ZY2HIte{eVKL~R_hkgfEqacq;PT7Vu6J@32Yhb-UcnbAudAZ*2$i$onKS|o#={T-628LQ~l%xuXKRw2?u22bY< zfU6+Ew(6b!9&vKrta*~p{c+^3I!OKKp?xqf(CAahIjg_j)|cz!V7>Vq8w97hT0q!W zfgxa@Jx|^X5`4~v6d~|h4#9;f5^C2{_z>40l6wIV29L*lFsB(^C44pv1b{z39}uk3 zjGqwId|ZP@hQGp<7%mjy;;Vc=869*78guMIkH{XzkC#kDo7Im`Y$zKSzUb-bwD;(m zXk9f=#dd=)XollFguLjjlx|bxRfnH8{lVS*y}V4XGedt{TwW+;Zhv~;*4+3V@^SJK z{^b$qrg+**p=`^Mc(vsZe3lzNMYJ$<23}2nbHklOV9-tbL^lJyB5qFI%t=6e1Md0*hAm|y|I5FyBis6tcAy< z%45>d!L&-NhwsrT(*!ghBSf9T2WGaK)WBQcRbaJqL-y*IRCTQts#RzWAENP>4KAY( ztxZw9WzR0y4-t6nooZa@F0!*}V8ta*zNmD{bj~+EgXF`4xK?+{Cu;_{7&cD8N8`rS zhK-d#J(m-+BM-y_$zvj<=pi{sAr$>!kC?-rgdrla_t^{=F4i|pwoN!l2$rbXD6pXV zX#ydlMzCFj(s6A@FO|xQ#E|8CyI${a)N+b$r@5 zekiI6xa^X(-{~iM9BSKe{TZ&TsL-r{f5~Zg0kfREbbB}sJh!bgvp(7oeGU0|W0iF0 zjO_g3x;rSgQpj#C=sBfEu9k*ixXlpM(hb^eD}+W&AE{M%fDIOdmtZ9Xj|mC20kN+T zWM)i5E(tS=9NPsp3mGx!H|Vho$AUrwY65PBOczksv{b#cqDw!NY*ruNRyRl|m?XyZ zvVT^_W&kP;T(0wIW^nVh`cykh%21rtfhs!Z(U@p-CbL>6K|Cd3wl{8R{vFzZ=J7C) zb)=BPe|rd@@{83x2Hz=~h^RN^Gdf@^eEvrYqtdIJzYnm-2QMk$kzpK+Un3MYbp?u) z-Ic`L8n5Nh1>sDciFDx?Y?ubixBNqNN6~ok@@V;Gps^N50;w>II9SJ)(vgkBn6kb` zbXnZ(qA2w;20T42+ftH~x>fH0^O1EH{+SiqCH{?qJd(yLL3=`dm+Ir<9T`&g86N+^ zT-g}MxsK;yiLD(o$9vtLKWQ`cA>m52Y(Uz_OShNZ*){ZK$LR8UeNjFbTkQPcxS=dR z>WqT|(1w*AfIr+a@=UjE4X^_a6Ox`E*o)^pMv&x2gPY@hpqku-C=mx=XY}UdLAE%OHvAEV?+9bKtrT@f&9_<<0Gx1$ZX;M^9cDHSn5U$q5CGp zWRXT?_(|}G+U+8$hkeKawja7v_jo#CB2zrRq|YC9Pnho`?npt!ZS>-StHOH2wdPjS zOk7)ovTHN4B~uM@o2;W7uFnsoq3M*0znFN)mNmo3Z@`XQ@S_hps__4Wc;Q7=p4ldz z0971N*o5!fkV%nwaMI=Jc366t2Xhg_2H@T54XbzA4j3|N!SKMK0bw*7+%KKaO6BYM zMNw`@p7RO)Nm;bRe?SlaPzr9cxL!g;#}*J-%llfr-Oz|BFg!jlZ<&4H!67e2nGA73 zj4iFo6^7rpjbFAa0vorBM&<=Qqu9R`*hi0@hGBC-WrT@F zyw7NLWf$^HX%ym62RlwJWl7!E);;W*TabeO969viZB|cSj=9{t{3a((aB(gAD9~j- ze%)i6Ai~`mO?vNBCR$R^eJ=212sFOu%v%LDpC3rm^UnTx9MegE7$IwHE8feQ#wiT# zWdfgcf`Okmi89tKfz0s$7sBB#Z2X-E9dh~9;UX)|{z&oNw)P!oWMbl%TlVpC3jgZM znN9`6sq~D!n`n1h(yM&MhP^iPNdzF%{Hg0qvp?BSomBAwUj@lYn2M zie?;1r>@%U$QAo6(tIuYp-EQSFMnZOAY#$-*kyALT{64cEbi(1wl(z2u-o3|_D*^J zzE4!tut=CKEN#!MXn1P1y=6F|Z8g6fsNiKPp4=PpId^!i@BcOP|9DQf6`Vzw!&moyUO_7 ztV}7mHVrOqoN#{v{w}ORJ`h~ME{NGTeFv0aUN}1}8*;DZ_7ecHgmdZrpbzN_s9Z{8 z`bQ3^wEMO-E9>?0xiYxsh+f9d+P{ll7Fy-QUkf04m5 zqRJl&rl~1i3w+*;ekr-;WA=1m?Ft9JYrMEBv?=(I^i9*Z1{La|Pe%9BUp8d=Ti*WF zz2O^n{fl}=+Ht*?Po0-^L9-i6Qu5*+N7Z~plBu}3siq~cYIzNL%oEc@20LKEXf9Uiq+n`ha)Y|KSw8n*8;WhqLxZ%r*hN6G5z;Aw(MSwm~H*OZ;jbhg(hu z_Ffw%n$DLE{0WhL6}odzWc2H^CI{mwTio1|Jx~F=N+9p2uPfH$z?!|5+xhv14JqOy za%=5FJFVKrvfqV!g+a=RLeC?GOTr(dTra<8#x|&{f_=K%go>-%eg6szq_}#GSzEr# zgNl~6p3aGQ*RI$gF?|uV<5nt5tku8d7c}YQa5n#zAlDgJy|8d`xwjf5<1L_+V-I1}&-f3t|~9 zWhqc$ff+%1;X#1BxF;8q-Q=*5egPXjIP5kZeeeohN;IFW-l$)rua6MQ#qfV+u z*~U(x^Cbi11(xA#YexKijJM;p?n~o~{+b2X`(gC#$zkxYJt0GTe!rFTZYbNy6%rFs zmf;{uD{&#^f@?u&F#D*()6(M{aHmpQB$^A+fu3W99Pz$!;;MX`!f@nhiDav^tYxSg ziQ4GlA$aG1$J8S=Xblq9A=~|eVWcwm3&uqva7C8Te=FO{bReeEIZ(&(5HDu%ig*Vu z7ioLIuU3aOT^ErkV_Jw;5YM)3QmmjwyEUuPnc+~-n5uNzNmGImPs@tO+1|N=1UZP% z0E_FHQ!)A{=ueC?P_@YUEC7f{GHp`v1`0RvNQsBZG6O3y9?6q;6jnulEO$$FSiZOQQaYFM^;v8t`PV^R}dtLiiNnWTzLWAfHVO2O$r&SL88+J{Z z82OuK8G5WCSCaeZHF_RTWWdNypg&%XfcI9an>~J7Bkf=ov?O^ua4wp^tD;E8NGRG! z8BT(kh>{w15^+J_=qD(5pN?d99;!umubfzP${nOb^_p;%5@1bO+cx60CX9Ksg{EB^ zBD6$?S(wM?>U1ZZTq=?4;ds^tD&u34jMc@5X_zaDe*}(rlXWc9vyb)A+l`Wg1Do55 ztWcx}s|Eds<$J#VeUsq7TpGSq2}*cE1@aXk2~RYk`Q~Op`R3{fJqioZzC?8cy1KYQ zg0B<5PimNBBE|t7^h@e}l2pbnWj{p93XJmN$lef^c#&a-?ZF>?N5*cn-Hy;EE*-ZX zpF?slHl)-qgVXBp{n#uHXrJ(G3(AA<^GS?sw9KDbO*&rhM0|n>cfM+70~M|<>}&Y+ z@)q!;WNlL=Diw)5D-bnF z!PQOhI|>pE;$xI7p65@x{sRmjk!DCIPj#-RqTRRfV1ECIlz6r+plHGMErO!Qy62EE z4XRN(`1e?O$TaQaz~e|=JQ?ZqP^Z!Ca5B~aF_JQb+%%~%D2MpNT_DkrHfinb8jL!_v0SPv!tzD|sR{oe%D=r7Fg@A#2XWEkc@BO09rZkK;A5AqX?Z{XYUKh zzOD_6j4g;g8o3|>b9p1xanfa=iu%lauGFS-1Zaz%u0J1m4>Cw9SpOfmWDNn;MYKq7y`yiJ&6h8ri=@BR?LPTriu$kMkNp7$N#m1_N9a`c~i?1fxJ>7 zLfYlCp-ZXY!WB}5zOyWV&s3f%GQsxln<<}a zmk0<^vfO7PD4%-b%!t=7mr{nEB=LtAgoc8l$gT&j8V7G4u-^ZGP>*&vC zK{m5Re6|d$r-KWNs|nYK(`JUW&m$r>Gmp!xiVIp(8-6D=R$L08(BM9MLlW@H+Ir%z zg(G} zwS<2N4(7#E>omFH5QN~1J51<~9a|Xk-=Np9uvigDT`+}b{vb6;|7GnUHiyf_zH~Q2 zU-#Z5!o$H@ef-ev%iXyb=N6!u%vHPCr-E>D6T&;L-T1E_`4nMNs_>YewVH;Ulutzv z23GqR;eyah|FLA*Tv@F`7{Tt^l4*_pJP96Hj3Tx5@0$@&N#94yZe*P!HY2Fk^LMyC zrSW_l&kC;#KMD`YHcGh*LmK0+DySMhl9r{4Idvj034=Er+;y|LkI$G*7o~$%XEsj= zZb)>$qvqu|SZOX6IFyYg=_>C1oVA^;V~OVCzO*Afw8dFkCSYH zlB%R$6BL^u{%P%nWA1l2mO@bS_EbRZ> zmoP!z2+Is$0&uXfF|a3qQvK6Wji|bkkX72y0VFIwSu>jbZzT$sZ|4$_wC-;ADN{;%f% z|C%MxP?-Rkxc*mP_khRJMRhstu}eJOlzu6Oj8V~R$@oN?W9ynmHW_r>4-_1g0-)98 zzk*#~=r|&QDiw|geNhma3# zZgl`RXDiUesm942-V@`nh7<}CIlrcsG7g?S7o(IwT+~QRH8ua5tPdeL4OXboLaYch z?K_hVE(XRZsuYFnaI6TiBB1rB=GO97@%%|=Qb$dLN*UcP9?x;xn$wuc0+aTH_XdHS zXlI7I71h=W^8)ALqv7EY5-_U(He0chwrv@b*S)%$<{R76Rn$dnL>*+hRm&o6d3tBj zp!)Z=f}u0|`IE7Z!}ORl%a_YTE9;ZHjg-{&i3=72B3v80Q~UdNz2wbi?!RwahLO$H z^7cy^N7ZVfE(hN+Bb#-XM?0=YrzF$?a|6e8A~rA{&AGp0qw}aEWPrm=rS{nOy}C)CBaI{V9bb+E#Gi}iYuL#M}*jR%}VhuuD(aT;Sj#W9q=2QRv#0qO_)uIbL{<#8xB zCaeWrAv%+pE%GqjSRe>O)30M`)GZ4uu!bI_00AL*^g)CGu%YmX53V)+8P(E}zlWV2 zg%p*&L1w6%azjqJ88iC+?04)66PR9A`CO0rYyp(*2aEFRKE1rZJ!2s%`_834E30}qE3XN=I@vgJ6=9ONOFjK=Mj#QW|13lmue+w~im7DpBS{x{F? z;8=q7CnHNcJUV54$LDw}vvY0M@_@H}ppTCWRpxPd)3L4ilWlQ+)B2IE;|W4iBR+d; zSGVWWK=Ctm7W;|zE;Dx@>1UqoPjK5CZl#$bM)FEU=&l9ieBLNL_x2AZ8i%uQwt1oc) zX0F^RK}1!TsH1zo*Spj)(6I=%W(N27^fu?`fl{b?&7$oMBXm}v4=YElJ-9L`2!pQA$r7cuj>a8GD*Vb2dek6SI)?G#N+Xirbnccpa zvE9kj{B?2rx1jm7A0K}yiCV;s2yUcwzG!@Yr@lS8=uKW+Jab3=9OB$8r~1+&i&(Hv)+&I;@p8mI_(d2?!WM#XMb2P@jVnkwh9lh6Wfmz1=_&GgP%m{ zG7=Ds45cL?cIk6)Ex1}8k+e?Cq0J)7nvx9OMaEwlW#T+0Q7E33R+m=J9GJ>=f;+n4c+sTvCb1X_L38_^ z24`MO)-XL|u;kq&h><)3L$V7e0|*LqZ6-U@>JK(Jv>WhfM9Elq^??kPywvS50zy*Qq=|f>-WzwacuZ`BtayzjxF?0Mk)$3uu29-E1Ps~8jVY;dF zDCVJ>`(^E7W{RFU1<896PxA4XUQc?>Pe^Nq7(_&}L@UK;^U1wSLeHzs;g^ODrxHvL zX4B~zqWP3K6mC%rATCa$l9=q`AVZlOGf7~=G{$Tp8QVUbWqpzIn8w}kEl|gVk^jca z?UfaiH?om@FddaHCF$g3Jm+np1wl|Dr`h80@)5GaXJM1PSQkH1Xo@`m*pL^aWQ~Uo zWoify=nswnWudKaF&=?O!!Ima-E(qsvnEGhHWN&yk58xsD$TJU{7eZ$j1bVubIIM( z&}zIW?t1Ad=kd;U_xAF(&viQS1-*Xe89$v)Fg+F8JN8eu=)s9dq+)rrKBdQ)>&~2Gk3~^_(u`&dYx&F!*4Bd2rRwO(?DC<> z$Ma)eAT!E^PEvy49&~b~G$q6!bN`%Ngh??3$y{i9ka&17Tqich-w{cqxIS`ssX-`D zY{6_^1)@{~NywvZe%A&&zc#D8d!$F{+@itsNM;c%G$dtkBY-V-_cxza6OkGVJM9- zaPw`XY1UhIa(1$8?W4UJ!rUDZ_V3!$YTo(os1+5KoA}s*vX+-@WBUnG;!IjrJx7x+IfVZciM1gRF1Z!C|=t1dY%dK!VQzG_Q*%aCz3|wj^>r#*0;vmka4R_vLxHLeTV! zy}}bS{kOt-*P}I)ecw6H9KWdy?HDI*Fy;PI5rjs}AtyC3T3i>#wg}EY=-GXbJHus{ zDuN+O%KeQFH9VObHSyiMd5n9AT(Gb1M~{fL-Nr_rheQbOZ`gu?IfErTz}JJf$M!29 zyzY1C?Kf3H1U@A-VrO5wgd3)KuJ3`0vA+^!gqt~E(0dE~MhcV6aLGaqc;kg_ivy&f z`DsQ*{1QEF;O9QYOFuqex#71%XZy*Jg(QSlS#RvkIP1-;Ka!1VJ{UN4qWZH78TH<& zUY$TA-*I<*5{KJ~x#iUErvUllOz7z>}olBZejRAUglic_-Q1;@KMYh|AhI z*w-*gm~D`H#jhpY1s1nja`CG6xA|4wUz>FEHxi>9q1EE8VTaQ58qolqg-jro39qO9 ztYz}!dK16h0*nPRQOoj_QA&1wLmoLT!~h%oekWSBaCj}V*-1+|D%6ki&^Y0%1xhs_VW z*$Y3{z=mopAd3{RNLXyy@jHX_Bc?K0zV5~p1rMTDvGx+!9LfSw-maqt<0dabw z!+c|A?4o#RZ+K_vmXF4GRD^3D{A>lYJC<&bjO_~uATy3XXP_V;JqUrK0B2uLA~H5_ zv_)=&$)o`eCpn6Pn3S|YZ)9Xtlg0$ygbs~G+@uno?@Yl>v@BdJOU<2;9*T@Mx3DuXqghC8#ffehCtHlnO>S!^8>{w3=QT=!7z( z$U;&Ez99*Cz(gPLGeGd8{2qu>vu~FVE3i0`!1Msk+>;1qJQ?6st5x}6s%aB3M2vs} zmBN@jalhUOwhWlnf%f3?dMDp8;_S$*B)#P<6r0=Z z=79V}nHMIG@;TxXd(_fo$z?s*Xv>hwD{8VM*Yjt9?D}!$<%w=^Hq$5BX}(D;bwCJG zOjW<{(7WfAB*(3YEL^nJP*FU-ze7q=rN35QT*b{Vfegy$B?~+l3Nw?ugPp|L;9X7i6W|;%Y?g%*wX!m<7mHRn^k|%r|C^T&)FC%ytqS!nQ zeI%R%Va(rMjrj4frZuuS6sQ|iaqw%vGE{4vQl`N^3_WDrxGs}UC)evCx+^LClywND z*+zB=Kt)MDzVJw~UQ@{w7~113OwvdQGhrKUND&sj zi#dStVcC+34X@*5VnvH(5Qx1(Gphh0b`bAhT6e3g8G91Vh!2@p-DMmXjw!AVrk0X8xB_M zzk_T@+DqI6@+FFZdB`5K08u}Bh)@v6uL#i_4pN)+<%s$R%|cy(onaWwHbe~=wG+0{>*-38BRgY; zC0W@+6;pbIFxi73DV$|{PEfxZW&ZqrD%z;#oTq=e7N0N=aul#AG*PmA)Fo1r(xM0eT; zz}&6!9NwIF>zMu*P1t&R%1LxTTCVXK!~O?nIg(GJNfQ4Ev_q@XHq* zapp6ot(1sFkkub5)%Lih65f`Qv_CI;!TXqNJ<5&A$s|8iDF`vQUXB-z^;>Q|@D6%} zWF6cC$0fPk|M?PBA%F6@{m8FJ+QS!ag23NbI?38S&CA0Vq;rfr$fT#_?Yo6h=q~76 zzPUdZ#xp4aUw4o?QGAiM-%t}ob_(*GFH*Mb%z}dO`Udp0AW2!#qM+=@<*xxBoEH$U zEy-NyVkJSD{B@)A{y)>Q1ng}5KznReq{*eB){;~djpm8pVCM_%wJ{YrW4wru;t88F+ zNfdz_GsVn~g|~()iV2M;nJ^YJuShyb&2o@Oykw%Lc1$bj62Hq!%_K$?3H5TSwtusy z?-TS>@C7ZwOo$MIor{gNK1>J{j6zyfTw6@(Kj1*c)ZEp^$m#z{4%j&UiyZvZoBtvQ zT>t;%fGdGs)D`xBE=#BqZB*do{0AF+k%+IxKPTt^wD(!K{s99V94!B4xc@~6oE)rQ zD=sFcuaV>5@gEO6+kZS??k|ebOM#)s#{JKkZ2z9d&hh17`RDYn$j${|Vf%N+^fhDU z0C2JVQ~OVzo#P8WaQt)f7i{2Q1F*5OenE%-3o6*SzdX$BU&x_P+zgRJnaQsoU6cWY zm>pa)flGoAjG4P$Q^E)gjFl~+OUe_GUG={W&fu~MlG6Vg%%zRNz}Ptwrew2#%+~!( z=t1u95jt=W#HV8ppXjB%tHCcA6)2N=ZXUp-3N_n4JbDgjix zh6fSo*67y4<#5lhwlgDmt5%XA`!$<`y9h`Tqym&`8Fi0_Chb}1(d;S8mXTtkQ@FKJ z{O0(hi?6-5H$U^MlKLA}8CaWu^7F5p>ayEuzKop`zqcL6AnCDx1i(uO&OLv2i+R9R zE3Zja{0PFf0<(Xa8_jx#mA3RCH^srClF6E0{eQO^5p43Srg*m2@=lam4S6EOiV0S;ILEf0A@RY>?*nx zmm(PI!>wP?x(%TB9$LzQ69o2AAK4l=R%rwp>«System boundary»«Application boundary»«Application boundary»«Cryptoprocessor boundary»NVMApplicationOther applicationCryptoprocessorKey StoreExternal systemExternal systemciphertextciphertextciphertextciphertextCrypto APIcallresponsestore keyload keyCrypto APIcallresponse \ No newline at end of file +«System boundary»«Application boundary»«Application boundary»«Cryptoprocessor boundary»NVMApplicationOther applicationCryptoprocessorKey StoreExternal systemExternal systemciphertextciphertextciphertextciphertextCrypto APIcallresponsestore keyload keyCrypto APIcallresponse \ No newline at end of file diff --git a/doc/crypto/figure/sra/dfd_crypto_isolation.pdf b/doc/crypto/figure/sra/dfd_crypto_isolation.pdf index 431934e7d4e6230bcd5166cd8ef3d22c484045cb..ad25012e6d19e47b5598d6b0dceaa3dd33de18a7 100644 GIT binary patch delta 14786 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 XZ&p;n?y3rSxqQ|UN`Y!ed>Wxg2y|yIDCk4xd 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 diff --git a/doc/crypto/figure/sra/dfd_crypto_isolation.svg b/doc/crypto/figure/sra/dfd_crypto_isolation.svg index 41cdc813..9b2c5763 100644 --- a/doc/crypto/figure/sra/dfd_crypto_isolation.svg +++ b/doc/crypto/figure/sra/dfd_crypto_isolation.svg @@ -1 +1 @@ -«System boundary»«Cryptoprocessor boundary»ApplicationNVMCryptoprocessorKey StoreExternal systemciphertextciphertextCrypto APIcallresponsestore keyload key \ No newline at end of file +«System boundary»«Cryptoprocessor boundary»ApplicationNVMCryptoprocessorKey StoreExternal systemciphertextciphertextCrypto APIcallresponsestore keyload key \ No newline at end of file diff --git a/doc/crypto/figure/sra/dfd_no_isolation.pdf b/doc/crypto/figure/sra/dfd_no_isolation.pdf index 85b42b31e3ac5ba9c91d288fffa33e5a6459f015..40fe0f63413f37f7375289169a36963f3e83c451 100644 GIT binary patch delta 14250 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 pYM@i9S(_j? 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«System boundary»ApplicationCryptoprocessorKey StoreNVMExternal systemciphertextCrypto API callresponsestore keyload keyciphertext \ No newline at end of file +«System boundary»ApplicationCryptoprocessorKey StoreNVMExternal systemciphertextCrypto API callresponsestore keyload keyciphertext \ No newline at end of file diff --git a/doc/crypto/figure/sra/system-entities.pdf b/doc/crypto/figure/sra/system-entities.pdf index ff320def02566ecf86367738666cdb13652e39dc..319056c0811f94300d807c7ca2c580454e5a731f 100644 GIT binary patch delta 6481 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 delta 5882 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 diff --git a/doc/crypto/figure/sra/system-entities.svg b/doc/crypto/figure/sra/system-entities.svg index 8fe9190d..89f4f4ae 100644 --- a/doc/crypto/figure/sra/system-entities.svg +++ b/doc/crypto/figure/sra/system-entities.svg @@ -1 +1 @@ -Crypto APIApplicationCryptoprocessorcall \ No newline at end of file +Crypto APIApplicationCryptoprocessorcall \ No newline at end of file diff --git a/doc/fwu/figure/arch/components.pdf b/doc/fwu/figure/arch/components.pdf index a4d6def0d686eb2d6f6069f24dd037f931f93027..2f30e1ddd8eb0bc744cdfe676fb736606c3cd506 100644 GIT binary patch delta 24443 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

S?UKBJ^ZQlG6pkakOgJ>rAg|S-DGTm6NF91{ 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 I4Q0Il0WoDGM*si- diff --git a/doc/fwu/figure/arch/components.svg b/doc/fwu/figure/arch/components.svg index 78b790db..146d22cf 100644 --- a/doc/fwu/figure/arch/components.svg +++ b/doc/fwu/figure/arch/components.svg @@ -1 +1 @@ -Internet«Device»Update serverUpdate client  FirmwareUpdate APIUpdate serviceFirmware storeBootloader   Trust anchorFirmware creatorMQTTCoAPHTTPS...External storageUSB \ No newline at end of file +Internet«Device»Update serverUpdate client  FirmwareUpdate APIUpdate serviceFirmware storeBootloader   Trust anchorFirmware creatorMQTTCoAPHTTPS...External storageUSB \ No newline at end of file diff --git a/doc/fwu/figure/arch/trusted-client.pdf b/doc/fwu/figure/arch/trusted-client.pdf index 518cf47159d70b0f6571e0ccd6a478f6839971c2..d13afc99c2294bcecd709d04a6c4b17e451b2b69 100644 GIT binary patch delta 28194 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 diff --git a/doc/fwu/figure/arch/trusted-client.svg b/doc/fwu/figure/arch/trusted-client.svg index cba64788..fbf0ec21 100644 --- a/doc/fwu/figure/arch/trusted-client.svg +++ b/doc/fwu/figure/arch/trusted-client.svg @@ -1 +1 @@ -«trust boundary»Device«app»Update client  FirmwareUpdate API«library»Update serviceFirmware storeBootloader   Trust anchor«data»Firmware package \ No newline at end of file +«trust boundary»Device«app»Update client  FirmwareUpdate API«library»Update serviceFirmware storeBootloader   Trust anchor«data»Firmware package \ No newline at end of file diff --git a/doc/fwu/figure/arch/untrusted-client.pdf b/doc/fwu/figure/arch/untrusted-client.pdf index 8ad775ef759a407168404b627a21ef96ef7f7831..2c6eb9ccd013865b541cfd74404ba19d28f16216 100644 GIT binary patch delta 30944 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«trust boundary»Device«trust boundary»Platform Root of Trust«app»Update client  FirmwareUpdate API«library»Update service proxy«RoT service»Update serviceFirmware storeBootloader   Trust anchor«data»Firmware package \ No newline at end of file +«trust boundary»Device«trust boundary»Platform Root of Trust«app»Update client  FirmwareUpdate API«library»Update service proxy«RoT service»Update serviceFirmware storeBootloader   Trust anchor«data»Firmware package \ No newline at end of file diff --git a/doc/fwu/figure/arch/untrusted-staging.pdf b/doc/fwu/figure/arch/untrusted-staging.pdf index 1ab0879c7855ab55f38afba69c4aaac714d6fe26..f31e3889d0fdeaa63e05299616b6d847f2b27105 100644 GIT binary patch delta 30294 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 delta 27009 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 HDdhhJv#O`t diff --git a/doc/fwu/figure/arch/untrusted-staging.svg b/doc/fwu/figure/arch/untrusted-staging.svg index 400834c2..ac66d730 100644 --- a/doc/fwu/figure/arch/untrusted-staging.svg +++ b/doc/fwu/figure/arch/untrusted-staging.svg @@ -1 +1 @@ -«trust boundary»Device«trust boundary»Platform Root of Trust«app»Update client  FirmwareUpdate API«library»Update serviceStaging areaactiveimageBootloader   Trust anchor«data»Firmware package \ No newline at end of file +«trust boundary»Device«trust boundary»Platform Root of Trust«app»Update client  FirmwareUpdate API«library»Update serviceStaging areaactiveimageBootloader   Trust anchor«data»Firmware package \ No newline at end of file diff --git a/doc/fwu/figure/intro/context.pdf b/doc/fwu/figure/intro/context.pdf index b20b5964755dde1b44952c9675bad642a8f2a17b..9ddadfecb00a472448b13200cc2b48efcbacf311 100644 GIT binary patch delta 17367 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 R91JosG%+*^B_%~qMhbQ6wp0KB delta 15301 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

PmEgk>Nv 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 aoeUkE+#F2JV3@d=x!7RH$VBDEVEzxjeA6)i diff --git a/doc/fwu/figure/intro/context.svg b/doc/fwu/figure/intro/context.svg index 506c2cd9..50c71788 100644 --- a/doc/fwu/figure/intro/context.svg +++ b/doc/fwu/figure/intro/context.svg @@ -1 +1 @@ -Internet«Device»Update serverUpdate clientFirmware storeFirmware creatorMQTTCoAPHTTPS... \ No newline at end of file +Internet«Device»Update serverUpdate clientFirmware storeFirmware creatorMQTTCoAPHTTPS... \ No newline at end of file diff --git a/doc/fwu/figure/intro/fwu-api.pdf b/doc/fwu/figure/intro/fwu-api.pdf index c93c4e682e7aae311bcb287e9d7ffd3de7dcdbcb..5a45ee752ca6f00db0b8421f5bee327fd243bf2b 100644 GIT binary patch delta 23370 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«Device»Update serverUpdate client  FirmwareUpdate APIUpdate serviceFirmware storeBootloaderFirmware creatorMQTTCoAPHTTPS... \ No newline at end of file +Internet«Device»Update serverUpdate client  FirmwareUpdate APIUpdate serviceFirmware storeBootloaderFirmware creatorMQTTCoAPHTTPS... \ No newline at end of file diff --git a/doc/fwu/figure/sequence.pdf b/doc/fwu/figure/sequence.pdf index 64f7947a5c727657728faf6450994638331d6de1..1e76a69730f8fbb546e6c2f71a1bdd3e1a50a2f2 100644 GIT binary patch delta 25431 zcmZ6ybyVL>)HR9}cemp1^1~g97k77xyKAuG?q1y8-Q8V^7K&?e=kmPoz3cndUHKz3 zJ9Ez2`y?wf$w?-DLJZx2$H@V@TJ{8z&3=~#eUk947mM9sK?vL_!wzwd=vwKK0qD4h z;^~u$`T3NAA8%PI9jlwB9E>wlL8uf;zLmUszV|BM7vKT_eWgc~qQFLN`2&q9Vx;UH zp_X4%+moYz7xaRNbjc)4?e-?(@e(33mwo8H(3=;Pw7glmLKq~5ZBtvYNvYM#Z>AB%%x;E12h^T+8Tt-RoT z6m!cIs_H3IBC;zD^O<1Srmy~>3bc%J`<6z!61bMeO%a~4>~7@71P-1Br}zu4i76}S ziWL4G+In%LIi>x0LVdSDz~6a^ksMBO{&D-~gw{8VVkTVRonL`)2QIFH<k9-p1oyy!YAkGKV^>_p50`l7}6 zLp*>1Z2S%gSFl5euz|h#j>-aY!cWWsDMp%&;>*7e%YOXtCU}Ua8icM-J|A7vHk1*E z<@)Gai{9h#j=-~BF%!@jfT%#DC6*9YX|1`4cw_N3GQ)`Iu9jw|u3h-BT2$zl1H;lk zA;p4kKewjT*}afLh!C80w}T_Ft#o7h2-Dks!3VJb;TUo*WGorzE!a*v*|g$@?3B_T z)~2i_uu;W@rB2pp;mTi{X()@xFNjekHEE;~DDZlKfIDOZz8_LaZ$W=N0;@>SrRK^k@G(sJWZIK!d6ddzJ-q;s5;1-qn>O<;G;gC;$7oJt2piTJ;pPv?uo@j{C zy1JWzo}lzPbwkpeKWNM+%>bS=6t9XZ?4y{VnI=Wb`qc>oT2^;aXA-4oQ2>u%KGLrDeT#62scu}``blh}^ z^kADg@xxq%Iy^I+0Gf_f^?a>7G zy_YRa0WR!7LiJ1Gwlu<^G5x>wmY){sGtv}~Dvi#`2gaSw-)#x`4bq|kEEY=w6*l>CR<-q&8PU@-r2?jv~I02?Sa!7Bxsoj~xPNxJ01Uu*BQLs6BX^19KX zAdK;YRV!sweNHy*lY4#SbxA~ErrOT%_t%Gf?|e=ar(GrcineST0#7H4bTGorXx^(}3>`sUMgCZX<8+Fm^VhV;B0MY+ zFEtQcQhmSB<v~`I zE2pz6ItRYFMmM%sTt9B$(T6wEacQoROk~SqtbkH@>%)Z)K3{jSq1&^~mzF&cbXeKW zBFoJ0_W?7bj%C_1pkjr{8+$M(2fJT(4m0$pF+qY&IclySDO8&A*PZFpNA<+%BNvpj zGv1m#kgOi4D|J9N$V)~qVFuPVx;|~pzT(KMp-n`NE$y*g4sH&b4gRY&-XSaA zf#uQDo>Nl{vZ~7+$Ahlkl;DzUXT`B=ooDATx}EFW@ybajkgkNlzaze3qRM0H0((w6 zq$y%W5`1998Z1#r7rg6IrrZkDF%Ita#$_1ZuX}+$+~r25%+ze6@~a|T5b30b#nFy& znfM))#CV~L58};cTC?Ms&?n-V5^KU;T7@SWM$`)Pq#isv+70-lT|O`#DLQ<{_tu*U z(a_R&rv?53Qo|&s-Xm;mRQK`9P-T6kX)wdJxbf|+qZG5OB!}{NNZ=?M196FJf2!5Z zW=i~$tC)z1OIo1=J2{GW`zHqh{@;spwGMJEfPIoMF5@bTgS-snL*kWttyjJcJ)evgo!dzAM5 zv(&%iwJ}ij)nk3C^Ro7Y^4dhY>v{Z=b133sWV)>0U6$pbKURGC37+|MWp8qO3?#SS zhK*gUJ}Wqt&Ol!z8X7W(PuCHf50E}p1m@c)Zg}W%>mRGxu_`WuQy8L|6GE8+Q%EPd zlh6q0D(W6=EMF}Q5u-$Q@G=trkuc}tIxXK7NL^P$PPHy|xBO$@re39EF)2_9ld>to zmu;Jyyt zIAE*?x^TWndn2!|y#(E_L3hzCTcQ72gVq+{qdugyNJDLIwTwfJAb`10Od67e?60MQ zD&+1Z${U!u=Ym^RdFb9q@CeaCfBVU1_xNIhwIihSE$O5z#r*Uo$2c8roenl~@wqM{ zEywD~*s-CtTT^#NXl1c=C30wJH$T6#X#6J}zrddwj~$!fZ!WD8@z1d6ai5n;MyEfZ zbRXR8KJ)u}*K$BUNeTBXtCVlUXtu%TWtLc|^WDSA>v`aKWG|6eVT<@zCvZ~}d#NBF zqY#s*v1<14vX$FuYJ7X2j9c)sW%zwVHNyi!Qc9PGo$4HfbKRX)wTzV@_)Fi-9X-dK z!z@Prp}OGPfTv;Pm*1d;7WZiT-Th)aV(JKm}QdX5U3hg%?n)0kTP~# zJ?VJ(@OgXd*o&=E*nWSFO?)t)u`b7r-e2f2_(8&m$EhZL)o4*;9->=iwZ;nYUM=NY zrC(b)0{-XH2Pj;onelOkBy7K*pQXwI7jxhC1LnZUmCXaVO@_s`|7B_;ygIlIGGeYd zJ>OU0k}~apCJ@L6DFLy1G#Mkv`ZGMPVOa8Wo8Tu)4hb5lR=F{X%Zt?lG{48Esmw$a zV!@mopO*m?^E+OgQ>t(xm1JO|9zAxs%t=dq7o7LbMT;|bUCTk-xNUd*ueA(QcpLSe z)d=+8sv5gLA3e654{FJ&`S~1^t%;Ty?U6EyPR^k;p{fKM$jYtXzCBboVMCVLusVqs z&hH@p82H*{HnJnQy~$i%ZZlm((wcmV^W)R2mIgM@7)#0w@8+UjV4gBEk>MzP#}tZf#|R__X~cG2cfm$?glQmy^44{_Ot zKk@N;Ka6)$ug`dKmgiVPOp)Hi zH(M3(_jslJ`}Z#rv+(Muifhqr^tGDp7f73vjRINLv?hfy1=q<2wEn8 z*8!8m;XU&PpX$~NNJU}#`rP+Zzo@7+@(3rIeb80Z%e@i08KTs#Y#ZLe1WWSeq>{Uf z_7eR}@3N~}TSCyd{8Y;g=KC!J2lbI`D{=n7rk{IFvv4N>bA-HcqK>#ocb0yK5~YB+ z83L_781)w#RCaXBj#60Oavv(aCa4TKfrsys{BXgXtuPZ4+=uV8fmZBG$V^;)m?k>4 zT=6nvuoU1X2pMpBzG3ogBO%HV6xiTW9`e}L<@(O_EfD!bQ9RLK!0vWGk$C26EY>eJ zf>;ceXekf~3f8Tp{)vB88pjnprN*Uhb&E(C`}~)41eC?h%#u_{ISZ|yLxwj#w))BfX{qoNvmLGas9%s?%OrrB<| zsu`ajdPnFDJw*!X;<*Ct5Y{~|kS1Olsk#{(@*6-!5Z}I}K0xY3^F~P!CG??5MD}Wr z^Y1B=vtNAanvb7ot*0R+k)kwOyC5o|(mLed{w!jRPB;{b}E_wkph1TSy%qGY5$ zgZJ<`XMu1fOMzJTcofT%($|?LM0@?$?zC8T^3HzRiEL=d?sduWx*v;_Kbh$s?6ff< z3-AD_!uco?2ZuERc&n+S+rJ%&To)&c8fz4dnByA55mvt;7J}DdrhHw5Kj+wC8+3`^ zo{20%RmJ_yNr*gWhpQBgM|V+-HK4s{FB1g5hR2^^q5l!-p8FbxrICU0RL(c0D4+4p zIB&j65zN-jp^GJ9T;won;eAS4^f@=p0$ULQeOqM8=Jwns<5M5&RC!CoOAnrF(^kiE zbM*cKg@}w&NY!8m0pX$GWjf%4cq-)HTyP3F*)^SK`v=jN6(vA5CyM)wha;sUeA0-Z zQIcAfK=A&0Fbye#3jTq|*Hqk#02x1>&aU3)=JI!R^EMjr2YXk~Gz2&(P}ot!_4x;ZsC4W|P=L|`YI$~s#Pg;&cRzKU&55G zOw(7dG`?KV-Vz4Ds`*L#@3J%&#z+Vx57_WiI zyploPnZGOo!_pm!n+R1$7^UzHv=eg_&B@@;IoFcIXg9wrv z#L_T}0S*DMg4kH#1qI=qU7XB}Y~ek!&b{EgF;|k0y404utu?IkewJtC>jX-?Fa=mN zHo7%_Yl%~Aaf=HUgG^YB0&6Hli_{8=?meYgoo@XLg)sC((FQaue@2m$o@zc4PM!GJ zW!g!RZoh>CdE$4dt`<2IBlO{Kx#V=&c9`RRv1SkWisF(MitmL<=pN>JKdzWFW09B| zqULM!N;W$|0S#voG{2!VyL0|*^%2t%$xG5eKa;|E!!$pfA(y;Eo6L}79v_{$xgYnS ztCJ^P0pKZ{Fkt7hvmLOMPO}CZT&=EWzf1lg%`%fZLx=EgezUi4`1Ua~>yFqy5^@|X zYEJ?*7Jhx+s4emK=-BH*$=!x|?F>ySMIhx>A_Z%qEBr=E10hb{IBqyT4!buX>mVsi zU_uo72T|7gKq6{wF>`IsnLNq;;-^o!z7I|C*_n_V>v)tnH36yJy0Lz6BuN>>P)-=kGi|G@?pNUNsFpB%3*W%M%Hut*Fz zzc9Nz=x;R2)G*_B&Mr7Rl9>NcS}V5lw)ae6s`s(cTQXcD^V+NWD0y_a01b>zEg(_8 zRC|PsR1?xw2s~Yohdl2E(W{(#JNr1_XRFb35mNg!zX%n4OAK+ox6J!YjoB= zEbL$Y9$eZl`C`0?eMJ>REs@JB6Eq(a!t42rbWf~T=@6HzokCI+=p zT!P^@aHGuD-+yxryONHL&?8mGenobuqy#-{+8EHHNtO@S1FcoVGiUlO*D6rrl+COB zi~zoxY1^mFp!kLba~1lGRJ;*^--eTy99A;9DAgk({ncco_T;{U zr|l2^a~2(q_Y4@sx*eqF8_wuNgr<&#{TFqK;Lrli*%RYJ@<`2v0bv>7+_ucJD0igN z-x#U3lJoj z*l0%hX-*MJ50GDf@mN{%PuJneNK$=!EvASg)a&{*B3r9^KkQ1v=7M8~5kY+2MFKOc zTkJ3#SsiK>qN@s`iIM_X&;l>|2hIT@IoDfs#6%K{IQDFjad~O)S;)s{KXB~&Qp{KV z!&PIkQ3q*_a0w>Io(`9H+wWCk22rJjqo$pUpdq}-GbC(syxKT(B!0`Qo3V_CtB9Xf zkkUv=(`O;3$&7r8RzRUym2WECZSFp%fA1xqSrQFJ$%;KfD)|T))gFsq7+^D1;H-cx z*lD2)ceUwxX48)>NM)#XO`@OyVc_3$lYx#g+(XiR_HW>M>pB}qy7!(S)$lb(z92uD zP!TWBp^lLh;aevWX;&pvkZZ9A^W_ZB@ehB5U>H1{Z``5DgU+s_-~0t#U!W6#l1u4a zlH(8O9UgG*Wo95M8Y%=Ym;NM2Gwo<$@CsBonurzW$_~Wdm-XlWar&8y+tqD0LSFy{ zRZw%b>THV&RuMv%*@DR&MZb0J;PwK)0@}2m?q+Ruxr%PE_9_X9gi*(`f7f4|XS;M@ zoqK@ts8mX@C;)y+)Gty5{NVt}xFGBb#NV*?uIGASTmhnrM-}C{o^UZ7~`LTIi(D0mS{@?C|I&kUCFf*bs&kG{|z z;pZmOmZ2=(_vho=tUrrMZa%gzrn{texj6fxZ+aX`%62O#pmYf;ndkw6*|x+U1yXaM-MDF#S_H-OBD} zD01;%Bo11h=NHm_H&5c@QBwpRba_fNsGiI~aq8vA+|i7=fYXD$H&MS*U? z8!P=^T}CQ%q9=EH-1b-hwwgkJE1O??O{iD4qytCOe2MN{TVDC*Oh3Ik+Cpu7@`j#n zJ=C0Dj&s`hPY&8ID8JJ$L$;^~V-ovQ(&Zk&2H>`=VwcV5vG6LF!7Z6o&0`QvT8Ir$ zvGNHB@N2W#VQIR5sk;dC&!*n_&TS_xG;rSQLYV46rQqk;7C1xypaGj08Y06vt z93-X?vS7sPsb9M}*-A+0s`230xKGh-TC}Mu+fvSsQ*40R;=rb3@LHb&MMs<4*+p*M zb6R!^py>fV3o=r5cXO^Ip*GEVd%-xy#6W1Dps^C&-`detN^Ck(a2 z!%+CzH7m!8x;9b2F`z)={~|55RlN(s2R-U3m)^WN{(QA*jRGESfvDwQ>v8AwxmOv2 zHC;zXahEL(E(MpnavK$>?OWW-cfe!{_kih8b$M~9jJ>Z&_ONq-mogU%8S}mO$>`5! z!))~mL^yRNq73Eo{d`ir>j}FA*UNu$!+z#WMk&+jr-j`aDsuAjbYx;E0-QY3p1t2J zS4ouzA$`#sg2L4Cl4S@m3&nW5a+HG(>BUx3Z*296EY!xa72AIpW`PaSR|4OI>(kix33p33r;o$btd4DN z)1KA$`Hi6_oI`z^RIEr5FCfelN!w~v-b>=AC1q7ef|j=CJVl5c+LLdH`%X6TQ)7c5 zW7veOuZy|I1x7@H0xI8caKR_mK~MU%0M}z>@k-L9dj@q2F_AZRa^0AC~ZKaX3Ok8Wxo&eDTbhX+dynZDv1TcB%iAFUgw6v%#= z8Jv!2PG#}4x>3RHT5R6W?rM6mqVKZ5*tnjJCg1nL|9gUv5G4)asbMK>gvx=)saGg+ z45w_2vOIprB83xJI;z|#!z7y@KE&_X^z=_|gHGLgR9kVj^K7Awe)48L$3nGYhBhrJ zg>0tI#8{U45P3m>19*5{^AEt9-E0sskw}a9NNETVfmg!-<;~2SJHhPOT&)f#d%cZE z$M&z~3b|8tTjZ+q69lWD>1r$)Op27h?K9Ixda%>*dDu4ISxW}>tUhp7;&M}s{qa`( z=EJZ|E)f@mEiaXWo3R|uAr>*3=Rp@X8qb3{Bkd$UJR{3k3P_)LIa!~--{EPqI!YUhCy7h#@wmlMNs zX!5iCq-7UM-!nHaQwVcq%Wk2@>OYrECyKwMF~DL3+eSkTAbF6K#OsweNy!_sU z@I+dw$gw*AnZ6~Uls)&EB36Lv1fSJPI)nl1>J0aluds09ta2A*oW5(G<5ab(~AxcZl7w z)*cM-{GL%vR?bJDy-})VEH>8bPxoy-_hEp}qL=9J=PNfI55GI8>8>0ksu+cGD$YGy z+n&Tet~a>^ki6;Oxl$-J*6K~3INm}tvZ=kCoI-!$Ri3nDI=u|8BKj4-e!V3uMI*tF z`|W=%2E^?O!%r!@3h$ah%gF@6wz2zD$6C^%Wm28^a>aJuS(dH1OQXGBHgu14b$X{J;n#*{f8cl-D=g zx5SKZ306uITZj|$^Kf58wq@f=?a^Owe)lKQ0okH8>dN?(7JA>MU0-D8e#2rRCC3Gk zla&0a$7^3sJ$lg@J#A&0d5A;Uj#oXOcqsER=)B|G_*_a1@q=2_qj2mDKyMnQMr5<- zs<6uN(j2G!PY9|xhLpIC$}uv_FWp)ce@BTK`nw16x~@ZYwuO?sFXGwV$I{_PJl1rL zfxg+H=?-d-hrbSeYAUo@J0s&{uF__{4uQ-ZB1>=o{<(8rMc>OIHRpGo9*b`4Z2#eo zox@!{uj#eJ2pcR~jUC+iSU_wYW$Hec73DTJt`3d*IR5$1AgiiI=%eD>%&VWm=-tjq z_|%0;_OW!;$OfN+`k#j`;tNMPU)T5e8^ECJ==a@Rc#eu|a%hdMz|zO>y5}Y8A$wv$ zoVUZ5o;fK4!8F5I56oX55{Zfb^aj%ipU<-MUjKX-5Qs(keapMPV`{%rloyyTZWg3g z#Ya!>N}Eh@wv;)J{iF+jK4Y(SRA!HkgBj!cBBJXXZP}cM5s*dfz9L~6LB>h9uLsbs z!<=AK*)h$r@fno#>Xs^`@w5rTWzptcD^(Els~9U=t9W0<`msKQg1V`%_A5cozx*bB zgpW4lpVL&`oT7f@E`FN}##bdaKF4QRAyVF=S{nAfD_7l668d*O2*asRsm)Qh_AsDD zcb~o;8}*t)m&QPBU+UGGlk_Vm(;J|+yNx(C6}fn#t;7)NjtM@wql*sBA5>Eoi{5zS zP9+8U^X^t8w}d>d4#^uR*EKZkTlOZRPVO~64V$~&I$bH;m-H#l{U!c>FC}7KwDK4! zQ1t&&ATSzBP)88^C-h4C1p3Z;y1&TjY2&6?+)wC9BAjRhX%%X(WB(s4E-;fx{P7}$ zX#I*W6v4a`dG*lx>JIt7HEa)@PF_AoivAfz#AodlG|nRqNa+WG+sz6NA_kKMe2Di- zlRXWCY5jXA9=k++B6(*Jjzo);I-ZPNazb4c#;g|}DhZ?^gyF=b8$Sd53|>TtSp2&r z5(unfrGj67LD~J9_}Jcc2Y&qhP!RSd)RRoS;tHDXGYDMe3)BBL1O8X(7TgOid*oMc zgYhNXa-Q!I@!XyTM7D@V-$(xEtNcqb$ytmeE;1i0)b8n6$g`e=d!w~j)|)z zd7Vidck9HIJlZPc44}QxOj8jXfewvkQJbev{gOqEgInf%6jkEFXy%v9-n8#y=NH#* z(9l`J5I_2KNtBjGHI`bqTa|0RfBho0;45Is@9rmS2dCtX0RC>cqV-Md_EN&K`0QZvQ0Ows*k7 zjaufccjdAcc+P)CldpEdStylSM2v)iD5|33i?=|7S@ZCyn!X{y-UdQoELe7q)r=mJ?-JFQG9? z6X$TJBf8U>j%}V#7vA)dwq<^|-iwl)ym%<|AjoL`AVPlYf(&>agWd4i#(82&rhBYONc6cBmiODCKGT)s1X`sh7qzVsytFjA4IM7iSc!8KK_l zZ{FIx=mC2Zcjq%xcO*>uZyS9soApsw-e`UE5*m{*fx}zM2+(>Leo(crqyU&prN1 zK8En(DanJwvvut%7c zim-p<^3u`$ zhAM0Z!cj%~Iam_9^;he)`o!1N~LbQ5Gp zz6&ge39Y>o1iTrx8C+n{PTDT~v{CGy*y}&iEP+ zptNLHYf2UjKkp1d3a4a36~cWJWFtrCgN*z^7L&pEJ4Pww5vVtvPElZe#$Mi1jhJIAlMA&Ga-9IcKg+f%t-ynOi zrmQ>8c0Q1rErC#)2;jqh{_cs3^V zfV5W@`5JT{q~R!9fHfb|+VU+ymA>dmxDtKc(-ejvfxsaN71bbS3^Ks_-#!G?<`eb@ z+0WXH8A@iPUwq<5SYqDjQKCV&s7GDd)l9S;K}ky0jy$v>NuQO=d^<@g3o9p@s3;Y7 zyhs+SL{fc5eQ9)UpW{ ztz*ZIu0N)bvjG`e6x>~%&6W@`1cIwU0uG_tvd7@BPJc=;n2+^TLiWS}aBVZjD_JFP zu{L%NfyviqrZ7LIUk;F*O#G$Hwz?qxdl()sHZ!9_(M4MsTAs>EXDE(<1HU_tvu_Em zo_9I*tDi11DwhN{iD&zC32Ije?nC2GR=}VWI!_l0MDS)V%B<@wS8OS9Fm$+~)`ZB7 zJw(!`hz`S1g!G%JQ(_1%Ak22;{-EPDi8c}L{e?U*jD8CtnzUX6O0++YgN2Kvg=ns5 zzYRq=^J@pV48kieabCDqeu7B@6LU_-j{_6b0KzDE)LPv}+F@|w zVB<%uqdcvuQrzD^cGph27PyF>Z4TVpurOl(#!Wh5gBYqCM>S1hV0w8d`TM(auGKjL zQAhD)Gp!dBob`63?tD*Mkep2g#mX!fM`F{%7>eh-{P>a(hB|v4t57jXmlO&zxJywe$}{Z-e%-$gm8LFpXeI z|D9sXebh7nlez2PQa-rY%7-p7?B979(mOvK8e_Vf3@;2g0Lv4`S;`N0vNyvVtKJeA z#r-O%ZW&zQ3L`W*M_4aHmA#Mu%Y)zIbYrf_3E4c$&(dhtJhu~gUKt=zR+i3c01(I7 z5gfiPD3}CmuQZ-Tql~Vcgj*cn5J@egxTU*+YM+$NorutFR5S{@_ofl6gF4UMlAs^t z;LN?G)fY(xjx%W@jv;whl)C7!hwXA*sBoWANL$DdqQRrxim{Id!3YIr*TU-kw_W~< zGMjJ^4ae>=)9^I~d1XB(wTnBuAiS}>!8N3R{z>eYRDm+e8S_4+cST0PFRiRVLc0x6nhVM-u*DlzF){{@n`BZ+H z@F{x(TJH6~Tq$E4&T0MJe8*{<8OLUtnQj_REB%_yj%PFvm4!|<@dvB*cFk8Pp4Se7 zhip_t(bp~XXE@W|Y`UI!nx}Wotr_>uPKNxNLt5&WUY%{QF3stmIBcM9CvcwD*rsQG z^PuQhT{lotq3BFLujN0goRxbBS?e5`YYaaDYgkYvHh^&|j%odqR-cW2bLiAmwV880 zPTiVT$!e4fL1xN{kxBx+)~PZOYiD-D+QWLUHgP9h#wiygS7cw!1^Gs_9FHrafC=D@sY=0JAdbgnGm z+d!6Rxy*-0J<$kKg>49ZO33@R48wKG)-+WvYX*}4Hq|FzrEwCdmp6nN1B_HZ9LQmMzyhFU(?Cl2;;KBs%#XQEbZzl`~8oOl7^)IKHh&X>qa) z_gHIaN1?!N3_m^qVP&UvnAZQ8cGD|2S72eJlxGCJ@-H+V6CekwM_lps@S7X%Yk4Q}Eu|ysa zF(inEwLu3Y2!W)brmQBVMz3sdZ0};9D5Qb+<-cZP4+kka7l@05k&TOmgq4+@n}n5x zgELXyg_Meo3!a38gjvkY*~HAw<#Pl(`~Lvnj2xuQEX^%k{&(na4cbIwPTBuo03%JI z#79mSfP;+*#17)(AmL;KF|n|7a{t%lU}56s;^txD{A_YEv2l=aaB?$&IC%aW$MI>w z_5Yf1vof)Auz}dwNmxkOxLBEZxY#}oK8LU}adB{Qv$B2S93XBc4lZ^!R-Vre7b}Pf z^uL~2NH{?(OaS-)dj0INenw(t;Q?`zd_tf0pF2(_PA(o!Zf+7zc5bHsWeMVB;$r=e zBsVt~6B`Q`3yAg8FDDBN6UTq9xIa7p_r}2vV&Y-v0DV&7;ACa`kL-T|KDGXjI}U*J z^Z2LtPYE2KblCn=#!UiZ=VJO4@;}1=kI`pV{?o)k!uIKum6M%?^MCZQa58cKmmBW? z8|UWYWa9ZR?EfZ=jh&N)=Q9Ks3)BB%{~s64Pcr`}x1i5ladUp^`$Rv}!TMS5=4K@U zv2ihdp7{SE{+U@e&i@>fd;*`T z02`+2&=UQ6MiD$nu~`V0H+HSuF5MuRu(D#?^78xK&S2~GdkaF!kvj$6gmiNaAS`*4 zd;qvlzIKlszC8I#;`X!1h6zNW;WoP#n%_p&FnO@ZUL%M6AzXJmBhY*>yCgOoRyw*t zzJIu_!uLF)MNF*7izNz5gkmMJ+!WztE2Gd|e{HST(MM|=@~(V?cXQcN@ITnao4 z`!VY|XBpAK7e47D}cq2&8&a)K*+nUU(4Rad3%pg&d52j-q0?kowb1HN=~+0K9)rQPszSG z<(;VSa|#h$SmMrIqKj8Q#Kk{K@bvtL4dP=PcjY(v?e8 z)$y&7xwE&>JAC<-*X*e*9jmpdZbT>?&UD8)iOsXO_8`y2k1rky*U99#$St|Z6Vs6_ zCAi0t;FATGXk8}$r+yZ&(w>L4fYuCP; z8asynM$J&AhtJ2>DeTSt(AA(iB#EqTcnI-eszsfhemE}TU)jAXQz^-X9F{l1wdWp) zIp&TO_xk0>V~CiJ%~+;iE(u)fOM?EvL_zB*&~O_k(|*S^Z76#AIsm;ZB+0ouWD-3G zo~=$l#Y3(+g<}fgHG{%Q^t}@D^u}-U#^h;(*I0t-J}f%epDe*Z%I$iD?hb((co~pZ z`*Rk=TxN>$hAQ+~Q?Lm;jO8%sj_N_T7WBpjD9dit!VeoNm87p z2WLld7xCH@k}2wI7n_NNCT{KFdeFL0cG9v&t%DYgYnjd4d*7kva*rYVH@e@ajrc9N zie+U@T<2`*QQWkfH-M4v8*e!GNPgJR(=Q|(O(z8S-zO(_0!U?}Y-nYgXLG}TCFX-< z(oh3m53ioNAM@Z{I2^Y2gAx|sT>kE+5p@L+*DV5e{ZzD z%D1#MHK@?Vx$YtTW1#hCy{HeWDas6zmvkQZsY()>u4GAH1nzbRs!0FS=~L8NJLu#z z59>s)^T0M!mHJ|9uqL^&-1T`$tHx}fVvjJI>xwAIqarsR5sHlre8_jxyX%$6j7H|X0Wat0+8NNS*}Uq}6C;jHI9#*+w%{mTTRSVU zQ{thOwe{vmz#7jQr8KKqOno4jOu09et!k{tt<)35Zf|y^N14==%r2P>rTe4W*^1sp zbxb~EO(p@^XR6#Ja)7V5PT+*qSHts2RO8Sb#<}}OK?i_7q_dd|d^_1HFV_fhXK-pJ z3QF_pb+08ZYBhx#=iiR9g3lff7JLjq!jMQ*w`P;8H202@pwEbWocPg>(uoG!kLI!0 z`&=fRi#$ady7t=ZUaol{6^I?0(m&i z3Ymtc)AbOIZpPpp*6bQQuQluBja>A?Z9$X<_8?KTXF-WggM7ta*qM~K#bgmZ?aj|*x+wh}X<^JYC!|&D$!Id|3JJB1hLC#^{yCTs?6QOC z14;QMYdWau9tjgGo?cuqnzOQQxonBog=uR9W#sZ}q~5uA`KS>VJk)&FK_csb=Tt4&SQ_>jvRznhb#9yf-d<{4uwY|wbY!pRgN)onRxi|i#Qhe!PW}&2 z<2V&%e`6oPG1`e-#x!79;SVe-r-JgmNLrvhAkmJLJJ3%dV$8c;^77Wn6RU}vD4$&P zB2cT3%){_eYC4(J_(rZ_RqnN9Qck5Xv@u=GOf=(pWlktCqZaJlWO9;oQl9FL=vUkK^jzU|W=2>SayqS?fiXXqefTC7hr&Kz>!FZ!6 zFC6sP%!eCab0eK(Wy*fy)$c!xBf;d+WoODJlTIOsp&8J`wh-?`jDxp2xfuZ*Tl%@@ zOL!9;T~fBmQcESwCVJthsX=oEWJobt&Z3yLli>GM)e>*u^{>o-xMWlDdwa|aQhxUAUm zE7m$07v1X`+5g^nw>& z&TT7fTJpr+)DCLbIDSQXkV2OY=0|+?dh{Vv@Or)4le!^_*rvM#rB})&&s9MFyXSgu zaGJDoZLe(37U^VkqXZDP%PQU5?w8MeVxa$i`?@Z_Coi08S;{+a&z_-Ve148PLKIej zXT8I&53f;PAF9%hnT5$X&rYfLdtZh1@T9y*OkP}*YVVHZr}ENxJvAS%e63A|a*?o9 znR0X8S-5JfvLjL-vXTwEZB^+JN4l=CDXiJyL91->mP0)?H39(KJ{=rCKTGN|g*dhm zm(}#lzWUrODu7|-?oxreqcza@3AlH^}udI?oub%w1lWp`f+Mt2mi||cBbp@tz2Lzeu}OP zlQdkcJLLYW-4h__#B=sSU}fGB`f_l}#s6dJXwFi#ls!gm0j7XF8O8_e8x?stI?opZ z2xi!4VZT#xiNN(=Lt!{RiD8>wr*aSv{|+y^ClIzQ|NOk{9+)By(R3B56y5M^VgsAt zSZyg>Z3&KFX^PV_ zSico*pW=G4V%kWokeR4wF33Zefc9=BZ@C9sHT)J{QM_u zvcwE|@ueEby?=}xw0PxN9QyUE&D+>3qs2PJ+Yf0{D9NXLE0HeL@gHLQo!=`po8@bE z=FZ~7iIoRwnm5M5a<8u7m7qi0RwyzfYHZeFBq>*$`Q7G=yFT?}2l_CaX1Y|XQ~Lb- zj9}^ny5J?nF1BgkzEXttcL``(gv?*eqCB3SloUJwY8gJo)bvt~IcMlV17!Bhniu-V}*f|s>=3Mwg#^nKmgmm9LKP^ha!WIk!+P-s8Z1C+Vx z-EVhypep9Zsl_FszYO=JrcGF?{&Kp}sNk6hJcww=B!L>!E*A$s4JaMvO}CU(K*nq; zVO+65!HMD3_?FQO1UPjL24mAL8l)Y7qntlRfA2Mc6LhnQ&;s%EYuKu@Js>jqlC0fbA zPRUC@|E;d^nO_<0H^i?#4F3)U5pLRza^QgmqoRj~jO%K{B2&A_MDJXZu{^Ii8To8+ zV)rRE^=6XsQes0NByFV9-^yA%>u3hfgi2pAI?!*Kk_2_qJLmGFqdKHW4lIL0@=$^Ji`oOM(j+qSQ9*I>atxHr!-OPX??mR|!MPQD_S!QM*yS-I^Hg8*^vVG1YA9X3@KD4BjFA zct((?Mgh`pOIT5p5iY=3kA0fIjqXOlWwW~{Ws1z|g@k~kz?@O5ik5ilLfqf;VqFiB z2p^tVG;&48NfTFF9Jd$(T&mq*QdW8H-F!4?TVECXey{MHtg+bTu|y6TNsr&&?Xd(v zqrZW9#x5N5>I+}NujR-I)ZGZz+?UALqP~h!*7x5a**G{$0hQlA+#4t*_F($v@L<}% z4uh&=iM~O4sg=XRW2xAZojv$SBr7S-;wAj62xvr5;x%d$+z9g8CJ=fjUFq(o+Pg)D z;cU3Xp17O>)0=jW|GdKyF4kAshTTW4K%&Ern2Z1rsl%ex*&OEr+k=fC(sM%|mTAsCBgN$H-ZzuD}!s(5?yA*kYsI^JczzdhIt&{Z>pxBtz*?@Bju^ZTs?I|LCa!^Cip)dAZ$BRd z-jJXkQHK=)Uq}6!wCuA##5y%sm*0XN#=o>X8kh~~AI7oJ59N7KySTxE4^rFTnh&zqKg_=j2)7_3@R#}bu>aNj zKX&?CXZv5%|0@9aZ<= zy_Qz8tUYg<7M$T#uG<8yWEAtpsINaOpUNKvuU)hs1+JX~tM&NuXnjQvy>#yOp5|Z8 z)Fme4HI_lrs%w**KJWLrezu|It|C_t?)J`aA35R>(PzMIT#^s;`zDE>=}sKMUx-Co zu9-?adYrsM1Esa5MA2UefP3s=b&s@hZPDs>yM3tDLN&+KeTkJ=(GSH!X1#m%lTdnL zi~G$2MNXbMu*TblwZZZ@fuJib&SVuDg1iwZ`4Wnk63W%0NFUK;Xf1inj9yOHF#6m( zi$M`x*IsFIK))OP15*931tk^IQ%i&W0|tV;;F9#cBCaH3U7xAaG>4Y=wW{^oU-8F$ z%4rjQ|OgGooZ)sly z?b!gAx51mfsz`bftg%w$um=e$tSI6lZ75HeQrr}Z0iktlP)unKCvsvY!|Xf8K7&Nk zU*$e68I%KGjOcdmTPXFC*V_6$-HJdSoW45#WBZ>#R3=CpW^a~$bx$=h%2b5cuZ(V} znLG;_5E@)c#KUpAgFE?}wrAkXK2lS%%Bl+>y)U<6>|@!sHXUx-&`P^_)W$I;ZswVg zUBj@rf!tV7&^X!o^E&J^OLfcfo_{70r}e86)XCSeA%iyV&Vyk{PzQGOQ>C~#=9MCB zPFWO78+{u&siDrr?vm((p#DAf*A~0aXoYLlz2DnTr5l`#KGh#cN zaxl?bKbg{7I;=G+f82ozKjRlv`fH#@;3Kz3h^D8Kzup4E_GFG{&uyvm^sQXlg-2e3 z%91k4yWs4O9v%6!UgzXHEBgAY(LLf6G?$UYl}lCo+4Rm^BRf5wr%g?m&1#4YK3Nea z{6#IuIwi)?h4(^iOf_}9;uV8hR>Pqk`1X}fYNIv_xwod}({4GkwJXV8mOUZw>ecWYt zms4fJML-MNt2%Xtmst+==wQ_qqC>Ke`3K9knw8z%lL9 zCBLobx1V0)CM8pw?IfnWr4khoy)k!VAtw3ok##X90sN$<7Fu00k_o>KtOLm}oee+K zogA@c>pVB@vy}^RSv{TJpqhx&dvXfB+svsrP1bYe|LlB0G^_STSYPB*LuGFZLE5FS zoP;$1@8lsJP0r5zM(8u1YSQ$0lsF6Lm-PIgIq(kNxBLXjYi+cuO`+(3?rQdEe;13Q zj?-Ozo7pT>h2%Rg&&}2uV*_B`o{!{B^*j&X_rd_{+m(*_NP-*;GY5Ya93Qm4!7YXv~vg>|5$xw5UK z&#e1>?i(Dv<_hL>8MPC+-kkPmo6O6%h%I@=bvcD&irh$^ezVn4awdAiXpO6_mi%Si zn|!kMTj!`Dt$`Q05$ETq>laZG=lZIiKj*YBvR+k)1ZHy{y1(Ly+b(#!GBxWx;3P5z zdAqW(;J@Pp&HKg_+}8)R4+Wf_P~Mi8--<|PCzU1Fcq6fA4F(m5GX&|JcNP!&Q)JKS z@*S()4+m=yjdK|4m@aG#o40TRFSVnp>Y*U6pAvZa&Q^ubPxO^|D&7;3`y)ua{SJ`f zSh%>{fAa`uo_DZ1CP+(O0&%sSW|#S18s=FM;7dR=_Ny-i$Mb*^+1j?y~=B8~!2aE7B!Lm4@$)|UhJP9dtN zZSB5mxEC`s2UlIIJ#U?R(w@FAEv=rb7wT&0J+*alQsNf<6uiUMHR}9!c|q(~Dfw`# zy4`)#;^^XGaQSe^n4Dqpwyt!rGJS};8c)6OlO){!Z(lP9fzp^L{O5fQe%nF`nT8kx z$Q=C^?B;gXI>u7hGjpdasD;owJ{MW-boe)yh|X_hxiKqjvoC=`zB2 zZ-?jXjG5TxBZ1#*DXW>|#KIUWS*%R`gG!xblTGfhMgYv2A8C>kYiX9UX|no*Rh=s~ z-ygZ7ccVkzpQ0+~*6M5re;M{ad9yQM_gV7=X(=@?)PYPgnUt~loJWI3D4H=4EsnxN zwm}$TPEy`k3z*~MajX(Dn4RjSgW^~ z=5VcZG8}xGro=y7vDCjrIIuevxtqE%l0%Fg1%xfi<_xw8*yY8Oj##ML?P_m-gc2lF z`4gqPj)ob`A^-GyNeX;_HOCkhIFL&{K1akk0jNA*RPn4Ku{QnGiqwq!XnO1kF^)Bv zm|{>V5>;If>k^JqwJe$8%L!Jx{9sIxGpO84QIGG|b`#L?m6OqOqYXM&r)pnpsCsRK z&D;5X1K(TTo3~6M5|n-@d=>KQ7C&>lWPsM5mX;>b%iBXMBkCnh9kHrSUC!RV7yH5R zAV8XZ#3`2scD}IV5%7gyK;Xn_J3_@N!>J3En)wvB^X92V2wDCQM&A;futI(^Y?O?& z!dIBDXyn~7#W1Gk_v_Nzh;i@@U-J(rf7;5NMV z&2l-rvDS&Ge^P1Tr8hoEM5M7qq#_x`(j|mS zHXm_iV;#834!P256{=GUg5cAqm?e8mm^wc3_+WP*Fx6v?&&DD!++t~!Wf7a?Ukw!2 zDI}%V!tpn^8nEE`Uw21gE{|v%lxbTNrx{h^yJIa=Y7+CpGvItj&|Ho}^usvn8OY7f z^_6SUXV#5htG87s-3*CUUspdsy)h+viF6t7f3tRHo_fsLj=PpZ9eTuae$5+X*7r7K zYxM1P*dhjx=ayCR(P#|~W>L9WDG^}YI@^wuhwk!0R2hk@?u$xf`npdQathgcVU#&E zHjFF-qcJl~v->`7?tVhtZ51Sw$_PR6<|ZxPjq&98ni7KI#&@PveUDZk#k78n=p`8B zxw|WWCK`Z6b5U$o%rw<@DQZnaDi)88cbZbFwTt$VKrDs|nJXXe(#4A{01qfA{Q=n} z%^d0J+@bw)iWLBFOD(wuHyktR@Wmf%C7~TRA4oLosn58;@WLI{xLiwUN6xqLLKMad zItsm;mQ0HmwMSDcZri1ibVdCYBME^{fuEyZK|`sSrl3<=%bKxNn=Z{4g)K)P_xgKc zaHu|51l+f`1^SqEI63ZYCIg2{;YLhN#!&yD>3-~Q1M&*dF(`<4Vct%k&n~W7YXSp5 zwg`(JI@jnnHGu?Q+Z!|FSe_-g&*Nz^%_jA-8zgq~pzM-mvG?a1Hm8Miy&R|# z%dPtMb2tg-u?fGa)WB)aE2qgZPkW_|G$uka9QrvFHz;GGgMyZC4X*B2$fi_`b!IEQ zB>5a|Y2%U^s@R4xZUS3qsgRX)#ALLt3ZMSrxxdYn#J&@PWAD86FRwA03Q+mkZJiK9 zJg+MRMQk-yr$1z<1V|QXGv}dr7g?LGb9QB0V#kNpXpL;@#*eOYxt;uud~JDl2U)Yu z&l7q9ipUkd_b~IL{nE-um%c(cjK>V09;S#=NfcqH&L^zwn(I#QpJxfiDB7UaM~-5V zooFt8f<4BKFEHD)r@dw4uG}|?lou7Dm#H^3$t71 zA%l*;_9f5NM+uUWtbjj3tc(jtEChYke~ykgp^j15HEq$h#47{#uFja2R5G7F<(|w> zHR(g!WWhXYt_v>|KZ3|3-RzMwXF*_3hS(Ob#%N8@zu|ECy`@cDq6k5A=CyXlri*Mm z_S~)dsGF>$jFQ@jkzoO$A z0fr)>UmiSYhV9puR0rb6k}94V#jiAym72;q7S0x<3vSre@G8ghV0khFPV%y?(;P$X z8gsw!DdiEH{F3=*DM!3%fyn4GsaP;{K*W~x961zv0AwNXGI2m7!3`9=4A?z%WZjix z@HGxml}^5Xzi2szPWm(|O|e?Qf#%GT{pY%aXQ}b&``?1~#_aKA>O{CVQR7jl8KajG z%_9i$V!GbEGk&L&jkMA(&RfwkLC%Y#((`D3<`4(je1X_~&<_17x-!W^yfQkAea^T_ z!4Yh!2xKiq%daEHaqniM5Wx)%I9XVIMvxENcg&fQ?wvAI1!Op$^>AyzHgJ|fEKiNl zfmS$@zkT`T3)xFnI{YBz+!$3IPx{(qbGWC9RM$6dw>R(7Koa^KW^qKh^$`72!>uG@ z|K*(=CiKDS2unqfQsyK7sUbGS(-E>=Ra|660Q^NUas8v3Nd{WiC{S8?nhx7;c~OS-Q#LIeKw#sy=?Wa3irY zyB+oZd5=6zUax%GM`5@$)x=3vd2#bHynW|LyzS`$PFJ7E&yLP|G-nH6HDbLp*zD)_ zGQ~U@41Y=5)yUXB8-Z6MP7$$?Sg$ONJqAEcw%l*YONOOw6L_Z&byj3{1R+&f;24%^ zIB86d1+>?mzsLxKiHb#o6VIlWtP8LyI6R9Y!spVrjL{KxBR&mNWL4L&!~LRB*5>h| z4e{<=kl)SAz}8?uCP+qsj{}XUo+YCCn0LtLO(^t!tEAzLsKa4NjBEA_zv0!YOb0Rs zBnxdnM%HxkoJ~C|Kvy?N-#(4jdyQ&Xl~rF&{fN&xQ?SaQYI`MC&h*F=i>=slh%BHcpg{$&!cFRw=BN_pXLnR*GKCHRkH=rDO3!DY zkTQ^WAV2ZAf=oZ>kyoW=Z7UPy>16=}Q=@0r48E~FRaNnU59@miy)_8VO7=L$UV9;T z!M>WoQ};5m1#dHscpZwFk`FaennF-!?~%7h4`a4)k?8glti{f7W#|oHC(X()xpDGUs~C-zNRuM{uX>x~ zb?w-uny1$zOz9m$XdD>S#uy^<%KM$F+lNh$tL{z}9STVocFX;ftqJ?(h0Z;Qu@xH< zo^b0iHdat-N4Zz>CN}zHO3DCekBw}Yt#fMb%Wfo4FR)}&AcG_yiD{0IfzY>B9TcT4 z#AGU6)!9}%0J?@+Opfq^hQc_Pwd*Gc+#u@x_h6;h;4>ljObh1Nvahp~Aj`l*W2O18 zIWI))pqhD~_LrTCR#w~K7_$Q64j6c&&5~A>^P+N+mFaof`--WYFCGC$R7D3kLbC3N z`SttU`Az1f%aTp3X&T=S8U~}jbk@`26?w;+8h`r2KC3j|w!kilcc&*HUx$$KisP*t@jIb=VL+-;i8z2TcZ%Utcf4999Iz6Dcj|g9GPs7gG8J4N z82EEWHflvjbNyGjriEUnQBHL-hDc2|21Nb!yHZ}(=Wi(pnsgd4yW%U~HL|m+W^}MT zXGy{M+&qW=!o(G0<4xtep+?#HU1b7+4Ed<@K23|-OErrI2G&GExv2H-N^b4T9BzG~ zCrBry;Szx1V`d;0;~R!Lnp3uH6n{dgbO$}_*;X6N80+ifz(-i7)C(yD@lJLGe<> zU1UW2uceCBV=+eR)zL=kO2S3>SZ8cyqsn!dmPsP_tDgbIpGcXsGmxWB>U_F%vN$rp zPth3rT#75XnF%+cXvw0`RLD5G&k|jiuBDP$y_-}CjRSGn+adK73|;psnyiZQTKrF0 zXa-f9w0w-L)@Am{DoO$JfT4r3{5`@a6-F`70JUM?U+M9W0w2Yzip7aTxSD3>OIfx8 z62-@v+z}^iUBlG4uEEh>_VHNV z>x9;IL*`S#k;;m0Y7JpUiqIxD2ZOZCy; zy7zMBkam4;4e1gPfM|Mq12E$Jfdq#YLij4|GNA@wZrIce*S-T@(+WX26%wm`C$b7zk1;3 z<>mx~|HXL=@N$BMgdX5+e%J`yd@z)rmxhmDkQ2=FFb5b24&%5V27AELVF3^9I*5i> z0L1w~a{s2-`T0PcJpZEK|K=AG_=}Rahh@TM_ONPxSmtla{h`Ur`LH0qzeU2R`vv0RA^t4qF>H43dAC0T`0%V=Mfgo0~_EJG6&Th7*pH z7IEj_Hw)k23a7lkH`7Del#dT09xPIC?@NJz{P1%KLQ;bmAvONmc<*5c8Fc>aQ4w(u zf)zl8z{^|D9$f-MkGU~!sti7C#MM9GMfA!;1Xr*0%Xjl zB~AC4YO2T?G-TICgoFjwaXi!4hhtBaGPU4Sc#3tvdoY(##=u=C-TFWctcyVFUziyMX{vW8TY zgqWQL^eEB-vd6xO00*1PRkq`I#ueJ{lq;XOzRt_XZGN`eCJ;|c{fz$ak6=4tG1t;0u2gNfY zBTh!3_38xBNz1`#sfz>% delta 27687 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 serverUpdate clientUpdate serviceFirmware storeBootloaderUpdate serverUpdate clientUpdate serviceFirmware storeBootloaderIn READY stateGet information about a componentpsa_fwu_query(component_id)Firmware informationNotify that an update is availablepsa_fwu_start(component_id)Set WRITING stateloop[while image is downloading]Download block of imagepsa_fwu_write(component_id, ...)Write block to imagepsa_fwu_finish(component_id)Set CANDIDATE stateReport download completeRequest to apply updatepsa_fwu_install()Check imagealt[dependency needed]PSA_ERROR_DEPENDENCY_NEEDED[fail firmware image checks]Set FAILED statePSA_ERROR_INVALID_ARGUMENT[all dependencies met]Set STAGED statePSA_SUCCESS_REBOOTpsa_fwu_request_reboot()System restartsVerify new imagealt[verification fails]Set FAILED state[verification succeeds]Install new imageSet TRIAL stateBoot imagealt[Component in TRIAL state]Test image functionalityalt[update is working properly]psa_fwu_accept()Set UPDATED state[testing fails]psa_fwu_reject()Set REJECTED statePSA_SUCCESS_REBOOTpsa_fwu_request_reboot()System restartsRestore previous imageSet FAILED stateBoot imageReport update statuspsa_fwu_clean(component_id)Erase store areaSet READY state \ No newline at end of file +Update serverUpdate clientUpdate serviceFirmware storeBootloaderUpdate serverUpdate clientUpdate serviceFirmware storeBootloaderIn READY stateGet information about a componentpsa_fwu_query(component_id)Firmware informationNotify that an update is availablepsa_fwu_start(component_id)Set WRITING stateloop[while image is downloading]Download block of imagepsa_fwu_write(component_id, ...)Write block to imagepsa_fwu_finish(component_id)Set CANDIDATE stateReport download completeRequest to apply updatepsa_fwu_install()Check imagealt[dependency needed]PSA_ERROR_DEPENDENCY_NEEDED[fail firmware image checks]Set FAILED statePSA_ERROR_INVALID_ARGUMENT[all dependencies met]Set STAGED statePSA_SUCCESS_REBOOTpsa_fwu_request_reboot()System restartsVerify new imagealt[verification fails]Set FAILED state[verification succeeds]Install new imageSet TRIAL stateBoot imagealt[Component in TRIAL state]Test image functionalityalt[update is working properly]psa_fwu_accept()Set UPDATED state[testing fails]psa_fwu_reject()Set REJECTED statePSA_SUCCESS_REBOOTpsa_fwu_request_reboot()System restartsRestore previous imageSet FAILED stateBoot imageReport update statuspsa_fwu_clean(component_id)Erase store areaSet READY state \ No newline at end of file diff --git a/doc/fwu/figure/sra/lifecycle.pdf b/doc/fwu/figure/sra/lifecycle.pdf index a487d8583cf5b829ed92dba10dc7dc7793b2b7ef..89b0db6f9511ae66c9af40de9a7ee9396355b233 100644 GIT binary patch delta 15733 zcmb8WWpLcwllE<9W@cs{kD1vqGehE-V`h(;8DoZ+nb|Qj$IQ$zGe5rX|L)dqy`SFF z2c2$pU)?&AYNpOl>PZ2=O$U!t1Zm6K6Aoego~k~ggzi7vz}+H;g_Mc|lfpTrdC8Sl zNeLj|S9XTzGWz&kX84UR0VkT*A1uSjMakvNU|yH*wR8GWnxC~(yDC%|hWW_;MYN+s zbEj`t#7pefWz3b@E}Y6orbps6?8_v1J6Fo!WkQK|^dMXvW0)6sz0_q}Ds@TjI`V_n#WWy9$Gw!>Tq zCXJ#Yn&W`3E}72@otxOR2xKD)#23G>(ShT5`NiYa*-9?&UqpB&Eazh+Gusrp%IRvr zJovJTSczM1;mj4WADE=A9f<_|W$TUwlvy;1`HG%>>^JULXtE5aYwZZ>vkIr_X~xJ{ zNzA$!NT9DN%0O}n6q~hJbUV^sK&%gOerwxe7}q98LXrd1NcH!`4n%Ty922p3fcolGeem5+O~{cTnwW z`fyYyKi?Ep_pA=t9XkKGeMGxYnBAYRC+Io$qKc{7;irjJKIEV}T?C-Mnz*YD_B@->pAB#O;I%cdzK;*@VI35q|tuv?~1TYm0Qx7Om*yH=AZI7Ujs4Z5 zG89}Oc}wU@MJeHgrmFlGvcK7kSMagYIjexdOm z>n$2R2DFEKmK2g|5GI!wb&anWcJGs@RBC6Ejp-aMT}YLX8;~cv)*_mk)@yUw`d%Cr zEj1yfc(}EA6%+$O;bNA3v_sd?4=;7|5HN!qxOnr z_9GYXY87?QhV{Ky)OqQmZ{ABesRcjNo$?(m9pu9FVfvG!rJqP(w{h&qfRb9GsY*;cbAcf>#B?MN275@Dr7?(;QbQBR(uP*? zXJJXr$VH3qxurP%yWHzDfXTzS(r0GDU`}1q8gH>?CuPLnWS;3MExXTuC)Bh4uWiLj zJLs2*6)qj`Onk9>16oJt$9|^#G}gj=u5oc-b2EY4 zuYHXZd&|mPlMx?4BTup_;msO6Ok?6=nx1qSPJ&!6j{k3sIdBuWLz3F;d6D=)W$bCE zU2e7gjG;CCY?ss+n&`Be>BV%Yut8;NRZxG4cDnRUR0wTfR0xzBjH@E@(N$FdgyKuX z<9UT4xc}{X_|wIH-+hJht9AW~?~8H4@5MB>LRU)Vh}szfltQc!GB0$_pTFFh7Y2Lt z(elvkHRkfo<5>}!j71}ZRm7{*`w%SMiy8dwRTP{tT5W#r^`^*Y>iWd{*LGq1{5v-4=;_B?p)+`X?7zz$vgN|xRorKl3P zY+R44r!G`L&gREk`+Yan&)I^e$};Y`F}fJ+Kbr8Uq< zdo0dkmqit)e_S=@5cH_$8c^xJ;(*4e&sI&4v1Q@7@#QTu7`eP};L^t$&M_8t7EI{v zpg4`<9`Uu+SnQ1cT$|55W}4TKpS)IMHCI>JFdec-_SoWcf~CV=9PLX{wtFD4Kt-#H z?@9#n^r2ug4Xm~TzvTFP*}3}dhf3VK1s!AT4fVDOHMs=I_PD*|B*LPUGlPP%Wy7tk zM+Y?E2lF$ueAeB^)aDjXM5ic6Cu8%p9Izs)qVf)33TSOtV$%3v^<&B;rbM|kyM^a& z^9XjH$5Db5oHA-|dHQM%mX^YRAyrnv7i&*^Gqd2tx!6>+%v zx}l`g50l$I(ue;hf%VkmH3qq;b9%DWZrn6GM^*+$=KZ!!Mm5Nnj>|`cKr>@0!xEHW zm}twX%#^lBI383@67g0qYGpxuO+EEPwoPX4z}{~O4E9M5`4*#sBO>F-e*_&D+pmLM3k^M6uBO~Kr=i;j8gkJ^+aR7J_goF_OE7U#n4CtXxxR`b^ z5rq;529FjRoQ7@&Pq=Js7Y8&K`PnxJ0Y2l03h%Il5>sn4#>>NV6>qjv5R=s)t7|c9 zlg^{qP7Dpx zI5Mlm=peT$R*Q>b6?~ucKRj}Mpa*}tDM}1+x-$B}VGF{wv>Eu-RE#_VyM-a#=c_tl zE!v^Y$h$#ME!Lh!OzD7ZFIF+e46u99-{{H7n$5;eq)XoJUIlN{1DVIq|5uM(M>pc; z5`Gq1gjmxHK}>Xr`?=mhJbe0%^R6@J0V$9^QIa-8^FI~!6nIa6rk-5mVn%g5a+A&~ zk-`*Kom)-kPP=*;WSOka*M|h^2Bs-dm}f%bOT`(Be*wXmjdE#^J1~YSC=hvo%FD`f zmkAfO>?#Jyr26N9uDDe&PfH2C@R>5q?+@0I?YLuV!rM4%r2wQ+FX4j)bjyo37H+A% z9ci?{mAPghB~J6S5-!%)Izq;>v*l6IL zV%j_Tk4mL;q4z)U0@5dkD50TG-n+&ICgGdy?5dG~)e~6EH#MWE=fiBld+FEm^bHQJ zoAmD5ESEqdzU;E3`_$#d?4GXYRcvf#y9XGpiGu{a#h_;O5SG7qe1f_laK^!0K{yB3 znsCT+gg5+Uh2O#4gUm&|i6~9(o%dE=+>glm`=*j*Aog9bu$80{W8j^9rq1*t$IbHa z!S1i*Qh=7d#GVf2kkD+-9O ziEtO1$+{K|R@3jpISmN9YfX#NR-K%KNYWce6K3xk5<5ZF5!cv7{bDOvUypetq!8DHw^yx?kDiX}B2lsqR4gDG#atRC&T_;BZx>&RXlPEA zffFHQe!hobKjW5rjCT7eaxP`rf~UBmq-gb~IudiOPdW$GF=F}-fTVR*mooH1 zCRf-A^uhJkLC9{XVqzNS9sr^gs$`Tggc+bAo97v{DK>hF?6r^L6TqXe#g~>4mvr+Y zPQ4qSKQ_lUHV}DzJ0CBH{c(c2wAz)&-Lhb(hwJU5XzwBbWPj{_*kwfZ{_yV^xmeT0 zt*RszoNlYT+mZoAADERt^W4yjgK_lxJHA>TyUJ&p8M}l>mWK8;5&d99?t1qA6)#2V zL782Nu#c!t>iK|xnjYA05Au-sVgO>-3OP)}Z<98kCz5gJ9q3PmHK65I`GnM;N zvF~oVJ+Zi5p+BW_YpY-zU@VVQ=QEa6%d{WrSyIDozE0HI5BK{01b2Bm+fMf69Ny{o zgW-XX&SBk)rhXqrg)0R!O(Oie@3|xp7vJsZD;E!M8|@JHll*D@A3vKcQuIA^Z^}t?CM5PWrnREr1pl5%MV{S2M0U#mUiZ1iH6>{ zz1iHiU&627Hal5)e|#{y@vorDC7*>e7wgitX=;UnP-h!SG&gyY2n_?0?-LqXxN(-3 zTiByl#I$Q|~x|TzB8sw0~YK zT(t7y^OIWFEvK74L@OF}vZePB5KhGaE8$Z7;r=s}F}vjcMrk;H{tG zU)$hSHaJ4**L^uJ5zuoyx>|d8no_D3dR{4h0pz^B^wqQOai7_g5CH!)dhRm!G)^#s zP&H$?{@hV}De)gkEiB$wQpoJ9{*qO*^7(p{&d>(AE`O@izSq+flQ=~z_}p6>6Qg$N z`>qa)gJ2b^mmXq`fM^|>kr8Tz_|s-+Tk8Tf_#AXsLwR)q2?>eX;o1C)l3YVWHXKEI zHE$+8eMY<{p=Q%D@AUpQ`CUQYvyGh*gz2i6!k&Jo80U$|KvK$KUQV5iMS$!1F=bW? zSUMgcuDE(D*Q(OrHl)!z+gbE|vo88*?xMEt$#<<;w38TfNZj6O5kQoPp^u5r&TGj2 z)AAHaKhhB>uX@3}08kL-sJ&6cWKK(C#yq6J#I?8U4*2D0ZKhO^Zl<;Hun2$xG2U$Q z>={Z%omCGDM12w260o8o(Cg}<=%lgSRw#=@HwZR^k7mJ%Pt3q}K+0@ZX3tdDPJ;iu z^LteUB4c-N#>d8|pkiwbFX4?Gl1mtXYI)LEU@>4mUy2XGIvvv9uW(`Th5JxCw;BJMqH=1I@!+=8`5Wd}LEKzEZ$y8W8^1)zVYcrFqe+hv;qnXyd)W^UM? zsoHRPNySr*Cts$;kILC@oE|kgWDYliNP^H;UQzS9{L`?V3HcyzHc;Q}!K8%{^6}Co zosO`Kr@%kVaz_Y{6#s%hx%rde&frcjwtA7d#&sR$!3y6T^V8qG+4)y}UDvI^TgAqdWYFsj*ttM$_k`{BM=2ho21=&x zXz{xFH5|1N=~2kAK}QADvPs&@{5>OuM+66oh5O;Zf)&gVrdWD{luTA&`{asob5FMv zu?%6_?a16%<0VB!MRiC*eU^~jyEwxwho*g-p;Bb>IS#N5Ox+>e6Tg|eAWN;}Ss0v{ zm|%|6F)dBwH7qIaKrDDsnn;Ez$Qg7;<28$2Ohc4mTQvGgpqmEd;;rv!voW<}5us=C z382BmZkMRJhO>x*5^&~lBjK8l0$PnT=_Fg6*u2Ag6ub%)<*Fcb z-9<$ra!m09sAVAFphP40R(!%>HC~$uk_l!9%u~h4Kg^ z%ViVU=86D?XFz7^^i5c=mAlw+D%%7(;ew-48cN1|BAfq}njt zwtz~tb1DZk>NPsnk(zU=gS8guM!(`HO=^S8?`lk@s~m;cjaFEcc|ZGkpbss5QNqCU zjGKuthsX|IdoGilR3m!VB8;LKGM5e%97~Wn3cv!Ov2Z|1p-D)GDy+?DnjXu^pM~B?)7S(muHz6O??`rvu||G*SG|b(fxQJN zL-ajV%mfiJ^_(AHV2VN>`gn%R}TJEm8xY1z~VPC&A$$2Jol) zDPyMKgeirmWFK3%n6YN(Xw*0Dm7`_GGpi$7?_YzVZ^}MH$oJBTkhlpZVJbl4_ZIXE zQ8Lrwhg+c68=A%!4qfG+JvF}toV@|~Cm?-YHd{R7?|IaOdDgN>uU7t(d#9>n;78(6PHh_sg&cx}-$8)$Hxon;l`9tW80AsM~v(K@{G@ zWHq;GJq0YbkFxMTKv5w*;PpT*e)c5Z#utm0^}E7Z=8(h6GK%t{_2dy9`>xAzSi$ zkYsLP7HRP3VddjyX~9)bKB;uD{sPuHyRMsgYVOm3lNH*Damyzg2_{c#=}Dt=%hb4` ze0O);$gTK7rlOx6Wplf89R($4%9!a1EC#3Ygd%JilYTn}*8orPk+r!#LW1e-ZtLiaxu6(-b7wR5?S*e7xo-qiw(Vf&o?sI#9*mSwS! z>;s1+(-T`_rCia&Zv{YoA=@-QMxJ!OHfX+;y~}+_ z9EQM0)vy9T!>};u#|0sN4|Ru%K|IT+fLqO_>(%V?Yr>MPL((f_O1LQAuDPd@= zjlTg0jxpU-GX+%FpQ0~NV7Sjf-<48ampUt++m1P+2I~JwOod|2Ese#J7ek4)@`nX9 zeg*HbW3r0)L1NI8o?+=%#*G%qB?9sQaQy<;g&UL0IFCPgtk& z8Z((e__yJ{*=f$s(1Oy{jAL?a($ozhnQGk8RR#z{;wq)C8k_wj^5*r-)#QY-11DsZVo&voAha7EGOK;13 z%hYfafg6Dmo(`1;nZEyho*P<*rWuK;^-uEpei?!KM3cIonB)9NW6y6e9ez{vfg2mp ziF}~x@&agSZ13V7lz3Y2N%}#4Y%VSif-k1t)y@amUelvZhWq+--rC+x z|91ZI4;+?%Ul-kgMIoU81LuZ1wp8+7k0oPkg@;%BhWxaBu6iL(g`B?#>yc6g5%iAR z2E&B@|6Pw{|7Sfi@thbIiklt4R{umi0gm`ZM?p?UgHhGq)IM>F6c6g(!7(X027rTy zjF|(#M#jz#WG7>1$tv;H$?U70^JfGX*S`*NlOHl)EiJw~|0mRp z%;o<`Z1UcmdojT)ey-yzHND9$p{|7dIz62X~?hIVFgjlbeN|n}_3{ z9BvLa79fy^4ai0I>0tr>Cxx4fjfIU9$i~A##>ov}0kX4w#*=Xa*jYGu|Mjwwaqw`l z@Nn^Raq|9K_y3sOJZvo7Ts)sWe2Q}YSLuKC|0zk%$-~3K!OjN!HM3zA5G6Co);SPRuOnJim{Wn%3b4z6PrQFgE@1mwKKu4K6L0#O22i=b`Sb<_90J4z0Y2^gLgqob9O{ zsUS^n*zc|4BGU%Zk3w@FgeQz4gH4J#nNek;!|8B$v{FM}KDIt*EG6Pz4JP9NK~d0$ z_$_kD2mHxvP#4HF^hKJK+#J&5L^@2;2X2N@gW`L+lqXiOsS1SHsbWed(=X$OZcN0l zQP4L1IzJa!6w;kaFZOAe6jc3#7ZFOOjteoIoa_N5634)w8RaJ(J`#c~d_t z%P#UD`hmZkn@ZNAkU|%7@NjV@U*bWOoXm*=g8>1zQFqIwNrK6fBP@A!9J{-UVoeh? zOcpw7Ya9$F__h&|1ws3z>R)i?>N%X8j)7I@(_2T)Zpm%;M(Hh=W5?E2W@dq~i>nzA zO&6X{UZV3o&CT~+5Bd*{z3-h>@09cI6y+N_Em75^?gfo^{lhEk&991HW%3{rCZ$T3 z0~&Z+%1~WFTA1r=T0^38Vh5e;&~7WN2-Jl?6l!oyvJ$eBVL|Sgm3bICpd^}zql@7v zS+Mn&9+CKlnze7uLqnMR*WWX92Oo(u9VuJb8O-`*6umvD7T``?&UYR$dFkIoriDd6 zE}iVYYRSj=dmzlFv~e8#&3XbojHY=)xt^lq(gJc>7icDEE z&RAC?6VATY@0-&f{h z_esf)ot(=}m5_;2=s{P2!1{C@ReLbvl~X8bS;-UfdF)y{HXE;6OUYh%%K-D~4k7 z1Y(lc`cz*vK;c1*RS_e$yr7%l8D!3kx@s(>)^wg!mcotYV8p>}QtvHgt>^iGp3xn} zFNo`27Af>d1V>kHF>^pZB_yT-6@VV>9|YKY)Dh~&^{G%2dL|tNqyzTX~fFi8t_G^O43pguBx2kZ^fi&Ix?}G7_@rsnFvOJ`z z6aT86rlD0*-YwbSCn9KzSN$uj@Ixs@g}M+^gF%Jc#rAZvxhNu{Xk(@IaGjm3g0$LlUAKv=)#jA4b$wt1_hmKP z)86K8$xEpbc~UVcx{7u6`uqOLXtxA@!kcVX$}7Io>xfk&gEFjs*&`>X)6C~%_*bG) zR}(f9^hDzeMq8n~^OwH4e)+yg@Vv$5xjzfOD9%Sivby4gS$E;)#9x;=3X*fEuSRO7 z21d$AQ<^E}@|QxZ7hlHGES9tgVzWW?_}BzJ-SEhS8G>+E50)uQVFA^EioQZkH?B?L z2N>T_zD5aDT9(SOW@p!r@D%R_PwU;h(W}VOxMrkB{j@jTf7B~Pd%oj78CZb#;n<7 zhv%eG^2Lx^1jO&p$5*5%h!a&4ij#jjGma9r9u(U*gmsKOj@FMSOWja4c?2C!+0}My zK{GqioQ+*mgf|@rAt2dN}VIs6upBZ9E#o3pWu>lY(&?W}TXl$~-M-0uP!*cLLSL{QNNDWv79_LQTKT6FXSXFBeUwf&GG&EE?imF`L0 zqa>S6y2M*Z+&jUaGP;@i)Yfs2` zL&1NU=TK=fa8j~`e9{lj)k%wtgq=eAt!V!`Id)&rXy@g#()L|jSR~K$3I2LIcP!}k zGyRE?Andr|oHC`qveVVk+~Iwp=lfCExvyp8vU_)>Q4-I8aUhVed;Px0Sni!>u+@oL(#)r_2l9tAINNUQm zAy!0CZNc5fM`s7;@=8$NHTQ&G`ZG%}R14QpKmKuHI36%k`0^gWkY1T?S>{u4b#Jec z|FN(^34ozys`F#sOsP?lmlCUh0a@z^SI*G$|AP2xLDl_Dru&ifYSb+N_3W88(_{rZ z^PTV+OE#NdoK*xB!BzfU55fmOO1%R`m6*B6lXupv3!^307r*&y>ZZdR^coEh9}Z)hU>V)1E%DW=X%uGc$9qTJQ z`}H}@4ik-`E*Ra3@zilD1L#bW|5;w{*$r!%(THzdywzEFK&ZlN;y361T6F;E!EUd; z2leBO@EG%cu?FWM?wz&IT9=OyZ$m7J)cSm+`1thNHOKu_W_s)ghSb<2nq{~aB;OJB z&zK~iLuF$w#L&LYY)UT`;uzmXl`pV=+nzb@E}keYUSOwe4ei;IVnA8Mc)WmgHy4ln z1LUfnGAtkcd1vV}?S04Ro>h?goAWm3>|P~p`sjnfwUR=YS4rLb-b-u-L2PWLygku4 zB1;QNS@0g&O>JQ3HI~;vT|(zV#tvPC#;SY?-msY5;Py{E1|^=QTM^mgOZ6C=8kluq z=qc!r2ksY%(Wj4Y9gs0w=H2Oyb<>g&;ye2zQU9#^5oa>W0$RdH%|~PXh}6oI)qdt! z0&L<;c7bs|rxuS7wp#Vvm8tJL-6}2yDo2WzPYfEFQMK0IneU(se{zt)dx_#U z!8@C5H{c^%n}MJTW7LnieIWzq5-7~e;h$i1%}oLbc^PqVupJ5B=2supUPs(;`V$dX zjkt`|*jWwL!gJi%H_05_4=;NaG2+#Q@I&Jd{wH$lwJRX-C(UYShGa zdo#gXLp)rvRq-RAoM)y~B$k9QJ zq-f;bN@9?3=&lhgDhSVhqCbF+$}J4Ic*k{EmWDE`sxL> zATlQC6)eeQEMnq}ig>gGcwTR z(`7Xgb-oiPZlwGwVEh&fQdp*Qk}t~PIZ&z7J!6ZYC>CW6$6{(Fopz!EF`J{QdnhAC?hbvJPi z`2>WyF<5*P{92x}pNICe4lNj)QG@%~j_u2IiHP$Adg^5xqolnI!x{&ymZ6d zd_{PIs^M$pJ)QvBZf-Lgda|lng^#+?3w&GZp-5tyc-pWA3NR+s5x}eZ#%o6hX-CJE z%*1UHK!rMu=r%O)hf#V#i%{+w70!Q@BZ966pjyzRNrqo|gT!)zb8-Q*xh&1XC6-yVo{}hM!#_QBdlps zvDmzuBMS^490OI)Rjaz>&feu({O;uRBH8FX&CB91DyC_+Up?96VE^r5M(iBC_F0)Z(&J;@!#=fp}0Ufv3kjhhwDo#S|1_!T1*pnt_K zZ1*79hnsa=X1wkcV6D^4EAAn#30q?Pne3TJ$Q0sp;3rvgNiyYqEO!Xy z-QqAAjtXdQH=&CcUfc1_>IJE%HP3N2L%5%Nkc58;mqTYDPe4#&D8UJ|Ff8Uu=+1 zn4OL_f*(iKkS0m+{Y(G(G2CDx?S`itOy$`*0156nb%RVrt}2Ne+i6ZJ^ar4VaDA&Y z0@yLL9Xw5=v7*}}t{pk~4G@2qPJTe%Hm0@^ceJxE)}?bfJ}>}H!;nj8GC8!;5#vW> zPSp@}BnGFjqPx!6(gBiyz<@rtBD-t4GOQgs^`js?Luip9dJN-=$ocjCl;~SU3skaS zp>|*i=CizHr*hk{PUyl2QOb`wvC^>Jul!nY*xoxoa(BBz)nDtklr%$LFWv^ z6@FWCNfryCGW{trK(un?w>&2{H_uPNN5(vI`y`T^nd8L4V^j@_of~70I|dJ?PD=GU zw^ZqYl_;)WM8v=*k;QXF4Z{wIy?|`*b?(uefWTT^mCZvWZ zhOr8Y5Q-y=SZVq%#o1~7-983z+G*rmEMRrtF(k96R2;YgasN^pfGD1 z>|F)StL|%~;}eE+H%od?GsSokMN$Yk6osN*&WPoS7^?2dUAs$SV}0}Vfr`<_@DeEj zhqyTRKMF=M*bw2}$;CI*Ba&VF`zV$Qmfr#$QdD8ix1#`pytunGWK||NV)|yN-jhmt z8NWp#vPw2p3_eXF^jn0pL6Yk0cs>CesC$uB8!SgMp{VXIJO=4|X!<$@2P}k`NPlkr zJaq4Lr=q#-{2t^(koe_YAm)gBN41gFDTE94Y23y*cEA86MUqAxH6F@kUTB9WBwDm7 zu6f3&6;eM4>M;OpOC48)$?VkjrdO<6`i8~Ou@RLb4KFW!PGCBosiYA@^gHW1kHa|o zVqw!pq0B>zIL?AhXTUc_yIOLl{1iJn8;3A;F(I~*JqOGR+NeD`Q-S10g7MR!5{|@$ z4w=Rl><5{%a#=N}B@;)^Tp1C095H!qqt1$I0Xjy|I?VBcu4FVe5i>__;J9Yu@ftD& zUEm)_LS0p@Y_KE~I>T)l%qs@$!4=jCSwk=nh@Umwm+*V+Q=wJd-3WiNhj*{ywz>a^ z6a>$?h@AiY8A&}}%@NFz;C(t`z^u4!SofuEK4CJ5R!R0wvX5~AvJz`dCn>TYDQ%ye znlZTpbP9+RCy~xsi_k#Jgq48aJGV``$0d$K4v<9Vg_#Yl*ctc+%S8BR4P`{LGJeKi zg4z{+7@EBRYm1DWA`c-EH((BQ zq8d>SoPfKP5ru?1$t2Kv!JRX}BB+cXtuObU;kXFJ<`GQ-=V<`((5CC!m8TAlZ z@;k(uP+`apc$J3t-=DBiMe+CA_PG+qsp?vKkv0x=5|;FkF8X|%>%y&QL~MI|3pQUfWi_Es!6q? zcrjVJL7WjVj9eHUA{G67n~b1ad);~hnuJ$&JoH^~nNl1ZI#NJ@89Y0d2ZFJCsC!0C zfGkaG8y*8$(_x`VCLW*2Z!c*->>h?ec@;^D%!19}w~q9r%Qoe_<cHV3OJ=phFddI$AV8YHqT)8?_8QUrd^8>EjV|kjOnpW~b`++``h%}$!PRy$Eq@HmiESO3% z_(B^L;7?RJkJyWdquD8s=s2TD3hnYuX^34^Qm0j3VV$Eq@Sc9Yl@N|v91D}9IzhOU zAstb?IhmV;rBWW&{D1)35E@gQH!VfAjlC-7mBIFZC zwYacb*TC2zVL));j}%{vp`ZnH^7JcKG9S=5&8^+{qBU3kh+EZFo_azQTT59(1H^xT z1F}hXcn)oM2Cs#-q;AC4WDF4=j14IOnZ!FG9O7%n2e4}*nqj9?a1K7l?&HH zxSPTdUi%ZI#Vj1q4o_j$PMfNj{$V=W;x?SaS-J3*K)HCPmkZQGcNyAZ6GwmJiq;S2 zd#tMEws7mZkQS*^M*TqM{`u8!Ezyi(`dM3BJaE-N8pXoO(N|imO0<|!9g@AnoUVMU zdNFoJnSHCG5FHA~zBrtw2J;^NL2G6K_G9B_Ilias=_O5oun#00p<8`fgqyR+#tbI+ z4>EV^II{Gm+H&OOE4PWtvoZz4w`~@ZGr7ky=UPo=k!VX&s9ac-5FBuR|J=R7+~sfW z$FkEA3)3SY-AUM;&jd2kw^Fk63$>cT(^JPK(3euZXPnjIvsVsA9WCG~HPBM5PM3{- z(?up3>|`2yyIXG4bm3Wz;8eCQkUlgK^wQ28T&Uk=>Wn%2_8@ZW z{s--g`0kNg*upn!-D8_Fjomx}qIpFXl{u0VH!MZ|ECzvCr7-506%Ut^Qq4IY=dj0` z@3u7dyh0IwP0$;g+*%IVgbsi|Zs~M&bs4k2yLNq{6rt-44`8r%o?^dcpIWdT7WL(z z-K<<~N<=6fg;Gt}e9RUW>)xYbVuBy*XT|L+WUbvxclJ@C@usG@1r=*pSSRL*VJ0dI zB0&Op+3Sr2sUQ$#RK=yF{)-4k2^0P=BFG8&Zz9OW`~RB=Qi{0zAL%@i08UOWj!#s_ z{SUR{Hy;ALE~mn~ReL_%FZwY>1tOn}hQo>iD^1;rd6Po9FZJ zKPd7OVSZNS_&m4I!<<|Imd`dnA?N?j;bvp`yd0lSj!#W?9%LM&n^8$ES zfdA4`GH&kAY2^A39R;wl{6kRxw;UVUKlGCKvvJyVZ_?+^8*(f*n zCo|>wM~>{%@ku(l$pD`&uK)DQM#l9yfB$uLxPUw`ET2>qz@5k<_6@D}6AWvx`SoFm zvw*S4KpubIPb3f=9Q8e7rVvoPpA0vVMTR<2R#N>ll8s&Kzaz;Z4-?BI|BW1#G=+fX z;$`Cke1_(Mu=+22BU+OfpcP+NS?WSHwB_iB&o|^y$zinUq!P5-Hh+g#r6kP0T+wj$ z{US3=prkZJN>^c}kHc!!N(p0WRw1*}rfq;F^E}myM(ro#-FA{n&V+$HIeVzjSEWQ1kOAGYKvy|hw zmN=p$@3FeZMMPa#IVLO$8rx2o*fMAkpG>f5KBl03Ua`tK~SMlso_B)WCg)3p=#wK`;X}htr zuPXo>o%64}>x1t-%!8-vG489py=3CLEEza3@m-b~oF~x%0Y6bvP6MR>&Dhv{3l@XO zOT=_dBxQ$>Y?}vMhPMh9Bm2f5>X4qSXCIcTqsUL2UPSDiFfQ&85(7by%#=M&c>|T| z??FIVrATicq68BZ21_B?4o=u37?r+@DAce(vmDv>1_Xs+K-h;!Zy$_Ae*n{kUrQ3Y m1RLiw9oT^PI6fX2JqUsbClOzs7!kv2EM7-Eq>fZJ+e>e(xFI`FF-1HLKRFyK1fd zZ>_rKeL7HIGEkf>Kts|FX9T%>rskLgB5b6KK_D&=h(zMYfMjLHIS2vSDr`u;uq0Hb zUQSJU3YIMrfi);_VcF^B=~_xMGBQ5{sxQ?U#KoZH!p9tyAb&^f?txN7ECQa*t>B#J zYI6sgTM&L`tS*E%Xobr4OI*Hi%%cVeW?7J$!z^{U`MTsg;96JKOHaoozL|yN9c>`D zNb%XxRpO5b&d^e^m&cP(_m76%)9Mc0&XXh!+N+$)+6U9U9yUgTjSH~8-Yqb zh>3x#q4xG%+PWF(pWj$=fhn5S5-K&y!Q%0M#p`DfUY1)Z+@Z#!;a=HoNU9=!T~wCcv3^)TEUn+)XU#* z!>p)^0&3Pmthb=X(aRS{T_4J=clsrNMMq^C$A_(q{$Wm-nuIeI#xQ4g5p$ke3s#B$ zD_~sz6pucwu1yr~PSf@ItKn;&rfuaxQ;BnJDCaEHGSqCUrAWVr=YnFQWJG>_)87Q) zec!WgH`30|_R3@3(c7KAzH65iMv}e%m{lSH5`Y=ZB#}Laq#rfy&W~wD!6@Vd=C`9i zW9{EwjS8k@orv1$@49G3-D#65CvD%UACbbFMqT|#7XTD1tp3L7z&GA9m&$YH0_q~QgP|CB>+veTi2XKgKm zSRCriumL*+)}Do%frigUc8rP)Ilz|5u7}guZE95bHDl6FXGjK!3YYE#;tQ+=c2gy7EOCC3e;_L6jYvhXO7N{{1vm+RiG*p02Y^mheJV5h zp&4qr6SZ|5sBpG^?%)w8h4XNx_0S>3&Yaaa_T>Rt7P7z@aW3jvg$h@(Mw zq^+y@M-jCHKjc!TB*B$uhkAkeyW@TZ=7e)%0y|&>_8y0k6FIE+Cp}s%fgCSk7zlra?TNU4bxZJ!E!#|3Rk4zkUjZ{K+8# zLHcq4l-l*={-hb&L=CcByZ>$WZA$dCyNzPnV~rJ_s5yfvN-ESFoH33>2>o^U@qvqI zhMVB$EoGt3Sm0HgGgq75ZR8dGSjxWIcDx?mfpqJ^#MbMOtJ{3a5@Bs+eR%O;@+a(kT9mI;CwL)nQGFC+n5*v0J$CBV znHpSy&=?8$DnyfFVLHQI77J%X;!Zz9(rKpP6WRNrZ^z7Lv4a-$++g=@rZ60THU}f5KEnSL_!{E zh^JyODnNDE@i0UBW(v=Ic&fNwZC*Fn@efHDuw;BKc_d5t9{`mP<(h`L161&aV&8|n z($-M0d-h)Hvhr&_7yEUq6v7%#c1U3(THdiBQxLe}C3BrW&5dn!;#~`+Ij7u_eKe6O z*r_9=V6c*DP+3^}0LEa65w-E}JyKW@9-j50c-*FNv^*jZI7qa?XQ3LvSB=Dd@?MEk zE4Y&!tOas7C4i-$Rb-VZ+*#zHP~zUzBp@G()I#0@Y0e6Fyh;RtP7xdzx`hJs0z99O z&=y5ZD=KrmeIl3{=u)4UAS#(2`nM8+9%}T_6a3__;T!ae7o^}E%9C40&|&AC7^*DP z$@v~CM0)2%0Tvts!E7b^EMeTWFh_Bu%xL30ptPa;Ie;!bM)c|QK_H}RJB2?V_(agn z)}1h_L_$zwF#awSNYBpwj`{`dGE)%?df@YxlNQ1!M9S0B#il3{&XO8J>D%MKU*&B%|KvqQ@j<)On-`I%EqX=RiwgSH!L$a{`gnH zd41rTc(s=%G_qNm^!P5O^ICCMxri&osdQF~mmY;uRru9p&AR}HMUzpB(8&AKJRI*f zlRN`{p0EmFLqV%}U=p!n*|2sKYpr8{GNaLY@kEJ6y$-++d-UtLgmOrH5N1}+h6%`3 zAOIsPD>NS;w3D-=iGdBYd*+3Pm%Z|G8vju@skC}Mt#p5~iQb7+J)O?j6$bmEX1#SS zTv&@SNPL{lmO2nJBT1@-W#dOh zmP`lBm{7A$dpOgZ&#!tWp!t#enJyvjZNSU))z)2Cj~8QJ5F$t#F)b2{*TQPfAMXzv zA(<3N12N_&0@Mz(X@2=IQP9Oul+_C_fX3qjO;F+~6jSzA_mO}2&i3Rx_8;9~FZ3%+ z`Ph?fgdFlg7jSnQ9zVr*#<9NlZG+3rx~IQ8XjK8QcUY+m+bn64D7TcAstaAJ0$eJXEhM1vLP%W&9dOBI65oHU4 zAFOmLte?lv5i<$J_&CylI4ok%E_zAlcBakidi=9+cs$K{E(|h) z-T0ABL(9>6lzy(yI1+T}X&N*fTTJgVr2mtlv+*S(&G4kD_nVl#Uf>Z-k5+>BI%mnCNIrUgPfS_--XS04 zii}WETLP6(gx8=oY5{TH3pPpCx?2kPB0UEW^|{0Wa(5Mh#T7<0D0F88YpCtbOnJr` z)mgTT4HV^CKF!k?^0uA6ejeUuk7TmTG@Rs#DKs$Muc=01ft8A|uH($S!JX8QX2GL| zsZfpVSVb?_j?^(+^pg(ZF##lxe(q9CwYY;o%mXO!0NMC&ZNqQX;s~!8idA->4DTQt~DAjBT@J|EhF4HiPy=_7+R1i&+EIR7?z) z^^If#Qk{9dCV*+S1U&6Q*_fh9yb;{NBBxiDjxDnG^v%wo(Yj`(9<>nt6srV`#9h!9S80tF# z9m}_^X0L7!Z_%rpD?a5)Km9n?npe5Om&=;RA@`$K=AxqZ;acagi761=qEEl|!HOB~|K_gvcf$YO zfxO5di*6`c)u@h2&2zFNDnWCiBXhPv8Hg7gzorFMB*T=V2i|kw-CMW)m-G&-JVxIusYlJaD6kN#Z!RL?ef+4>j~gy zja_Y3+nT{!@muLz?o9m6dRdo?L*+J(H+jN&FgudpestAxwMki7HizzpmXZZ(|b- zQ@*#C)jC&73({}C*Sjg=r)K<0mjILH>R<3w<3zYuzfu7nzK^E|V`CGG@9%eu-X8TH z6Jse`t1id8;h&!<7zlXn&-Q??0gO8)FJtx*FhUM#2{;c4rsN-y?K@d!)sp~jL48wH zWMn-^!WG8cCw=~vJ_B&I4KQXd2*vU|a0@~9C$$?c5#)%Pb^VyVQV7Y)t0)YMRI&6ZXW8(~dVnp&OPDSK%TVV$Yj zdi&$1I9(?p!;G_=-KmYUif~6-D(`IbTYs6V4??#G;m7>P+z|eu!T*;*iHQ;fSBXF<1}VxmiV#F)8_p$c6Gsj{Wyk3BiHSte|kJu z78--MCj}v|e|T1t{qybOs`LHU>gCC)8fj}Lx==U1u0f!( zxDL%xlF<=-s_Nlq=~b;IsThpzv*+(Cix-9u_z!0_ef;#XdU*$eNx9F3^T(WPvoE-F zq(Jv)x-TO-3|DGXelpyB5HeTyq(N%x0Do$S9)~EysfM@PcsM{+1eQ^+)UM4$Z5-fW zI5l**AXT6kTUxeiS?g@h7-k_uW9yHt&a=?3Qde|S_PCRCOhv-|Uu*)SdVwuGS~D;m z%lzO5fNN1$FH>+KUyzV@OUaYn?i&kb%0LIe$+K_RTQlR{yyp$mGZ!RxeW7-p(K2q% zm9(b3;gRQjpB3Oemfr@LbZZEicZ{AGw*h*Xx)xDdW?#@Tu)4s)GZnvNhA|~AC)~GA zP@A~>^l_ur-%Q3aq`HVoonKA8rQh@D{dJQ8+Uq^)lkEfh1KfKWl`m!I4&Ubr=IY&u z;m(G~X#f2aM&1B;B@Z(_ALy7k+KNb|VUieg2UXtLUIFm=bvENL)qh0X2DyqL2)U4X z`F<|;`5sN9eG*;qvMK}%NG9R<3+w0+M}_+ah>(G(OkQ_a+%^ zHTcK*ykHIu9&fblVV>Sbw2A__#vd|6NT}mQldL5Mf9G>L`=|baE$eTO4_ez*u}Ua| za_|%uG68s>wB!=S$%w5TI(Ml4R*_UWsCN8}cWPQh zj5aZ}5=XHeyU3Iav*gXTuaKIjD#w#>Ax$u(N05pwYwD$*6lnrl#zB0M<0T3}T(D4N z8$_Y{8`f$nP!3ntoXCE!5Uk^F6<86T$7CVeW%^<2G7~%IU znN%!9O(9K~!kN6+A}XRiW*5^#ofBcA!u}WBS0xj@WM{Pvd<(*|O0sZw`hLw=NUFcQ zo*qbAPNlroN#ejn6$37N06nA_NuOGjl(7y~vSP9sD#=tIkc1GVl0};zH*9_gEZ!Xc z3<^+{Bt!arx)8KDapWw994!ib>0yL1)`Gnq2Y`kPfK;62BpWU+V&xWUKy}DxQ=Nkn znwBi9=cC$8+3t5wSyyG)5Y6OJ)pB1T)=)mqoa-G%wk_G01K%KOQlDm$k-?LG3RX#g z6;M>c5QVsLB`lOsq8nb-Ohp@@Ell5GA_JsLiqr~#KdQ>kC30pVtD<1i6()}gpP_Ks zRx+HZMvfE>5G@fSR7t{CO|WFy{?%ghEz2Z1JPr|=wvH)h#Z#OTgjIsvl(0qmL>-8g zy7&wA2Sa{;);-t87<(gf9ee|MgI%2G?#vx#kk9dV?%0n}{vR7!IxZLxhmdtr`c;5Z zDbHy^h6QhvB*_@Yx(BEwTG7E&%b;9V2}C<2Cb0D$MJ1s;A#vh`GVL-%l`9zTpZdkj zvs2ixW$awy4vm3X4$h-o=p#dpF#~nquWg)aqg+7ZC7BC5>QqPfobCJCNHH$;m})1< zaoDqAUc#0NB#)ts)M=$def)yMmT`bO=xn-xD9(04G2EYoBr(XNVFeh*gL4qfyT=e% z4wXRP28QL3Xi}#I(-a50o?JLc`AmVfv;lNNV$>OI!iK6M94GmJI0&+6h>bSyte>I)^ScZ$ktVPX6e`(-u1CW1@xEzYU=JB_od@ z0TOosMR}%xPE@c?ndxQl1z*bSDuMW1BDk1uZtu-a8*cc-%3E=FSdTf)FMRMf%@27A z^{}I!{DzyPKL5^Tct(ws1fUM`pdd>INB1E7D9WEBMO7*MVmKqBZ1j6vY{95@Qe;6c zS6Mxf4S3yKO@SKbLPjh9CO_T77- zc5`B|e?e~ahs52|tMy-mD?XWDDaZdUj`~&vv;o_-RFwvcMyZ}y36KvOvOSKbbnvIj zr*$I7@MhGit9?7fb18wOcNgnt)YXh5kd7y$yP1{@3D)O9;cD+r-KuV>MYVhS5go@~dyb`%8wL3>VC@cy7)za4|x z#JiovR?{NHNZAhV0k)*4YbdW0Kp3~=ffY7y!dy{34^?9~D>1+tP{advEb@jwg+;9J z%ay21o>7cOfe_lO6qJDtYYG!I#50UjkHsWqCoIMYi~ha_pcuwU5Q2x38s-Z`eS5`0 z!a6J_32Q+aenc&#z`>tkg2cg?r1N3nKkDF^B#aRQ2QdxfFjJPu?o6|L!`DC-U86O@ z7vbr$_49j;ODbKb3fy)?gs=Wkid@Z623;mCU3whzWtz`QMhls%6(D-nRMKaKUXFx= z|IAf{{8{?FutG)XgRqROPR(-+JC@%SIm0dBl9AK)KlVe8qQqvXgAP1UX0g zdatnK%Z=`_b@OF+|EM>R0$|sQKIa%|qWEvWXLRknn*}asGs&PmbJQqR=YTq|kHVa@ z&5vFXivP_p@fA5;ktQ8~k8n@@A{9S|m2@DsK-~oxhfM&Bkt1DVhC7ao!EBI*&sDhV zGFVF-R}h}_*!Rl(-ERAfdyksQ(+xVJka~vttm|iFj@#V>)K=Zggx(!FjTiu6qW&cN zgwybnp?blbu9ELRNg{IiO&sd?ly}qUIvhGM=4G`r6wL>eMXiU}z(p)FeT8#kcXv(d zhhhRy)a+5}Q7K*EaqjHyUHkr0GSqG$yv3fteEHm^I!p8zXC(7WEQE9?i@!oK`7F3u zsq4;6$<_pE^QF$4dgpwr#)loJDq%ijBgg&udptkNx5+mRaWUoWS=1lqepoWe3pd?H zFNR=%-~NlBpJaU(+QioQ{|vjnBRdpBOK2uGLPkQn?|_hykd=drqXC>?3J6L;Mp;%; zg+|68VT%wG_}je+5FxWOvJlcSbFvXKv9PidGBI*-CD02Jk#lnVt7Q-|aWXQob^cZ` zvHZ6oY+x^8Vqs?P{6A6`LF$BTB5B0`x3#k!osgZial)4%VFC_u0yf9LC;7jBT&(|g zI2kz;?1@R_*cdtJ|6Q|kG83|~|BKmJSP5C!IR8b=oZlH{HrD^@zsGz3DcRUr3E4PU z|K-{L|G(ouO%G?SrL>+Wn>E^rdiM4DgQt5^jX$O%k^6%& zbkfOt>T>6#a>PR#q!X^lyQI@@-(0huQIry8|k|Ys6XnB^H z`JsT8;*pW-tEQITX9LVTBc9Na<_Zo5zZ)>j9zV=|@vzS*A5bnulJr>ge09zMb7*B& zeBsnQ#s)Y@Dr`k8LenJJ3_)tN6cOB%aFQaWcoFEKxO_8%NL{^i*RX8IP)(g3w#NAf z7xr;uT4QJRO2;PVXgK;gU5W5VYGGl<9&i8&2Kv1aWOq*T^wlw3qm8z<%^if5s8~;p zAJtu`<;&1rMaITK`h0+lRn@9a-tw>3sivyck&_(ls)_=ZUtbZcMy{&IL)QYzr8TQ( zj+*ROb<19x{$Q7{$%amKFQ;Z~23=Kah7RlZHj^Cuo0!HvB0QL))jkqE1KFZBrEGwW zjSwcQ0a#g=0pw_;pCRVp3xxc%u!PB*$l|cVaD)-qMV{#FUK{xey5wtIO{;{P zA_56>!v~@j&`pMMiDflbMc6pN+D5`Os(NP4vn8tJS$v4nBWo;*UQV80eIF->*Pl*2 z^4c1I3L8-^!Q>f}A&12FE)N%fA$SAWmNq)~w6uo5_@+B^7gj4S3@7T-leda3^-2MH zjvpdj!>E-2t74WvlTupTI3t*1v^=2pX$FcE9s{={FxM0XG z3#h?261exZP!GK|NLc5@AoZmJm<;Ut{Z#B)0YtD$vpF&!f#aIK`@!e0;&cEt^s@-o zU{UoxRn!Fnz^j%K)F-yjoD!$YC`###LJL}&<7;$)Z!~PAW|*&*Kr~vaVYfohy6Ksl zpmNf}w3alUr$)~PMn%eNr)L=ljFd~Yf_z|4#n$PSZjQ$GMGX#b(`B-mCa)BW`^ozO z3{En8;%f(oF}w4d)$&%GgEp!pang)3`yH+!pNhcgh+GV7uy<21jC|>wN1lN>l zB!&qyIU%fA@Pan-5A_c!F~wLm>l|UR#Q-ks5;GLC0rDv7N-|U7x^93(i3t{|zF--< zr$$GGBEp(_m~e>NM$|)q^o0R3Ysm zD=0kLrUwt3B_loa&I`BjV|bu)Y_OKg5ch}F6|YDh+VZEs7s`q}6lEP9eVG6;#x7f{Hke%=_uO)u!UpF#5^raBz6_|n7~uAc zbyK5&14AK0i(|NgfcLjcdxlPks9TTkb25w@okr`~d1(o+izPrT80QHnq({coT_RVun%0yo*mu6@2D8>+zWl z(hOX6Y}C>$0S|y<2$^RguRG-TYoFJ$+(k*uR(nsqNpA4{V>E*%XAv2nRGw?t0BV5% zx4<*rkqtL=fkmFSL|Cuah*by6cEmN#3skoarNIQE0^VIChM~@p7yGW32%U&E*IT2K%RO7>mSpM_C>%8 z4NYt%)O~UiP4s28nkc zX@8RwL9@tZWNf~s2u!PGyq_1!ri|wB%J6|*zQFD_g3{9&8oePF!?3i%ii?nQoY;P? zLc*YYvFWO6`H7N$fnDYz#Z9_%$QQmjS zXl|9aa<=$j=qIr?mYG@@6vDzKYKm@h7waxwyh0x_*J>c}52$an-{a)|bYi?QV$A6o z5M8cgaXwwSWJ)MbhEVVc_&QRhQB2h7!kUExj06M21Zb5!4z5g7u+j!yJ+xjJ2Os)J zI%q(@8jb~Oe8x{sab+?sH6_ZAPA}Gqm z8N99!?DHiAZ3j-wV;-GB6M{Q^Aa-bN)o%w+ax%r#V$%}Rh;&!0vmAluEcc%A3*^m0 zM#?vB1A(dBTUv!cPyMp`QiUUP?RnJgwnD&ogRzyk7hqJwn!Xg}b)hAQotJ5AuG!6S zIhkVZ*i}}rtg6xBSjF(7>*Q7HS5bGDr=Y6C(cFaI=FRO-MEV6^*)H%K-2nV3X%oVn zbP%&SkSmoIHu|LS~4Q6$5?5deEampB38qF56g*NBr z18!&QL&`wzM@%cCtat=gF3!118|g}E%p_SdY0T2-9Ddt63Ht9}PcgvGXvA$!t5>S^ zlQ(9Qr9q@JjiL=dGzMbGf6kNsNlXH~T!Zz%bq)UX&672n9?lEVLxW#Qm#Amgf z;uFv_;Ox~xsuI>iINSKqI&q{3dpe9N9k`GLT*0Txhspe-40TEgi%pGM9P&3ccy4(z z+X&o`=@0k}%)TA}a}TldRidC~zicnGl=mlzk2G4r=~1slJXv}kGx5cLv(|2WWu z3kneRZhD-3TDcJKMG<&{V(3(x6b(lfLr0iWK;DmJMV{r+;IwgUB^^FDGbdT}tIAS?lf3{pQ)%gU?~&yyV!Y z83L|Vf>n(`{#vlTPnY%Ps=EJU3J+Fs>h|qdY79?Zhq$T1hvvkZHfZXhO1aV zST5eMdKh6o6#NR5HxeT@c{P!ELncTWP#BD5*dpsY-1n?+A|dzrf^-vraq7%nGJWF8 zsqG4E$mw?nO|D>-3fJo~bz+fc>$W@=dJ(_aKe#hXs_&rqmZ0@32OGLM>L*kEr8&ry z2#y|r$;q*Ip(WMhc7grqv#9JiZ=xkuhr6k=Dmld7Y) z>7>(YZ-vzBWPv?*5b_e>?~JjJh36P@Ath4|j7;`|jK(fQ%r$Z%>q#Pf8;S(Y?5DR2 zq;8ISOkZVsDm%_HgpR6kS=LgDaNGbM>N@Ts-=apFzr_v24Y6S|-m3+tK=gEIxJX=5 zgWFiknFA>%8Pjz#?)rPImw>508GFY$8XBwCKjEkQD|VW4Ngh2QwT47SjAg0O=l0S3 z{&DQW=t#oL_B?N)gy3`)$&GKcc5{S&ll$|wZYVOgi`Vz8$Y}G|h~C?!Qw;~~R>xsS z&4Fd{QQv6Cj&5bhX)e9?0I)o3;BnMBl3$8Sh;b`Xafv{nV)&4C5RN4kXbN@(+HxR_ zitQ*1l~s;r&u$E0sk>pO^X;;3Ii}HV>tR6nN;jX}r)!dFPt&}$P(_JxSL}z;xwQtX2B1G5&LeKfVpz=T zYm6Gb?P|^dJ0mgPfG^-u6rO2s63^?R8``H*nr4H~$3P7_mfuaB{UCijkG%77?Pe}U z?fjPYK4;VZp<)@~NsO8aJ}5n7C%tMLTwTD+o^Zp4k!cG%Kj;PuhroZCobFX+L`FDw z-ArAuYrP%1*Ho99->F&7Fw_?u(SW&JRJYW0w%A<(-mW^kys|ZGvu0ur&k?>~0(LO5 zvHsHgJCNJC`5=LzV}uny>2}LJ=gy9uYlwk(ux=m>Xs*79X@L&e)no-}daV*2_Rh?8MPl-kGw`aP_jr z$!q5ZSS||{?d@I)6)wM4E`SQ~;(@$eO5lF!Ar|!ORt9~2d??Njg*wdwU7QG6#iy8) z$2tBao9#k#wo~xGbN~T!F`}^@VAo{#Q1ycj2^dmeY1bID*F126p=`n}NVM^j&so;E z*L2;wY}xhzTy;NHcXm}IFP%y|AKjeb;#c+n9+9NC(6AKH$}^RZkVl1X$u=)sc^o+< z9iq(LT6>=&0%KmehqWusQ?eec~LV^dnJ+oGCc`D2>+G4VbGA7f()URFP(Q?|YuNW`~V0b{@4wo``z z6?zj6r1|=-x<4BBY>}B*lZ5HG9GMl~N5^0pVd^^sYnC=(8wdqe1rL7{NvFc&H3Xj? z^S7=&Eh_VuK;&4^PG!&jQsuXY;&(q!3an}Z3H`-cwaBw{BWnWzFWbeUswkU>ys)@% zPLd~!0DF(Sx?#iE=JYv<2f+unkKi>9XjEVjss(9?3m*B4FSvkJN>>suE6}MAeR}7H z@l%o~69dG~bisMd9q+VtPkuq=k9iqYO`Y-5#==u_lGP0a7<$t;54%EFNvw`}%PI_LsjsVPEaxO<^)aCh=qmu}N0LtX5B$|Q zGV4ZzM#zImi$sqXL=c#vF;5G8Gg`)o!VXY-hE1tcMpsrHFFZtG^ z%GLBPgjkKK^SZB3hqgLpfWaB7rpb9Qw>Zcvo!>JLqME8X45IMw2iDv1;63fXq*rQU z2VO}Z6B5k}9{X7h&`l#Q&qXHtOFSELBe?rX4G!NTReKT2A6q}Op7^|%Z7L8#`eW_n zws;m->i23wLocg;QR#F{Bdz#6?7F?86I{qS<960seVsi$4jWkkbO;HLOWEGgebxRH z;9-(v3nWNG(pHhT%OIzdfeX_9?u$!|oZ@_nQRGm~!cd}kDKgmjs4#`)sKmNdk1N0xe zi5eVzpU=rx3;<&$;0EWN@>ALy{1boTs|y%Vv-`_V$WGA2QH$#9RXwi4739pbUB*=?3k+eZ(KBl`y;FU7;NMww93 z{XMcqW+drb?{{EoZS<5@G%IAKKvhQyWs>)sB&cx5Vm*a`J7ebETvbHU#6$&^^HkCo zBD5Rn6^ffO08)?0%QKO#XPdmCwiWrNI^H*7n}9$Lpj3~ga4)N2Ad=WAOiD?YsG&;R zr*ITGA-au`7>#u=ORii-9#45g=4Eu?osvH77J)W(uP-L=B0K?8{-eU2)+n`-Arpao zDh*4K;2ZvUQ;V=C10rnQ$UszQD6%^US(}q+KhD4e;6r-e4JBXcgOpcu3{B7rmmOk8 zzChCF8z(r59oRx?sze#oOqO`iSeQtFVuGsJL4#7SN6x#Ycq98mL6yHH2}!NNh6_6s z21$)hViAsw8*dLjouVGAr}XUJUr3(b)|)GseNGsxEGhK+G%ii$l^hKlHCmLnKdN4} zyKVdz;K;R4SDy$Px#W4pfk_sY$O>8`oSke7T1L)^YEF)6GoDB24lGt0-W^(_CX)Rv z4>*T*wopuV1UWzz^*4SWgM|+YDq2FwJf3gaEJP451DZ(3*xoD>iKL{o*n~l0aJ=4p zAG>J1l>4jz_;eC<0oA8_L<+Q^g>Ts?#+AGbfKeDvGPDp6edOc!7KUDOSk0)cCRi%R z=-p5^RAFSbjLfmKB2)>6C|^^Y}GO@RrO0*5EaI%rE4O7E`%q^P1i$tQOMV zD6kgNJ}9&n6W%De7FFF)U=|ZTC{puk&*UnFRgX77P&Ieb_-zdX3?2v5ay`a(M3QG8 zEbf({_%^j12)w`5e&9=5LEuZ$0LK=(0DgQg{{o=c!YW{V$usb8ySt&QuXypXw^odZ z4e(J?T*XD?OK>=Q9UG4s6q=m`U5D0RHK*^3+$MZAFWbMX@mJ0=_^C&}Cf zr8Elp;s0ffEQ$62Pk<1{yX}bkm=5qsL)d?e!(2frb*B>D{n<(D5VLEsDy2@czn&Dx; z#Z2t57wiF_zfde0fB)`*R3f{2it_SfPLtw?lQc6UQm+_fZ*$s7_v*q<+agDi#gnA$ zR)#J1jpSX|$d3LlZSO@itA4T{>W}&3s8Cs}6wVaLYJ5M!F`H$eTp-L(v)0}GFPbZo za};k2Bp@NvRV|4_fJYRPiOj^dU?*NO> z)1dBo3q;UwVJk#ulua8$%7fcjxuHJTtMRJLKH+}Wn1{9v9DBS&uK~}9aUnr1B61_V zWd${}&8({;{)L9@M!!@t2ugKq?LqCsIOJ4U&J>f-fZ2W$+|LP&VjwC!35B@;Tp`W( zUueOw22%w&+nfFQ37(?s-hBK+=oS9CU;T?DC_*n}eiBYEmm`MAn7QAL!`ncfWirEn zK^jB5184M0n#yV>yt?<}1#}~qYB5ylSS{7-*PYADCWv;rt`0mH86OxHE5xD^N?2s( zc5^X{xmkQDY(JRA0rG)RwWfulS?&1yBDyUbhS4ckc2Wsz{8bVzBknAo0>NJa!@_{J z{Lv=`_e1&Yf>3U9+~*bM-drOnkA32T$Z-%zmK~!sUk~JJkuiHgvDFIez0PqZFs;9B zel>VWsR;_8&N8*axrq1t02@fXgh)OD5Kd;shAKW%U?^pAWhF`Je`s$*0OxBd*4zQL6`rl?So(d1~WSc;XnI_^O%|c$Fs6Ae}gCoi}`=>9Va8>w~qb4m64F0`Ck5Z~tHSf6+fY$inuo8yhpD0wEh4Cm}QI|1@A`VJGBd{@3*1?l)KbSNh*A zSib2YD+|m25=OTFh$9m_AqOYhe|a{hfBxT}QW7zRV^U-E8$cDN|3SnKBAzfRf)C8Z z)o?6g2n@uMASdnt$EN(hc_$F*gk|yn@=xN1z`)-uQdcSufH-vZg6c$dEP7{FU=shc zvR_F`a3j0@9?{SqWJm&8`e~hG&P95RXfoD=<%$WE(Gbi&iZV{eUmdD)zqFhX&?5_d zs|Gtx^kY=dptTkhIq0Ym_NsOX&L!iNN z?UpCZMxm@afDv`FPIe=b&Va&IWf?BhAVfK?J%SVVuNfrX;3~y6=!*Pcb4wt*^5tD~ z-vDJ?UB%x~x0rOk8E114@qwGdF7>9_x#fmPXD$mu9M15I5p%K*1)Vm}V4Yb@YD;+) zirbpym(Ed)oUxtC)01k{5a)GwxIyzZK-!!GJ#kIfh`ST8Pf6BpvI+1q zgg~4L3^H^;tO+xGSP8B&ssK$EMn>jq5GXmcI82VXB1Q~}R%2kOP<6r`T~N~2D1kwC z!ku_v!z>`=?~~F&xFm6LH4sP(enG!6;%XltkWK{px4=a}L7++m5bLl+GC`52tqFzj zj1>{%?4yB^yaWcx2zS68<1&CoZ_UG`u>?U`3XZ&TQ!x}6eoW${FDJ;z;=yoou`xoE Kk%`KSLH|D=t!}3P diff --git a/doc/fwu/figure/sra/lifecycle.svg b/doc/fwu/figure/sra/lifecycle.svg index 7dc33d30..a3fcba2a 100644 --- a/doc/fwu/figure/sra/lifecycle.svg +++ b/doc/fwu/figure/sra/lifecycle.svg @@ -1 +1 @@ -ManufacturingOperationEnd of lifeSystemmanufacturingand initializationProvision ofauthorizationcredentialsBoot(Install update)Operation(Prepare update)ResetReturn toManufacturerSiP and OEMSiP, OEM,and/or Owner[everybody]SiP, OEM,and Owner \ No newline at end of file +ManufacturingOperationEnd of lifeSystemmanufacturingand initializationProvision ofauthorizationcredentialsBoot(Install update)Operation(Prepare update)ResetReturn toManufacturerSiP and OEMSiP, OEM,and/or Owner[everybody]SiP, OEM,and Owner \ No newline at end of file diff --git a/doc/fwu/figure/states/default.pdf b/doc/fwu/figure/states/default.pdf index 2ff934e2af3cbf5dbf6cdd1549682b2240e6efb6..90e5b0133116591dd88560b2c648dbf9551a4b0e 100644 GIT binary patch delta 24622 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 aBOJ27cnaGM1YvV=fqAf)n50ysvHk^xCKGA^ delta 26254 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�!J`D4aksvx?$bX6_e?`O``iqm-Z3s?X3#6<)?{>OgN1! z4s<9(s|=6oEcA%llofC@t5`80*ubN#wygsVa2r3V1cff3xwGBg$Y=N1HgR8u{P}uA ziVr`W@xWpEA#AzZ8^Y71EqXCUf%#a;Q@vgPStse)oK9 zE1C~xF4MmO)dqu(N2p{D>d8eUsan{#3j{`_4{TnX>?b&G~#+=;=mMF9dm8 zS&enPw0T@_S6nM@l#xluM4+sdWRAfxUZjt0_y1Ya}*4}H7XuMg&kw3^sCdeN6h*QW{P{UU@%ic%Ra1p7$LH(89BvQP;w z#9~(1821Pns+#b9-;YNs|9v0%NX#c$n3%Gr*iQ@<u6381cDLmp;Imw$@*?y{ z^9q65D0#J_DwF*WG?#Myz8YfvzB-~h8eN%-{0+K-+FUPP02t|gxX_l_$=@iX7lU0& zu)zT3Pip+&FANw>bEB$#y-u~^c5*}p{HkpMjU170bIcM<>5C>O?Q$}8AV2dy=C?mI zG_#-!&h8fa`O-IV8Fo67Aw`nQq`8M=M@J+)mVBgzi?MWtJO04bL3lob# z8jZQU%wCYD_nFlqPmsb$m>TQ(!_0W6bW3yVaPpMU&sC&+NtUh!$VcYwPK08RreWOiu~u5M z0LNK;KHaQ{n);qSwzx)y!p?@vO2CS*RIs!=X&dvmy4X7TW_{Gi_IKz9iN`Ly*;{RB zY3IG3CBl|kf5c6=niX~GHp~2;ui9(H6$abW>Q?mLaJc~{)A^|i|9&woRH@1%*1{V#oD zXXSp6|NUJ9S^q}*{!%Me;NSV()F);AC&I}7zGnZ-{mi9vpnz;~ z2~KV(pEdq1;CL?pIR8^1;A{c~35+Xn$pDR8_OhV+pSg#&W1obTXVEft@1PTkeEP6` zJv-wU9Y8^w7_&3e=B25SuHuCLR9(y4%bG1F6CH1Fn8p~RiyjsG9=*3q8Wvgtcf&wI z?1ue;_Jn{#B=%$~{&9up8}s6=T(^Ex%K>05FLUWayj8Own)s|>q?w3B+?G0_5d`Xa zAe*c-X;YqVsaBpAnm^&%jYS+t-ccF4^UQeLhX>eO#WswjnUbaGbd?^K^E8n-$y^|i zAw@oL$!;9EhtncfHJ3)Nk7KE+)2Vo^)lK1KM7y&GezKWO!Vwg`uGKCjXeGF^sXvSi zf|+*P%0RHaU4}uw%b>wNaz#NuN5*~=nWqCYbFQ*(A=qM6AL8!v*h$A}xRF4;=T%+Y z7$I5Wrqqe!dfX&I4%o2gSDmrQOkb4*{3;d~#a-$*M=ay+?$Yc?dGnIuJs~B`K97t^ zaU8j4GIT2JJL&U~Z*ir>UN3KwWA zVUE5O4b7s(!bCc;KAX@c+#*TcmG1i`C0ytg67h@n7r&8YE(T$CIpb_^IFz{fq4*Qw zxb||IZ{`R=4f{LrJj{SsNdBREADYWRITING †CANDIDATESTAGED *FAILED ‡REJECTED *TRIAL *UPDATED ‡READYstartwritefinishcancelinstallcancelreboot:install successreboot:install failedrejectacceptcleanrejectreboot:rollbackreboot:rollbackcleanTransitions———Applies to a single component———Applies to all components---Transition overreboot. Volatile states*Always:reboottransition as shownOptional:rebootis equivalent tocancelandcleanOptional:rebootis equivalent toclean \ No newline at end of file +READYWRITING †CANDIDATESTAGED *FAILED ‡REJECTED *TRIAL *UPDATED ‡READYstartwritefinishcancelinstallcancelreboot:install successreboot:install failedrejectacceptcleanrejectreboot:rollbackreboot:rollbackcleanTransitions———Applies to a single component———Applies to all components---Transition overreboot. Volatile states*Always:reboottransition as shownOptional:rebootis equivalent tocancelandcleanOptional:rebootis equivalent toclean \ No newline at end of file diff --git a/doc/fwu/figure/states/no-reboot-no-trial-volatile.pdf b/doc/fwu/figure/states/no-reboot-no-trial-volatile.pdf index f9fabcc5e06d2ed0cf0768548cd992c36b98acfe..cfd201814856469c3970e6819f638ca5b9e8439d 100644 GIT binary patch delta 21698 zcmbTcb8u!~*DacKY};1Hwr$(CjU9E|u{usV>Dac_vDGm8 zjK*@M*>L35$9b<)evm>ws&3(z6hICN51h7FHOGUdK+GLlE8=b)I1$9bH4di!$|axI7c16%wh*xCh1~h`LoFQvdkf zK}fzYnhL7N#@1~`$Hsw);7*K?y3=AcUuHE?!Snar{eA3@A%^@=_+}a1tmpf&m;WL^~IW4ja06>TnF0_o+pmk%+QOF39s>r`GM^Md?jvZXS(pcZXGo;X&q_9&F%4Rdo-VE_sgV-`eY9}O=5(sa? zDJxI~o#6El=c6g4MpooUss%<1Nmfgetf{-jk7|1kZ|Y$`IQq1*6zpmb_NMj?{(kHi zd_X&yx{SU)Y6NK2hsg&_69OGwz{~}CDWCXM3Fgc^p9QBu#Q~j46gRj z?y;l;hXJJ%!XF4A>0(Ufh|3YA7z%=yFR|J{ zyQ`5qkwU1aE@7uh#LxOBM_4yADjoS7^@5lfNI$il4p$Iy=#4u#Sm!AcRReXNi zY!5c#${5sTvzB6LI!%f%52otqQ$bPROT~m{pdGBZGn69mm91i?eW@hpBFn~R%xclc zLpMFJdUeJ*qxai_zwzvomkks(DdUU#QHk?Pr2LW_F#Q?D#TbTZhTB{?s{*nn80yr1 zr?drZ4qfwV>T~9VmM6noN+?(TG3={ zn9xc`f>)!}H|u|hYg--nm4cB=^OF67HN>B5xKygqO zSR5~L`$VgnE^8wyep_7(5A^p~d6A$jpD zm700bF*fG+Uv}AbOiUpCP<$i(a1i;9l0||$!I#w%l8ERqv6mTeA%ut|cN#e@DSisU z-akh-#(GC0pjZ@=S$^oR=H?)|@Z5_h`X`777QP>3HLE70v%%s)*)ZsDT|B9h5!N>V zBCe!_(6;s3g3GJT&`LP^&ZVoBdm&JWvSfN!&yzs05$r8 z0+?N53nQ;4`It&J98Oe7wk8+i4wDyUl2|?i`jkI@SSTrFCD&Wa4s4IghUeBf!acM?&HeAC@GU5N@{oVemaqNRd8MPmqFj=TQ1Sa};I%7n3vK9q#` zE(x5nJaNuS#Tak9&8yeUEAP7386CF*9K4ls!{|>6OQ@EFuqn!++bOjDmnVz%)yf=> zHBpfO1G3r0uq`?`j8$9&;wS|K>AMdf>gLAv##S<>|yu+xI zyV0~(c7=&IIFCFwIR`gagT@TO@ueR)U6q2HVY=*jgJ)_XcjA{)L5%%^jrk9o4}uB} z=edhF>##XAsgHAHe~t#${g%#wC85-iG}H;u@h=n!0i=``%7D*WbAo|7NzfeOY|6{K z!<)4L%p1^TsK$Gr=)eNeE4o+|@Kjw~tglakq!}8}*aL)MkF_$Xp z*qBL{T%a&R=PcDNfm>4@_8T^$lb_P|W@61$s+Y_>aL2T>5mZijjGUGToDfxLJusmJ z)~5xr&2#2mFlgi4b(*02y@?7?d^v**vi^oK9*=d+DyjVel6h=vGdYoDtSd>cx6wO7^ihjU@{zgx=ab>j4Bem zgC8FsvJ+ZQF)gr|k4y!DizNj^uW9Y=ucYJiA(MaWbyf|o>$7=Ul@0bg?jyIOKI5s& zvFqvlM*@ljGz5?bBSu!`+QWbQPBb-6W`->pVRMd8uzme*zY?i*q!{#jiFKa$GIXa( zEws-F-_O(WgMi-=sIy_*>iQo4KJ34K&aiGN!Y(qV1Dd)56&NTRq-o@bKQ#6XDKXUD zDq{$_j)R?hOmym|Nk=Dw%(B$i;?u(~Al6+D<#Qv-bO40$t&4hcZFoTqr3vS7#-qBE zh%stH6Ia4oD>K20CqP%iaGDq5c!j{|P~S2i)Pfcp>#z#ij29YA#$*u{b=)W(s<`jS zl9*W-l&eFVwDYp6&iL4?Fq5*2<-0;NSNGy7Q)6B=A@8ChRL)s9Qd9ECoJ9&HLusp4 zmX?xmO9R#<3EZPJ2*2hdA}*PVREk&zGgVkwS!d}n2}7B;zv2fVejLXsd+ zITtYt5ulYIp-QQdFnQ^&A^#{DAQwQp*s;W^+ z1vjtTr8K`?58$1?i%Zp_Ke9@Ne3`LtVv;C=g@#untyGXKwf_AxZ$7ch>|0hAo2X71 zsD=(0r9wX!VGR6<65~s1mx#9Kwy%HfEd%YgrmG`$VpS)-4wv;qqt0*W=w8XXGbH0q z3M(3bW%Ub9jA=-4NSaEHRvmmrqQrZm>Yrag(?hriNctw(e@C z&U)O^#nb%mSH8&^G8XIis%CrQ`M%A|%iH*nR6m)`c-EY24OqO7KeOH(u2Be*!7qxA z-%P9il*)`%HrA0Yr-@V1(YhvwEQ)v&7+Sjo?jQU?>$^ah(th{=4p#4?Q9t8QbN9#! zU%?-#i5-KLxn@MG`$3bb*vKPhq!>`L6J<`5B}{V=5%!r8<@@(0Ofz(1<&)gI%ApLO zL?f3xHBfF(v^PZ!Hi?|wri3>YPp;tK95)xIHZ`GLnY-M)hG)Aec*aZp&0}zg!1Wmb z;?Uv2mT7)Clt^(3BW}{y$BGJ;WjvP@Zkl1m7J87G29-vk99r*0a>T1`Sw@uy|91py z+7>u8LmDM znl?;)Fy932n43|g)>UccM<6cE<(R_)-$(uqTa%caRxyJs`(+J^1Wk#uu+9+|lX^P^ z=pkRds?Z|zk&J;bzXdtpPDnny9V=TdL_Q$;pDeYDSb&uyBDoWJQtaCctS|B^V;=iv zJg>awrg^3|^M_ph)Fm7|`q8w#l;r}>E2Q~JX3~dJ}MM?86TdlYQc*3}< z$d78!wF$zh^1o@0kHpJt7!>LfrhK0pN;bKU9$cpxbH-EMLuVR~1CBnMYx^1Rr?;KO zg1i^2SMM`9ri~a-2Kd}ff1mmR_k{;xZFE;U>spP#N_80ujJyR@bIke^O8)_mm#-63 zaZ0(9c;uZ2%~{-{1Sn`4zn9Wan(}F)2I7)gRemwd<5OA$w3>U=4)w&`31B64QO9Yu z_B5p35&g%c}c zk87u7BaHo>9DcNk4J_FhRUC&{PfHA(*#YuxX8+~g3*W7%VUn4FV^!>lL-3bWLXbdyYfA#P$x)D(5zTpnN9 zfC`Lq5leg?ZC=gWY|?yg9Vh?ty066zZg!Q^R&P!Y>zj7kjtplt(D;x_Vb%Y8NS78$ zX7^~V`c3v~<8^rZr)Jy|)`j;ZE8F|d`)tNbfSaS&dP2~`sC%b&m-oy4?}f}bWM1Lb zEq596MM7Nfl0ZD0sWw>|H-vj@RNn9)2eLf~1a%ca7(;3v*?KcRC2vkTBLuY9l!=v^ zj+Kmxii|aS^z9WENQzzw4Gspk4G_?-|9nE;kZQhT)N=ScQfq{Th2~jR!m7yo`U5tO zvI;bdGM+)s74EfUd|hmT=q#Knb(8nz5WA@mI~;O{ z7;5S}j!G&PsYYVV(j;W2tH@iC_wXC?z@20nQe|=}9Lkig7`9UUX|`@_)tk=sAKZ9x z&8I*9wxrMK8!R{=Or2`AU#xxi4k=!X)BD>xFdw^DaW*k7c*u?HuuF@%-W{5IAWCF54&98Ls`QkB21tZcKpwR;$yQ& ztVJMyU$5>n9CMF=0gWzL)AC7G0vMOS-aWlw{so<^iW)HQ}H#j7gK4hP!|i6{n zB|40S}8H)Wk+`!{j2xp7EMDQ}jq%(Sr7R<>9xV(9;* zJ>uV6e)W>Q8t{Z-RDo%_zuh|y)l<~fIP3R(od2<=aoj4OY@+C9V{W5kDx+-}nZ8mnh7J!ZLCnfI#mbE> z?`uj3=e42INn|W)JEhP)Mm-8^yJZs_X(ugATYZT)Xg3ur08 z*m0$-0l$-26-92Kz?G4(zMY#}`tN?A=Sj1Ij2tXcD9M3zQ}cXHO?X@Bhlo;)KHQ`E?7&+|aT}P*hvLfR=S)EU{?~P~x-Ynz6 z?aB!!){qM0X%9CT(p}Z&W~v`eaWfkbG9l(UDX)(dxcHO*MtZ(no}V1Vgnn|Ek``?( z?qU2;NmIAYQCGPOw6L*n<&uEX^9sIW9P`&KDHy@8`S|*pS<%=&&{^elwkxmo?{jK< zO!zcJVb<`SUVfO8cG1^w0jJx5B0R6ZW_sS{_+!{*22G z${}3owoi$F+#Pi4!1=O^sl-cuEsFMa*H~SW4w8FIat&z}we9&@pq@)*ZwB|zv{C3cksmP8un&EAe0C~9X%@78-cBC};yEA;;3ZyM zwR=6mb)E5U4AX4$`t5EO#6@nL`GRvz?{qzLQs^`|=S3Qu(V3D1n%RXA2wh>{>lygD ziBh`FfBSdVH7MGTcAM3Sn&Z&H%~2%Zi3!Svf^FnPF|^`sGythY0pDOZ*jhH`3b0dIWtX761c~Mgh&O z3-#Ay&B@oP-1tn1hC(DU5n?q+mo|!AVk=xLNM%THPAC43Q5t1uxMqrJlNlCt&`sv) zK5;ATr$!KQ(Ns~t-X}iTK@!5+0{ZulfRPJf!)MU`uzr4kGKOuWkg3JpuVdPe;X`on z1?~C+N6JtrZ3g{SUxaF#(Exw_dyb?c=pN`Tq7P*D5K#fz&Jq4%0sm3=w5S#8dK^Qa zKMg7Y*rUhtAfZGz`nKv3_m45toAW`10QSv4_p>R1Kt@}*Kq#FS0%9mo%zV28HEO{JjtMUl=!{kqqOBOC!1g{a{0qE zo+CR!6|?zjKhFI<&(`aGO_s8GJ?%CFCy&7ZHoB_@j=TuQV?-&f$X{R$(+iXp z1HpAtN|8eOL%(5~c*0BTHk4KD*nVV5Y>+R559x_yw2!T|20DF#ONVd`5;q4k)LuH> zlIdVTfr%f=lt2~mMWK2CFDscLS*~PiGuESx#R@lX&Ktv;=A+8fscyE#ov{d9i<#3p zrH(=bc!bfY7~QnI(Jqc4SFPD+f8gqiPtVccGHJr%x8m?02QIeeW+Jrf|oy53Yo|JU|LhPG!c)6nsZMm|0~zJ%8#Y5gyq62pJ`EEv==^BCoFdbYiT3 z2y&4kw`)@lCz1(o?Fs{BOuvkaAG&BBnjU_{pr9pP5bb)oF0sK)fO$Yb3(E1@plj`{ z-Ki3vFuilvik#li+L6@U4h=yL%eM~#9P16Yh9ah6v}J9aHzsj8q1m7_%g-EGkEc6> z(t^m+xQl>n>Qh@i^@)$$H0bnE!$=Hb!E%YzxxyIsiQC_LToWL>Ht9%K*AD-M+z9^e z2?uXzm1UtsVkU(SNg?w~xe=qGG_<6=cCkrF2lbA-x;Z_wi5b(gI5Q?%KK`!(fHR1N z#p{@^+~*CE***t>PN9&1?Sd3Y(UE!br9HUKs2q~8ZDPVq!L+`={A8!ytEP0~z&&JD zqH50imWNjyuipQf% zckSa@<(6z)U@)6!nviJBj~0ev0G+%r2;zU+dxJ?`5y=L=j=ss)MlocUT<#x+_9uIuGVC>w7kGcvEs~RGKxrk z5H*lMS2v;CFQV;Z?a0nd-)p~Ck=r$G44_6)JA@X|uqsQYm+b2)OzwZ72KJ&yM_^zd z4}AWRw@Bqzrref(vq3U+a0D9{CpV7?hP4TZYtQ5q_Q#aUkXfW+VId~4ae^K>y1O<2 z4T-SeMF#VY&TB|cV)P2D=xE2wl3LvTv%aIp8$qWN?!=mUNl6v2WHFO!#8rYsu($B{ zn-%&h@fx~C2h^C5_K$e7!(n7IGvZ7)BC|Q!&GN2x!IhFv3#In3GP` zjD}0VA+@a@NKcoQjyJS`^``hclUS^$wk_cl_*f$L14cnb+PQw){3J-NZeQ*?d;osN zr8_IdWy2lsn?P}+ERa!@OveRj^ob3KOXwWSZVjV>2A7rvHO)H=U^NB?Zq+<9YZKV-hiEHCJLPtR!8nE{C#COCK z70Ly{mO~d<`#@?51zF%9Pz#z#^9DZMs7dB>G#`&yJs}e+`APE1tfDsEvaWH1>(T=Y z^6rrsyW3Y%NtTQu9BjB(iLO)zP4bDW~sP;cd z|FFh;Wr-G=?GdauRpK$cY>#gx@#^z)BY6K$+gIlW23O<$1Z&o%l*lB*q5 z2+L9*7eXM6Rj~T-lD0vn?fvq4;>$hA(5aUBxO1Pp$-@ zTu}M98b!A1m|bz~(;b;;IdQgSs8O03l)vuD&2^wLLgz-HD?=bI)w(Sz*>wRJ8Duy4 zG81_M0e{5om_s-&J$szB7%f4yGa&~RkcLk4Y4{>nHeIwZ`jkN^km76Tnxxani{+|3&fx8ZO1BOV>w!8whn_f?pOTp4MVivjn#m&rrAR zxA>~Pe0{HCC`IW?dMZOSFUgGM^JOLrGz+?AKq=ike;oq-5k9QsPbmn@*`MUMAR@p# zQE+qOCX)R-@0=&c8TDoT+UMb6lb@ikWX^X2!+pzPjs5zcIJ6$NRk;MCXXfFqHd>0Y zx$B94EyL>!Eure)P7f*&PK6dv?10qV_2iVEjU0?Y2f2rO|I&aa&O7%es);F&;>VRL zGr_eVujp$Df5zI--YV#vgY6Zs>+yiZ*jjs-fF}2%T>IMRl>?0G`bms{#ahyMeIPSe zzxmG;#~`CA-Y(iQKX8VZ8`SVJ6HkqkQ0cTzVDa#XCTcKmTo$t|VjT3F$V2xrWD9h63*IUs z$1Gb{B_owYBEE^f zGtUb)=Pn=R_DlNEEbHssq*5<1&Tya_hPZ(|Unq}crBXzf=>%&7>jKG@GN~_(pP=7_0?P2u5@-Y;WCcAQFo#>;2&Hn&H z@iA~sf}tP+<6vj4r=y_y0w*mgqOPJzr{ZYhn50XE2mY_Yt1<~HCo3m0JqsrjF*7q8 z7cnyvJ4X_u3JE0(CoC~BF{7BdtEstz+b4pJ?OzE|V<#zdYfCG)e?yf8X_D}$<^Bh~ z6Lm4b#=^kN#mP?0^dA=oI|~CV8|%Na9PCUCT%26oOdP}<>>La%?8NLGTnw!2-2Y6o ze*!uGjpX2BW?*J#VP#|cBx2!YX5i*z`CRZXR(4h{26j$17H00xkdv8}f%V^nOvD@j z>nHuc$vz|I&jQR$+^k%mICgFh1`bYc4lXWY4mK`^|7wSei<5zciIa(y`4hsy#Kge< z&+32h|9P>qu`+P8v9mI>{6oaT`tQ~39G}@wuFn?PKg+WG(>d_3QXI?-|Fr%u9+uCw z%p7b?9RIBS+{%B4T$~&X-2agNd*du@98BDwRGdr<|IYn4%YWRW&-$OcVrFJ#;bJCc zW#MG_{PX@P#Lmvlz{0^z_Q^;5nfbgW?8Ka(IktZ{$VAM>`Pm2CKbuI}rp7`02hYjQ z$@RIV|5Y)Gkk$lXVdvudALiqrx~&u15=NJ&=UvTrdKi8?**XtRTiH}Qn$*Si^6>9O z%gcdexKtd~!4yo(@Eo%-CejKSB$^MJbW?1nt54nT*rP1ryyU z<$ejWWKSj&z0C~E37zEVm**+S0vw(Xr@%S);l|D5WUKF|6Zv;WHbTtm!pUY&_qnec zdG?)<#ALW3>2Uxj6!ut{5-~XM5;yjXAh_TD*5wpsTNgDn zs34f%&Ge10YS=~82goZ{PkXp38rcyIKG=J84=WktDIU(eLT9j2K7tJ!!R@2!CSjxvQaWpG zp)vQ@S$Y%H1e+xdovhfJVHwa1TdpF7eV>BDyD@GKL$0C+^=<6>VVMRzWSG~s z$)~fj$Rla1AXC5Vy8>0n;eLR8{cFG5eg8XaBWSKcb$x19VH6u~c2P$~I}mx45r$gu zgr5@}Og#n{b;g(M<|h!a=y&8|yke(*&X?z1j!Vh?-rktHXl1uu{K6oUz-3^eUsb8n z5ob;(i1$`lR3r+$Ab$_r{?_F|rTujiy`2CN>g-yPiV=^D@WR1#t0dy1_NLK@7#RlK zFrqzEMmC!voE7D`v=X7C4d}H0V~E!DW5T$&-MUZPU{T}Dk>0g_lf^k5>e6^53|81c z!-&|bI*s*;^2)GPiV%t0gKIA8PBU#uM!ieaUPR`rr+^{_WE1a(ms9j3*K16YarB~J z!!PjC#!@if3nk_T4dKzRDH-0ZlE)o;$6#xdUAsr2Ry>c_s9e$&41*X-#DbbNS;t7eP`p=dMDzoZFu`(U?s|~1 zC<2`sH@f`H!?1QnXb`i$%`Jm3JUb{XOsKWHaM_5OXshSiH|9AOLe{rfSzC zSJ!;dH8|Z^d`^<0=BgEcI6W%PCYW+_cMAxZ6?|Spz(d`$ybJiyYB9ReYFsMbdZ66% zQ_>B=h7c_BC32J-O(McD3KG;GigqD7v`~>h3G?UhZTXW_0w_$%CP+Nlo>Bq)>kCb} z`PR0hSyfU$>5w6|`|@Tdw+>++uY}*(MEneTNyJM&Y@TgGjywLO#QgA7x8L36#mN|j z&Yw0@oUxH+Te_(bRBB#0^-}HOi+)+ZV4!z2&(cJC^>PIvk zU;L<+SDK|{3*gMDzpZmO&!TaNI?8Rb1tnHx4j#Q8$sH@r9@6X?&bYV~?nGgkqTw$u zD(^iKDM{VDbp2sd^a^OOH*;#fp$#|1x~8z{YjbblNjqmDF*XkEM30&-;Vt!Abp%v+ z=GQut8T18}m35`9kuqgoxRv@O)<# zM#;I5$A*pUUNoqICB62FKg}U6*H9b0|rBIv^qbu6#o?`20n#u`f ztd;NYUT6zsMB^i5UX-E?liU5*e_O--_ejSDX{kyL(jCJBf}c)*vbVZ-UW4+{5si$P zKE{ar0JQ6vEVnM|T~LeFtI1Uqn%N^rQ7=76$fRVZqpctWqgB1WJIP^_0Kai zAF!MlXe&=rBoD1~!94GBcjDa6NIp{`!3&&kyLu5a_IzrV=B>8xjvrGgAJw3Z$~GXD zm4rFpq{?NMh#UKk^N8U@-ezB+uimhKKEhn10%l&p5`Sq?8*|=n{7a{%FFDl;H3vCA zOkim*F20}U657-mTJzre#s`1B^2!cSyr%aPx z-q9gRj|vy|A8F&}Nc>Ourc8{?#{FLchm(u#Q?#%pF{qGGfBycz1r8_E|0ZzQIFpnG z-T(J0&eSxCLcf83gaQ*c=fCyH|6lNbl>fKr`2XhmM=tya$$t-V|1vJHAhR%`Fm?NIbn)_ha`Dn8DS}P1CnOso zs$%2l^1j4rAP^G2uL+%yFuwz8{r2$~M`l(IQKdU~!|DrIc^43p@b-8YTUx})P4O?> zLgjTrnl7GZ$S53CEHsg-Wq|5AVG-l!9%Oxaj036OXng3|R{szo6e+QT=&`jpRFU2W zP~c)1ZJ}Dc9Ir3=9%5g3dip_RZ{SpKBzK5DP`AL0riMqNC{cD6wb*JjgcOp)VU=M- zGNU@=5uRMSuyjannNytw9D1_e4hpEG0tmmhwo1)s0-F+$EByr!A%C)M*Vtm(mbxI1LG|s_V#YQrS zdz^cm*nM~{zrX8ALr@6`9zAG2yTasnpC31lK|Q;?#OVikz4T6+yzFF#e@lb{dP)Jn%%p_H{!u!i+El#2G z@DVDGe~I-i1m@gbg~-u5kFGtaUVPo=VZg z$oU(MPoNVbz1K(hho=ECwXB(b`joyd#f>O4hJfhS6xH9GXroZgRIm2iQ(iEpJ%+T8$%xq!?ZG=FO7)VS!}F$kj^zigQG&2eL<_5?uBOq@xUas* zjU_XN59c9Ec%#klt}ARSFB$-Px2|Tqs2{v7Flj@N0uIzDmFT6&f|qYM9iaAq$7_YW z-bLxff@?foIrb5a5Ol5uEH6C6vXpt#WH(%PLd4TT!YyCy7Jo~rKHi!cTW&Xn6t_!E z4Oc7zpaUm!(ch29@!t{|!S>r-Jk+f1kLn5p_D7gEM;8KLjGT2yG zVfU@3=VoN`b{3-=0G&{sFPdl#rRC^rg6@z_63;V^2G&}UM}djA`4?Zzu57KdEqzf% zecqPK{@U*T#@+3sTCMDLlSWM{!r||ch#e2@KSN^-UjM2YUA!u*y_ZbfRW1#OyMrI!cPCA@+*F;LIBxQkxr?+&qTY-lJ$gm+9k3A$XkmvBe>5A z%NwI1w%aRYcjyNs02h!pzUltxA1L^^ngCReeVKrqaOg|t|E@JM}I|XV8{Bm&4PX)1K2*@EwIlTv>}{JDGN z-1F(8zE%fPbc^H~2_6Bkr(QVzNS(d8-|$89yRaC$oVG{jigUbP_e^D}2>IVfYJW;1 z66x@H8GZD1J++2EOrCpNJyiYpTRJ)~#!~C*H@tilfx6j6&w)=618?Vl8T8(@kwd?3 zE7sg^@NG^(GVKrhzLw^JHW2qw@Y)4N{#cptZTj)IxgQF5{z=PWm%G)$KX4%prA_WFuFO zf~I2y?nhMyx%Z95ek_Wy^n%E!+83@qSktgSU}jnhGD%yS=?ssww4$D7p+GDSVPtug zw6_XmZkUJ->aVi|l_*JdmGNOFLOIcsvaii23EHvH6E21}xPG%++kA*uuf26)Ladlzvc2;I_X*%g^t$p)-*| zoXS_n*SD(7YciX_y((8DFo5q5b6U~9jp2N&6{uPk(l)YaiL|Zz96tn>x9A%v*x=k! zRit%dE77+H=vjbpp@KS%9JT%M_c{&Vgt2#cXN@s7x7=T$^dXTiaD;02%?7A z_mtJO7nstIP9QCiFP19a4W5I21&FDNjZjJjXt)Q5JVIK>dDSwgzWQPqkq8{fI^oZU z!#qosB7a{+9N~y&G^AH5(!e;LN2IRp5NxCe#S7X?ZKG(KmyR$y4mE(KAs#Vmc%deX zv1~S6!;`u|_G@N7%>m%B$2ll5zT!pMCVY+VaX31Kvnnivh;Y01g1$$~p+|Sm8C-%p zM-W!?KC+S~>vwkbUVb#-nNQMZGQ~F1$}hsp=d`V!t65UAF>j7u_sF%l=@qf%TQ-V^ z;K^PS2JvTF#qMWz{SG5Uq$W-IO`hENONV3B#ON{zg$~oURXmVvePec;D{cg(Fw#H+ ztL|tTbp%bR!w#p5j_N- zy`N;Ek>Sm`KjT3YByF0!P_c!ordIN&RM?{n`S=a+frbOE!JLUFJf`;?@!2IFkzcfeq2zeRw_dh=(Rn}=ejX^>tKkI`v&Y*S3RYp z1vQh|<&563lEFCzBvFl~X^*C+=ms`~VR}LXW0Kt^M2K-}j-2Qq^JkKbB$34=4jI+7 zNKDG}coe*Vn^x=^|9$F(dqCBKRa3Q|6}M6%U~Q>beDO(+4f)8~=E8!lhd&&}W0=w{)u;L9mg0$VZ z!PaxKbjx0`cfwNuX(tdMo0PBPUX7R(1%>cgZ=eV)%H&{8%CbmpJ1>3yIoBNzxkO%i*##Sw&$- z-q@3`b-I0LCF_r`2@{NP%V1uH9qV&tJ!xVR9}RlUG8jSfgsU~Q(&v7}r7EC)I#$K$ zzVblExKmBE?i(dmb}x;TLP(s>1*r{yo+Z@Xi%(Ao^;R_&prQ}&N1$D>n=fNN&G1x{ z_DmWwv`^-wca+F3jT=$`t?LiTuT@n-Ygbw(*PYum_??Pk2fmEH_z=t|Rr|nD8`03x zlT>e??J^PP&4v3-t*!E**1R)Zi1Dmcdl0~3yGgOJ9@$nVyWFyH9VK4=Zr+c);drbu zJdg4y1a1PM?zk$t{m12-G-$}AYDoOm5?<`fVeVIfh5$>0m%|ZLQy};8iRfmK{f*-wjN`9U#)_+48vKdpb~W-G@71D@h1BSXjFky~Wt7Q4XqAcb(2N)XSJ~FW zSQ33hPZa4&-}dNq)6&xXMCRP2jRicgRihEvFkpCc9`987=x3FFNM$)p50>)iXH_f= zs-2lT7kEg>X`Gl8_(=cJ{u#Z?emF>Q;^tf-gCz;p##MJurmS5aebvalbN}M*yoReE zqh5s>PPY`PyxGFFH#aD}Y0kW}Gzj{U*y7&EAV3W@0JS$}(p?elf6Y;gwFTs;x3!4R z4mwy1!~42B*Lw<|qPo}C?{u`3ieQP-x!3;G!{V$EBzl&!Gu)(ZV&9Ld?1iYM_%u+U zG$VU|-I$2_OI4KXBioj}4D_tVYiSQf2W;ZbEN#)?>G~T6QR|-5;pwXXiZ-wgp>9mZ zjEgKf8HhsF*VC?u-X9D;vIeN>i0JLVG7xpf-OE^2m)MzJJxIcyz?wX{pKAr}Xt?0& zGs}_@xzcoyUh{e<4(Dz;Ug~XlIgGCyMZkPt#I6#p)f>#$NXsX1N@nYB$u?8~Re>cK4AS^+jg8Aq>s&c`B>`AP}FQ=pOlg z1cjjIY0>^LE&W7)nwIl{_V+aDdYZ!C&$A2zdSj1&i@Nfjy5SzMGpNx=-nLYrQM9}tWA@) z1c{RfRmXr&%ZQ7W<==)EJJVo;Vm^m3({~3K+ORQ`R9RIj(+{F6-9I_EJCb6pN0Gw*5@o~gvoeh!XQ zbKTS{3co;WyT$0%5YM3a8g#o^(>{x36ReUNbOokH-S*5v+E69k#!?w#k`!1P*czVA zlk)^~My02O+`quzrMIqK|ILT43*Sv&dXgCA-$Kz5;(jK8-#rn&CL^&~00fD}S7spH z@x9L%l_V3RCH0r3<^9Kq+awei$Yd*Ev03{U3d!J|GY_;I=PV~m(c(<`8HKhLzU6s6 zu%>$K**9<#%xmKOEgZ`R7*%;x4Sah+B;RSWJcWR++yOut)`<+$&4B|itS!vIr^ZT%^4pvXo!&*J9Er|6^nKxBF z2ieaBnKv1=ZP{*ffhU`GhT|l~9xH4?xVY~9XOz!_E@|p9yZRrnUtKG_ zV@LByHGW^#7*s3eOlZ-*+RJ5EBO4k#V;^p{%S|5aXq0-hqv;7Ubr&rU-vj>N;dD|3 zEaeN$8%P`#ul1V09ouLM?#tzkeG9hIAED7mRR@wGLbx#+?^|~gW4JSEhQILm3!nse z%P+XMddthRH>$P%!+NsX68 zyZJ|JZeRbI%k4teSE19jX1et@PN6u>yUMzytB{Y}AqwIWQ?mc^wP!r~YI>AY;T7vW zyBl!qYW50{hFw_(_fH}e=Y;_h?VuOUeF(JyNjAJk3z^Im7OlD5qp zkdnAEEBV#HI7FHqoTK2fD$YyqpNW8j1>iiQ-NuOMJDvo>aq(%jkRu4jw^N4XGhNGE zy5EbhRL?G@n;bz=QM4TK9vQr6L%}S+pkt^r7;5NNU_d}>2A%={<`u?9g+E~%CYl37_dV$_&@B(XGLhrVPvk5^n&9#9)|td%%@ zJ)a@n^`dXQ{DV*K_4VPRPb4Ie z@V_hf{B>g;9-e3h8-&e?@LUH@29~|M8*EyU3dVE}MOdHo+-xPqE7D|E&Gvt)GpKM) z{2(i2`IL<0HIKzsz!mpmC*;O`xAVCCz6iuwy+*MMy?6B3O@D}0G({X~H>#DPwdM2# zY?ZGR;=dHv0sn{{l}R9S!`4GJ8MUd|oJ zj=Z*yd=fJEu-zHvPypS2z9>vz8Y4}ssxDAc1o7Cj%>w@$63qjrt-_%rf}juoj2UIWAObQnJY9CCzR5IF!$PaMACik@pbHcw*iW zL3C2nG@}3N0JLK)9%U^p?ghQb#FHy*;Of6dK>(&osVR6=18}LZ5GX7{(uc=G82EQDiuwdu4srgxwC`-vQk4pFL@bVvwsTN?&b* zVjT@k$nA)nB}a6|1Y14xL)#Q5f(C~z!zb*5E}6*2e7VI;fUnKYiAUwFA4JXfWo{-E-@!OrUey)HE^hc>u}(ClY~ zN@WI2j4U=n??ZGOkS40-Cw9@AM*0F*GiD=DM_4oC!&UL?XQV8|XhjxJqIPJ3H`x7! zfkp`q@?C%x?A^0|o2&`ljD)rFNf3Gi`f_FWh{YxSX0CwoDmhv5w;>iQi4dY@q|x^b zQ3j+1D>7d#D$FEG1I=wR2E5c$N4R5C8jt~70RXR4G1R417eU3f6ST1$fzHqOuw8q7 z$@Upk3PNi0FRk(NR{i>Zkgzgo&sD8vtb$j&ANv9Z%<4_tPm!rQE8HcEVYHBL?`*Oo zL@4CJ3o4q}Fb+f~FI{`TMJe+%H)!S`uB`QB;AAbJPlpA|7cXBDklfsFBp7VS0f(h3 z#1A_>AkgS~BJg_b%>Mz09#h|raAftMDmfYg4X;dB*1?s~-GIKa+_OfosY=>IYxsLq z_p^zp8!Yp%K{#0Lk<%c>Fr=O;3QNHZ^!f(AgP_DArM07xI<>HHZNP9%IYw_ zYKn=XU#7q5mkZ+Ic$sG4<}^SN)?Zj-%al|j5n7aEPRr4wT>65{wd7oytdLS;J(v&s zjk?S<>DHsFSL0f#C;g^Lr%6jWv>XoJ$J&;|pl3s2=zc-~D>!8FM|^aBE=1rxrV=qQ z<@}5VUQP8a1cB~Dln*QlRLhKt9{)yf2BjPg7yhP*P>wif;oI(ZDJKwz*^KFd;cvYA zxEpwMg$m zywUE!^H|<&$-x#ED+pa0C`XcKBqtEu>$edtj1XI@owNyO@$y#TRD}B(MK5nVF58rc5!Csjl}xwlkfV^R!NG&4v#&(Q#akl@SO! z&(joSF3aOW{TMf!kDM94QEymHy#>l1IZOZ3#l^|r7~Y!R%{>pZT7AzUVMsQn>dCcd zaM6+)glzf*G^Akj&GdO76Drxzo$V0I&bsr2b-jTu)8PQEkdipi3%#Ba)4OletG}Cf zthG|PS*cC^Fa4q>%1NlFTC)Z+#-dS7$1e17vihD*d1RS3jH4!!$mh@ZaB>rM8_B1~ zsn$u4<|Syta9ztkZq0Y>r8uf2tl$>G_Sj)>Wn!bv1=Sk0!lOEB&qOYA-%QY3z+{%WO>x$*~LYI5( z0Yd1@-9E?9%QupSzTirbA*GYX>`%26scM$YZ8|exiU7t4mjjjG z88y&~;wT{49Wj}5#2Mgs@F{eK9J`aVkN~+PeQwb#!;H0Z5(bw*BKkcQ95qI4s;cqH z`0<<%Gt~`FNjWi+5N@LR^^t}kSgnJLF16Y z1&?!rdfsKixl|xXrF4Pb&6lVWEWRzooyG5!MnqLHY2>5JZPUo2u~+m-5o^1kQ1+V! zz{E{qk9tA zLXO?_E!RC>W|l)>GF{zX4LpnfHJ5@}$$*v2UxXz4OQY=(*wO3#cu$fseuH}KzBre9 zk9JCIN<-=~hmrzw?D=+ElbV#uOfhI*nX_bQL_US}pgfn>d_#oid8bFJ^W6&jJDLeS zm@`eh0dviHtA3q-i2u3!Ik;uhyj|mLQjlw;p#kIrnIg~H9mNV{$e6}d6rwf=bJO^P zz}{L45T|7$vWg-{t#QIId{?G*7YOBXj7~qOZik7LyvJ{66QW zmzqDLU;;2|vFA5HE*X_%`sfA8wZRy47xv{Xjj5J)5H`_dD(h;(=TL4^`?C{5cSEhy zGDpQ)V2Y&qcfp4lc^H z)`wk$N}A|t{(F>OY}&kS>gG>fxc5ZWX-AJS3OyPml#2osNqrPIuO-~a_PX5X!{VVt zOK*LLUCtd9G$JrQ=lYsf$jwKp^1Uv>-u(^1!oml*$`$T!N#cG(Fk#JxzOO9Z>GCRf z={m|h`T*yX@d%q-n9nA<^496Q~R}Sd|F32%~JIh z*3F#&&DXrtDBbeX)Lfz+W7|yFOZLE=DtSoSWN&QQmvq%#SlJ|3`z6=lt@p_&z7n z=H9hscW zr}Vv$;O#u&df05NJ@O}AmGv+BQRq^6j#%ggw4^+gUG8V*j25d8;rr~cLG&XBS7Mhf zirsr~5)nZm{*IIfc?V->m=t6<)7+Nr6t7|-3t=v+A&~gQA{s-#sEowwm&o>mJ2A6o z65pgmpoQw7foy%KTZKx3VC0}|tV+U%2IO@Jf)4lXCd}PEg3fVXaVtv?T5Aq^7yooH zRPoi~RBg%+w8}bOcgp8_`># z2dsF`()w1v{@o4UT%8PPfm0vM{TAYUN5E8NsO%L)(d?9?qB!#wQfx&)T|FxuAucwQ zuLQ!#g{3R^Rv=xL6(&0sK_*zq&Zu!~L18NX2<=G>cb{ezp;M0C_3dY~RY;9Xy4{By z4m_>0La*MiG&~2%bqtD;UlAPaTn)sA zX3D$1b)B_df#mz-6S?n-tBy1WPMl5^p-%M7en`3D6T5_r+r?+4y~^-~K0c8}hXekE z(YZ_st4q5$quVVK(^$p&62Q=t9H9-zQ=wBd{?>`Mk-+&+OmAq`9KHStiZIGv5&d|R z2_vcKeFmTF;}!Yju*Dx?Bln0@V{K%(b~e4fJUl3d3tYX5A7d9Kx#p?P_d;uYaMo8K z`nYHES~Y!q??Uq1iPjknWWw?4!Y(5r)E;Tgm_|si$aLq)AH*mc2uCOTLefwsbsWQ} zVBxO|oX&W;$>=@RF7fcOE=zmO1gzx{oSo|6LksH%q}M!Yu^;W1yq_DnXPz{+ot@QGOIT>^Im# zA+SGII+**f#V#m-lD+s*!unr<8%4&1P*Cfyb^V8o{d*}Wgi^>+bnCawj@tj@jQ=ge zFZ6#hx*#7vN=5&p$@8OB_W#=JC_t7XZErmbTIhc zXM0O@ECFGZzm_8I%9>*2q)W_)^3L`D8|6C1*i311`V*aXvO+~scM(KI{ZJJJh5i@g zeulC8d)^em@2k66IsT?{sN(Cc*65hRsOO^&fKr@1d|}#7;k;ysl{@lnn@aFFi(m`+ zt{i77A9l(9!mM0WH(t*(;K0pcy8X*I@ukE7=-8T0Qk17VkWWj4IoH~ZOxu{LebFCr z_L#k#YN0dUB| zHB}AKLNIkY%@rz;X+^7wFhc*mCHxx;8;`)qgECFHBoO$S6;^k&S{455aU7nAY&}U^ zMGLvu-Npv+p2|+SJGt&0+3IO-naqU@pO8ze2gqfxWhamA{CGo>vmc(*HhM)q25`*1 z2(HjssnRR!;g)6;J4&hd=hZQ;r2PDjQsrq$BgHS`dzu3T>5G=%Tv`(ONg8I z@757M{a5RRc~eL|xzL1CWIQclV)!zaR5(Z55@~X>Lrfb(E}qc})Bx_GkAX}%8{T7| zaJ1@^M)NCKuQ4T~WegalkqP%wBd9TBm(A@=>wa1C@=>K{B~eJ;akDMiC>+t5*G|l zP40X~HW6Nd!7TUwBgNS+6^vGCBipB ZG1HTiAjQ&)9$%PGkPi<8QqWYy`ww(0TEhSU delta 23068 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 †CANDIDATE †FAILED ‡UPDATED ‡READYstartwritefinishcancelinstall:install successcancelcleancleanTransitions———Applies to a single component———Applies to all components Volatile statesAlways:rebootis equivalent tocancelandcleanAlways:rebootis equivalent toclean \ No newline at end of file +READYWRITING †CANDIDATE †FAILED ‡UPDATED ‡READYstartwritefinishcancelinstall:install successcancelcleancleanTransitions———Applies to a single component———Applies to all components Volatile statesAlways:rebootis equivalent tocancelandcleanAlways:rebootis equivalent toclean \ No newline at end of file diff --git a/doc/fwu/figure/states/no-reboot-no-trial.pdf b/doc/fwu/figure/states/no-reboot-no-trial.pdf index 0b27fe23ef1f467bff892577b21c0ea28a106dd9..e5073fbb646737096dc3ff5559f7545135257fab 100644 GIT binary patch delta 21699 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

hUS3||10o|42|#JpeN9_n-~mq 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 z{oFn#1!READYWRITING †CANDIDATEFAILED ‡UPDATED ‡READYstartwritefinishcancelinstall:install successcancelcleancleanTransitions———Applies to a single component———Applies to all components Volatile statesOptional:rebootis equivalent tocancelandcleanOptional:rebootis equivalent toclean \ No newline at end of file +READYWRITING †CANDIDATEFAILED ‡UPDATED ‡READYstartwritefinishcancelinstall:install successcancelcleancleanTransitions———Applies to a single component———Applies to all components Volatile statesOptional:rebootis equivalent tocancelandcleanOptional:rebootis equivalent toclean \ No newline at end of file diff --git a/doc/fwu/figure/states/no-reboot-volatile.pdf b/doc/fwu/figure/states/no-reboot-volatile.pdf index 682524a0e5af4f6d5b0b564ded8c7c781f6f25c9..3fa63cc02c7d83aadb4c4f46b4e4ffa97d760f88 100644 GIT binary patch delta 22590 zcmbTdWl&w+wk?V~1a~L6!(!p?PH@-Y?w*A^1PSi$?(P=cEx1eY;PS|~_pP(fd3CC8 z-I{;8jn?}Z^G~bM=6tvSf7%0&l>_Z-Y1tDFqkYRZnE750!*x>C6-^38L>q#%7KTM7 zEc9$tuPsf_ARR6%Inq6);X850y2s{s6YEFHx*+N5N@SqMkr?~Xs`OwI4r4!fQuO?b zwpZ}}Vlc80^TM5onLPbqtnRtdW2sZKjE8xc->b0&_x1AfnV<=q{Y`=p>p_0QtXM6?`Sr*x3wZP)u#i8Qcm zwWf*J@+s4F(eAFG+|)zO>8@YxT;S>OaD@rawUV1%j1}-JPDD zN=4mXue;6CwJB<@ckaq>ZzsDOA#djKcK*FLNJ2(EwIacoT%6=B!Z2lk`4iY`(Lzy% zdVo}rFa-w{FHoA8^g(t*@0bhs!Olp6j(toL%Zf6BCiQ@elvAwu1fuTabgT-P+ihFJ zCM7v}!dKPI_Q{`@%s`PubjFKTn6SS)L>NkN4fp5NpZoW}GaGd4(ySOTWt>;*zrr-B zU@H*+qNxw)%AC#rqpAw|2+Sc*e6;BnaaXf0Z_3khARMu(CXD=Y624%ur4&Sm*wZ^e z7DFI6GM8wOA4xPO#Hn4!WT|W(@<-uWMykfGB-ztYRAgpV;uX}w`rZQ9*6s89TAqBU zJ(F!eID*3&;PVx+uRZEZ_zoZs2FxoD6HIVoOF4>OBR9yjN8xIq(w%QbS6MB-{Q~1;*SvS?$5uBUx|10mLaAFptfxM3 zFzwoNfLlUna-gXw_tk&lvx*Dyk4$TT17OO`E}DT%@AxxHzZJm~R~0*L_75)fYyH2nudBDK+Cfb-^?SMibUT z(5{fW*KUgZtbz@djfffnolgOIH7?Kh?aOt}=hM6GKdEbqG{cXj-bG zlk#H31*-{hqR$E{btS|L=U&SZtKS+yjPoH>4*tW~Lb}@L4q_?VZU40}SP$YFlKA)5 zuoWcG6C7wUP~0)>94zCDQd;lBIMu?Cp{y|L1WN;!Qo-&|Jkyl@$4`=k2fjq=;h1`u zlN5N;F*y}PR{HJUnj30OU64_~6diBT-8hH&8)#yw^OOTd=r`14oswQRS7!hK51F3|Egh8N1gfj3_>+uo>z%^@E!&Qivp7lgy>r--4i^z zvgg?Q3gdo%1G9pJdz<2nF+Xn2tL>DriU=FO+n+oPO(nMd(%Ih4t?Oq3e5K@41%+uP zaH*gq$m%jFG;{sszS1BQ!jPX7zM&pn0m^s>{d;!0qtZ}KB41_lt!;5qxt}x=WN;uU z!3RB{I^&kz8uQjnI4-0MtX?m}ved`c7QA%+05nY~3sS~tlsdn+vWNG6RjHqcdiAso z+C37bHB)l!oif@`ZPWs6E8#Hpu_c)7iE@L2N=SRq!DG0@&^QSRq0)nL%DsxoYm>6k zS?^XRlmN6I+sTAzNd^^;d%Tf^rm2{bgWE}+4uzk z(JVbS*I)$m6$f#?E%po<-LfHh?S%NH5Ma|6E^d&L+coNSbk&B zWp(+2SF<;M@b*2c`L^z#(OA9)B${*LFYFrV?kI#*seFRuTfe=24TI;RYdR&X$%v}J z*btS_ix59JjPJ*}6V!=pzK(lV za62&arOBpyTkhP_JcT7l-9WN%r!;HV0?z{EecbFgU&emw`C;1V$6=_1kR!YpX)UxD za#Lp#gf(djKa03{;y5&1NY`&Oqn)LqQU&@&TnA*yl27NI#nq`U-K$l}&F0S_N&>D+ zYqXyWKCqBlU&><_AusldxOgxRGfG8IUZ^r=EA^FyB{s_i}m z-;ZlnCW#%Txses3nsTolsU9~2ImvBFkU$DVeOI$2tzM3y53pQzAK6F4VGp}1sgeKiD3yxnnt_2ZDs}qkn^?0IWD7u- z^fQbrl#;oPiAA9z{fU1fj6{xj1?D?1DgV!T|F{{C5gAqZCgUHB_Gb}$px+Utk%Sk| zQdmO=th$kdaO{|aYom~pBByWPa&@~q)@_M_?#=D5RM!B>0k*hi9^%w%^QfiGC(T$$ zl6~ouO3Xl%sGni!Z=Np7F5l=7)85DWL-Ck9=R-5?L666CZuJ|9=zF!pk*9C|o4n_f zUPqc)y)~P*cANG~hZVZ(pmm?NcD+r342YSzC-I_Qh~huaw}?>TC9_$T282auZ#3NR zI#0H0yPjU<5P$YncOW zaq`W)jlvS+@!%_sP%MBT^h4N&QFlPsIdii?65{5&^}Q>WF}hE4Cnce;Q2Z6 z2|{ak-+lTzcU#B#QZ{J)1*4d;`OL`Nc7;=|9r!|n+My8s8e=$ar~=fqQNl{?e>3uY zzEjG+ls)c!@Us_vMFjgX9|9Jr)GA@8Vk!J8INmXviF^Q(KK?C`;AW_Qyn9moLtvY? z_|~wqT>JjLx=Mf%UhLb+8!|`WYEnWgJP8CFpnetpH#mp|z{P?fAb{ZP;$&)Mi{O#5 z&+X}hG2F^tU#`<-|Fxc;IX*o2V(kD`;H!y=Pv9P;tN_{aGF%N&j3Fr$`6Lts*STbeS9ekC^QwWY&9QHNJ5X}=<@!CrU7daNeu8t8pPj7_ zj*K5)90|0;`^+DB0X2DqhVYChQqbybfnjjVeCifNKIi{)lYM#ZJ?NxLE-25C(8=9? zlZgKl=x*lJ?-_eMwYz9-&h(|Z1tQlI18htW6701whotWT19wViuG@0&%w41%wN9+> zL3LB8xVWwLoF6xmrRw*66cSrEQfELcR!A7htsCgm#xR}m;+MS^Yin`7p$U(GQLiZPfUz9X+xt9Mcp{eYrQ-Vzp?1L8{1ZOhixTV`^4-7 zLcVP(upz(AX*gEPoOxX-E$tHQ<_{&=mRohypRG#n;bsv7l@V*=8Da=-ui_Hn^S zA)Ur1zc?FEH4#1NgCOby3trq#T-8<^v!$>V);uedQVdxiMw(v9DmY;$#HqYdd$~Yl zT%W%(T~SS&8YVJ4C1-839!e*Tk19|Ga1Up2CyR-T!(bq-#xcC7LltLvIsfjH-#oif z+=}QY;agaJ`rZ9JB^UGi?J~;xIntY`cr80sp!4MRw$*KA3NG*u>NDYO1I>`#SB{h~ z?AkkOV~Ar}138$Do3I{;8&5F?g2zjsz*dI6%+lWDd$=jWTmh}1*eB7g{D2O4;V-J+ zl_(Z5?8Q7-$`ka+xhWG?X(M|fFwn>h3FCr~b$XCezfZuPylC8azZ|kCAWkQ1WC9(jh2c$shl$PKaM?&@0)S=T@l5rGx34-E7UDtgme)7O-4hqOi+4yv z-|ajw^UYU*U2XMd8uEn~g_Q&s9d+FzBVj`^Do%1dJrXxnYjCqELR$$AAgg>9aUgf` zNL*xr7u}bpxJ~!#f`U!BqkH;k=J3fRSJ8MU!N~wvGxIMK%B9AUqsb?OL;5IqzVF8~ z*@V^QypQFb-`^c2NA|b&VSyeoZe~Rd#Md^R)d=0&-rk|!FPqdC{ErvT=e8Gw$K2XF ztrx-al1u#VC3b_pO4xgtrQ49X z;!z`7qkW&~ZaabyRD40F$&pkZ73bxL2J7Q@p-~a0!c`E6y7NysdZkm zn~XNzaXvp@fjwMF$8sWwFS~Nd*@B6?*5v^b>icpA=HMp42PyLNOLv`8?wL35k9$o> zF5bWGhF6_qM8_6LgT8mJZ@%A|jDr*@J-@4|65fz=Cu>T{E?1H!=bS(jh=y@$UPYW? zXzy2D5E-$jBRu+p=r`)Odu9t^fe+a!pB+C=-{R9(P*u_F7Y}G9} zCR`4`|NEe?4W705B8ar6o#Rr`jKX6J>>f#}>I zUVkb5Fx$-rRHVaeibGUziiMh9TP#c_WV1&q;T<75!VLLz0>Y1eaf2UGI0GDzubEv9OZN-Ek@6cb~5NslO_%xyie zUlXlpAH;u>`=<1cp*x_Aq*D#zRARFqC*b6N24R+FcRB1E8#Cb~UUZk85jzUHnJ&yhSU7scVi+!M(vMY$+5xG>+^QYbB;GqQDSN*JQEZIZ=MsqAZ*p80&T+&Cv&iMNX43fZO973+rS? z`$xYFRW4o^H_wo?6q1^Kc(53wyw-QFpQtgP@i>`nJ*E!Xl~%5QzIjEYI}Xp|O$gLz z`{(tvD01Xey4M_nx7!@U{X=@nl;H%N3xPJ0x4Kl@;1**>{uNBQXonQzf@C4v#NuWF zU*SW@HeTqk*cY9NCxWQtgr7>KDL<)!owc0r1D$wTv(L%gl4He(ILI02XWXrJwKFwe z*8@AVYJ2k{59+$g7UQm^L}ecFhp$0zZ0xGx?w`8b)GZt;s+(~xbSD_@x(OS9OWrU1 zxbQV9aD51FA3Oc7w@#wwUSdBJF;k{^<8?Zld`qHkH5!_uh^{%Ef{KGvdR6Dplym|& z;Rl#5NdI}CXbw@=;!z_)Sr)=<|I6uHONqt9OA-2Tooi2;U^>G)4 zXuVHPse|e6`Zw!(K&*BMV9AYw^jIFqXCs=RT2)8TZbc|m?_}?D-Ykt4c+gx5y zzi2dd28*_my|>pUr!wxU^xJIDH<@oYrmrY8hm<~V8r})Y-|(&)42F?{B%yvmk&zhZ z9dxdOd2@&<*J#ic)_c3^FD^;@ z|C**QhCzUxy1n(u-?RgOmY;{c+9#1Pd-c~17TOxwW@FV`7i)cdJ@YmzXS+Qoenx?` zN<_gc){%3&ipcr}9D-I4iNpT5_X+^Iwrt?2sq7j0aSJpR6F#4XjG&WW|1f6AO#h)L z)dCPG<|#alljmsHFxLa%{Ll&YiL7G1o2uU0jO{{n*C=cwIipAh70D(y9*Q^nh_334 z8)jTcpGtG07c3fQu8vv!;ru04!ufS`*I?^$>bcp@8`fOR_U5}!0ymwf`vgUgf85=I z;)2EEkg!>jT18Zxvg@oF-~k^v*?zm{a+Zf|l69I`=xfuTCu;_)nzS7uWg_Frtco4_ zSX?%59TwypZA|_f^e(x@#~Jhu;n4h*JxW(%mOaFtYmJch=M-~ZC57$rY=de$5t%1d z;1M&g#6UdOB|lCu#An>!Lg2sr_&uOD!!IZ_MyfsOvnO$`H`%EBj?u`7`GZbt2`<;L ze4w@v&92@b1C62$c44n*eemCimEWp*Ht8P{-&v?{>AA^AKpg~vQ5B!WL{L>>yxI!0 z4J~*qw&RiD?Cy;&i;Be-7=Ovd6EWQ4P&~E6MkM8Y2@}0Sg^r^^lZZW*61wR@2^(5_ zU;Ff0c`PevxJ=VBEH(?1iV5Ew^T{l2ljtGT1tj9%4Ssxc#D*W(Eqes@LMff!KI42u z>&F+iAu^Sd0D9ne(Z$akglRzZh2;-I$$6d;Z($zH$p_m+XkYF>;zajB;xBjbM0((Z z@W~S23|(p80$!3vO@U8&&q&|eZoNQsMHEwR>>q)rklhG|PlB1F{TB1~yI?)ahK;~g zjpUhuTa9spyoH+Ty%O*>9xE6CR}$s zytCD5{>941*WfuPaS_t%|L4{B)Xt#2sJXbkyuN?e&R~6Ub@t4uN_%B~SxG~uKF`Zj zZNDzUY1oHJwOYq-82Jf3w?HSm4lMc@ThssHC=Zwm0Tu2M-@RlrF(00KzW56;qx)!XyIX zuCp*D57qZa=uD59O+zr}X=hhk6S89at;z3do|MSkwF_Y+le#TK)o-1_tU5BXr4g)C zPP0$mvKXKcK87pJgI78yviK+J*Q@NU^H(9{fFuUUWfc3Nexgb2b?NN!dg`m{1jT3< zPcaxb8!8X|QK-SaOYt%59dFmg@E`S%VNCJI5gy!y*wEm#8-B)5%dGh^a$)U~MUnEO zB~owq2JA3nE6yT0CrE@g7R7@{NDY_IImUw0Yc7Z=JRdzN5p1>vqaoIiZAP3|wR94m z9MmteA6(%=)`Qwp!!{%!IsqX^-!EZ$@`%ug&611hjD{8^22Ts>k=ep)*Ed~Sb#mRibpool;&x5fd$~$YY=vdj&gT($LztV8g_#)DhtJde!a7 zFL78{xe1tv^%!_TinG2JFwhWC)7$j@0o7DF2i*T0xYYsZe5OH>ftsWHA6If6$P&@yk5o`e2?gP1YcTu|bs zq&6(yls6gP)aOjwpm-Xb)x6sEF3n4qc#Clr`uhmNV38v>mT1U;u~ME5VP%a!Pz}|U zqiGdeO14bk;wJHW*KP6S_;%W{6pwAaI45XUc?p^Qr$@HMy-S;a-Z&+i=s9?e+~uX7 zp@tHU%>t=Vb8G6PrH$KDl%7a37zo(7=1Z)!HsIbSC!kUM)g@(oi{A7(uqAdu@QE(m#{{yQT{5{9h%^>AF5yT6DXAAuqrw4J zg)&zp;g`r_d=IL|=ZK7Hct)mBkRCq97Zd#)^`fx0b~V~%g!JUrg|!EONKkY7fIzZs z(f~z_+ogbjDh=k5Y?`h@x{j)_dBdFOSX|l=F&G_q4=*pNmw#^m@APo4lp$?%4fLfo zJ7aipOwPX90g(kXNo&vMNcVPdghylGRUSguBk?C>CT$CAQ(vpx)&At+B`{|+dAx)Y z|Fq5BW9)IIZ1J?Bx<92+3?Qjc{0wroN1p)20n)rd@PVEUy0Xf#BOJa!VDB8VLc!@( zmYro4WP2n)z-P+I^An6qK7_Vk@0HhsGFQtBgX>BeA zn1#$l2F4BSLB`X4KQ$6GqLloyTgouj)8Q6IhmkoESuj)DBAM15rNA-4C6@(*S~@)& zJjB6DwzOgjxf zlMdrFUSx<4W$gz|(xzyW)(gvo^h6Y8Bj#bcc-d#SekU8v#QRwJ=fZlQ)#~OH^{b+i z1cwHEtww`ROb`WciL#ppWgNH0PuINogN7+d*)#Ox-|wEp&*Fg1%#_GLLmWw1gcbotZ*Trc%7o8XfUT!MyCvV3)3dT z%zhxwEn!2e|A26Myfh4@Y;?1#Z*b?C%KC(qQ4-$z5hz$I#sv@)?Qmi$Pp3KaGc=$T zfzn%BSQYmfVYqgv47G#?ycYAxCnWVraqL~Z#hmn*D_plr2Ykov683@TXpD7LCs!C< z^U7)Zj1!vfIENVxnez5U~UjwK2zuhfGAkhH4Lu7VC@!|rT; zwn$Of0Ajnxw#awp6)G*%FX9ak+txAVm@~^ON>I;d6);qZX<93Fcb7hMTk-hDm{Bjo zlF?+CuPfV3m!)i7sT_CH>u+8;OtC`g1qfBG=~??MFKF8F$K`tK>C2#R`nHAt18;^UM|OzhX4RcNkD+G3WU8wJlcVv5NlWySzd{NwP5(^bFrLc zAt$yhF>9r3%rugy+ zwUTSc*kK^!0`>IsoJ{dckrbc*?C$ZSUzVxaF~-ien;S(Bt|H_VJDLYwmVRPYb-T0M zI><;f`Ob$OQ88zOSuZJs&@K-06R~tMJXCuvDPo^?Vxw{DTf?N6Hu_hv|;O1(d|^H(7T5CEzE@>(ZAnDilU?+9L>WXw$Mu zNIQzvzKs~dGD1M#9k@Jl1BC_FuJ~1%i;Iw{nE4g8#V2oS9zQ|R;v6DloP6M7)as~Z z0pzNB6W*Wt(`n(HtD55y`To3DE0~p(avJc{9mnPBp20C11%uf+yO49RHZ7 z=|*cfi|;N?&c#@Kmv)mAG5>;zFM?mAOd})uiCpZBurBp2#NyMh)Xq-JwH>hLMw%X5 zEzGTRnmT6+M95#4ed52AVnWt*akoG~tUD(HL@O?PVZXIlf-RUEgI${zV$4evC0V)2WvJ+UHb!TT}5@j(@8i7y<_ky_E*{}iq7Pl0vIm$6Pl$g z>@D?TqWx862;I{Fuq9(ehl$Z@$ErQBLphWk_4SYJ6@0J0?ex3I#619GgJ%D zn2K&CN6&($WGmJUgl?nZZW5xRqne0cIi|YPn4xYQ?$*you*0oR-Bj+L#I#Obc$}?> zL*o6UNo0q+Ah71o0zHg$JXWA=9nBvTSO-wf(5?DRg3TdgWAb}W&M{6}scuXZ>tlt5 z>P}5xd6O}Roz%yCCgV*btU;Na)EOA6&O6!|yATOTjq z_kJ5^BP$O~M_PHJl5c8*H_s_DOx`GT`>nJKaE16EUk~sb5_CTe?)CiZv&p5<|(reL+jpsS!8Y6VF{S{<$yNP-0y<0TlA{5Hzcelsc zwf!A}#g_&_c7W|Na$P8O14rpv>gksp`%Sp`(K{GAvWEeJsomFq>ro$;y|EPnD;FsX z>0g7CloZIx4*Xm3PnLBFSwccyO-6)X+1}XR#Xf;h1P|ulrjQ5;Iww0P zDI*&v3n?orfQyusg#(!2AVNyb&Bpl`l3C2u*~HY&<)Z`u_$MH0Q^2uUb?( zSH%CoPl%xlg=c4B0s;XnK(>S#Q4$avfQ^Zji<9GH&i{IV9BfSN0QP^PKn@lrE>13P z79c5*1IWb2LCOK-Vq)ju{+s6bDCGQCC6J4iiIszm9RTc92>`EUT(nYaNQ?5u2mf!NspwVDI?5&gjW7?I{Fnpq zcM~5k3J>FNJtqez*T!cWz>3OcN=NtlWsCx1!C;C$4P+Pj8(H8M z&E-l{BhQgA&K-Y$Im&Kg2e0&2SFhzkeqFGW#pFqdmX9I6l_`dhC4`8Dk2Jx`6GiJ8i*!81CVH zf;Ax8r20`IS|YYO*LtzPzJ5YAL9w+2X~4bAFAx>L1@mIv!`@$ghIgKv?Sb*2wS@(j z{}^0NlO+Sn0|wP-SH+HLwU7OFYSn6N5-CT9_Vhn&bx`>6>}Vv7jv!N?reqh;DEka( zMUE7_u1RY`X#~;lSM8O^>Dj(qE1h&|R*?O?IrQdnPiN$b9PFSZULRtKkt0W!zPAx1 z2(PHXdPx19*{NO*u7mt-^=FxD+t-H2=ro~U7k^?vja4VE?NIXE`RcHE)^g<>EHM3a zP5ZH%Bq-`?(SWMeU6(7DR+aL7Ql6-dkY&C)uK|euG8_E#GE$meMgxRol@%_68E09a zDEW*{P)nm#!rHo~k&+{}b?4xm85^sI`dQpUq=BLt=$CWd>LD$ivc=CBWlFYGk;*04 z1++|1LaYcNeK;WjwK14W+8tabLW%5Kn#j?$on@nfH~2J}{G`0oEe`#B^vv>O@|`X! zxuegRS*;EF4zDe6xcC{gI6d75ZAAri;_b*X!_cDJ*lv%K$Y0pWl+#m}&^;%T*%T&z z_g%Yx6)+e$1X0>mmzS_;MHPKD6m@O9sAL4m=WmqdBozfxd9SxfS6i3e0#DAGm{Ykb zARk!7M4?HUkXg1G)+WkC=-#qx;h1o^*^(>=#Fy+UQ8Th~sjAYK()EkteRZM)J)Dvs zEFCh#YZDpXN3Yp_jL9P(J^MxEVxh}4C<%vJB&oKH4hmLeKJ{3%0sa)<4@V!2!B&BA z8zncWir=%mrh_12KBOQjm3QaUeIW&XD)kM9piNm>hN-ne*v8RiGhmb zm7rTEhVPz3z0vo?GXDHhaH3}=*Q<7fW#}*18hkjAS&?~MrNezRgCF3fQO5@2pcg~m zIb4?g23T2{AJeQ%tHToym-{mA{Hyg_X-4m)TFtKiLnT}=0y+wr$Qw@o6jn*!g#N@d zS){WwO;>a+8y*vC%Cb^(cS!h&3`h*SmbG%jrcT>iyPhEI(f3d!7k`{Bt%N^1Yo#=a zViZN4aRK`sxyZqQDj!8lS0@k@PNZIMI-}e#6&*}%9@bTj)*7%q4})Q*Rn$&gp@-jr ziUL~`xBwT~L`7Ci7DgMS)U|}5*cdV0ZO*Zo9(flonl7Ogx^UtUWf$dAUjaMCIke+k zD$0pLZ}i!Yc-2E7&Z7Tj`OxM3#m-qQ#p0?;fEX=J54ct&v_#94vHT0P;b>m%zWMtu zX5z|l%c9&qdURZ>Yu^gbfrhDK&)k(>(peFI)>4a3<6dI`Qw`QJ1r16fRCP6gqP+${ z#;K{|(SmbuB_r{hQ}wsrinsqE1zMKk{qS=~QccqX`W5u415$OV)>ulJnoBHevl?Y+ zCW^Wonz*)k>tsz==W8;k+6raE-uiU*^oPKl<{kaSs!G6g&RhkYPMEQGP|?Dl4i@+> z0ZiVJiRpZ^&xzG8m^cslG`Bvb_PyS^!LYyFo@KY|{CaWK6Hi{Tic%U6GkPRR0@`P{ za=o*Q7Liz@&@eP5vWhUFgvFr4f~`mrbmwYxCZG2dPFD*gd*@)tbQZyZD#p9zQ&h~6e$O!xc zOBPCC#EVy4$5H{*hS8O`yJW>SmX7xM4 zKWFcpKeH(`qz$(136<62O0L{NE*@@4OK+}MY2nkE-6b!x&$Y96hsAYg=GRGidQu`u znyVTO^v`&HFI%N@KC&C}bE;exC;ouQ1OE+}v_j%7pvMx}IxG*23;vN+7S+u)z0fEB zMTkOw6fmN3eoI0ToLc;)9lZz4Z(=mzR6D!_{5$twQwS-#CG|fGQoYCC1V}8!VG{*b zyq7CZi*jD|r7x8v9Fa^pFmol;3S)d?|KJ(_=7_A^9IW-6LUZ6~5^4(KUxfe73gzwX z{$YlQ|6+!u|M(yD5DmcnZ+ghd1^8fm0M38d;a}r_&_hm^{~tXBBy6kECv1zzqW;fb z3E$~x6U;<)5&rTk7H-ZD8kaDmZVUP^_haJ!&H2BG|8FJ#JLo?dhJVlUpRNBJ)PJu3 z;7mkV|B?MK^DpiF&z<#(8G|_4KDhaReoeN(ZS8 zk+|upIk~EpW}KcVxAO41lewx@wbem78{CgaND?l+f@BsZ6sB(Pk1n2{PA{I@Bt>w^ z_Jm}^M3t@Vo!*u>^#uZB_ch?+;^ue2EnnXszEgZHhpy6@yJ7bRS$O6VlkxU=7Mq)W zmz&~WxP{H>gfUq>OOsJJs90zsS4{)gb-*Dd%s$9~c=!%hz0r8zv#s_nLM&2Z1Kne7 zcBm}94MIbVVz!2D@vy(Xm%)PcFUUNC}7u<@p_O)E%l9wxg>rjOBN5}f&Z$#U0H<{f z&@48TLD}Qn^@?=K_d^Gvo9bV_l*PNqQ6!$*l>xuP4byfvSmaZSZ52 z>^t*yhbcydBpMyk3en>vbe7+J&s!Rp9(wN@l3jg(@1I_?UaP``_`@-~x4g4Y_8p)> z?w7J5$iYKz=BGGl~@ZnDHTTKuj$!q)Pl-@yN@s~Rop1#AmUS}~$QfohaWbQ5Kv%D0;i z(EFnaT4Ant(Ry(Z8_!lwyhOtU9cw}67w#b$UwD&cH=K3?#ghX=&7W-+e@dx5+vEv>(`{;vg6%fWH%*4uSoSq;8z2o7Qb=on`%Vcwu+I3BA2MFSFO5 zE=tGER-NaNTrI_hpI6}Kw&qh`+Ta~BJrsqL-hM2e@0Q32uFvk`p+;?gM3*0kFaHg9 z;XTlxx4AZj5rNyG%Qg4MZid3agV%wlL%Z&>ocT~KrJr9e+4c9sjgGtgbzknx=WjJR zgsZwXydHl@?JJKgGCEO*`EXvYdESE3znz|e4ZBVXVvt?@IxCBCg@vp3L9{tr6x@A7 zb}B??8*HqrunDf|xfz+foyDpKflsK+7f!SW(E{6h`9V?oFUP8e7thRgyCYG+ z@1pgYgvY<$U8Yv2k6-!2o|uq4#hkhP24cO7P<0Ry5tQ)uF0J;)sZ``a{gXtEuGd3?w9Mg8*>x9+u*`OcDApq zf>Ig@^AgvCJs|$zs*!Sn44r1+3wCJ~cKRQ_yb!i3e4}_Q)Gn3xnrN3$6N?#j@8O)`c9;af{0X?bHqbTHf;| zfSe{6C4cwGu}1(B^iu6d*)5W7D0l=yIP<{s{nXi;9ZV>a+l9m2<*+?ESDfYXvS%Vo zP0ar`QkyS{LZZ#*VffzH_1GGEKY8wHabJ~sTsk^0##Za>GrW8hhQ8Uw2qYwmLbCC_ z^ndHx$YNZ#7HjU;51vzyO#a2Ouc;9{i$d*^d0JLu_Inlz6fzG35s!@@<^3GGvpqpv zt#LJ?&scEP#bP@u&5=k+Lkc0$tBE>8lK2cOxudKp&q8h(auI;!HO4k^W?5j(Rpkl` z)&{xJw`E#$NbF>v#2||wQF8JX-%+3^l+SXUC#lMwh6O`>kqV+tBSsP2elKoK4++zzUGo$WxK7 zhSBDuAY&Y;2{NXQhd_r`5)4Uf6|srhOn@h|4gcZ^3Nds*Fza=InOh?(;VngCb+8kS z%cg@s07tM_64A0Fb^t;)e|4y4ZM7A0RQb6UW>~dLEM^h*t9+lmQQpv-IjEH%6!w#R=*l@*I3&2~kH1g zc1g2j8`*M{v>hvmsa0v8J#WnRW6+GG7eq!?A-MVwOhSG^e$`ZvN!ZdzVS1pW6LtR@ z1d72U4ll2g_Ed(+4iT|JFZvy)93iQuJU+}qEGK$e#?X8krxgP?;bdTiPaF$}0q@x- z^dalwa5^&^4enCA*(tp=3h3I~u^D8GnP`M@SXS^o?w zKmVfzmyQbNP`*08zEx#flimd7QMnq11&Y3((~R_P4CPy`K-V;rwvxq&r)%8@rV1=? zF*Z;F5M7d#rL|)!0C!+BuyC{j;4_F2?HE?T9Yfp;gT(@V!WP-jm|ysi%EG@ZNa{pL z!Hdg$219(@`6HDEy)o+&4}-(lfMz0qR&sYKQ}zWn(&DEF0Nm=$#YyH)#COpm4TQf@ z47@fZiWuV9`=X|`z>;!w3S)+Pu~hM<{}kXYKuTR~h*l~<%RM;c7T7w@tC~j5;EiQS zCU79@KsX-?|0Gq48oi1#0*qufU{oqp$2yrup{eZnqimX&4*Pl%q>n&L zI%3%HOhXZ6-fXZ&Aa#N2)69C71wzCf2U1}%5JXtVF+}#*9i1Us6cj**xmc^Pe>Q^Xu#cD+T?V7nX4$rg1^uwR`Ffiz zZV0O|(m;!#W^WR41V^RK0j1)uMSE4QYh=Y{N8RbYf_W~+yUfUvPCJnjzi&63z5!V- zH|04IIfRtCpJ1k*=E=D~<3{T*ZSrHGVhjDRnp-OD)`c5v6Wa+f&zd6eHL*Y(vc|Ti zmEY2%ajFCbKVbhMyqJiDCMJ619{r|?Nsy=mI5sVTAnfIQ4dtZziNyMzKgP6Nz}^f!GXOG^-0 zOaRKLB!^>DoyVdPe7kAIt?}KbS-1nKn6Yc9)U)GPN_<;eD&L6$L7%WEm4C;Le~#jr zk#yEpv$T}G7%9X%xjuyK0+X|brqGe6@8$gNM~harI>dq$;sg;Vogo z>wg4ey>Wx9>tODZxnk=;pa9lRBtS7KU&p-~HYo}Y?X})O=~tKzWKYO2OKLkWeJb)W zk^k+Ev2SYRlAoLmqEx1d)^j-7=f|EtO8&J~1w2p`OhKqwO&SW={92;~vtzBIX5RER zcl{3ZF(-A)5R33)7U4xX1-H(;S-@QDTqXJ;yTfopE#KFuRm)?4U+^JSZYfq3?4_ywG zrOhY|Ir7Ave5upv`(3jB@Dew{jJOQxVbHNYSJsm(Ch^{&%PNEAFHgK$LnnRiLt3f~ z?xSr{oZ>AHN*i~miPU+e!pZEVl~M@&u6;pn1;We_>h2|EB!+#h8vCZKhvY+~mA9KK zV>-?BSd;uj9yqj5;h=jI&moN;m-82|YO}T?q##np^>6N5) zV4#I!VD3(?yAQaG$9r|+epPL&ystIw3>9MjU8*$*!UNnST3L>4f1$YCGIJg!U5+;G zN8PYLQ6HX1dk}&$hE}s*72W>j6f6xMIH?jCd$mLm^L&`iAkgs5T>trS#KZ)Y{qRU~ zvtrQm%^le1JL7YceWus+dZ}h?@J8?{3d794b!!g#sM*Z_+eJ1P;V)=FI4IKULI3j= zt{Mgw$n~nSBxbuQ=gUTP+hZaPQpX<)q|TtOo`nbWZy4{KD^gvSs|P~WdE^aYP}64; z96iA!-G@X4pk&13??B@3{B>V&zE>^{<`cMFjXcGAwCLe{YP3hiNr$>JOlKmtNJqPG zMhQc#Y-?dIiM(MX33p~}dvLgEX=#3>aBR}T0o?WpBm?RN&nKykKE-r93(n*ajcNRk%VmHs=K53qE#Mw)yTbb z_w4GphOZZ;R)rl(zZCvuvxRGKZcupBlyzrm5d1y9#kG-1fChE|c5lqMyCTx}8d!_7 z11Zhx!4ai*tRSfVH2%Q;9$t7l5P`0zt5p%XKNxUi38JAVVYFpnBI*2oCu31vVq4|$_+hUQX!TgXjg;`adOMNVOt0!VL2W8 z#Nqu_wci|I@bUlMja+@!jFQb)K-SPhhSSNJRzqFAfj1R?cOThNUwEbq^3WWgyTS?x z4EhKZape8(ABdTg`P8vcJ%KiSy-kNU~M`TwGR(k39P%m23y zM(Veq4-t-wo$X%|A_vQd^HmQwum6M76uk|6;u>(Hz)(;(%n^f=b9ULih!l)QxLYamlh!X(h z`fs;Rzqu_P2-UnUT<>-9iSkWcJic}kH=2KKHzmr)Bg*eLk)}AU*`FD0*fWvH?*{^t zOm&j3D1H1aZ5AV21Ks^&YcOqQP5R81jd4n9FcnxDb=uPl=z^4V8cStJ$r2H05o&lg zPtW5_nUx;nvX4Q>ORrtKzMJ=57v7uRjAT)$KZX9kPR=qYs`hWd!qTt~Q^?BZR{xkn?@5eLqyYKtVIdi^Tb6qDc zS_x(ez%J=&4EY$WgV7mnxdnhsx8I)vi5PQ8Thhzy>@M#Iy~Z#>55`&n+ts=~Ot9JS z#|0=|lm~gSTDAu|2tv+QycWcANNvpsA~0kX{;F4Morv;nsL$k)h1ZsuFx&Rb1@gYl1jYIi`|0x=KUXG%gokXb8>vD1?>HV*9( zeA~ilb+x}4A28}}Z6RoA$~mhJ*v>^1<($2OoqY}e5^~AUadGhisvbLYSX1-Z<^Hs2 zuXg2O_zYv;GQXFo0%f$#D48vR@lFyu0tU2t3xCLweN9bL_e`zJM*7CFop(P~tJ|JJ z1~;*53qgp)Tq^7%&J9^O+%MnzCkz!Z84MrSn$>9MjT&*@x~S*YJbYn>px9Y!S0CHn zFnH@POl%^<-&Hy{a0vv(<33N9w$muFX=HTMIyGsA?>idGY^fKFz{BiK2RRJV^?@|> za52&km#rHquf%dV22jO=qzQxlHKx5={WUa%Kj^gvzngXTY4h%Yk1d6LVk%$!G0InT zDT<4O`vZ1yfv+_GUiUE?RsM+zdcD(gGQL{Y5zuKXtvqX~F zH5UDtOu6^?w);!m$@tJ?&0F%{xm|!;N4vM_bze1Noj&*ZyVnHOU#lb&fvbVacZ-sF zw#|UrO~;QSW2dOfC z);dD5FSUIkd~(vGCfKtL`l?}y$hlLa$Cc{I=1pv{b(%{4);azuu08*HdRa8XA>}r{ zgVcywT7a*n@cz(!=Tk!W-1HD|K}&jw;j4mvR8Q_E)!rN^_ip*hvavOX4dr+$m|xrh zA+_m1;CWlh;w089eY|&Qad%-}*3gXyUAN2l&B3>@_((;nLx=Zzy4~bq&4Q?C3nA6u z@KYI^PCJ}%Znk0YJjCo; zRsgf5JSN9?S9NzzCI=&r>$--%toV714NegpR}sgUJ8?wU@Kfhiy`{w|DXs{tjXlv$ zoVi)Zl;HM<+(c`Z^mYt&f3p0>?J`U_xO-%`Cv00Kk6F(9O z@TCIoDqj9ZScQitngWBsycpjNY!X)9a5vbpDie(6916EO?L}-S#Y3sGs^&g_sWYf_ zO>B}Ev3N{E_=eAXJMfx!smmJSzSnh9abL{BRlQEO=Xvkwv6sPsUOe?M%5GFUQ+wNq z8)8|Y91^hnsx#sfIxMFL(`F4sn4DzAN}qFfcB+lNc|m2Z#r6#FUaqDU{$SxQx0bHA zgyP%%#I^j8qK%)@cH>(h_`)YQ$m;j_2P>BsUER(^$`aWaKU5{x`#%51bmU8?_b)VG zJI(nuLkHZSgz}Kz@9%yxhV!&j1z8QW&APU+>CP`)S|1n@7o~pax^wRGdCw4F&Ow|{D}IrTkZv{=e;-GuOD2XWaSkx6YuL>WhRhe zwG5s>>a9~d@u*!hE$*yhqGM&6lGnhnA`R#l9;X69x3vNu@KiG5yB|var$qiE2>q#9 zXC(Nvre#F`^&!jdGs$QxSs91%v(S}B_4`ZQ@C5M5)HUTT=vvC@b_Ko~c-?VCa{~lU zJX`EcM)fc6IKXh8$)k*hPQAOJv@Uvfe?Qy&Voiwc{Wj`C3qzP-48oy}r~lhml%ojg z6bkDb85? z=!t$jFrlz3cAgyB6&q~%#2;l-66_fqwh}R6H{RQQBiV)l=}OF#m%$j48JIoM(73cc zXMQ!lB?Aw}N+I>47YBRN!+$$<>qIcIhmwt}c#+it8KL+7wVRK3AN@qX1BcNXPUIJK zt?~9y$rrAa=fO5kFb`#b!=G8d$h7js{Wq>V2FMb|=*3|6higAW122!-1CR2S1*h~< zV`BWAXUAw42L?)ZO^YA(Du9w*?u?tyFD|{@4xg*hP&TQ)X|(ggqSd3M=G1}o5}5vq zRDGWbNRY%uK5dHmNJJIg_6wtUT{B~mrxmT4NLN%Vv+26z%@bnghbYD7+|j$#LvZsTPLR7F=238|pYE`?EB_xR+H z9K%Dcv0hM6#f5RgyZC83KAV?4n&D-ceZZ5wkxVpMi`TEqjP8e1AdQ#Y`q@Z0*pM>< zNK=X*cEG~d?B*7FGj<+;#rc$}e^)fBdQgoN1&)GKt|#x{O5kol+g$OoM!2O))IKz0k7Ho3{4+?xPs{TgyLE>6^Axlz3uDKB` zfbmvCZiaZ9vFi1>cG~G@lcckxk`2cHuii(!^0Lt&`?B6yY&)=NL*W9sv)g+8Du zKO{=MIA@Nirq~LBqxymih>BtASJ`8e(aoV!E8D zz~MA6&r(zJnAwZ;W8G{%ab@~NzhyP?5h`bNmVMC8!zI`p-k#CJy8u|Oec+TbBpFkC z$+K^8*_IZR((;AKkc`bQ%NI*7RJySz$03e`b(foUqmd@d;Si;W{2|N>wVoW!r+?Gy za}WPm`+JpE<&PTwurEq*ZbCi9x)l+9917V?++sf$tKZp_N481hIQ0BRv0$N>ix=Eu zq?qwatxk3{KS2w?cCGk|V_MdB^){ZyC@QiD$8)Hjfr~=@+zUl8`ij%m4II=X#f5Xi zfyFdEFi_rDXKG%(P0Kk-O14B)%TG6&u_jspCO%J2Vx)deTf3m1XCkJxonu|0CsEMn zxzcBkCxW`t<9qVF;(OB2H*6`A6xpOP`!j7QMa{CAO;;wcWO1_e$^HsO$F9jyx2L|R zf=H#osF7M6Qwh%Dh{lvFNf&V!F@>s>Yj=7c5~z@*&nup7n7Lj-Naq3r)9$Ncs?%do zRQ;(La+_wW7c04hoqWrD7A0e+L7@hswQ_96yI!s=DCa%)L3ou}m0AxF1+kCW7Zfcq zy8X)<#eh9(1}$7x8vG4Zm+CZx0h-TRrfd$g&V_*nA#Gtyx_8evQ(M(rRzr&H^F_@g zIu{(S3CabR3Fk7QAl0%(S~oxNdx+$Y2yeEaS2~!Ya?;3GkJqM|S#!Vm3lx2)utuqqj()h-q}zq_z_#QTi@>S-klWtyZG9c&AlP1o~s% z|7lvmtdcRFQJcM>LCUgGX_oKPAccG&{Jc zP+J{!6DVt;rU&ekd$H;8f7CF0?83V*u0cI|0xI%olu{`UgcAEgH*cie$M(D37sBE_ z!OQRbhFvZkl{6zkU-SG-Dis!@)CAs?V(k4vU}50{JQYg!w}h|$ATUv_#{OyMo(x6R zy9`|wK7Bmr)A2}~JivDoRb~5ZZAxCOrggRen~K24qhWTfNKh0Ur?*o)V+ZkEeJC0l z9Bw1j2HEvBMWpVloU{*0(t`Cl;Xb&yuKRH$3mi1z-{qqUj&FU~V{50&$7gg^(k;|p zqa*HwsHXGNqV+1u((=H&&up^*Zw^>)m7;a}WM5qQw+yvCpnQ_2mMUs{o5rm=%Z!1i}&#Z+25FQI_P#6aD8JaxzCNV zxp!^b+h1(=d@ilbd#5FObgS%28g&0#H{!1Ta@)-X{2Yu@gWsusj{Eu9C6CRg@{xW% zr;PoO;GKNYdSEWjKIIopmDO+BQP1UyT#3+2&(exe4uxM?v)Zh_1Rrw322qb4Tpzk@ zlkMF@lEC;yxVthQq@DC#VKUakS!T9uXE>FM*>E#?O`$|?^B9nRaXF#oZ?PS$I|lSfJA9@pLlv(evR0>DRp{(H>k>PK^OB*IgdzD0f?#;9v7sQj)n zAf`oHkyBN4*M%-_@c@QhOR+L$~2slgQxMK zp{dHAUtL$N7mW0PbRw^zr0Q5};MD01>gh!L$UjA4_|z^T^LFV;S)WS8V!wdclEa~3 z!svXKl;xG(E2G!FHCQ#)*Zbb1VtL+9)s*Yp#zB*Un|sSA++}@<6KBaAWPFrPp6-2)xi9ADr_O ziaF_>yiv;--@laJI@La>vYv3fzO>6s2(?eKqE9EFg)-f}6bzylhee>0d?RcumpO^0 zS27RKBbv$d-lX@L>X2dBOY&JBOYMv$M6l7@<7ia=cQhdQA3~Urun43f!>$#D1NziJ zOI7nWT_01^3LawaD5|08E)jvBcCacHWu;~bfQ z7_SKAZwr8Qt%Q*t{~wA5NoC|B1^xgrBs%-s2S9lL=?R2|kp7q;G9CD%;r~TwB1jna zkN^H(m%<`QnIB2S{$vHnvA_2IKide3{9hIzjEo0F9{&v%1d&m}za0S*tfjtpvV2&_ z&o5xeAJR*r!25ug5ww#^?M#OXfiy@sTcDyNe;9`JU;p1Ro-@$qf4_pi z#P44x54m2^%@VmDd4s~p^{lC59(u^5ghl>$58fxBy;NS$zej0$TA`weA|D2Fk|lN4 z%MZ|T>SZ8-uilYf*>GDVRm49tl&8;@rL=lD*%>bto&1zSpn~#8SAKSx)iuM_ce<}) zPaZt_9Acpu${%Kgox=mwN58odR~a;xeiHY90nqD!g9}0m!@ov5N+l9tEgTgW3Ag3L zg_5wUUty#qyBNrNdbrlNOD1~p!`j#_1YLkgA=5m86p7M-NC|9}hT_chmOj1`cK%0N znUa=os#$@$wH{;4ppkeyG5LC|6`PuCx%=yuIr?Gy%b#kKepM67J4$4+?fdrUl5+ZR z#xHStC0yeEj@S0(YwXor!RU6jt(qTJ9XFea>Lut<&xb%qCDRRrlb^N^{ZHlB(^1K1 z?)$q^gne(-z|9H2>0L?hCix=D-EmUQedtj|1yVzO5&V&RIW*Op}QrOe2_<$ z2kNE$LN1lZo;TE+fqYyo6;i8F|48{14J6`zYHq~HO`SJH{%XVIBaR7yuhu4xq}iU0 opZe83798#MJaua;>nX_IjT1;6_ocx@ei(vcI4mqmT2P$-0bj=(3jhEB delta 23989 zcmZ^~b8sL*`z{*WwsvFN+1R$7jcrbBXJc$^+qRR9ZQI)9?)UpnopVp!x;54P>Y0Au z`D1#fp6-4-0DZXzjh6*3wQS??TTnl{dyIcngIP>Hr;@-plx^+=vPlv&i8+piRnV=o zxbVEYl+6L#=A)z<^H#3y`9eP$nJ(@p69;xDZ_>l~R^dL#n;(vM z_1^c?8?W6E5tWN$JvE!`GqGFheb6q??bja;Sr4vno<*GRY1x2$-#=+j3YR77#YV3N zbfh6C*$Y*d$+p+pWonF3tpTOp*A3sBGO+EBjpZG6J8kXSmusr^r(G^SIo@4w_3o{h52}8eVR+Je z75U(+v|nixdy#@gWiCn3S!*J&04iO*!;yt5$!uaN^T%asv0XxgD~YOO7>on+^=6Fq zvUM7HEz`-MV%Z%?DsEhB2keX$1xz>O$Qz#||FY|0+2ICs}pSkbn z=jTI@$lKFc#FC6rpR}ai)8$4djM7|q?pi5Sr(nEK4A|04U25&4FwN&?RK_v-@;fp-=jio|obP{6WwAkp5JUYY z7pAcxaH0&l>}nJvO^E&AFNr%W7PZxqSb#u^BzQ7TNK#g(lL~@#i-hhCoa>4&pJqzz zY3QSICexZjD5Dc8U$?2dIAcP9eUJUd8sj(oBu)W5@TN}xn6^2ouI>RI@8zS;cCt}~=dgIO2GxBE z$F$(B*Oc#RLQoK#|g}VUbIb_O34D9)7t#;t7a&RCot*c}j7FE}oJ#eYA7Yojk z&V>*yu6$`ha9YOtd`$d&d;iSk!GfhdOhgN)dFY&yMQZ6KCL52BfEsx+2Dyrk?c|O! zGeUvmA3WBt%(EmZ@huA zLW(UX@9^&Q^*G4LcEdA|LlSraq8Y--X_yqaE(LobJj#a5<2AokNY+gv=1~=nBmRbx z{uS65L03@58y8CBN<1G7FEXY-$43hwBuM;zuYQQIwGBT=_&vrFh#+=CK9+kU0O@RM z(!Rnprla6iC`cNdbo=p9>!-_)t6)9fS0E!O>#B|+s2RgTmG9cc)E%knafJ(7es4pp zQl|ME6Nyr0{h*{^g-CEhDKw@ccV=iTbK8jY4|Jvxt#ToDu`UMdxYRZ_vDRsC*`-#-z^=IS zh)L#E1ywf+6!i4p!FmSdy3_!Q{(7?ZrC*^S#Soo&+4E-ObC_x%wYm}4-3k~-B|Z>V zsHP}g^Fqh0GI`3e`j{`l(!W#2{Bd9~jg<%E;haoO@IaN8$Tm|H(Q1(!VGBrVT0r`y ze!4A8fxCL(1Tj7s#5lu-*-UNMYg{H2K98m{Bj$1wudfwpem~VyA^* zz{O-E`HWekbEng9O-v6jOya{A2FTxbA^HWbWl>aB>Shl~_azrc(*g=dc_?bDSY~aI zZGY>W1f?q)LLz>*hFbxUOl%fc2AE;h#fzs!nb6$HV3yWo`^GPw+TLDVmQ#1a7Oqgz z;-_)-4(RYIrs@hMB(hK9iyqD{%sc}Up@QW6-r&Hn5zl@;w1yD7*pR~*SxtjXfXH@r z(v-FGGyB>sQnm=mJj$-BC9R_8mAO0Tx zbnWPBr9u_-a*5A%5V-6;5f%9b*QN5Bc*&-S5+amJWX#602H`1R3Up8yF@U|6iTIBd zhL{-dA4scGt1lIjP^&6K8D@}!Qos>Jpru$lnV!jl%<;KexsIPulfBix)oSZ2CV>zH zvRopHBu*hOSH=Sj1mPzj%xPr$`X+-tVV)1I68HskrZ86NusI451=LMX+m_IvS?)Sq@kfT zX;LO=aH=8+@~)*7wURX=Y9y^PGPPjXK~|J0>?f%xmbZZ1Te>gJeYpSO-@+)9)iswi zOe6FwBH#S7$Zs}b;+=xGiug*_%h9)*oO|t~w@j_xQnh|<{yj?hS(QMab39yenGJ_>kUqd5 z%X!fzP9!Dspu5eWeJmARIEKkiUF~?!ozN!lug-&hT z^7j6hU+G|Em1~eq*6rL;T0YeN@wDaf$4_OlEpN=1gT|5fxvNvlKCU>gbmA?n&`>vz z3NB1o|0#STZk*vJiTS9TyMuX9`+JGie9gqJV#o%q_1g%9`{ zjH?||I5Rs_XBQ_kBisLI_QqCl>?BMi|B)mlBrI&q><#;{m!JSMGdl~MfB@Y8f_h{f zdU^ZkET->pA8%EZR6P$QezeXfo36Ge680Q?_Zv+ljyN2Y-}|nd6=upkJyDm9A_)cw z27w0#OAop>ixeV^YhiS>7I1gwCfRJZX4ldqkakIzy=nGSGxT&iE}$9VL$dP1{VJIN zI`Qh`=P}Te;N;rvJncU7y0z^d8^k0m85TmsXE+3#=8Z(UEYjhAMA3LT2aQ@@5nR{2 z$)xy6+AIiQynSxIBNKWqS^5yaN#uS#mZke3?E)S8*vxnbrQ`ni>rMT{A|p+AXB)Q-~)j;xt{qaEn;cb}EQt9xF>#m}B1$j|2CnKHC|o)uZq4y>M9uKs zQ?P#OR#Z6jv^8H%dVbtQa9*8Q5p-CK^oo3TGcl>>pR{*Pt z$jCE-_9bbs8P9-V2@(6CSS@Xe$qE4(gt`B)k8}t(l9_)2EE`0RS0U%0IPGIN=miq( zj=NeTpHmFyfqte4hL5|tk=BMd%nt*4E+HhE;8uN2gP02!XsmBo$WA2CfvC6=beRgw zIQy^&6DpuMJ_CRX;jr}WdN?>56uY=TyRMcPS*MDGXkEDef#ulzP%&%XSxlq zxbb7JV3$w-l~MnW8aKW5{tEc7gXUfOkP`ajT6ZPljZ{zu5e8NCnnHruF#@tsArrWu zt@!1cGn)Ptan(wYEcQC2sCIH`)7B^lgB+hGhugXk;QRCl)AQMZK{d~37a$UHy%Q7G z?e2s5dWs&R(A^Tn+j0H_Q^0fYWu}MCQz1chxAEh*(rwPpe!No6Hp-}`4{#=BhG5yudf&k89coKK}1p@#8E2!v9x+X$4DJ? zM4QgvcM-1^&wobQL9IpWuT>nvcI+R=5LQ6_#Iv8?fvb=~qbx?dQ=YtaO^Dt@ z)LPZq%u06zmf`B6q+>-OY5V7WCPVjdw(B~BnpZnS-uhIhNp(KII}o(M>i8{6>Zq%`t5krdfkYCC9zNV$j%uiP#zD}TVo+m)41%p@8gLa1KgI1DRn z&F*}g)iCUF`UCy$5{Ph$>dQ6affdo>&{}oVDEN!!g5%nDwHLQJK`=Qop0myf^pdxk zD}kRy*VG!vE*OP|$l*feLxgFDn%t9r+ibBYRACWAEER%@APw*$<-qUd{}2ktNa5&_ z{k7(AU4Rf1?xw?TX=fFs)XvMCn)P6+8@%&y3%b#@t; zBhDhwz3)}9|NXMI^Ht9?w$ZO+y?ntNhq&znhd+Jo%KrWQ4@cJ=3S4X0%*Wm| zsthr2b~M(HEu}x zs?8L>j-PWf_xnjThIfw*JyU~f>Pbar56xAqjNAOJM_1U-gYLHSkds`h-9~r0bhq}# z10lZq1-N>iwkDSu(17Phj)9-&=qTeoZq#i%k&Rl^*`Cli;V9RLQ40NPSC+h?a8x6k zvdZKZ$rT6!=*eQX`zJzGS);z|PIhq70Y_Dp*VyuNsRiT>nYfp;>1GNurQvHQ_?t5I98;~jOA76+A2|;1iw`GkVmbwvj{kKwY z$NPspZOA|x6^C-E1JA8@WK8^n>%|e)Pv}?nXZKRrm|w!uaj60q7yo^|soq+#B!^h_`h@V%;&{xPi_ zO8{2X9u$EySX8e)D~!-)NCz`JBYSj$LDY;6&0{fJ$y~?OOvDUiP_zHz>kLAMuX@GI zBwQJ6*T4m0*R4qAjH$!PT^TGT#an$glfDtwNh`>{7tV4jYW}iHPLJ#BZ*I<&K={{v zeer1}x~ZiF=3iRZz|bC+Nbflv~7wiodN35I~h*NqQk0b zp(Zy|ux_QY$gYWhjDjMkT&sA-v@2r{WTl(!TYVc|E}XBsz4t~&yx)3WQr)|~bAZXH zfj<%6#CmCzU$ed^W!dNo#8M2Ml&LVOj0HN3KsYk1eI5xM9*Vk%HOck2OM+p>r01d| zCbjLd{)WmNwQu06P42^wP&obUiW^EMvw_SWrup0?UKzvOKM^{eA`^Qu3GWKOKf5aa zl%~4HgAqug#)Z^_|CSVC-L<4hassHFZtM!O7oIn(YZttzo@tNHXpC=bbIWi$`mE-u zmGsbjug}iBjQ4buMtoYjgU)8g$7<;5t)QftkY_^euo@eK+AK{e48rL{6~|v|3~a5N zsK2L&K;vMN!Oabr)|r}( z7BbOph@W&L@?H_vf3(|V#b0N2A1TktEIO^LAq>~ig*TBMILT8R(*=T7mBgQ1E~OXw zeL7KKst~lHul|ndc^iE0WlZDeWS7@W=4{O=?$VZGDN`ncDAs6PhVtngISdosgE3i5Bq*Ut*OIMk|GA1-Koi2q zmHkmXX@)Qys!djr!Jp7~`Fa_YP<;Dm{YhY1sm8H4!tV8LI;DxedUPlDBeqX+f61Fe z&c_6@VQKfK*R#B-xEUbVJVbQ0xw`n#*;ZCl)v}>@TJa#t>+@K*M$=twU1>hl?HaSm zT$BT6@af;#?@G$p&RqS+cyd8dy+nQ$0`F;nI*CA3QPXIasEL_dM_#!qugZ!JTRo@s znud)AtJ2uPj#`<*ZX|pOTs>;llrF5jFRBXs77V#~7qn1jWv3327tsi5iRfDk@zq$3)uz|+J7 zcje;baJ$ZK_BUoLzPim4wMH--i$aOTcj{!?9P61$!`uz47NY~lRezQ)EUh{<0TcRR z_#v_?whRbNOkP0pee%P0?7;S(wc*&p+wLhLjL6IMM3Cl&X#z2a3wRklr&O;IxP40) zI95Q==egU**8h;2cmdbZf2nhVx&rN(5UynFKmF=;uZW31v_c&o?bxMOS_&X8gv#RSnc-~M)S(Rw^-8iY z)DC_bM`=L!X|n(m_wT7~-?D`V*1E6GLhcK&?bbYeWL#GC%IZQw#oa44+q~tz-_E|z zD8y2-@FU7c=|lm8OKguzVd@aME|z;^7wrj85r6QpW7G6jd+)S6IO`f}On$0F6Lz1L zwoF^Ij{?nJaQVXkv~RoOb(A{H19_gNMS`NL-mRi+(6@Y-{Hm6=!?^-Ia(0>|Ck&D~vhz1?NtYM1A?yKe!P z-av828g#JQJG2HNK{ZhK3AKF}@xF}ga^Ic2s&my!-cf&i)RvxJQev{cETJv8B`(0; z?sK0Qm{uRuc~n9ayZ{DT3y< z+l%>K9pr5PX8i5qFR1e$Qd&A7oVtv;^th9>f1Yc@f8t-AdN`TTU94V;_;Xr?3>;)w z2eKdKv|~1OLvOz6j($dA4%RacD@dpCdPL*1hBoEfR2n>n!U0`&pIL zqQUdVahM@)w@JX?;;l_^)4F$q-KtiEGnjj1aF#6Q14BvlE&SVzj@G z3LXo$C1!TQl)(^ue0va}I9Z@;i%ZvannMxVleX__@gUx>F#Cm%D=uc=<*!*0wAH5> zrNN?pC=JyvkNTjB6l18$wz z)r-r9?G%xsQe90eEl$999Z(M-Hr02)aU9MA@hGfWEHz=kU76pK=w0MG^1$3s0$iuLljC zmwP~_9!q`)2~Q6i848IhWQp5@a<&CNA1h9xkwXyU>ddJIrR}onkptm z>zv_Pyr&}5eV*#;(qC)ifzJ4^`hvuP*2(-i&2i=mWjgh`dBGl%2k6L9*e9WLPcBEr z_q6C#p(8_EF&#-Mf%2c_BiS0~3DL~sP2NgV8gc`Jn0kLufP4#Xl)Lwuf-w&!++u^gA_D!XKlWNs6kKUOF*@G}iAcn$El)tpfxW;4J78MDw;s_^h zF1Yr++&&Q7Kq&Ed`}m&SAfInNfxz^6P!h8+pBF*Rh*nxp6PJC+>tWRW^4BcyT2Eix zUd{f<&b!C$JCqL)47g;w%K|Q95NKL&Mi_p*c;l#D3Ca@%jZ5?6N1>*%>@Y|o57(%T ziJfQr35O`T%~9n$j-v%`szEdfnc{pWYJyD^BtJ$0&^eD!;-`YJvzxEydo-VGk>@#U z>~M_Io65J25V?(p)E}m86Fn+kGLEeclhCPv!HXMg)VoUWyD#ds{7Y#@K`ALrSl3vFDIiuz&tPlE>sYCxVJ1U6*RtjXI%yYJZ{s5#T8R14yH&6Siu=9noT8j?9nV6gZ+FKc@EU^rjp0F;v; zN-BYrOjdlnsxa8-j3gI+f~FEk`%4739bexcTr=l4TF2Gy&cOw5BfhcU2MYab&M~?m zE83~ku^vw6td^wU4Y!DvX?Kdnk-QS$<$o=V-SBbM(BWaagam_-VWDwHL@P*hA-~H2 zy1t^yQGDdezbAVp^Br@lNroD5BNH!^BNoE%t@x#%$j`c>`j;X#;0;PD0|x|!(YU7X zd?`Z+)Pm`#5Ax=Jc_5=`GE$QXST{~iPr&c~Qc4t;tKfWSmVtIB(y=V>5yg_{PO$<|AH#0wHVB_oW{ z0W1?TP$=4>ED>dM4+Ok(nYS{BydmFE$LNZeid67_3B_R#SKYOWWr++Q3_oPerTubX zAjKV6knD3ocQ$({A@KWt0V2l~knli&N#u~p1$$PszT^$*Q3c`s%kvFxMSyS&0HFjI z`~r#AuPQ&MazM&&2bq_aF102q_t4T%N1Y;_=gdfn77n~ldNBOO1A0N=I0$9>zhFPX33Fh8kWXk*bUbP}trN8%UyBHCT!dY4Yn=(^@ADiFrs#v z2o|ncE|n5nM(iD7JU;c%kWkLNGFlrANY|oFLrs3EwU&btD;WF!G#TVrqE$T`Kaet% zNYf!25T{)BC}MauDtes10)@2F#l=_e!sW;Q#O~-NTE_1)C5E2g$mfH`Q9KN`;70_# zfR>!^pP>sh)+V}?Il>yADLJ5-wdup)p$vQ>7IWQPoB96o!8722fFYH6xSYbUyeR0W zy4_ZIeTEYQ#dy^;^#svurk#deCH$DhOV;ki*3dKeVIS1BX^^f0L5@^L$iPU}CLT?` z4pUW6{1Y!Zr6dj7DxMX_1>UO-!UP#Qf4pVXO!`QZY$8Qq?Bx zJ%H3k>?s?x9nI3|MF;mL01MV4=MT?EXY=nq;995O>;Fb(8%aZ_Z{)!5VD4_Hl zr947*#&$Vc%E}_DWNsFoPlQr5Ew&KU_^n`zLekV?e%O%Z~&?+py={ zo*>#ItR;9?e3_D;K=s5R)$*}(8%+;AMt0B*<=1n3`;s-YT*`Of zS$yApkeh`W&mUlVs{W+C1N0yW^8Ff#;ADO9Sjy2_&5z@0ZZ}Wq|Jn*5E&h@3q$|-X zI8|M=%(9YKAy_L}t2{HwRO6#WK1JWI;rhw{ldqUp{A-zXzCVrn))&LzW87p?^g4_9 zw?F#$9 z$4$zm4g+IhPco7x23Xjc{w)&zpNoT&^Pk1>FApaN69YR5J16IVdJgt~JtymbJWM1k zT>r(hGqe7W&B^g!$-(sBI0p;I|M=Ot|6_Bq{^wq%e|7vXg@c9de|FmU;{4bCr$UbZ#MxL`Nm$vr{wMlB z6*F^?aB}@OGduG?`R{3Qq1pdc{;wqw&=~_<%p7e0*E;ABx1|livgh^G#q`C{;Z>ry zV@j45lDh}OjGi)|Xe4c7#~x_}M%ynp>anfGL>`;5d}^I~>pv;kZ@q&^8yq*Ng^qY^ zDG7y-mEdeH%Gj>+5OsuXLdFgP~V9MS_}4b-T@yO8;_^{~$uvEVGr;IyKB?^o;iZ0Z};ZY+um=-#9t%ZU|0As+ya1GQ6s_TS0Qp<8bmF>Ip~f@GNxfxnB$*S zc=ydePxx0%(br+O5x_n6L{VDBXN}>9Gmg6f)n>!^=gPB6@EIXfiu$s;`r=d*DNc*O zz_t($A|CM`;s@4R)Y-f~0O+OK+Ixfds5dQlg)S6kAOu5qc*nBSNIL@n7e*j&@Sej3vZCwNHyXpC+xRw-VZA^pf0F?D(Z(2f;ra&fh@H7!bWgt}I= zHDEg~+q1BqbJKF?HrX*CB0Qn!kn7I$t@&u4;WtLQ!y18~f+EbI$l~srwuY;WK|xlz zJ5;dXypg+V2RM7(+u7UOnP5I|bu{}oD6^RDy&h8vB|C&Ll70G*05R&3?x zf~2ym99a`e;Ew?~?Jidi@;!kbBJP+CAI^x?yI@e#?PP0hws{uaj8`V!UYTa8WBsd! zht;``&wzy^f_Zk@an~m=xB-7F$dd8OgQ7=Ug66REu72oXqQiM(j)xi`xsV%W_x)B{x_nligdF6 zFWrO(StLs3GjIOpYHUQ1a$~hhqHtNk`}Tx5`48kb17?H|sKG%0;6@FHsyYM}o%5Y# z6zB|eV6ki(p1RwU7@p?(u08d{-7M7A3DH(6&+iU>A^OLhskJFw&!=S53gNRv z0r-wq&BV}hC3f1o`XXV@*i4&YA-H0#q>%8?f=hUIuak=U)0MHu2(;0E*e z@eNUzLU|FC|Ak4sVXU2qb-1Nc_9i9l1&9N`wuI4?g)+-w$|FXU8sHIjI1oYn?sb$* z+hc~giR}%glpn&n5Hio$H^Y6$Ub~ciZsOPY5-LYL&Ut0^bb4?sWmH=h9uT_j5)4#< zknlAO*NB0TzPuvTvTA$3-d*>`Yx^qKu)kAAWq2cns`HwALu^f$9MS1dHsYgo#GP{wy!~hu zDyJlCfhWN#03BUkzEx0yFPGviN(V1OBfzb(47$^ zUFuu+RG`AGxwefFU3=mPUB@uc*%xlRH|N94u*+fKINVu z`h{~Q57U(A!GnSj_Vq-46!_>%l&wL-4qVE2IK;Esj zet+|O(Raw5>&9nunfT-f02sXg@qI^Dr%C$OHB-u%=Hngh{L(RrJ{m)2i9OSf6KZxT z8ljYNQ#>d6v&aJP@7@shh=Ip0Zn5Qy_cs3LOE$jeLhh1_96P@MTEs?Y>ILg4EO%tP zYR}LV%~x-u0!Nn>b0`+X(Jy`&4{MxdG*q20fe)-?A#0okX-c>fVDr0xjhjP_bqUvX zY~o=Dqu==xX(v~s>oLl0U#2XrJd46AS2$XK)XRbV4kmfsbp(`EYm>#J{KY`G%f6pN zTO$46jx*Bs0%tpWvW;1_=cea&^Nugw#3#YS(x=w0enZM`;Cd-5#0ymHXk}60NVj}JBYX! z82#|~lu$0Tvy^-j??hFHImUl5d}%9X(a!bal+d93Yv69iI*HGGz7qZFV-F$axg?j;haC?HhRwL59&U8|dpIp>2sYbY-) zi96V5y?>nyMv23Q;I1xl)gcqnw$!4v{|46!_Onmdkhy_mhCpjv2DeHw0c32GiRBiY zm#dPN$lL1N5d*v9HmD_{#=VT{-?yrJNx3 zo>mahaU@aT(;x`TG4BW~0`FB?yUA0T9UnPBw0TUqYggsdOM|c){O;n#Xp<}OO4MMm zP*nf@R99GlJ#~4HhhaRBJ!d9p$U$m$&q);wh$HwX@66IBmp#|Zznw!7rF?WV_vdHx{d=bcb}y) zuwOP`V_s2Z96uWNK0OeF42B88(1wDdOU@QNZ6H{Wy-bJB3fj;I;vUYJX`Xt%vsZd2 zy>TMPtuWgXS!Kwd5$43q-v|E*lu~^AVTXoJ)&H0e(tf7`(_DKcH|vOgyh2dQP{SQC z%;hFsAA&hZhd1c#4jd}_;N*vS`9rA~olsH0uVRE$aram&kO+NkM)Oju9Xv}R!jX_b zQu+8GoHL6B8SWW=6%p%(rl+j0k9r_n)U2*ErRvjti)%{&hHD%HrCBscEvCjQ5(|-W zfgi|ZhOT19tpkCEI}de54U!xuE%p~sRSKy-n6T19!z34u5ylLaQ>~>Bc+T@RsBa6rU@N*o6sA9dRLGsme)URX)g4Pf-wpC_cV35B?K^cC+-yNvdVcM0hB4 zn8bh#C*@aJ?f^}tEtIi?dNwbTlyo$yzAaEh7b{O5Up-OD0bvIdZHy~gX zCa1V!kufmPV^78lIXBw*(4cMsV&4N4sGX-;+`WUVP!V>P9#}b%X08w#3NibvvVT^d zaD<5J3si4YoE*cSAxTN~cuCKH|IPP32|C-yzcJq~Y+xJuVQqJ1o#7Jk745|3T6OH3SV<8$WP`Fie?C+aM_NOip00cI5hx3uw zQSQ?~MIn8!t|*%1tmg`-e5(2Zm#TI4_bN-@`~t*A5qM8R*bEA59w?L6m(T!tp3T?*3!4^YW8h$eCzr1Bx^J1T3Gm^Z0W4)6XNNH$Bw zpmJ9urmJN|(g@m&H z=7C8|kUXq9 z-CeTMDh&46HjsEMk$z%L`71v9>h3ohlJa-!DK02k%|VSSfSbnTielxl+2UoRjt+Nz00?heU)&DnEZ{!6qR^r`dTl z8|NRTEE1x;RKZB3n;!YGr_I6mC<3{@QwX-4B)+**)`3!x&!I+&U2;}`U~*e%jfUGo zntx`_d5X~s0*o@+sFL-CTImPP^$X4_i!Cde00$6M1YJ)_@ z?gH9EOZhPsF^AU_A@3u_3@IUGjV1s5JOA+e*Ovy0PvqW^h^6$5_4>3 zo*IUYXPecroWD9x>#*xH7k5v5*O(MoF8W8ur*Fm4EU-VwFrbJcHMBVkQ^((9E7CK{LlA`oo0GAti&d#N-7m-WQEXeBfv#-p1Fwm&j1& zAS|R04Divg!TG|YO)H8FkR#HTPx}6wSTO^`9~tp4s+B%Gr3%i)UY4;^0wy2WnB_d` zC4V$W1Bf_@foU~ppIG-@^N-pbH2_^@K0Hn-u9-_bY<(Iv`dDlzZZ07FZtH(Xr+1MgJC{vBuO*^o>}4`B0$o z+cVrKIlryW4HVCPgt64o$VsWXa2>$Yl-MVc9uAKx864i?QXIHBKo<{?RgIDRm1u1 zq5)DyIX~5DRb~?1C~D6ei%KF#KGv3;FH@-J*G(){}vj2)BdVFU9UW^e$~6K z7niviJ&;+6q{b7f?~3T1z{4=xYXDG7GeB|7L|4q-W>?alUf0B4(UzQJ)iTQUMHfYN zF~Y5}l}hI~Zfbo=ee@Yh#M>t#kDTiN4wk9KDj-BY$fvy)U_i6Irj zP)#e&LF4y&kBWA>t$e#kN;MHa(CdBM%su5yQmnP=h*xzHzT)pg1@z~8#!;k47=Vbb zBFE6{PZ7TPPU>lD@I9M;6l6-Ly}V-ATf-#M>0WQ`ZVLIaP%diwNa%yCG+Va8XsQTw zM-c+-nh2A8(yK6c?KKPua*++ns;FKhLLkgMp>^u3kp^3aw#aRzf#-AxjVF~u3lJ|=gndYed?vn5zR{L zm6t;6_s#CMK9BY8bNpx82T2=b(|Ka{yZP81aJqRJ_=i8+blRZXj=7OA%Yiw%c1-@b zEipIq5|acyb1Xv0;v0q_pnu0o+*CYW>qzLxGxR>d{f}E`!0&nIvq>oX$(fVswtXHy zT?M*$N}tWsjeQ<%U7nnO3{qSFHwA%+vyq< z|GNH-O#=Q;O;Y1F1~^zbxc)EZa#PFOMrYac$8nDLYochxo=6JSSZX_(Sk$w!y;44P zB!$=*OLkh~MX*L9q4FlU^`n zm?bxyT8*a}CYSR_W6$2r_|f_9>%_#OLHPi{_=NbIT+a1v$Fa}#1TDHWOkDzPFlw6v zL(iMS*W+SEuqFd4*(8R5r%-HbH6!@WHOOO9(c+)u&#A{5dvxX7J_4BkZrgRYtip`q!-|)6NNDkNu(^Y%C`_k zV3;_1XoDAm2I1chuZ#OjiD$aAW0-*1}T&k zI_R^x9h$NE0SY`%GM7{PyzJ4&XBO9;jkvS|o{d+0u%-v_5>$re5mOGHbv*@mOv_^l z$*$8Y~l(+kZjrfN`I7RcUS%%o#$~+w>D8P7xN$-YO5Y#LsSH zqt9x1ecrh<^c<@<`ns0S99k)zKUvb-xj7dEZWh)-$vL)RROOKtw(3b!u8EHcjZVi@!|DL!vV{m|Fc=M@ ziPI&00!CODI#{u8G`88&QDaLeg>I3gBGwz#KkIafE_V~ly7-yHe@fDcEvQg#)Gny5 z`DPdBttEUGuaq6C)ZLtJr;h=3DoyQ#>`u#rhR<~lQgfN_8@>(8UMntUAtO2(HAD}t zNJKXhKat|}#w3)%3)Fxo@uIpm%G2u@s9z3lWS=Lx9<9huOrUkG!Eg_#H!(0gt#!djxYhJBD4$*;@cbeXRPnERJp6W-FkA$n$ZzYSX(B7rUR4SW8zZ~{YBxzWyPZ^>ma`C)bsmAEDWkDL3yt3OtqT^N zs{Ee!h=h;vXW8i`Ny@*yr+Dsv@~n=Jh<&a8_~n+gB|f@oEUW8OQU-1!CtLNHpX)u* zC!j*ZCYDGKncj;u2O4%d40cR~_nxd*fs#iMg1{E4`j@k^oY3p}P+r1W>?3wyr(;5!Tw4S0{kIQuz-QA7S-Qf@;Ffl)U(neBIla^zN=vI0m-L>1kWES>$Qr8l=Vd5s17%@$$BWZCp~D4QkFof|T~)@( zc_hsXPzb`~?8xf{O1q@7$-;k`W>*U}sW2)9`L(osbzOcHGWor_sV}a;)1c*v)JZ~( zij%i!LINYq_+>Zx0qyTE{gxLy!77LKANx%=s*l`Q zL@=AJQi5%7{bvxFBh+OV|Y12REL6<@Z?P4D;Ec*ZC3L+_(2d`CCJC^HO_a z+AWpmf!oX8kCNyIfC0=3PW02fLr5VP=B0wa#`$Z>ONX-`3?o?nZiMcrpxT4_UvAre zse7{uB03J5n)Z5aJe5}LXM@5|HNM#g6}|@i{*l(<&oca~>Dq;Yt6Ekj8+93)x0T11 z@!hZLjXhtn7s6Y#xy(x@gVO%?29NRvxP$JjR)JexJ@-cIC}`%r&^P<{QVfupP9a8l zXYHAvwhz;-R?vwuM6&~myB?)3f3tTGu;u0VG2_U^ge8d4>S8M6BRfPbW;*k*{VZ15 z;1-j9i9mzsu)Zb9%h$EOk_odLc^hJce|H7V;3-9rB1hEQpSZ6>nm<>sS z_(u4>Ov6uFCyTur9+#$)4}Pj)$$sqxVEDF;Gnh!DXgcZVgQZeILf@5dZ8p`})12X7 zEF-}DkYN)!nUmHpPnF7InZWV7(;C^7k=Mw5@qL__JfJnN`IA9k$O5Esky0(*yS@8?UPo+XkWs2w?ev(=3=W5<6q=7K13o0jol@wwQXpx3 zbven7T0$YO)wwQYu=;2FS&Gtymm1*=zgF|<6<}?8CRB1;)~Nk~Q2oWyp_}N=&hXOe zWCjd+|NdSbO$o^JAIge$L)P{8mV{ENLq@!=hEDC-3ztY*7r;wuvbZ|5LxD1A z;5;%#BI)a+;yhzBTB9$;3k?F(HaxOQgxbISdoCbR0uB;mOo!jXJza!aS}1hwMcc4L z@D~k-i^mzvp_1tACv;~ap+X@RDcQT7eCH-n1s|y$Bb*Rajt+Qj{1>Z+L#uR;@k5xi z&9p_-HYlZe*-k8rd_>7m?Fb+F)XNELX;B~on=-OWFMqX-QO!2;(I+IAo5aEwdCxk!OVN)iIfxZ4JMMw3&_C6v3gv3S2H4eyH!^;fHkFllFox88 z<)%a#uNI+8C<9M#qJ3424!kzv`h0X(^Goi;t4p4oin;xGZ(81HIcj)c*XPqB{pA?-TG&{8%mGVbc($5_<`Us=;*1y@6}w4YBBLNYcZUTpF@!Bd z^jJ6rRkb7VBD{qXC$3M>FP|n2k0{!nM39@Qf+(s_*fvEZiHc2=X@iIe#f%NRB94-$ z5LDiZRlyL9qGEea9Mwm69|Fq~WYWBU3?PbPJ!@JyAdLuiGWLZx}yntzKMV1x}MGMj3t%89yB@<6aVXgh@ok*>|RlSAa zYVSL8dl2j(?R<10rT*1-+b5l34?BZFE}k!umd)nO`UzINbWfp&TSfg(9%b5P66=lW zdSpHpw=6f)@;RbzF-f8*$MVd%=2t=#_5F8m0XVK2$pau51a4qbt3+ovGSpBuRQMxT z^59kRwQ+T_`(H`|H;MS8X6D(-}m4<8oy-)1^jD(;55di&_3;kym`f~>a{P*h5{09dB|9Jx>Bzi9lGSs?HsYQhTe=*R{zbUoU zdAhuA=$4FX8o0i$yvav88q5|cM_0|h3W2+XtNDZjx#07s|Cboyw-4ofzd>Fr;0yYWh z?^ zJeqj1kZ^6V((o~WA$NEa2iA>#4Vei)kSq`v*Mb;cJUBeSXjAhdXFnGw=bol25?zCsr4C` zFqvnf67~(EV62}h{V#+-&^@^irJbohVu%NiGIFEjWQ|^EpBZ?)ubo>G?So`wd{h+u z)fg1Af?^CaI~>@_p$Q3zs^neq#h#bI-+Q^4 z|N8u{!vge)v9*&eFPQ)UZ;dF($1DzC&XA6KPb+) zlub5@^X#@v>HMe`XVi;;<+n?Ziu2%%?i;CmShl<>Eb%x!*RyhV?bhL?O@eHcOqDQ#jg z(1KI3M_?bTXP4$2En$w{?_7Q|#@&H#b|aF4L>>J>T4gVS6*bE;E+cNVte(NMX?}># zP8%OQo!BW6pWLC}-rN4kaJBz2b@S|Po}VhI_v>Z8WO_}o2P1?w4ty9DbIdTe{*J?? zb@Pr%A1)?znUk-Zlo_S-)}bt2tHAj)l5g|a{oN4mK!%0?rCRIS@XNU|Vhe5~knl|U zkAm$VC*@(OW`qv5CwtAAro7jmE8c}S9E@ee7;1Wb+kG~<+@;I!nVM#iRrA$)hC+yF zXHm9#76;U?5grGrgcfp2*khi7xt_;z$*y3@sPzcCdlzZBFX6eAiW&>+#8!-MJKpz` zo82fFKihX?j4V>}vzSlvpYrSmwz^L7E)ITOsQ9!#ku2@yM}MnW>~fZxpBT3BB_}6y z->q}VGhR|c>SSvquthT9^n1VM_U6^wj3lvs?e?c@K5D#>-t1!7BOtxM)nwvP{%;UVH*E>%x)B$HpNg%XOn;X5T=^aQ`e#&ra7Su5rZKhJ5&8%leTGdtI? z8b;4<5&#U6JkqbO$mIqjAr6osXX`?5V-FzV9TOYuNl%Jn2{ISJ!a%@FeCOB$7)qw5Xss(ns?EA~7ls5L0dkHn zC2xu%H+ZwmZCEp^r_X7ez7p;Aba53}v>vSvB^D0HW$!nF3=9HYeTVAiI4!RNO*=Mx zmS2KHtC~^TS>g3flLX{v5RyGjq(vx^q`6gpV#67r7T z)|rXe`xZpWP(xZi1}3%a-wt%Q)T)m76^Iz_m2fdjTc4gUx`M>y^+ubx2!Cpj>#KTj zQxL4wSWYqxI!|;os%*;O{gBE}u0F9iY9f{9C*{TEpQ?de;O2-}r+D;x=<%2i|Es#5;uam2aCu&Z0ephdHCUa$ zv~*S@9GT@Wt6B)i?(MDEo-mc+N@s$|%T+m#IJzv6;mG#Z5Xw2Fx8+QSwofzKsfH1b zYAd?~!X(lUwsT<@8_5aJro}#_>(!3<6XsvKcljxGRF1xJsk+)Ro17$eopHxh`mi`No%JR_M&N_<+CwQ`L!yWUbUW7i$g;T5)HmbYIi)Wk+l3RG zEdec7sxs9Ezg}COT^br4i6(`{>{pnKS#j;`6&;w(JUfs2Cf;4PT((@Y9DNWlv>dQ< z#TSP1Ik=v9Ip(q+29l7+e6}G}JMoU={GoRL`RYow%pJsa`L6IA{dt$l5|jW}0moGb zax*Hob~;4}{WX=#?#`;%!I3frAv`GQn?W<$7!(TSPm6DRvIe>h+UFSZ{T5$)_|3Ds zO9@f{xn&s9y9T0G!0%AEordVi{$Uoq#EN9F)Xwa($12sdWzI%%+Z7eSHxpmM)pJqf zYfE_R7_BqK=xL#rQY&Y{)H>8E1Es^-Q7~7DPgS4Fc6)Hv$*P&^o5$55IGX$(B^B~Q zg+CPgpC`f_tLdS=JMMV<||=c+H> zGo@<3kVVi|@4peRK_GI!*CB=y%76_B8k-K59tl|{05%Nf8x8Z$+eV6H)e7Y#3dp4P z@KtM*5%#f9rc?AkA#H#RO03ISrf`-iI1z8~HN~NOx)^cf`fvKzP@7=6xjx2x{8Y@q zQuLGjt8LO%hfutaV_V@F>q1cDq)n=T6{gZ4<3d<5&cqWE8YfMp2M#hE3am3WR8aQU z2aXrb1RVK3|Fyo&CDJ_yXqNQ?I-AT3siYY~LxsC!4Hx)=&cF>NZU zsbw*Gil6ja^o7kdCO$Rb%8?s>PFgq;xcJ@(KZx~>F1NRN8o75Vv0*uycABw*Ertg` zHmT+fN$cWA0}M(VimWe)SMrfKNE-{oi~-en6PSU_7|RHv?94t+)<*xdVaVjd6*`wb z`A*##!R8wx<30mHPN}9ElY{^j;@Nu~`9^tccyzfI1M4yPGdyi3v9eb%x7CTG083ve znLArt2cGo0xqN6Z>o+Sp(*JIAK$3vR+Y3y}e9|r(2UXi2 z6o{vLoi>7};FMOpw5Cgu3Hj<=?&<$|J$}x%k#A%ax+n#~fn$a?#ITN3lW`~U#R8K+ zs;T|;hTOO!)7%Qg{lVo`z2D!Gor(mfm!S7!mpk^=E2NerNRikuCk9G<`b6U;^ofT2 z)8k$UG*QFaj&+1LB2gr`N0Bbfnl(viHnx<}wNDTYyhina*2@)}*6YUu@LCnuc#)wq zF;-^d^YRA}Bxml}IQoK8PjLKW9+Kz8vnsj8vHj%$d)d*`q1i7|l<4JTHg9*fi}{*F z^~tJ%*%4qUL6cj;$cw4HxXJRl1$2>|>s^+*-u-rwA=u7AW0bwG@;+~q9%ta>!`rAH zR5K;6_zbO$h3bdr0-xIMIJwAd7*-@xNY-$bb)4uRPx+zV3u|jF5(Mp%m~Qm*EW2Co zs`&)Q-IQ$!kH9$B6HFsnIN$gb9aLz{p{QRhFQdtxQ>b+K^DKf17;%AQFeH2DX~4? zct{zXui+fev1cXHggKJeZL{9W@csiE?6o)^>Ks` z92qeFVm3sC~ZXrwp?iiTxDZ zi^>;%SJ!pO!jteBWBMfprW5Qvmo(`Pc@u>N46Eli@NF#8CYxJbk^91tqw(vE2s_cWoN zR!~{}o*+oZ%GmPTDuxH*2rBQ&;gL}HF%`3Lp#K38Su%Jegsj*wB_bep-^)IxBQD#N z0Tyf+o$Z=5oirXvP#=?yG#-Sc0e8oW@I=ObmPk8B*qN%T*YqAYU~a^I!k+$~%v@TW z>`YdY>_jG;{KVChJ{W@fI^BL8m4q|iBW^~4?7w^+#K-m+A6;@$i@wRCv_{#Lwf~AQ^CQx_N~h#g`N>? zed{%h-*b_XMJX);F_2PTEdm3~Xzs%t>Zs*!tNEMwf&E+18TBXEOOaD%t42(H+8^&A z-`%U(x?@nsPYyYTAgRKGX`Iq$v?pn2`vm;-2m8?gp-Y}T>2k%VR%~tOr=$~hi&Cl3 z6qo@LZvo%Tmp7WG(~&Da>DSqInrw_F2`E+cwsaorD$=3n1DZz%i(upk%^fl9Ed)eu zMa6r${nMf@hW~{yU+fP;JR&Y;f6;Cw(oaub(bNpk`qM=F(b~x6TfV_rEUI~(b%;k- zQmRmoCc|`xKSr>T2+y`*cmNa?7Hw#^X+?i%te~!^_QxFshuBg5HAjI3fcIoUe~`lre-Wv}sHM`zm4;{H><2aDd51vv3zas`mUzecD(^B;-;0{(R| z34#9I2?_s8A3$K?d)w5%MB<(_JO$pHlkPdg{Z0r@_WU_MNKYWVmrRZijoAlN4IcNL z0Ygx<0rA`h0|Nwx6FCLpgLVD}fH0Nd*-rliv^v>hU;u^TOs+xrf`)$s!1n>wuKxrK zy4qo&1K|Q5`H&vxUI8NcgWI@Pvb=cSK^@)5LFR{0U0mkv>S91KPg0SwVw&0sDq~lq zeCtDUe*PReV7LrwpN&??FVrgCNM>SD8rtm#Juad-rVc-zGM5-7vKCqMkv3asMwc+F z1$^$AQ>z_ho*5E(WO=wL%hVk`c41&b@WBhwPP6xD2a+@AO1G|zWw(%z3k_{1QCBwf z8ZA$mTC)Rxy;Fl$Zsn8#esbM+u*E)9q$~xWadJ2u!9=5wZ;XeOkYM>&{nyNM;tK&) zJNjk8AE>vWnyF$_mwa>E3s5T}b1l8bL<{jta8A;dMx>zsn$mGoK#l|=W|JG&k80xT z9B>B~{(&g!a`mwiSi0-7a=pZAX>hOmZ-Dim=9qshXMek6-lHf?uVe@>p^O(9_TfqQ zxI=FR?mRuKt_A;~^3r?zrNv?UudX?S)?k%P{ZwV*S)vD#_coaV?(Y2jy*$ay*a1`x z%n0hJ+8xVvgcdejKx@E-X=;=b8j;56%UI+dzCREADYWRITING †CANDIDATE †FAILED ‡TRIAL *UPDATED ‡READYstartwritefinishcancelinstall:install successcancelacceptcleanrejectcleanTransitions———Applies to a single component———Applies to all components Volatile states*Always:rebootis equivalent torejectandcleanAlways:rebootis equivalent tocancelandcleanAlways:rebootis equivalent toclean \ No newline at end of file +READYWRITING †CANDIDATE †FAILED ‡TRIAL *UPDATED ‡READYstartwritefinishcancelinstall:install successcancelacceptcleanrejectcleanTransitions———Applies to a single component———Applies to all components Volatile states*Always:rebootis equivalent torejectandcleanAlways:rebootis equivalent tocancelandcleanAlways:rebootis equivalent toclean \ No newline at end of file diff --git a/doc/fwu/figure/states/no-reboot.pdf b/doc/fwu/figure/states/no-reboot.pdf index 2e7372514fbb182689a6d5f4753b1cdb81dbd206..485f9f353982f79b23cad182a32172c6000dbd47 100644 GIT binary patch delta 22269 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 delta 23419 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 T-i!~$L`4PgIXD!xmGJ)u7lIB+ diff --git a/doc/fwu/figure/states/no-reboot.svg b/doc/fwu/figure/states/no-reboot.svg index 1079b942..66ac2b70 100644 --- a/doc/fwu/figure/states/no-reboot.svg +++ b/doc/fwu/figure/states/no-reboot.svg @@ -1 +1 @@ -READYWRITING †CANDIDATEFAILED ‡TRIALUPDATED ‡READYstartwritefinishcancelinstall:install successcancelacceptcleanrejectcleanTransitions———Applies to a single component———Applies to all components Volatile statesOptional:rebootis equivalent tocancelandcleanOptional:rebootis equivalent toclean \ No newline at end of file +READYWRITING †CANDIDATEFAILED ‡TRIALUPDATED ‡READYstartwritefinishcancelinstall:install successcancelacceptcleanrejectcleanTransitions———Applies to a single component———Applies to all components Volatile statesOptional:rebootis equivalent tocancelandcleanOptional:rebootis equivalent toclean \ No newline at end of file diff --git a/doc/fwu/figure/states/no-trial-volatile.pdf b/doc/fwu/figure/states/no-trial-volatile.pdf index 0ab658bae1a7b5179d970a3228c223e9edd429ed..9f098e3c26ec8b8f91d7b7f9c972c08f8e2cdd61 100644 GIT binary patch delta 22818 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 E0iC|s;{X5v delta 24375 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

&7?A9j*0>g{2wj1R%f+M^GGlbIKP@yV zqC=2W;J+VdQ$T(%#CLx1FeHzta{1`m@O|*Pu6!Z#f!Dbs?dEz6}wSl74S}!4R9x_0L!bp2E(g+4DZ=m374L+hDiJ4 zd8l2XST`r>bSK(offW*i3>D~A>JC5>-RPCF!pq`)EW?@RXt*`+~PIk=AcBr zB`j>WNA9qFpS~_1QYsLA-^0Q_D3o5@&mZ)=dB(r zc7&gD5nWC&4N_eU@nhMl;R<${27$lpiw`{{W6@x-U9FT`kd*GXXd^5&w?t6srpccvy9sY>SU+_{B? zKOM`egVLHrn=)G%48=?@u?%4Sh z@KEEQTbk*(Q0VZ?XBgElpMG|%4V%7vYpiMnq#zCxpYqK@`@_ zW}PS&LdEu!K|}y~LjY+I2`7!eMFCM; zt}eDz(dQ$MKOk+;PQEg;ms$ale@-W+Xx_!TVpy;os-}!8(B_w9O>vRM>97RqEvnzz zS@UB0x8EB@;~(ZN?@q4L;-Tbp+Nxpo# zVj5TrzMn6ITPojmvQA%5flWNegox zgm$+XSk~o9aZ(P=BEILK!HVE3QpF6x4@yywBx}%ve|O+D+AHe`cjVBkY zLANHp7aOYYZ2Qo^-Du5%zxa6j&iV#CX6W8QxSx>GF6f2sSXXCe(;PaIsL^WYZ<=(O z!_myk^OOZ?)GPcJna$;~_t_L%KXmn6^56 zPnLswP9py|W`PPd{TH(Uii->V2ebIcC-}=-NJ=sZYTCKh4O^$7;pnR9DrxEc4UoCp z()>3-1`zspfJ|8YZx9O%{y$q7DCyq-nUI~<|I>A}-5*sUA=G7oME=?lBEsUR?ABkC z0x0~Sw3jgOU*v?a@IThYziWSw{RKUM|7nLZLD21A5{T#nLb}Kl1RgPaqH7@hP%DWD ziPwFwfARRSh$!O0(T_k>_dfy=bQMID(?5a|C+o+Lfgl8-iywgy^gjYolpx*ZA3>9g z&0{nmg3-MMmMfT{I1$ehR3cAp!{n{Q8-Oij{DMkt&G_Mt#7sgt`>1Pn`i~4O!S& zE_aYN^;(Q4V$p6^K7jSp0Fz6ZRt{UEkTMQondH`*~Ts(3NCUDcHubqkacjcBW{_M-(f^ zdgFSZw5(Bz0n6*l0*xw>Sfz98%(9FUM^FODymc&XdvM>N% z!4ClKupBoQjhPi=hb_heJ+`AQ`b!OHKq3-B2&md1s6BA@?t4rY(Jd#AQzi((3-M2o zu8>2pe&yDCL?K~@HR_f`+8inuyV2}O8_Vaxp##t+LP*S8?Iq%^s`fIGGpygs$TMfG gVI=wa-k{e?@y#G)Jn8U(0I-MREADYWRITING †CANDIDATE †STAGED *FAILED ‡READYstartwritefinishcancelcancelinstallreboot:install successreboot:install failedrejectcleanTransitions———Applies to a single component———Applies to all components---Transition overreboot Volatile states*Always:reboottransition as shownAlways:rebootis equivalent tocancelandcleanAlways:rebootis equivalent toclean \ No newline at end of file +READYWRITING †CANDIDATE †STAGED *FAILED ‡READYstartwritefinishcancelcancelinstallreboot:install successreboot:install failedrejectcleanTransitions———Applies to a single component———Applies to all components---Transition overreboot Volatile states*Always:reboottransition as shownAlways:rebootis equivalent tocancelandcleanAlways:rebootis equivalent toclean \ No newline at end of file diff --git a/doc/fwu/figure/states/no-trial.pdf b/doc/fwu/figure/states/no-trial.pdf index 10381310b65962ccba302f24eb3159f86f02988a..434991f72b8ce6cee6af36e0dd2b050c0e4964a6 100644 GIT binary patch delta 23422 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 delta 24853 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 †CANDIDATESTAGED *FAILED ‡UPDATED ‡READYstartwritefinishcancelcancelinstallreboot:install successreboot:install failedrejectcleancleanTransitions———Applies to a single component———Applies to all components---Transition overreboot. Volatile states*Always:reboottransition as shownOptional:rebootis equivalent tocancelandcleanOptional:rebootis equivalent toclean \ No newline at end of file +READYWRITING †CANDIDATESTAGED *FAILED ‡UPDATED ‡READYstartwritefinishcancelcancelinstallreboot:install successreboot:install failedrejectcleancleanTransitions———Applies to a single component———Applies to all components---Transition overreboot. Volatile states*Always:reboottransition as shownOptional:rebootis equivalent tocancelandcleanOptional:rebootis equivalent toclean \ No newline at end of file diff --git a/doc/fwu/figure/states/volatile.pdf b/doc/fwu/figure/states/volatile.pdf index 15d170aa05f12674e399613ad39623a5c608c97c..ca19dd3bec0248dfb7158429188591f652161964 100644 GIT binary patch delta 24495 zcmaI7V{|54yEYozwr$(CZL4GZiOr7fblh<|wr$(Cb$ac0e`BxxopDapkD9lx8};WJ zb5@lGg7iHAC&&Q~b+jGuhLQdA44LC)LGhmbu!MnDRp78Ak;mnNgr54nn^;ciq%(?1 z54Mjhi!7gZs#2S?(;|qP7Wq~6^^Y|-fA|FFxkL-jhWop1er~Mh`d|592Dx;XEu1F5H^TCTij^uh`LfC>_;u<6*@r+~`c&^`pgs3X{kJS~-6{WqLCB5t z@Sz2&f$+CM?rQBH&)3Ja zDwT;fj(14YFVEZgDcI=iY-vj@KJCXkA^Al(vv(MBiOPf0-{vC}wAQh+(!6LFeubYv zzjR_jr!4$^3eSxS)DDmEoaR$PjM@|MlQGlyZpcIUNhLEEiFeG84NxUp7yXp)|?ZK=%q-> z*>Ese*YA~rCN!piW9d@odn({Pi!v;VQ7tjekKkG7OOkaSX`*J#Sc?;@Arl>3$xFIbt;Zm~bU+Uq8xj`W4}|p3*A{0OC8a$&}aKHpqU3X&)R+W6aGnYf)6- z%#^o}V2<-YLc*&1!#t5K{1xT`eHpW?9oZ1M#PtJ|eu_c|q_{5W#5%f3O4XPLUnre| zHF=GorLMjzc2!LF4}05S*4$1Q6u6mJBFz>fZ+btG3w`_XabZ6xziDKIped71LUl4^bM zqdFOW;47=h@Bqh7{j%3C=PZsF&y0NCGJ&-UXIxu3KY0Q&;seVMaY$R!s>x=8*ltb6 zF7I3L<<@QDk6L=kb57$NcG0FJ_?%E#Kq=eRvUi4t9Tm5QJU$jZ*Ib3;;nD?hbgZ>% z$teY>P8pQ~MpLnF#QKZ8t1X^czI0=TgxbN7GH2s2ptwH2oQZJaT(o5834cr>>SL*V zz}L$Vs6FEfKb!ZY_UQY-LKv$?wFvjID+Mb{)`<)SDvXS!8Mgw+5b_2t_97cSpcl$T zFSj>OUMecLhd@iaicGc7tdRegc1i7*MKsE(ghV8kot?66L+2rBSe@v>+>%ewAJ*4f z2f$_+S-0ZPs=3hG4g#&EbqkVsqaA^8kUoeUWO6yS45@O9LMN3bUKSG8Ch`@r{X1I{ zXDebJ1wHfVVX=3Ac4gawNR@A8fIxzeW$@3>W=_7mH>A8ZCVbWz;bF2dKe_o)8H-3! zA;0dclsF~Hs@Sm`J53z$g(IyC2la{Bbjh?b`;m@zv=I0;0@*h^+se7Riz!0_$Mi+S z0H7+Yggul%*CZ9C%RjTI*MzAah-XpvB1O-n92<^kI`cSeYD>!F%5aaGfB=+0N#poP zI+1`M%L8TNZ5~ZQQb!yP)_4!x3^UJ6*12I%Dhg_|yB(&Bgw=;5V`ejXz!%nn9RCPcdRh`9gm%yno=5 zmlG$WoS{*}(R)NbLf3>z0a!u6_>mAbgtfRM4EY?qMg5KWnjx-b!q7yVd!Qb~0*x;0 z-}R0@;k|39Oj4L>Vm{M@whT7)HVyriL|gBcDB-mOu7F_cqVUAT_D@fMK(d^rjzW@P z4;pIArWI#U`gh3a>6kd^(aT9RmqhLii22OHObkSfwHP9LNWQ4m0ros$Tklmzoulu8 zAU}N_474i`Cv7^d$8by{AVvT+3S`KkQS^b{E4q*!=`D%KJLGAJU|g~8a2=Q8QVzcu zqFfcA&)TLnAgd%cU&O3HovtItMH%iDG_tnz9)juPEt)EE51J;Af(;~~;jvLZ6%Py| zox_=9DKIOC*lEIu0moGfr&r*X&ig+O^dkJyS|gLc7-;ZQ?C(QQ$3YP!S(A$CCZO#{X~K{G8L!H#k`ux8*Oz!MBo zPXwlPUnZS!f#M2%Q-JJ1h*2cN{=;{`@>@v^#U_);4-B4&4$vosc19WChL_ugdO_TH^06mh@WAAolC((`loTAUO}h&9(9 z4SH7svb^J`m=w)TqDSaF@umuSK3`R9sBUqOlZo;-@QKobva;uGUuT*$@fN?zmEu2)T4We)PQj-m%BmBz;4MwqWHbwLcVoSso5#Fl2!x; zr+z`h$9kTQeG(0*hYmtLc#QTn*y7AkoBbpqij8xT1~3-f%WaKcxtPQ#pfMmNZ#OWb zoiU!>+;no)z@y?CNL;_KVczArQ4P@fO`t&E)+|9I<@<+7zMpFkBz#4xpIq9FH0Q$o z{KgDD&bE*P1TB^iMfaYGe}4$M-tn5JiuW0;@C9#ydEm#0v7X7emWt+ytHko#YD{^@F=L~&<{c~&hV6C5WA5^@-1@F zqO*g05fgu|o?UlvRX8+oO3$o^7&^6Fqn)ht5Rg=HPx=cr#;gTnaOjUlW8sC$BJeiE z8mg(Xzz$0u0AG9M#$34|-NzdV@Q0@jW+kBoxP1O-R(#xR27UMwDWxMjkOFDa)xtQq zM^qA>;x3e02yC->hMwtp>;_*F(#rhKl4p-B50b5bP0lhCI8n$b?X6*KvEp30u|W@o z2w-tCf>MF>>~wq7>(nL)_~+v6VTjHbxR z>Iz(PJQ%5fLzk7-Bte}NUwg<@)k}R$0zhw!yEZ#PoAP>OXu~eqvp5)sH@z$B$Mhtb z3(wY{8O=E^lsZCmB?a-2eKlRl+k<_g--`S+CAyigzM@!A81?@t#4D>KBK))FF}BiBzBD}(H$@Gm=WvAiNdQ3sG8T`y&hDEh8JlY0@{vz zrH>H>Fa@~WM9?c+)ynd{T;3zoi@-|IWcL{r5!U^LDG)OO%-C+Yn zGb(}c8DG{QtORe|{zM_nKzI^RPv2}}&ErErwp;o<j2OBm54vv8r>o5)8^7PNlXdGqm!l!uj9U3mEzG?@`UgK30h94rkJO4a z_P@6`x2hZn#8K{f5FRc|L@dJ$F&Q+rCrchW#JdHratC=(CIbLrnrN z6XW%pnt1Hpr~h70f8-Q#Y}8`u6;wD$h*ZHAm_Za0KiQkpF~5hd-)i`;TgJmBg;(gA zbo&Y^Ah&IXx2Lm3FSP^!`MdU2bGvi?cWvQ^{cl2;U~x81){5wP7qmh48c~p`M&iX< zK{R`-N1rI~uhXBF@%AHwFM&~~CI)x;y*;E=J$hth`zFhKrfo ok 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 N;zDO+lv0sK{~wIH3km=L delta 26212 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 †CANDIDATE †STAGED *FAILED ‡REJECTED *TRIAL *UPDATED ‡READYstartwritefinishcancelinstallcancelreboot:install successreboot:install failedrejectacceptcleanrejectreboot:rollbackreboot:rollbackcleanTransitions———Applies to a single component———Applies to all components---Transition overreboot Volatile states*Always:reboottransition as shownAlways:rebootis equivalent tocancelandcleanAlways:rebootis equivalent toclean \ No newline at end of file +READYWRITING †CANDIDATE †STAGED *FAILED ‡REJECTED *TRIAL *UPDATED ‡READYstartwritefinishcancelinstallcancelreboot:install successreboot:install failedrejectacceptcleanrejectreboot:rollbackreboot:rollbackcleanTransitions———Applies to a single component———Applies to all components---Transition overreboot Volatile states*Always:reboottransition as shownAlways:rebootis equivalent tocancelandcleanAlways:rebootis equivalent toclean \ No newline at end of file diff --git a/doc/storage/figure/callers.pdf b/doc/storage/figure/callers.pdf index 81a4791a3580dc0f811a4942aa75968020b16c01..71b7b2a186c89aeb4a57c737f7f06348ddf1d488 100644 GIT binary patch delta 18954 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 KX;ECLsQ&<(R&;6r delta 17151 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«Application boundary»«Data protection boundary»«Application boundary»Application 1Secure Storage APIStorage serviceStorage mediumSecure Storage APIApplication 2 \ No newline at end of file +«Application boundary»«Data protection boundary»«Application boundary»Application 1Secure Storage APIStorage serviceStorage mediumSecure Storage APIApplication 2 \ No newline at end of file diff --git a/doc/storage/figure/dm-authorized.pdf b/doc/storage/figure/dm-authorized.pdf index bd5fbe8d9edbc3133a4faf0f68b1c6807e23da42..cf3d1521bf259c56ffb7fedbff47a558831e780c 100644 GIT binary patch delta 25050 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 delta 22797 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�g&h1%tNB{TLWuqedK<1opG*P6xIpQXP75O@SU)B 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 OAz(r-E)_jh!v6sxE3no8 diff --git a/doc/storage/figure/dm-authorized.svg b/doc/storage/figure/dm-authorized.svg index 44032111..f1334af6 100644 --- a/doc/storage/figure/dm-authorized.svg +++ b/doc/storage/figure/dm-authorized.svg @@ -1 +1 @@ -«Device»«trust boundary»Platform Root of Trust«trust boundary»Replay-ProtectedMemory BlockApplicationSecure Storage APIStorage serviceStorage mediumDF1DF4 \ No newline at end of file +«Device»«trust boundary»Platform Root of Trust«trust boundary»Replay-ProtectedMemory BlockApplicationSecure Storage APIStorage serviceStorage mediumDF1DF4 \ No newline at end of file diff --git a/doc/storage/figure/dm-exposed.pdf b/doc/storage/figure/dm-exposed.pdf index 8217b8c303c0a8183dc8dcffd04637c639ec8050..27bffa846a14022e38a2e2b6077f9fb30f627c9b 100644 GIT binary patch delta 23943 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 diff --git a/doc/storage/figure/dm-exposed.svg b/doc/storage/figure/dm-exposed.svg index 8dad9896..10aac56d 100644 --- a/doc/storage/figure/dm-exposed.svg +++ b/doc/storage/figure/dm-exposed.svg @@ -1 +1 @@ -«Device»«trust boundary»Platform Root of TrustApplicationSecure Storage APIStorage mediumStorage serviceDF1DF3 \ No newline at end of file +«Device»«trust boundary»Platform Root of TrustApplicationSecure Storage APIStorage mediumStorage serviceDF1DF3 \ No newline at end of file diff --git a/doc/storage/figure/dm-protected.pdf b/doc/storage/figure/dm-protected.pdf index e8eefca8249c0e256766bfe17ad83a62c13f3d3b..0cc0a00cfe9caa278578c1d60d437d61ef8cbfce 100644 GIT binary patch delta 23953 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�NFYX2}aBfj(DRe z9)k@$Ggx1=a8sV=cgnIfHc#Ju_DFx$ynubcIplhPrxz++y+LSp z-egm|2Btx~07(fGl@`td(?uP~x})<6x~(q^DEudfJf)X2r$YajzdALBp5b%r52G{j z0ohq&(4vQLlE_kmBp>*~jzF0g0eo-h^m8vSx}RE6R{=o79=UCnuY{shFXRbv>;4eQ zEh?$ubX@j#1Fv<7Ho|Q!<9hkfMDj#14oxJ{r#SVi*EZ0qKV|M zt-nN)LVMqv)HX)7HcTF)FM`?<`n}QZHo0%5@|X};KU~0Y<;&S4sL4x8R!f!Sh?O9P zVeo@1KEma#ZKLq~1RP5r{dN-#xn%d@7mMSq2$0Z5RB;r|*m;W110_c&3jdx z7U4?XuEyG?9=GopX!o}|Qmb-9c_~&&@f{Xn78@bUiIA-5HQ9{ZrD+dT&+&(^y#z1x z!}A{#WnPCj4I(U;h!VOEQCa72fL6}cN;wS%r&KMorHR#JC&Mo;@Wl(Rc%Mtrdp0+B zaMRptLp*aGe=?`TZ-}(@g;6hY085I>RaPIn)j_Pj;9{NkID87Z0?eogS3N85; z5xc}+CRpnDk9S8`Y^(=B?UhB480jYZxPg>tz9@1A>zKe@>0Y>KSJno1GWsJZcG>w|EhkRhEph zsB_q!ue;dRsT|aKZtwTaJC33BJ!*_MjiERRWwNU3*XWfQ_kIBCnimwpP?CURpj!L7 z;{a|cH*f^ZgQcr}-s3BKhuTl~Ijxui&vj@z{?at6Y2$Eked`UF+etzRuBnQzB%;bI zaO=JE2i=$Fw;gX-=ROU%N-vJMV?DR49&}%_uaApCD83o2hkSP>;zJCnu6;dG1=E?Z zAhrk{{M@>mI@O`Bc3~+ezrbHF(LF-#;WfCQ9Tt6vMlWJfS2z@)7;l9a6PxKqwz|=t4&2noiPoN^ydq2 zB0vhvl5qn?nC|u4i@A`uMX0oYHbuZB!lyD{cg^9FABzoIHAt@P09H@crG#O93UUZY4cEd%Xj?v=I{;v$Fc_>BE<5A(SRA zkvZUEwn;9aHUJCK8ablbwi~Y+_HCXeO(~2rSi$Qwfh(xu{w08YQUXM)V||t2@qO@a zZBCOiWbTe~y9$~t5@fq<5OUF8ve+z&dcl6LB%HNxT%*ZiG_&kU)U%7fWHG{2^~O_T z>K9ugAXGbg=%vgr?tqy}k(DLqWmR<}!-yeDSZ?OKKkWivHzQgTc4=ZyTZ@7~EMJfwZN^!WBg; z#$vF2Cr%i#!z1!)^kE18j3}sqy#aG|V8jB05wQ+-SU8gCHKQv7{i%I`}cH^myKtmJ*Tbj)#A)F!t4)Zq&`+P9QQJO7qjZdZn%0-cNV&fe-`Y%L8J5S znf-tMq2m80%7Z0Au*qlqSi-`vPhbWZlZOhlg($=Zh_`>ll7@6tK#^z)I#kCXt>Lb_ zXDx|6%&LHqaA)BB0~LxpqZTMT zhmKc=z~^)DdW>pWq^^QDHbfnM_6~b}*CZ=sO3A#lo`Y*?9aAEunW^&*7w(d77*a2; zh#A86lpGpH47f|`WeUdWp>9g#;+DFfy0}W0Owj}rD#FuWV;bElF24HN9OC@;LN0J>T`mt)m0<>FW0fg_5c6? delta 21510 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 z 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 diff --git a/doc/storage/figure/dm-protected.svg b/doc/storage/figure/dm-protected.svg index a80b492b..30fa4558 100644 --- a/doc/storage/figure/dm-protected.svg +++ b/doc/storage/figure/dm-protected.svg @@ -1 +1 @@ -«Device»«trust boundary»Platform Root of TrustApplicationSecure Storage APIStorageserviceStorage mediumDF1DF2 \ No newline at end of file +«Device»«trust boundary»Platform Root of TrustApplicationSecure Storage APIStorageserviceStorage mediumDF1DF2 \ No newline at end of file diff --git a/doc/storage/figure/dm-secure-link.pdf b/doc/storage/figure/dm-secure-link.pdf index 4367dbf6d998815090a6c33275f0cf51d73fe54f..8da0606c5f5c70d39a6e6d85a9351944e928209e 100644 GIT binary patch delta 24535 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

X6t$5sGKX|hnB5+*bPq5U6>}^< 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«Device»«trust boundary»Platform Root of Trust«trust boundary»Secure ElementApplicationSecure Storage APIStorage serviceStorage mediumDF1DF5 \ No newline at end of file +«Device»«trust boundary»Platform Root of Trust«trust boundary»Secure ElementApplicationSecure Storage APIStorage serviceStorage mediumDF1DF5 \ No newline at end of file diff --git a/doc/storage/figure/lifecycle.pdf b/doc/storage/figure/lifecycle.pdf index 66927b7af259c003db4bd763378d11fa201eed1b..48c3d520f67e2be730964d28cde2cfee2a16a142 100644 GIT binary patch delta 15140 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 O8#f#!rPvQ~xc>saJer08 diff --git a/doc/storage/figure/lifecycle.svg b/doc/storage/figure/lifecycle.svg index 0b79fe6f..4a2b5d92 100644 --- a/doc/storage/figure/lifecycle.svg +++ b/doc/storage/figure/lifecycle.svg @@ -1 +1 @@ -ManufacturingOperationalEnd of lifeSystemmanufacturingand initializationProvision ofRoot of TrustsecretsBootSecure operationReturn toManufacturerSiP and OEMSiP and/or OEM[everybody]SiP, OEM,and Owner \ No newline at end of file +ManufacturingOperationalEnd of lifeSystemmanufacturingand initializationProvision ofRoot of TrustsecretsBootSecure operationReturn toManufacturerSiP and OEMSiP and/or OEM[everybody]SiP, OEM,and Owner \ No newline at end of file diff --git a/doc/storage/figure/storage.pdf b/doc/storage/figure/storage.pdf index b0df9918eedc0bc779ef374fd02d05b95841030d..f2dc2ca448e865618f4cc51c82934a5c7a3fdb71 100644 GIT binary patch delta 16060 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 delta 17719 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 Root of TrustApplicationCryptographyInternal TrustedApplicationCryptographyserviceInternal TrustedStorage servicepsa_import_key(key_slot, key_material)psa_its_set(partition_id<<32 | key_identifier, key_material)pass/failpass/fail \ No newline at end of file +Platform Root of TrustApplicationCryptographyInternal TrustedApplicationCryptographyserviceInternal TrustedStorage servicepsa_import_key(key_slot, key_material)psa_its_set(partition_id<<32 | key_identifier, key_material)pass/failpass/fail \ No newline at end of file