Prepare the exercise and predict the cryptographic result
The original lab accompanying this lesson is content/labs/cissp-architecture-contracts/run.mjs. Run it in a development environment with Node and permission to open ephemeral local ports. Choose a new output path, for example node content/labs/cissp-architecture-contracts/run.mjs /tmp/cissp-boundaries-my-run.json, so published records are not overwritten. It uses no credentials, production files or external services. The process creates random keys in memory and two servers on 127.0.0.1; a sandbox restriction may prevent socket creation and must be reported rather than presented as success. Before execution, predict four outcomes: intact message accepted, changed ciphertext rejected, different associated context rejected, and an intact replay accepted again. Then predict the deliberately incorrect case of two messages under the same key/nonce pair. The library may accept both; that does not make the usage safe. Compare the observed XOR relation with the prediction, distinguishing recovery of the other synthetic plaintext from key recovery. This preparation forces a property to be stated before seeing a green result. Both retained runs used Node 25.8.0, OpenSSL 3.5.5 and macOS arm64; other versions need their own recorded observation.
Inspect context, tag and effects before validation
Read the wrapper’s contract before interpreting checks: a 256-bit AES key, 12-byte nonce and 16-byte tag for this fixture. Rejecting a shortened tag establishes compliance with that local profile. It does not establish that all software or every GCM use has exactly the same format. The exercise changes ciphertext, tag, key and AAD separately. Each mutation should cause rejection at its corresponding boundary while a positive control retains the original message. The wrapper buffers provisional bytes produced by update and returns them only after final validates authentication. When the tag fails, released-byte count remains zero. That observation is more useful than showing only an exception because the consumer received no data before the error. Next, compare two context tuples that naive concatenation turns into the same string. The fixture’s tuple representation separates them, but real integration needs agreed normalization, types and format evolution. Finally, replay an intact envelope. Accepted authentication demonstrates exactly why single execution is an application contract that this decryptor does not implement. Keep each finding tied to its own observation rather than combining them into a broad assurance claim.
Observe the recipient, not only the client error
Servers A and B are created by the exercise itself on different ephemeral ports. The first permitted request reaches A and returns content. A relative redirect within the approved origin also completes. Next, A redirects to B while only A is authorized. The client rejects the hop and B’s counter remains zero at that point. Later, B is separately authorized to test cache identity; finding B requests in the complete report therefore does not contradict the earlier rejection. Interpret observations at the time and within the scope of their respective checks. The fixture also rejects userinfo, fragments, unsupported schemes and unapproved ports, and stops a redirect cycle at its defined limit. These conditions are local contract choices. A green result does not prove that every possible URL was analyzed or that an external library shares these rules. The exercise has no DNS resolution, enterprise proxy routing or TLS. For APS handover, turn results into conditions to reproduce during integration: functioning approved destination, no receipt at a prohibited destination, reviewed redirects and observable limits. Retain both positive and negative oracles rather than only client error messages.
Relate reuse to actual origin requests
The exercise’s cache is an in-memory structure written for teaching, but origin requests use actual loopback HTTP. Repeating an eligible public response does not increase the origin request count. Changing origin, fund-selection query parameter or language keeps representations separate in the fixture. Body length is not used as identity. For private and no-store, checks show that subsequent accesses return to the origin under the implemented shared-cache policy. The no-cache case stores the initial response but actually sends If-None-Match before reusing it. The report records the conditional header received by the origin. A 304 response permits returning the corresponding stored body; when the origin revision changes, a new tag accompanies a new body. Thus “an ETag exists” and “validation occurred” are different observations. Inspect the request sequence instead of inferring behavior only from the final body. A complete freshness engine, general Vary support, 206 responses and every HTTP authentication rule were not implemented. The demonstration teaches the relationship between evidence and decision; it does not replace product conformance testing. Its deliberately small scope should remain visible in any project report using the result.
Interpret framing rejection and resource limits
The exercise sends an ambiguous request only to the local server it created, with simultaneous Content-Length and Transfer-Encoding. In the executed version, the parser returns HTTP/1.1 400 Bad Request, records HPE_INVALID_TRANSFER_ENCODING and does not deliver the request to the handler. The error name is an observation of that version, not a universal API-stability promise. An initial attempt expected a different parser code and failed; the check was corrected after observing the result while retaining the substantive condition of rejection before effects. Another check actually receives a 1024-byte body and rejects it against a local 512-byte limit. The unit is bytes, not character count; Unicode can make those counts differ. The example’s limit is editorial, not a recommended value for every service. These results neither measure load resistance nor establish complete denial-of-service protection. When reproducing the idea in an authorized chain, include each hop’s parser, connection persistence, CONNECT transitions and a legitimate request that must still work. Avoid turning an isolated error message into proof that no effect occurred: observe the point where the application could produce that effect.
Build reproducible and bounded acceptance
Each of the two retained runs passed 36 checks. That number describes exercised conditions, not a percentage of security achieved. The report identifies versions, platform, script hash, observations, failure and cleanup. Synthetic keys are not written to files; at completion, controlled buffers are zero-filled, servers close and the cache is cleared. This does not establish erasure of every possible copy within runtime-managed memory. The JSON evidence file intentionally remains. To use the practice in a project, prepare a matrix with claim, initial condition, permitted outcome, prohibited outcome, observation and limit. For example, “do not follow a redirect to B” needs client rejection and absence of receipt at B in that exercise, accompanied by a functioning permitted request. Add owners and outstanding execution for real DNS, TLS, caching products and proxy chains. Repeat the demonstration with fresh state before comparing reports; do not expect matching ciphertext hashes because keys are random. Retain relevant failures as learning evidence. Editorial review and local execution support preparation but are neither certification, psychometric calibration nor production acceptance. The course’s question totals do not alter those boundaries.
node content/labs/cissp-architecture-contracts/run.mjs /tmp/cissp-boundaries-my-run.jsonTwo GCM tags validate despite deliberate nonce reuse; a redirect is rejected before B receives a request. These are distinct properties and observations.
Common pitfalls
Check count as complete coverage; valid tag as absence of replay; client error as absence of effects; an HTTP lab as TLS evidence.
Related topics: Cryptographic evidence · HTTP destinations and cache · Acceptance criteria
Evidence is useful when it has a concrete claim and an explicit boundary.
Reference: HTTP Semantics · CISSP outline effective April 15, 2024; current AI guidance consulted 2026-09-29