16. Policy Boundaries and Cryptographic Assurance

Provider selection can make cryptographic policy more explicit, but it can also create an illusion that policy is enforced solely by naming a provider. The educational bridge exposes this issue clearly: an outer fetch selects edu, while a second fetch inside the module selects the default provider. Understanding both decisions is necessary to explain which code performs the operation.

16.1 Outer and inner selection

The application’s library context contains its own provider availability and selection state. The bridge creates a different context for its backend. The backend request specifies provider=default, so it does not recursively resolve to EDU-SHA256 and does not depend on an unqualified choice in the outer context. This is a deliberate way to make the example predictable.

Predictability is not the same as policy inheritance. If the application intended to restrict all cryptographic computation to a particular class of implementations, the bridge’s separate context could violate that intention unless the backend policy were designed accordingly. The example does not claim to preserve arbitrary outer policy. Its source and paper make the internal choice visible.

Application contextFetch EDU-SHA256Constraint: provider=eduSelected bridge modulePrivate backend contextFetch SHA256Constraint: provider=defaultActual digest backend
Figure 3. The prototype has two explicit selection domains. The connection is application code, not automatic inheritance of policy.

16.2 Properties are claims used for selection

A property query tells the fetch mechanism which advertised implementations are acceptable. It does not verify the truth of every advertisement. A production system therefore needs a basis for trusting the module that supplies the property definition. The loader and property mechanism solve routing problems; software provenance, validation, and operational controls solve different assurance problems.

The fips=yes negative case makes the distinction tangible. The prototype does not advertise the property, so the request fails. Adding the property string to the algorithm table would change selection behavior but would not perform a validation process. The paper intentionally does not make that change. [7,11]

16.3 Standard algorithm versus validated module

SHA-256 is a standardized algorithm. A module can compute its mathematical output correctly without being part of an approved or validated deployment. The algorithm specification describes the transformation; module assurance involves additional requirements and a defined operating context. Confusing these levels can lead an implementer to interpret a successful known-answer test as a compliance certificate.

The bridge is especially unsuitable for such an inference because it delegates to a backend and supplies only limited integration evidence. Even if a backend had a relevant validation status, a complete argument would have to examine the selected version, configuration, boundaries, and operating conditions. The study does not perform that analysis and does not label the prototype as validated.

16.4 Data and error channels

The provider receives message data and can influence errors observed by the application. In the current example the input messages are deterministic test data, but a real digest request may still involve sensitive information. A provider implementation should not assume that a digest operation is harmless to log simply because it has no private-key argument. Input contents, timing, and contextual metadata may matter to the application’s confidentiality requirements.

The prototype’s diagnostic support is minimal: it propagates failures and uses ordinary error printing in the client. It does not implement a provider-specific error catalogue through core callbacks. That omission is acceptable for a teaching bridge but is a clear limitation for maintainers who need reliable operational diagnosis without excessive logging.

16.5 Trust assumptions in the laboratory

The experiment trusts the local compiler, the installed OpenSSL library, the operating system, and the downloaded documentation sources for their respective roles. It also trusts the module file being tested not to change between compilation and execution. These assumptions are normal for a small laboratory exercise, but they should be visible because they bound what the results can establish.

The manifests preserve file identity for later inspection. They help detect accidental changes in the reference collection and project artifacts. They do not prove that the host was uncompromised or that the compiler produced a faithful binary. A reproducibility package increases inspectability; it does not remove every trust assumption in the software supply chain.

16.6 A policy-oriented acceptance argument

A future deployment could structure acceptance around explicit claims. One claim might state that a particular application request selects a named implementation. A second might state that the module’s backend follows an approved policy. A third might state that the deployed files match a reviewed release. Each claim requires its own evidence. The teaching project directly supports only selected parts of the first claim.

This decomposition is useful because it gives reviewers concrete questions to ask. Which property query was used? Which provider was attached to the fetched method? Does the module perform a second fetch? Which files and configuration were deployed? What independent evaluation supports the module’s assurances? Answers to these questions are more informative than a broad statement that “OpenSSL providers are enabled.”