<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-qin-bpm-rpki-rp-bench-00" category="info" submissionType="IETF" version="3">
  <!-- xml2rfc v2v3 conversion 3.35.0 -->
  <front>
    <title abbrev="BM for RPKI RP">Benchmarking Methodology for RPKI Relying Party</title>
    <seriesInfo name="Internet-Draft" value="draft-qin-bpm-rpki-rp-bench-00"/>
    <author initials="L." surname="Qin" fullname="Lancheng Qin">
      <organization>Zhongguancun Laboratory</organization>
      <address>
        <postal>
          <city>Beijing</city>
          <country>China</country>
        </postal>
        <email>qinlc@mail.zgclab.edu.cn</email>
      </address>
    </author>
    <author initials="Y." surname="Su" fullname="Yingying Su">
      <organization>Zhongguancun Laboratory</organization>
      <address>
        <postal>
          <city>Beijing</city>
          <country>China</country>
        </postal>
        <email>suyy@mail.zgclab.edu.cn</email>
      </address>
    </author>
    <author initials="C." surname="Zhang" fullname="Chenlu Zhang">
      <organization>Zhongguancun Laboratory</organization>
      <address>
        <postal>
          <city>Beijing</city>
          <country>China</country>
        </postal>
        <email>zhangcl@mail.zgclab.edu.cn</email>
      </address>
    </author>
    <author initials="D." surname="Li" fullname="Dan Li">
      <organization>Tsinghua University</organization>
      <address>
        <postal>
          <city>Beijing</city>
          <country>China</country>
        </postal>
        <email>tolidan@tsinghua.edu.cn</email>
      </address>
    </author>
    <date year="2026" month="October" day="30"/>
    <area>Operations and Management</area>
    <workgroup>BPM</workgroup>
    <keyword>RPKI, Relying Party, Benchmarking</keyword>
    <abstract>
      <?line 87?>

<t>This document defines a benchmarking methodology for evaluating RPKI Relying Party (RP) implementations in controlled laboratory environments. The methodology focuses on whether RP implementations correctly perform required validation steps and on the performance of these operations. RP implementations are treated as black boxes, enabling consistent and objective assessment based on externally observable behavior rather than internal design or implementation details.</t>
    </abstract>
  </front>
  <middle>
    <?line 91?>

<section anchor="sec-intro">
      <name>Introduction</name>
      <t>The Resource Public Key Infrastructure (RPKI) <xref target="RFC6480"/> provides a framework for cryptographically securing Internet routing by allowing Relying Parties (RPs) to validate Route Origin Authorizations (ROAs) and other RPKI objects. Currently, there is no standardized methodology to evaluate whether RP implementations correctly perform the required validation procedures. In addition, the processing performance of RPs, such as the time required to validate objects and generate validated ROA payloads (VRPs), has not been systematically measured.</t>
      <t>This document defines a benchmarking methodology for Relying Parties that addresses both functional correctness and processing performance. Specifically, the methodology provides:</t>
      <ol spacing="normal" type="1"><li>
          <t>Functional correctness tests to evaluate compliance with the RFC requirements.</t>
        </li>
        <li>
          <t>Performance tests to measure the processing time and resource consumption from object retrieval to VRP generation.</t>
        </li>
      </ol>
      <t>This document currently focuses on the validation output produced from ROAs, namely the generated VRP set. Validation outputs associated with ASPA objects or other current or future RPKI signed objects are outside the scope of this document, although they may be evaluated using a similar methodology with object-specific validation requirements and expected outputs.</t>
      <t>The remainder of this document is structured as follows:</t>
      <ul spacing="normal">
        <li>
          <t>Section 4 defines the functional correctness and performance tests.</t>
        </li>
        <li>
          <t>Section 5 defines the format for reporting test results.</t>
        </li>
      </ul>
      <t>Passing all the correctness tests does not mean conforming to all the RPKI RFC.
Performance tests do not have criteria or requirements.</t>
      <section anchor="requirements-language">
        <name>Requirements Language</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

</section>
    </section>
    <section anchor="sec-rp">
      <name>Relying Party Overview</name>
      <t>A Relying Party (RP) in the Resource Public Key Infrastructure (RPKI) is responsible for retrieving, validating, and making available RPKI objects to support secure route validation. <xref target="RFC8897"/> specifies the expected behavior of RPs, which includes:</t>
      <ul spacing="normal">
        <li>
          <t>Object Retrieval: obtaining RPKI objects from Publication Points (PPs) and keeping them up-to-date.</t>
        </li>
        <li>
          <t>Object Syntax Validation: checking DER encoding, syntax, and structural correctness of RPKI objects, including certificates, CRLs, ROAs, and manifests.</t>
        </li>
        <li>
          <t>Certification Path Validation: constructing and validating certificate chains from the Trust Anchor to each leaf certificate.</t>
        </li>
        <li>
          <t>CMS Signed Object Signature Validation: verifying digital signatures of the RPKI CMS objects.</t>
        </li>
        <li>
          <t>Manifest Processing: ensuring completeness and integrity of published objects.</t>
        </li>
      </ul>
      <t>After validation, the RP produces a Validated Payload for use in routing systems. These functions ensure that only valid and trusted RPKI objects influence routing decisions.</t>
    </section>
    <section anchor="sec-test-methodology">
      <name>Test Setup</name>
      <t>This section defines the test setup. The System Under Test (SUT) (i.e., the RP software) is treated as a black box. No internal configuration or implementation behavior of the RP software is mandated. The test setup focuses on providing controlled inputs and observing RP outputs to enable reproducible and comparable measurements.</t>
      <t>In this methodology, the input to the SUT is the controlled RPKI repositories configured by the Controller and published through the controlled Servers. The output of the SUT is the generated VRP set, or equivalent validation output that allows the Controller to determine the resulting VRPs. Verification in this methodology is based on the SUT's externally observable output, rather than on its internal cache layout, internal processing pipeline, or implementation-specific debug information. For the correctness metrics defined in this document, a one-shot validation run is sufficient.</t>
      <section anchor="test-environment">
        <name>Test Environment</name>
        <t>In this methodology, the Tester consists of the Servers and the Controller. Together, they generate the test conditions, trigger events, and support observation of the SUT for functional and performance evaluation. The SUT itself is evaluated for correctness and efficiency in processing RPKI objects.</t>
        <figure anchor="fig-1">
          <name>Test environment</name>
          <artwork><![CDATA[
+----------------------------------+
|             Controller           |
+----------------------------------+
       |                  |
       v                  v
+-------------+      +-------------+
|     SUT     | ---> |   Servers   |
+-------------+      +-------------+
]]></artwork>
        </figure>
        <t>To ensure meaningful testing, the environment should include:</t>
        <ul spacing="normal">
          <li>
            <t>At least one Trust Anchor (TA)</t>
          </li>
          <li>
            <t>One or more subordinate certificate authority (CA) certificates</t>
          </li>
          <li>
            <t>RPKI objects signed by CAs</t>
          </li>
        </ul>
        <t>The test environment should support multiple RPKI transport protocols for object retrieval, including Rsync <xref target="RSYNC"/>, RRDP <xref target="RFC8182"/>, or Erik <xref target="I-D.ietf-sidrops-rpki-erik-protocol"/>.</t>
      </section>
      <section anchor="system-under-test-and-servers">
        <name>System Under Test and Servers</name>
        <t>The SUT is an RPKI Relying Party implementation that retrieves RPKI objects from the controlled repositories, validates them, and generates the VRP set or equivalent validation output.</t>
        <t>The Servers should include PPs which host RPKI objects signed by CAs. Each PP at least contains ROAs, a manifest, and a CRL necessary for the tests. RPKI objects can be added, modified, or removed by the Controller.</t>
      </section>
      <section anchor="controller">
        <name>Controller</name>
        <t>The Controller orchestrates the entire testing process. In <xref target="fig-1"/>, the arrows from the Controller to both the SUT and Servers represent the flow of control information.</t>
        <t>For the SUT, the Controller controls the start and end of tests. The Controller can obtain the SUT's VRP set or equivalent validation output through an externally observable output interface configured for the test, such as an output file, RTR, or a CCR profile <xref target="I-D.ietf-sidrops-rpki-ccr"/>. The Controller then processes test results and compares them with the expected output derived from the controlled repository contents.</t>
        <t>For the Servers, the Controller handles content changes to ensure that the SUT sees one set of RPKI objects during a validation run and a different set during the next run. Existing tools (e.g., <xref target="BaRRy"/>, <xref target="Rapport"/>) can be used to implement and manage the test environment.</t>
      </section>
    </section>
    <section anchor="rpki-relying-party-benchmarking-tests">
      <name>RPKI Relying Party Benchmarking Tests</name>
      <t><strong>General assumptions:</strong>
The functional correctness and performance tests in this section assume that the controlled servers are correctly configured and reachable by the SUT.
Object retrieval is assumed to be complete successfully.</t>
      <t>The tests in this section are based on the published RPKI specifications referenced by each test. The test cases are intended to exercise representative correctness properties, rather than to provide an exhaustive conformance test suite for RP software. Validation behavior introduced by Internet-Drafts or other work-in-progress updates may be relevant to implementations, but is outside the scope of this document.</t>
      <t>The detailed functional test points covered in this document are catalogued in <xref target="app-test-points"/>.</t>
      <section anchor="baseline-valid-repository-processing">
        <name>Baseline Valid Repository Processing</name>
        <t><strong>Objective:</strong> To establish a baseline for evaluating whether the SUT can process a controlled repository containing valid RPKI objects and generate the expected VRP set. This test verifies the SUT's output for a repository in which all relevant objects are valid and all validation conditions are satisfied. This baseline confirms that valid repository contents produce the expected VRP set before error cases are introduced.</t>
        <t>The baseline repository in this test should contain all objects required for validating the intended RPKI objects, including the relevant resource certificates, manifests, CRLs, and ROAs. Each ROA under test <bcp14>MUST</bcp14> produce a distinct VRP payload. This ensures that the absence of a VRP from the generated VRP set can be attributed to the rejection of the corresponding ROA.</t>
        <t><strong>Example Baseline Repository:</strong>
          <xref target="fig-2"/> illustrates an example baseline repository, denoted as BR, where the indentation shows the certification hierarchy and corresponding publication points conceptually.</t>
        <figure anchor="fig-2">
          <name>An example baseline repository</name>
          <artwork><![CDATA[
ta.cer
        ca1.cer
                roa1-1.roa ----> Expected VRP: VRP1-1
                roa1-2.roa ----> Expected VRP: VRP1-2
                ca1.mft
                ca1.crl
        ca2.cer
                roa2-1.roa ----> Expected VRP: VRP2-1
                roa2-2.roa ----> Expected VRP: VRP2-2
                ca2.mft
                ca2.crl
        ta.mft
        ta.crl
]]></artwork>
        </figure>
        <t>In BR, ta.cer is the Trust Anchor certificate. It certifies ca1.cer and ca2.cer.
CA1 issues two ROAs, roa1-1.roa and roa1-2.roa. CA2 issues two ROAs, roa2-1.roa and roa2-2.roa. Each ROA is valid and produces one distinct VRP. The expected VRP set for BR is therefore: {VRP1-1, VRP1-2, VRP2-1, VRP2-2}.</t>
        <t>The <strong>procedure</strong> for this test is as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Configure the controlled servers to host BR.</t>
          </li>
          <li>
            <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
          </li>
          <li>
            <t>Start the SUT and allow it to perform one validation run over the controlled repository BR.</t>
          </li>
          <li>
            <t>Compare the generated VRP set with the expected VRP set for BR.</t>
          </li>
        </ol>
        <t><strong>Expected Results:</strong>
The generated VRP set matches the expected VRP set derived from the baseline repository contents, i.e., {VRP1-1, VRP1-2, VRP2-1, VRP2-2}. This indicates that, for the baseline repository, the SUT can retrieve, parse, validate, and process the relevant RPKI objects sufficiently to generate the expected VRPs.</t>
        <t>Each functional correctness test in Section 4.2 through 4.6 starts from the baseline repository BR defined in this section. One target object is modified to violate a specific requirement.
The test setup <bcp14>MUST</bcp14> introduce only the violation under test.
Any dependent objects <bcp14>MUST</bcp14> be updated as needed to avoid unrelated violations, unless leaving them unchanged is necessary for the test. 
The SUT behavior is evaluated by checking whether the generated VRP set matches the expected result derived from the single-object violation. In general, VRPs whose production depends on the malformed object are expected to be absent from the generated VRP set, while unaffected baseline VRPs are expected to remain present.</t>
      </section>
      <section anchor="object-syntax-validation-correctness">
        <name>Object Syntax Validation Correctness</name>
        <t>This section evaluates whether the SUT correctly performs syntax validation for different RPKI objects. The SUT is expected to perform syntax checks according to the relevant specifications and detect objects that do not conform to the defined syntax requirements.</t>
        <t>The syntax requirements for different RPKI objects are defined in the following specifications:</t>
        <ul spacing="normal">
          <li>
            <t>Certificate and CRL: <xref target="RFC5280"/>, <xref target="RFC6487"/> and <xref target="RFC7935"/></t>
          </li>
          <li>
            <t>Manifest: <xref target="RFC6488"/>, <xref target="RFC9589"/> and <xref target="RFC9286"/></t>
          </li>
          <li>
            <t>ROA: <xref target="RFC6488"/>, <xref target="RFC9589"/> and <xref target="RFC9582"/></t>
          </li>
        </ul>
        <section anchor="der-decoding">
          <name>DER Decoding</name>
          <t><strong>Objective:</strong> To evaluate whether the SUT correctly rejects an RPKI object with invalid Distinguished Encoding Rules (DER) encoding. Examples include, but are not limited to, a malformed ASN.1 tag field, an inconsistent length field, and a BER-specific encoding form that is not permitted by DER.</t>
          <t>The <strong>procedure</strong> for this test is as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Start from the baseline repository BR defined in Section 4.1.</t>
            </li>
            <li>
              <t>Replace roa1-1.roa with a malformed version that cannot be decoded as valid DER, e.g., a truncated version produced by removing the last few octets of the file. Keep all other objects unchanged, except for the updates required to keep the repository internally consistent. In particular, ca1.mft is updated so that it lists the correct hash of the malformed version of roa1-1.roa, and the updated ca1.mft remains valid.</t>
            </li>
            <li>
              <t>Configure the controlled servers to host the modified BR repository.</t>
            </li>
            <li>
              <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
            </li>
            <li>
              <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
            </li>
            <li>
              <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
            </li>
          </ol>
          <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set with the VRP derived from the malformed ROA removed, i.e., {VRP1-2, VRP2-1, VRP2-2}.
The absence of VRP1-1 is attributed to the DER decoding failure of the modified roa1-1.roa. VRPs derived from other unaffected ROAs remain present.</t>
        </section>
        <section anchor="certificate-syntax-validation">
          <name>Certificate Syntax Validation</name>
          <t><strong>Objective:</strong> To evaluate whether the SUT correctly rejects a certificate that violates the syntax requirements described in <xref target="RFC5280"/>, <xref target="RFC6487"/> and <xref target="RFC7935"/>. Examples include, but are not limited to, an unsupported certificate version, an invalid certificate serial number, an invalid SIA or AIA extension, and an invalid IP or AS resource extension.
The complete set of test points is listed in <xref target="app-cert-syntax"/>. Each distinct test point is evaluated in a separate run. The procedure and expected results below illustrate one such run.</t>
          <t><strong>Procedure:</strong></t>
          <ol spacing="normal" type="1"><li>
              <t>Start from the baseline repository BR defined in Section 4.1.</t>
            </li>
            <li>
              <t>Replace ca1.cer with a modified version in which the Basic Constraints extension is absent. Keep all other objects unchanged, except for the updates required to keep the repository internally consistent. In particular, ta.mft is updated so that it lists the correct hash of the malformed version of ca1.cer, and the updated ta.mft remains valid.</t>
            </li>
            <li>
              <t>Configure the controlled servers to host the modified BR repository.</t>
            </li>
            <li>
              <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
            </li>
            <li>
              <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
            </li>
            <li>
              <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
            </li>
          </ol>
          <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set with the VRPs derived from ROAs under ca1.cer removed, i.e., {VRP2-1, VRP2-2}.
The absence of VRP1-1 and VRP1-2 is attributed to the certificate syntax validation failure of the modified ca1.cer.
VRP2-1 and VRP2-2 remain present because the ca2.cer branch is not modified and thus unaffected.</t>
          <t>For each remaining test point in <xref target="app-cert-syntax"/>, repeat the procedure with the corresponding condition substituted in Step 2 and compare the observed results with the expected results for that test point.</t>
        </section>
        <section anchor="crl-syntax-validation">
          <name>CRL Syntax Validation</name>
          <t><strong>Objective:</strong> To evaluate whether the SUT correctly rejects a CRL that violates the syntax requirements described in <xref target="RFC5280"/> and <xref target="RFC6487"/>. Examples include, but are not limited to, an unsupported CRL version, an invalid CRL Number extension, a disallowed CRL extension, and a prohibited revoked-certificate entry.
The complete set of test points is listed in <xref target="app-crl-syntax"/>. Each distinct test point is evaluated in a separate run. The procedure and expected results below illustrate one such run.</t>
          <t><strong>Procedure:</strong></t>
          <ol spacing="normal" type="1"><li>
              <t>Start from the baseline repository BR defined in Section 4.1.</t>
            </li>
            <li>
              <t>Replace ca1.crl with a malformed version containing a CRL-level extension other than Authority Key Identifier and CRL Number.
Keep all other objects unchanged, except for the updates required to keep the repository internally consistent.  In particular, ca1.mft is updated so that it lists the correct hash of the malformed version of ca1.crl, and the updated ca1.mft remains valid.</t>
            </li>
            <li>
              <t>Configure the controlled servers to host the modified BR repository.</t>
            </li>
            <li>
              <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
            </li>
            <li>
              <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
            </li>
            <li>
              <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
            </li>
          </ol>
          <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set with the VRPs derived from ROAs under the publication point using the malformed ca1.crl removed, i.e., {VRP2-1, VRP2-2}.
The absence of VRP1-1 and VRP1-2 is attributed to the syntax validation failure of the modified ca1.crl.
VRP2-1 and VRP2-2 remain present because the ca2.cer branch is not modified and thus unaffected.</t>
          <t>For each remaining test point in <xref target="app-crl-syntax"/>, repeat the procedure with the corresponding condition substituted in Step 2 and compare the observed results with the expected results for that test point.</t>
        </section>
        <section anchor="cms-signed-object-syntax-validation">
          <name>CMS Signed Object Syntax Validation</name>
          <t><strong>Objective:</strong> To evaluate whether the SUT correctly rejects a malformed signed object that violates the syntax requirements
common to all CMS-based RPKI signed objects defined in <xref target="RFC6488"/> and <xref target="RFC9589"/>. Examples include, but are not limited to, an illegal digest algorithm, certificate missing, and multiple signer infos.
The complete set of test points is listed in <xref target="app-cms-syntax"/>. Each distinct test point is evaluated in a separate run. The procedure and expected results below illustrate one such run.</t>
          <t><strong>Procedure:</strong></t>
          <ol spacing="normal" type="1"><li>
              <t>Start from the baseline repository BR defined in Section 4.1.</t>
            </li>
            <li>
              <t>Replace roa1-1.roa with a modified version whose CMS signer identifier contains a subject key identifier different from the SKI in its embedded EE certificate.
Keep all other objects unchanged, except for the updates required to keep the repository internally consistent. In particular, ca1.mft is updated so that it lists the correct hash of the malformed version of roa1-1.roa, and the updated ca1.mft remains valid.</t>
            </li>
            <li>
              <t>Configure the controlled servers to host the modified BR repository.</t>
            </li>
            <li>
              <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
            </li>
            <li>
              <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
            </li>
            <li>
              <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
            </li>
          </ol>
          <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set with the VRP derived from the malformed ROA removed, i.e., {VRP1-2, VRP2-1, VRP2-2}.
The absence of VRP1-1 is attributed to the syntax validation failure of the modified roa1-1.roa. VRPs derived from other unaffected ROAs remain present.</t>
          <t>For each remaining test point in <xref target="app-cms-syntax"/>, repeat the procedure with the corresponding condition substituted in Step 2 and compare the observed results with the expected results for that test point.</t>
        </section>
        <section anchor="manifest-specific-syntax-validation">
          <name>Manifest-Specific Syntax Validation</name>
          <t><strong>Objective:</strong> To evaluate whether the SUT correctly rejects a malformed manifest that violates the manifest-specific syntax requirements defined in <xref target="RFC9286"/>. Examples include, but are not limited to, an invalid manifest version, an invalid validity interval, and an unsupported hash algorithm OID. The complete set of test points is listed in <xref target="app-mft-syntax"/>. Each distinct test point is evaluated in a separate run. The procedure and expected results below illustrate one such run.</t>
          <t><strong>Procedure:</strong></t>
          <ol spacing="normal" type="1"><li>
              <t>Start from the baseline repository BR defined in Section 4.1.</t>
            </li>
            <li>
              <t>Replace ca1.mft with a modified version in which nextUpdate is earlier than thisUpdate. Keep all other objects unchanged.</t>
            </li>
            <li>
              <t>Configure the controlled servers to host the modified BR repository.</t>
            </li>
            <li>
              <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
            </li>
            <li>
              <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
            </li>
            <li>
              <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
            </li>
          </ol>
          <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set with the VRPs derived from ROAs under the publication point using the malformed ca1.mft removed, i.e., {VRP2-1, VRP2-2}.
The absence of VRP1-1 and VRP1-2 is attributed to the syntax validation failure of the modified ca1.mft. 
VRP2-1 and VRP2-2 remain present because the ca2.cer branch is not modified and thus unaffected.</t>
          <t>For each remaining test point in <xref target="app-mft-syntax"/>, repeat the procedure with the corresponding condition substituted in Step 2 and compare the observed results with the expected results for that test point.</t>
        </section>
        <section anchor="roa-specific-syntax-validation">
          <name>ROA-Specific Syntax Validation</name>
          <t><strong>Objective:</strong> To evaluate whether the SUT correctly rejects a ROA that violates the ROA-specific syntax requirements defined in <xref target="RFC9582"/>. 
Examples include, but are not limited to, an incorrect content type OID, an unsupported ROA version, an out-of-range origin AS number, and an unsupported IP address family.
The complete set of test points is listed in <xref target="app-roa-syntax"/>. Each distinct test point is evaluated in a separate run. The procedure and expected results below illustrate one such run.</t>
          <t><strong>Procedure:</strong></t>
          <ol spacing="normal" type="1"><li>
              <t>Start from the baseline repository BR defined in Section 4.1.</t>
            </li>
            <li>
              <t>Replace roa1-1.roa with a malformed version containing an Address Family Identifier other than IPv4 or IPv6.
Keep all other objects unchanged, except for the updates required to keep the repository internally consistent. In particular, ca1.mft is updated so that it lists the correct hash of the malformed version of roa1-1.roa, and the updated ca1.mft remains valid.</t>
            </li>
            <li>
              <t>Configure the controlled servers to host the modified BR repository.</t>
            </li>
            <li>
              <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
            </li>
            <li>
              <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
            </li>
            <li>
              <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
            </li>
          </ol>
          <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set with the VRP derived from the malformed ROA removed, i.e., {VRP1-2, VRP2-1, VRP2-2}.
The absence of VRP1-1 is attributed to the syntax validation failure of the modified roa1-1.roa. VRPs derived from other unaffected ROAs remain present.</t>
          <t>For each remaining test point in <xref target="app-roa-syntax"/>, repeat the procedure with the corresponding condition substituted in Step 2 and compare the observed results with the expected results for that test point.</t>
        </section>
      </section>
      <section anchor="certification-path-validation-correctness">
        <name>Certification Path Validation Correctness</name>
        <t>This section evaluates whether the SUT correctly handles failures during RPKI certificate path validation. The SUT is expected to perform the certificate path validation process for all RPKI resource certificates according to the requirements specified in Section 7.2 of <xref target="RFC6487"/>. This includes, for example, checking certificate signatures, issuer-subject relationships, certificate validity periods, and certificate revocation status.</t>
        <t>The scenarios in this section are representative and are not intended to enumerate all certificate path validation requirements. Each test introduces one specific certification path violation to evaluate the SUT behavior. 
A validation failure in a certificate path is expected to prevent the affected certificate and the RPKI objects depending on it from contributing payloads to the generated output.</t>
        <section anchor="invalid-certificate-signature">
          <name>Invalid Certificate Signature</name>
          <t><strong>Objective:</strong> To evaluate whether the SUT correctly rejects a certificate whose signature cannot be verified using the public key of its issuer.</t>
          <t>The <strong>procedure</strong> for this test is as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Start from the baseline repository BR defined in Section 4.1.</t>
            </li>
            <li>
              <t>Replace ca1.cer with a modified version whose certificate signature cannot be verified using the public key of the trust anchor.
Keep all other objects unchanged, except for the updates required to keep the repository internally consistent.  In particular, ta.mft is updated so that it lists the correct hash of the modified version of ca1.cer, and the updated ta.mft remains valid.</t>
            </li>
            <li>
              <t>Configure the controlled servers to host the modified BR repository.</t>
            </li>
            <li>
              <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
            </li>
            <li>
              <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
            </li>
            <li>
              <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
            </li>
          </ol>
          <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set with the VRPs derived from ROAs under the modified ca1.cer removed, i.e., {VRP2-1, VRP2-2}.
The absence of VRP1-1 and VRP1-2 is attributed to the certificate signature validation failure of the modified ca1.cer.
VRP2-1 and VRP2-2 remain present because the ca2.cer branch is not modified and thus unaffected.</t>
        </section>
        <section anchor="issuer-subject-mismatch">
          <name>Issuer-Subject Mismatch</name>
          <t><strong>Objective:</strong> To evaluate whether the SUT correctly rejects a certificate path in which the issuer information of a certificate does not match the subject information of the certificate expected to issue it.</t>
          <t>The <strong>procedure</strong> for this test is as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Start from the baseline repository BR defined in Section 4.1.</t>
            </li>
            <li>
              <t>Replace ca1.cer with a modified version whose issuer information does not match the subject information of the trust anchor.
Keep all other objects unchanged, except for the updates required to keep the repository internally consistent.  In particular, ta.mft is updated so that it lists the correct hash of the modified version of ca1.cer, and the updated ta.mft remains valid.</t>
            </li>
            <li>
              <t>Configure the controlled servers to host the modified BR repository.</t>
            </li>
            <li>
              <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
            </li>
            <li>
              <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
            </li>
            <li>
              <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
            </li>
          </ol>
          <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set with the VRPs derived from ROAs under the modified ca1.cer removed, i.e., {VRP2-1, VRP2-2}.
The absence of VRP1-1 and VRP1-2 is attributed to the issuer-subject mismatch in the certification path containing the modified ca1.cer.
VRP2-1 and VRP2-2 remain present because the ca2.cer branch is not modified and thus unaffected.</t>
        </section>
        <section anchor="certificate-validity-check">
          <name>Certificate Validity Check</name>
          <t><strong>Objective:</strong> To evaluate whether the SUT correctly rejects a certificate that is not valid at the time of validation. For example, the certificate may have a notBefore value later than the validation time or a notAfter value earlier than the validation time.</t>
          <t>The <strong>procedure</strong> for this test is as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Start from the baseline repository BR defined in Section 4.1.</t>
            </li>
            <li>
              <t>Replace ca1.cer with a modified version whose validity period does not cover the validation time. Keep all other objects unchanged, except for the updates required to keep the repository internally consistent. In particular, ta.mft is updated so that it lists the correct hash of the modified version of ca1.cer, and the updated ta.mft remains valid.</t>
            </li>
            <li>
              <t>Configure the controlled servers to host the modified BR repository.</t>
            </li>
            <li>
              <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
            </li>
            <li>
              <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
            </li>
            <li>
              <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
            </li>
          </ol>
          <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set with the VRPs derived from ROAs under the modified ca1.cer removed, i.e., {VRP2-1, VRP2-2}.
The absence of VRP1-1 and VRP1-2 is attributed to the validity period failure of the modified ca1.cer. VRP2-1 and VRP2-2 remain present because the ca2.cer branch is not modified and thus unaffected.</t>
        </section>
        <section anchor="certificate-revocation-check">
          <name>Certificate Revocation Check</name>
          <t>This section evaluates whether the SUT correctly determines the revocation status of certificates during certification path validation and correctly propagates the revocation status to the validation results of relevant RPKI objects. The tests below cover the revocation of a CA certificate, a ROA's EE certificate, and a manifest's EE certificate.</t>
          <section anchor="revoked-ca-certificate">
            <name>Revoked CA Certificate</name>
            <t><strong>Objective:</strong> To evaluate whether the SUT correctly rejects a CA certificate that has been revoked by its issuer and consequently rejects RPKI objects that depend on the revoked CA certificate.</t>
            <t>The <strong>procedure</strong> for this test is as follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>Start from the baseline repository BR defined in Section 4.1.</t>
              </li>
              <li>
                <t>Replace ta.crl with a modified CRL that lists the serial number of ca1.cer as revoked. Keep all other objects unchanged, except for the updates required to keep the repository internally consistent. In particular, ta.mft is updated so that it lists the correct hash of the modified version of ta.crl, and the updated ta.mft remains valid.</t>
              </li>
              <li>
                <t>Configure the controlled servers to host the modified BR repository.</t>
              </li>
              <li>
                <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
              </li>
              <li>
                <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
              </li>
              <li>
                <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
              </li>
            </ol>
            <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set with the VRPs derived from the CA1 publication point removed, i.e., {VRP2-1, VRP2-2}.
The absence of VRP1-1 and VRP1-2 is attributed to the revocation of ca1.cer.
Unaffected baseline VRPs from CA2 publication point remain present.</t>
          </section>
          <section anchor="revoked-roas-ee-certificate">
            <name>Revoked ROA's EE Certificate</name>
            <t><strong>Objective:</strong> To evaluate whether the SUT correctly rejects a ROA whose associated EE certificate has been revoked by its issuing CA.</t>
            <t>The <strong>procedure</strong> for this test is as follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>Start from the baseline repository BR defined in Section 4.1.</t>
              </li>
              <li>
                <t>Replace ca1.crl with a modified CRL that lists the serial number of the EE certificate contained in roa1-1.roa as revoked.
Keep all other objects unchanged, except for the updates required to keep the repository internally consistent. In particular, ca1.mft is updated so that it lists the correct hash of the modified version of ca1.crl, and the updated ca1.mft remains valid.</t>
              </li>
              <li>
                <t>Configure the controlled servers to host the modified BR repository.</t>
              </li>
              <li>
                <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
              </li>
              <li>
                <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
              </li>
              <li>
                <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
              </li>
            </ol>
            <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set with the VRP derived from roa1-1.roa removed, i.e., {VRP1-2, VRP2-1, VRP2-2}. The absence of VRP1-1 is attributed to the revoked EE certificate contained in roa1-1.roa. 
VRPs derived from other unaffected ROAs remain present.</t>
          </section>
          <section anchor="revoked-manifests-ee-certificate">
            <name>Revoked Manifest's EE Certificate</name>
            <t><strong>Objective:</strong> To evaluate whether the SUT correctly treats a fetch as failed when the EE certificate for the current manifest is revoked by the current CRL.</t>
            <t>The <strong>procedure</strong> for this test is as follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>Start from the baseline repository BR defined in Section 4.1.</t>
              </li>
              <li>
                <t>Replace ca1.crl with a modified CRL that lists the serial number of the EE certificate contained in ca1.mft as revoked. Keep all other objects unchanged, except for the updates required to keep the repository internally consistent.<br/>
In particular, ca1.mft is updated so that it lists the correct hash of the modified version of ca1.crl, and the updated ca1.mft remains otherwise valid.</t>
              </li>
              <li>
                <t>Configure the controlled servers to host the modified BR repository.</t>
              </li>
              <li>
                <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
              </li>
              <li>
                <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
              </li>
              <li>
                <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
              </li>
            </ol>
            <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set with the VRPs derived from the CA1 publication point removed, i.e., {VRP2-1, VRP2-2}. 
Unaffected baseline VRPs from CA2 publication point remain present.
This reflects that, in a cold-start validation run, revoking the manifest's EE certificate causes the fetch for the corresponding publication point to fail.</t>
          </section>
        </section>
      </section>
      <section anchor="cms-signed-object-signature-validation-correctness">
        <name>CMS Signed Object Signature Validation Correctness</name>
        <t><strong>Objective:</strong> To evaluate whether the SUT correctly rejects a CMS signed object whose digital signature cannot be validated using the EE certificate contained in the object as described in <xref target="RFC6488"/>. 
Representative test points include a message-digest attribute inconsistent with the encapsulated content and a signature value not verifiable by the public key in the associated EE certificate.
The complete set of test points is listed in <xref target="app-cms-signature"/>. Each distinct test point is evaluated in a separate run. The procedure and expected results below illustrate one such run.</t>
        <t><strong>Procedure:</strong></t>
        <ol spacing="normal" type="1"><li>
            <t>Start from the baseline repository BR defined in Section 4.1.</t>
          </li>
          <li>
            <t>Replace roa1-1.roa with a modified version whose CMS signature cannot be verified using the public key in the EE certificate contained in roa1-1.roa. 
Keep all other objects unchanged, except for the updates required to keep the repository internally consistent. In particular, ca1.mft is updated so that it lists the correct hash of the modified version of roa1-1.roa, and the updated ca1.mft remains valid.</t>
          </li>
          <li>
            <t>Configure the controlled servers to host the modified BR repository.</t>
          </li>
          <li>
            <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
          </li>
          <li>
            <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
          </li>
          <li>
            <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
          </li>
        </ol>
        <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set with the VRP derived from the modified ROA removed, i.e., {VRP1-2, VRP2-1, VRP2-2}.
The absence of VRP1-1 is attributed to the signature validation failure of the modified roa1-1.roa.
VRPs derived from other unaffected ROAs remain present.</t>
        <t>For each remaining test point in <xref target="app-cms-signature"/>, repeat the procedure with the corresponding condition substituted in Step 2 and compare the observed results with the expected results for that test point.</t>
      </section>
      <section anchor="roa-resource-coverage-validation-correctness">
        <name>ROA Resource Coverage Validation Correctness</name>
        <t><strong>Objective:</strong> To evaluate whether the SUT correctly rejects a ROA with an invalid resource coverage relationship. To be specific, each IP address prefix in the ROA is expected to be covered by the Verified Resource Set-IP (VRS-IP) resulting from validation of the ROA's EE certificate, according to the ROA validation rules in <xref target="RFC9582"/> and the resource validation model in <xref target="RFC8360"/>.</t>
        <t>The <strong>procedure</strong> for this test is as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Start from the baseline repository BR defined in Section 4.1.</t>
          </li>
          <li>
            <t>Replace roa1-1.roa with a modified version containing an IP address prefix that is not covered by the VRS-IP set of its EE certificate.
Keep all other objects unchanged, except for the updates required to keep the repository internally consistent. In particular, ca1.mft is updated so that it lists the correct hash of the malformed version of roa1-1.roa, and the updated ca1.mft remains valid.</t>
          </li>
          <li>
            <t>Configure the controlled servers to host the modified BR repository.</t>
          </li>
          <li>
            <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
          </li>
          <li>
            <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
          </li>
          <li>
            <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
          </li>
        </ol>
        <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set with the VRP derived from the modified ROA removed, i.e., {VRP1-2, VRP2-1, VRP2-2}. The absence of VRP1-1 is attributed to the ROA IP prefix not being covered by the VRS-IP set of the ROA's EE certificate.
VRPs derived from other unaffected ROAs remain present.</t>
      </section>
      <section anchor="manifest-processing-correctness">
        <name>Manifest Processing Correctness</name>
        <t>This section evaluates whether the SUT correctly uses manifests to verify the integrity and completeness of RPKI repository objects.</t>
        <t>Manifests are expected to be used to:</t>
        <ul spacing="normal">
          <li>
            <t>Verify that the content of each RPKI object matches the hash listed in the manifest.</t>
          </li>
          <li>
            <t>Verify that objects accepted from a publication point are consistent with the object list declared in the corresponding manifest.</t>
          </li>
        </ul>
        <section anchor="manifest-hash-mismatch-check">
          <name>Manifest Hash-Mismatch Check</name>
          <t><strong>Objective:</strong> To evaluate whether the SUT correctly handles a retrieved RPKI object whose content does not match the hash declared in its associated manifest.</t>
          <t>The <strong>procedure</strong> for this test is as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Start from the baseline repository BR defined in Section 4.1.</t>
            </li>
            <li>
              <t>Replace roa1-1.roa with a modified version whose computed hash no longer matches the hash value listed for roa1-1.roa in ca1.mft. Keep all other objects unchanged.</t>
            </li>
            <li>
              <t>Configure the controlled servers to host the modified BR repository.</t>
            </li>
            <li>
              <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
            </li>
            <li>
              <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
            </li>
            <li>
              <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
            </li>
          </ol>
          <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set with the VRPs derived from the CA1 publication point removed, i.e., {VRP2-1, VRP2-2}.
Unaffected baseline VRPs from CA2 publication point remain present. 
This reflects that, in a cold-start validation run, a manifest file hash mismatch causes the fetch for the corresponding publication point to fail.</t>
        </section>
        <section anchor="manifest-object-mismatch-check">
          <name>Manifest Object-Mismatch Check</name>
          <t><strong>Objective:</strong> To evaluate whether the SUT correctly handles mismatches between the object list in a manifest and the actual objects available at the corresponding publication point. 
The following scenarios distinguish between a missing listed object scenario and an extra unlisted object scenario.</t>
          <t><strong>Missing-object scenario:</strong></t>
          <t>The <strong>procedure</strong> for this scenario is as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Start from the baseline repository BR defined in Section 4.1.</t>
            </li>
            <li>
              <t>Remove roa1-1.roa from the CA1 publication point. Keep all other objects unchanged. In particular, keep ca1.mft unchanged so that it still lists roa1-1.roa and its original hash value.</t>
            </li>
            <li>
              <t>Configure the controlled servers to host the modified BR repository.</t>
            </li>
            <li>
              <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
            </li>
            <li>
              <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
            </li>
            <li>
              <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
            </li>
          </ol>
          <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set with the VRPs derived from CA1 publication point removed, i.e., {VRP2-1, VRP2-2}.
Unaffected baseline VRPs from CA2 publication point remain present. This reflects that, in a cold-start validation run, a missing listed object in the manifest causes the fetch for the corresponding publication point to fail.</t>
          <t><strong>Extra-object scenario:</strong></t>
          <t>The <strong>procedure</strong> for this scenario is as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Start from the baseline repository BR defined in Section 4.1.</t>
            </li>
            <li>
              <t>Add an otherwise valid ROA object, roa1-extra.roa, to the CA1 publication point without listing it in the corresponding manifest ca1.mft, and record the VRP that would be produced from roa1-extra.roa if it were used by the SUT. Keep all other objects unchanged.</t>
            </li>
            <li>
              <t>Configure the controlled servers to host the modified BR repository.</t>
            </li>
            <li>
              <t>Initialize the SUT for a cold-start validation run (e.g., with no previously cached repository state).</t>
            </li>
            <li>
              <t>Start the SUT and allow it to retrieve and validate the modified repository contents.</t>
            </li>
            <li>
              <t>Collect the generated VRP set and compare it with the expected VRP set.</t>
            </li>
          </ol>
          <t><strong>Expected Results:</strong>
The generated VRP set matches the baseline expected VRP set, i.e., {VRP1-1, VRP1-2, VRP2-1, VRP2-2}. No additional VRP derived from roa1-extra.roa appears in the generated VRP set.</t>
        </section>
      </section>
      <section anchor="performance-tests">
        <name>Performance Tests</name>
        <t>This section evaluates the performance characteristics of the SUT during object retrieval and validation process under controlled repository conditions. For all tests in this section, object retrieval <bcp14>MUST</bcp14> adopt the same transport protocol within the same test set. This ensures that the measured results are comparable and reflect SUT behavior rather than differences introduced by transport protocols.</t>
        <section anchor="persistent-storage-space">
          <name>Persistent Storage Space</name>
          <t><strong>Objective:</strong>
To measure the persistent storage space occupied by the SUT after completing a cold-start validation run. Persistent storage space is measured as the total additional disk space consumed by the SUT relative to its initial clean state, rather than the size of any specific cache directory or other implementation-specific storage location from each SUT.</t>
          <t><strong>Procedure:</strong></t>
          <ol spacing="normal" type="1"><li>
              <t>Prepare a test repository containing a predefined set of RPKI objects, and record its size and composition, including the numbers of CAs, ROAs, manifests, CRLs, and generated VRPs.</t>
            </li>
            <li>
              <t>Start the SUT for a cold-start validation run and allow it to retrieve and validate the test repository.</t>
            </li>
            <li>
              <t>Stop the SUT after the initial synchronization and validation are completed.</t>
            </li>
            <li>
              <t>Measure the persistent storage space occupied by the SUT after processing the test repository.</t>
            </li>
            <li>
              <t>Repeat the test using test repositories of different sizes to evaluate performance under varying repository scales.</t>
            </li>
          </ol>
        </section>
        <section anchor="processing-time">
          <name>Processing Time</name>
          <t><strong>Objective:</strong> To measure the processing time of the SUT over a predefined sequence of validation runs, including an initial cold-start validation run and several subsequent validation runs. For each run, processing time is measured as the elapsed wall-clock time between the moment the Controller starts the validation run and the moment the SUT makes the generated VRP set or equivalent validation output available.</t>
          <t><strong>Procedure:</strong></t>
          <ol spacing="normal" type="1"><li>
              <t>Prepare a predefined test repository sequence, consisting of a set of test repository states. 
For each repository state, record its size and composition, including the numbers of CAs, ROAs, manifests, CRLs, and generated VRPs.</t>
            </li>
            <li>
              <t>Start the SUT with an empty or isolated cache for the initial cold-start validation run, and record the start timestamp.</t>
            </li>
            <li>
              <t>Allow the SUT to complete the validation run and produce the generated VRP set or equivalent validation output.</t>
            </li>
            <li>
              <t>Record the end timestamp when the generated VRP set or equivalent validation output becomes available.</t>
            </li>
            <li>
              <t>Calculate the processing time for the run as the difference between the start and end timestamps.</t>
            </li>
            <li>
              <t>For each subsequent repository state, trigger the next validation run without restarting the SUT, and record the processing time for that run using the same method.</t>
            </li>
            <li>
              <t>Repeat the test using test repositories of different sizes to evaluate performance under varying repository scales.</t>
            </li>
          </ol>
        </section>
        <section anchor="cpu-utilization">
          <name>CPU Utilization</name>
          <t><strong>Objective:</strong> To measure the CPU utilization of the SUT over a predefined sequence of validation runs, including an initial cold-start validation run and several subsequent validation runs. 
CPU utilization is measured by monitoring the SUT process at a fixed sampling interval during object retrieval and validation. The test reports the average and peak CPU utilization for each run, as well as the overall average and peak CPU utilization over the complete sequence of validation runs.</t>
          <t><strong>Procedure:</strong></t>
          <ol spacing="normal" type="1"><li>
              <t>Prepare a predefined test repository sequence, consisting of a set of test repository states. 
For each repository state, record its size and composition, including the numbers of CAs, ROAs, manifests, CRLs, and generated VRPs.</t>
            </li>
            <li>
              <t>Start the SUT with an empty or isolated cache for the initial cold-start validation run using the first repository state.</t>
            </li>
            <li>
              <t>Monitor the CPU utilization of the SUT process at the fixed sampling interval from the moment the Controller starts the validation run.</t>
            </li>
            <li>
              <t>Allow the SUT to complete the validation run and produce the generated VRP set or equivalent validation output.</t>
            </li>
            <li>
              <t>Calculate the average and peak CPU utilization for the initial cold-start validation run based on the recorded samples between the start of the run and the availability of the generated VRP set or equivalent validation output.</t>
            </li>
            <li>
              <t>For each subsequent repository state, trigger the next validation run without clearing the SUT's cache, and measure the average and peak CPU utilization for that run using the same method.</t>
            </li>
            <li>
              <t>Calculate the overall average CPU utilization and overall peak CPU utilization over the complete sequence of validation runs. The overall average CPU utilization is calculated over all samples collected during the measured validation-run intervals, rather than as an unweighted average of per-run averages.</t>
            </li>
            <li>
              <t>Repeat the test using repository sequences of different sizes to evaluate CPU utilization under varying repository scales.</t>
            </li>
          </ol>
        </section>
        <section anchor="memory-usage">
          <name>Memory Usage</name>
          <t><strong>Objective:</strong> To measure the memory usage of the SUT over a predefined sequence of validation runs, including an initial cold-start validation run and several subsequent validation runs. Memory usage is measured by monitoring the SUT process at a fixed sampling interval during object retrieval and validation. The test reports the average and peak memory usage for each run, as well as the overall average and peak memory usage over the complete sequence of validation runs.</t>
          <t><strong>Procedure:</strong></t>
          <ol spacing="normal" type="1"><li>
              <t>Prepare a predefined test repository sequence, consisting of a set of test repository states. 
For each repository state, record its size and composition, including the numbers of CAs, ROAs, manifests, CRLs, and generated VRPs.</t>
            </li>
            <li>
              <t>Start the SUT with an empty or isolated cache for the initial cold-start validation run using the first repository state.</t>
            </li>
            <li>
              <t>Monitor the memory usage of the SUT process at the fixed sampling interval from the moment the Controller starts the validation run.</t>
            </li>
            <li>
              <t>Allow the SUT to complete the validation run and produce the generated VRP set or equivalent validation output.</t>
            </li>
            <li>
              <t>Calculate the average and peak memory usage for the initial cold-start validation run based on the recorded samples between the start of the run and the availability of the generated VRP set or equivalent validation output.</t>
            </li>
            <li>
              <t>For each subsequent repository state, trigger the next validation run without clearing the SUT's cache, and measure the average and peak memory usage for that run using the same method.</t>
            </li>
            <li>
              <t>Calculate the overall average memory usage and overall peak memory usage over the complete sequence of validation runs. The overall average memory usage is calculated over all samples collected during the measured validation-run intervals, rather than as an unweighted average of per-run averages.</t>
            </li>
            <li>
              <t>Repeat the test using repository sequences of different sizes to evaluate memory usage under varying repository scales.</t>
            </li>
          </ol>
        </section>
      </section>
    </section>
    <section anchor="report-format">
      <name>Report Format</name>
      <t>This section defines the format for reporting the results of RPKI Relying Party benchmarking tests. The format is concise and suitable for documenting both functional correctness and performance results.</t>
      <t>System Under Test (SUT) Information:</t>
      <ul spacing="normal">
        <li>
          <t>RP implementation name and version</t>
        </li>
        <li>
          <t>Relevant SUT configuration used for the test</t>
        </li>
      </ul>
      <t>Test Repository Information:</t>
      <ul spacing="normal">
        <li>
          <t>Number of objects and object types used in the baseline repository</t>
        </li>
        <li>
          <t>Number of expected VRPs in the baseline repository</t>
        </li>
        <li>
          <t>Test cases executed</t>
        </li>
        <li>
          <t>Test-specific repository modification, if any</t>
        </li>
      </ul>
      <t>Functional Correctness Test Results:</t>
      <t>For each functional correctness test category, record whether each executed test point passed or failed, and report the total number of passed and failed test points in that category as below.</t>
      <ul spacing="normal">
        <li>
          <t>Baseline Valid Repository Processing: pass count, fail count</t>
        </li>
        <li>
          <t>DER Decoding Correctness:
          </t>
          <ul spacing="normal">
            <li>
              <t>Invalid DER Handling: pass count, fail count</t>
            </li>
          </ul>
        </li>
        <li>
          <t>Object Syntax Validation Correctness:
          </t>
          <ul spacing="normal">
            <li>
              <t>Certificate: pass count, fail count</t>
            </li>
            <li>
              <t>CRL: pass count, fail count</t>
            </li>
            <li>
              <t>Manifest: pass count, fail count</t>
            </li>
            <li>
              <t>ROA: pass count, fail count</t>
            </li>
          </ul>
        </li>
        <li>
          <t>Certification Path Validation Correctness:
          </t>
          <ul spacing="normal">
            <li>
              <t>Invalid Certificate Signature: pass count, fail count</t>
            </li>
            <li>
              <t>Issuer-Subject Mismatch: pass count, fail count</t>
            </li>
            <li>
              <t>Certificate Validity Check: pass count, fail count</t>
            </li>
            <li>
              <t>Certificate Revocation Status Check:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Revoked CA certificate: pass count, fail count</t>
                </li>
                <li>
                  <t>Revoked ROA's EE certificate: pass count, fail count</t>
                </li>
                <li>
                  <t>Revoked Manifest's EE certificate: pass count, fail count</t>
                </li>
              </ul>
            </li>
          </ul>
        </li>
        <li>
          <t>CMS Signed Object Signature Validation Correctness:
          </t>
          <ul spacing="normal">
            <li>
              <t>Invalid Signature Handling: pass count, fail count</t>
            </li>
          </ul>
        </li>
        <li>
          <t>ROA Resource Coverage Validation Correctness: pass count, fail count</t>
        </li>
        <li>
          <t>Manifest Processing Correctness:
          </t>
          <ul spacing="normal">
            <li>
              <t>Hash-Mismatch Check: pass count, fail count</t>
            </li>
            <li>
              <t>Object-Mismatch Check:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Missing Object: pass count, fail count</t>
                </li>
                <li>
                  <t>Extra Object: pass count, fail count</t>
                </li>
              </ul>
            </li>
          </ul>
        </li>
      </ul>
      <t>Performance Test Results:</t>
      <t>For each performance test category, report the corresponding measurement results along with the composition of the test repository.</t>
      <ul spacing="normal">
        <li>
          <t>Persistent Storage Space Test:
          </t>
          <ul spacing="normal">
            <li>
              <t>Repository composition</t>
            </li>
            <li>
              <t>Total persistent storage space consumed by the SUT</t>
            </li>
          </ul>
        </li>
        <li>
          <t>Processing Time Test:
          </t>
          <ul spacing="normal">
            <li>
              <t>Repository composition for each predefined repository state</t>
            </li>
            <li>
              <t>Total elapsed time for each validation run</t>
            </li>
          </ul>
        </li>
        <li>
          <t>CPU Utilization Test:
          </t>
          <ul spacing="normal">
            <li>
              <t>Repository composition for each predefined repository state</t>
            </li>
            <li>
              <t>Average CPU utilization for each validation run</t>
            </li>
            <li>
              <t>Peak CPU utilization for each validation run</t>
            </li>
            <li>
              <t>Overall average CPU utilization over the complete sequence of validation runs</t>
            </li>
            <li>
              <t>Overall peak CPU utilization over the complete sequence of validation runs</t>
            </li>
          </ul>
        </li>
        <li>
          <t>Memory Usage Test:
          </t>
          <ul spacing="normal">
            <li>
              <t>Repository composition for each predefined repository state</t>
            </li>
            <li>
              <t>Average memory usage for each validation run</t>
            </li>
            <li>
              <t>Peak memory usage for each validation run</t>
            </li>
            <li>
              <t>Overall average memory usage over the complete sequence of validation runs</t>
            </li>
            <li>
              <t>Overall peak memory usage over the complete sequence of validation runs</t>
            </li>
          </ul>
        </li>
      </ul>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t>This section records known implementations and supporting test tools for RP Benchmarking tests.
Readers should note that this information is not an exhaustive catalogue, and other implementations may exist.</t>
      <t><xref target="BaRRy"/> is a configurable RPKI repository generator that can produce valid and intentionally invalid repositories, supporting certificates, CRLs, manifests, ROAs, and ASPA objects.</t>
      <t><xref target="Rapport"/> is a script-based RP testing framework that uses <xref target="BaRRy"/> to generate controlled repositories and evaluate RP behavior. Its test suites cover certificate and CRL validation, manifest processing, ROA and ASPA validation, RRDP synchronization and fallback, and RPKI-Router protocol handling.</t>
      <t>The authors have developed additional test cases and supporting scripts based on <xref target="BaRRy"/>, covering all functional correctness tests defined in this document. The implementation has been used to evaluate <xref target="FORT"/>, <xref target="Routinator"/>, <xref target="rpki-client"/>, and <xref target="rpki-prover"/>. The source code and test reports are available at https://github.com/chenluzh621/rpki-rp-benchmark.</t>
    </section>
    <section anchor="sec-security">
      <name>Security Considerations</name>
      <t>This document defines benchmarking methodologies for RPKI RP implementations in controlled laboratory environments using dedicated address space and constrained resources. No additional security considerations are identified within the scope of this document.</t>
    </section>
    <section anchor="sec-iana">
      <name>IANA Considerations</name>
      <t>This document has no IANA requests.</t>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>The authors would like to thank Jorge Cano and the FORT team for their detailed reviews and constructive feedback, which helped clarify and improve the scope and methodology of this work. The authors also thank Mikhail Puzanov for his valuable feedback on the RP/SUT model and the externally observable validation output used in this methodology.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC6480" target="https://www.rfc-editor.org/info/rfc6480" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6480.xml">
          <front>
            <title>An Infrastructure to Support Secure Internet Routing</title>
            <author fullname="M. Lepinski" initials="M." surname="Lepinski"/>
            <author fullname="S. Kent" initials="S." surname="Kent"/>
            <date month="February" year="2012"/>
            <abstract>
              <t>This document describes an architecture for an infrastructure to support improved security of Internet routing. The foundation of this architecture is a Resource Public Key Infrastructure (RPKI) that represents the allocation hierarchy of IP address space and Autonomous System (AS) numbers; and a distributed repository system for storing and disseminating the data objects that comprise the RPKI, as well as other signed objects necessary for improved routing security. As an initial application of this architecture, the document describes how a legitimate holder of IP address space can explicitly and verifiably authorize one or more ASes to originate routes to that address space. Such verifiable authorizations could be used, for example, to more securely construct BGP route filters. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6480"/>
          <seriesInfo name="DOI" value="10.17487/RFC6480"/>
        </reference>
        <reference anchor="RFC9286" target="https://www.rfc-editor.org/info/rfc9286" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9286.xml">
          <front>
            <title>Manifests for the Resource Public Key Infrastructure (RPKI)</title>
            <author fullname="R. Austein" initials="R." surname="Austein"/>
            <author fullname="G. Huston" initials="G." surname="Huston"/>
            <author fullname="S. Kent" initials="S." surname="Kent"/>
            <author fullname="M. Lepinski" initials="M." surname="Lepinski"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This document defines a "manifest" for use in the Resource Public Key Infrastructure (RPKI). A manifest is a signed object (file) that contains a listing of all the signed objects (files) in the repository publication point (directory) associated with an authority responsible for publishing in the repository. For each certificate, Certificate Revocation List (CRL), or other type of signed objects issued by the authority that are published at this repository publication point, the manifest contains both the name of the file containing the object and a hash of the file content. Manifests are intended to enable a relying party (RP) to detect certain forms of attacks against a repository. Specifically, if an RP checks a manifest's contents against the signed objects retrieved from a repository publication point, then the RP can detect replay attacks, and unauthorized in-flight modification or deletion of signed objects. This document obsoletes RFC 6486.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9286"/>
          <seriesInfo name="DOI" value="10.17487/RFC9286"/>
        </reference>
        <reference anchor="RFC6487" target="https://www.rfc-editor.org/info/rfc6487" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6487.xml">
          <front>
            <title>A Profile for X.509 PKIX Resource Certificates</title>
            <author fullname="G. Huston" initials="G." surname="Huston"/>
            <author fullname="G. Michaelson" initials="G." surname="Michaelson"/>
            <author fullname="R. Loomans" initials="R." surname="Loomans"/>
            <date month="February" year="2012"/>
            <abstract>
              <t>This document defines a standard profile for X.509 certificates for the purpose of supporting validation of assertions of "right-of-use" of Internet Number Resources (INRs). The certificates issued under this profile are used to convey the issuer's authorization of the subject to be regarded as the current holder of a "right-of-use" of the INRs that are described in the certificate. This document contains the normative specification of Certificate and Certificate Revocation List (CRL) syntax in the Resource Public Key Infrastructure (RPKI). This document also specifies profiles for the format of certificate requests and specifies the Relying Party RPKI certificate path validation procedure. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6487"/>
          <seriesInfo name="DOI" value="10.17487/RFC6487"/>
        </reference>
        <reference anchor="RFC6488" target="https://www.rfc-editor.org/info/rfc6488" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6488.xml">
          <front>
            <title>Signed Object Template for the Resource Public Key Infrastructure (RPKI)</title>
            <author fullname="M. Lepinski" initials="M." surname="Lepinski"/>
            <author fullname="A. Chi" initials="A." surname="Chi"/>
            <author fullname="S. Kent" initials="S." surname="Kent"/>
            <date month="February" year="2012"/>
            <abstract>
              <t>This document defines a generic profile for signed objects used in the Resource Public Key Infrastructure (RPKI). These RPKI signed objects make use of Cryptographic Message Syntax (CMS) as a standard encapsulation format. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6488"/>
          <seriesInfo name="DOI" value="10.17487/RFC6488"/>
        </reference>
        <reference anchor="RFC8182" target="https://www.rfc-editor.org/info/rfc8182" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8182.xml">
          <front>
            <title>The RPKI Repository Delta Protocol (RRDP)</title>
            <author fullname="T. Bruijnzeels" initials="T." surname="Bruijnzeels"/>
            <author fullname="O. Muravskiy" initials="O." surname="Muravskiy"/>
            <author fullname="B. Weber" initials="B." surname="Weber"/>
            <author fullname="R. Austein" initials="R." surname="Austein"/>
            <date month="July" year="2017"/>
            <abstract>
              <t>In the Resource Public Key Infrastructure (RPKI), Certificate Authorities (CAs) publish certificates, including end-entity certificates, Certificate Revocation Lists (CRLs), and RPKI signed objects to repositories. Relying Parties retrieve the published information from those repositories. This document specifies a new RPKI Repository Delta Protocol (RRDP) for this purpose. RRDP was specifically designed for scaling. It relies on an Update Notification File which lists the current Snapshot and Delta Files that can be retrieved using HTTPS (HTTP over Transport Layer Security (TLS)), and it enables the use of Content Distribution Networks (CDNs) or other caching infrastructures for the retrieval of these files.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8182"/>
          <seriesInfo name="DOI" value="10.17487/RFC8182"/>
        </reference>
        <reference anchor="RFC8360" target="https://www.rfc-editor.org/info/rfc8360" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8360.xml">
          <front>
            <title>Resource Public Key Infrastructure (RPKI) Validation Reconsidered</title>
            <author fullname="G. Huston" initials="G." surname="Huston"/>
            <author fullname="G. Michaelson" initials="G." surname="Michaelson"/>
            <author fullname="C. Martinez" initials="C." surname="Martinez"/>
            <author fullname="T. Bruijnzeels" initials="T." surname="Bruijnzeels"/>
            <author fullname="A. Newton" initials="A." surname="Newton"/>
            <author fullname="D. Shaw" initials="D." surname="Shaw"/>
            <date month="April" year="2018"/>
            <abstract>
              <t>This document specifies an alternative to the certificate validation procedure specified in RFC 6487 that reduces aspects of operational fragility in the management of certificates in the Resource Public Key Infrastructure (RPKI), while retaining essential security features.</t>
              <t>The procedure specified in RFC 6487 requires that Resource Certificates are rejected entirely if they are found to overclaim any resources not contained on the issuing certificate, whereas the validation process defined here allows an issuing Certification Authority (CA) to chose to communicate that such Resource Certificates should be accepted for the intersection of their resources and the issuing certificate.</t>
              <t>It should be noted that the validation process defined here considers validation under a single trust anchor (TA) only. In particular, concerns regarding overclaims where multiple configured TAs claim overlapping resources are considered out of scope for this document.</t>
              <t>This choice is signaled by a set of alternative Object Identifiers (OIDs) per "X.509 Extensions for IP Addresses and AS Identifiers" (RFC 3779) and "Certificate Policy (CP) for the Resource Public Key Infrastructure (RPKI)" (RFC 6484). It should be noted that in case these OIDs are not used for any certificate under a trust anchor, the validation procedure defined here has the same outcome as the procedure defined in RFC 6487.</t>
              <t>Furthermore, this document provides an alternative to Route Origin Authorization (ROA) (RFC 6482) and BGPsec Router Certificate (BGPsec PKI Profiles -- publication requested) validation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8360"/>
          <seriesInfo name="DOI" value="10.17487/RFC8360"/>
        </reference>
        <reference anchor="RFC8897" target="https://www.rfc-editor.org/info/rfc8897" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8897.xml">
          <front>
            <title>Requirements for Resource Public Key Infrastructure (RPKI) Relying Parties</title>
            <author fullname="D. Ma" initials="D." surname="Ma"/>
            <author fullname="S. Kent" initials="S." surname="Kent"/>
            <date month="September" year="2020"/>
            <abstract>
              <t>This document provides a single reference point for requirements for Relying Party (RP) software for use in the Resource Public Key Infrastructure (RPKI). It cites requirements that appear in several RPKI RFCs, making it easier for implementers to become aware of these requirements. Over time, this RFC will be updated to reflect changes to the requirements and guidance specified in the RFCs discussed herein.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8897"/>
          <seriesInfo name="DOI" value="10.17487/RFC8897"/>
        </reference>
        <reference anchor="RFC9582" target="https://www.rfc-editor.org/info/rfc9582" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9582.xml">
          <front>
            <title>A Profile for Route Origin Authorizations (ROAs)</title>
            <author fullname="J. Snijders" initials="J." surname="Snijders"/>
            <author fullname="B. Maddison" initials="B." surname="Maddison"/>
            <author fullname="M. Lepinski" initials="M." surname="Lepinski"/>
            <author fullname="D. Kong" initials="D." surname="Kong"/>
            <author fullname="S. Kent" initials="S." surname="Kent"/>
            <date month="May" year="2024"/>
            <abstract>
              <t>This document defines a standard profile for Route Origin Authorizations (ROAs). A ROA is a digitally signed object that provides a means of verifying that an IP address block holder has authorized an Autonomous System (AS) to originate routes to one or more prefixes within the address block. This document obsoletes RFC 6482.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9582"/>
          <seriesInfo name="DOI" value="10.17487/RFC9582"/>
        </reference>
        <reference anchor="RFC5280" target="https://www.rfc-editor.org/info/rfc5280" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5280.xml">
          <front>
            <title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
            <author fullname="D. Cooper" initials="D." surname="Cooper"/>
            <author fullname="S. Santesson" initials="S." surname="Santesson"/>
            <author fullname="S. Farrell" initials="S." surname="Farrell"/>
            <author fullname="S. Boeyen" initials="S." surname="Boeyen"/>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <author fullname="W. Polk" initials="W." surname="Polk"/>
            <date month="May" year="2008"/>
            <abstract>
              <t>This memo profiles the X.509 v3 certificate and X.509 v2 certificate revocation list (CRL) for use in the Internet. An overview of this approach and model is provided as an introduction. The X.509 v3 certificate format is described in detail, with additional information regarding the format and semantics of Internet name forms. Standard certificate extensions are described and two Internet-specific extensions are defined. A set of required certificate extensions is specified. The X.509 v2 CRL format is described in detail along with standard and Internet-specific extensions. An algorithm for X.509 certification path validation is described. An ASN.1 module and examples are provided in the appendices. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5280"/>
          <seriesInfo name="DOI" value="10.17487/RFC5280"/>
        </reference>
        <reference anchor="RFC7935" target="https://www.rfc-editor.org/info/rfc7935" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7935.xml">
          <front>
            <title>The Profile for Algorithms and Key Sizes for Use in the Resource Public Key Infrastructure</title>
            <author fullname="G. Huston" initials="G." surname="Huston"/>
            <author fullname="G. Michaelson" initials="G." role="editor" surname="Michaelson"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>This document specifies the algorithms, algorithms' parameters, asymmetric key formats, asymmetric key size, and signature format for the Resource Public Key Infrastructure (RPKI) subscribers that generate digital signatures on certificates, Certificate Revocation Lists (CRLs), Cryptographic Message Syntax (CMS) signed objects and certification requests as well as for the relying parties (RPs) that verify these digital signatures.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7935"/>
          <seriesInfo name="DOI" value="10.17487/RFC7935"/>
        </reference>
        <reference anchor="RFC9589" target="https://www.rfc-editor.org/info/rfc9589" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9589.xml">
          <front>
            <title>On the Use of the Cryptographic Message Syntax (CMS) Signing-Time Attribute in Resource Public Key Infrastructure (RPKI) Signed Objects</title>
            <author fullname="J. Snijders" initials="J." surname="Snijders"/>
            <author fullname="T. Harrison" initials="T." surname="Harrison"/>
            <date month="May" year="2024"/>
            <abstract>
              <t>In the Resource Public Key Infrastructure (RPKI), Signed Objects are defined as Cryptographic Message Syntax (CMS) protected content types. A Signed Object contains a signing-time attribute, representing the purported time at which the object was signed by its issuer. RPKI repositories are accessible using the rsync and RPKI Repository Delta protocols, allowing Relying Parties (RPs) to synchronize a local copy of the RPKI repository used for validation with the remote repositories. This document describes how the CMS signing-time attribute can be used to avoid needless retransfers of data when switching between different synchronization protocols. This document updates RFC 6488 by mandating the presence of the CMS signing-time attribute and disallowing the use of the binary-signing-time attribute.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9589"/>
          <seriesInfo name="DOI" value="10.17487/RFC9589"/>
        </reference>
        <reference anchor="I-D.ietf-sidrops-rpki-erik-protocol" target="https://datatracker.ietf.org/doc/html/draft-ietf-sidrops-rpki-erik-protocol-07" xml:base="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-sidrops-rpki-erik-protocol.xml">
          <front>
            <title>The Erik Synchronization Protocol for use with the Resource Public Key Infrastructure (RPKI)</title>
            <author fullname="Job Snijders" initials="J." surname="Snijders">
              <organization>BSD Software Development</organization>
            </author>
            <author fullname="Tim Bruijnzeels" initials="T." surname="Bruijnzeels">
              <organization>RIPE NCC</organization>
            </author>
            <author fullname="Tom Harrison" initials="T." surname="Harrison">
              <organization>APNIC</organization>
            </author>
            <author fullname="Wataru Ohgai" initials="W." surname="Ohgai">
              <organization>JPNIC</organization>
            </author>
            <date day="16" month="August" year="2026"/>
            <abstract>
              <t>This document specifies the Erik Synchronization Protocol for use with the Resource Public Key Infrastructure (RPKI). Erik Synchronization can be characterized as a data replication system using Merkle trees, a content-addressable naming scheme, concurrency control using monotonically increasing sequence numbers, and HTTP transport. The protocol is used to interact with Erik Relays, a new intermediary layer in the RPKI supply chain that exists between the Repository Publication Point and Relying Parties, enabling better scalability. Relying Parties can combine information retrieved via Erik Synchronization with other RPKI transport protocols. The protocol's design is intended to be efficient, fast, easy to implement, and robust in the face of partitions or faults in the network.</t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-sidrops-rpki-erik-protocol-07"/>
        </reference>
        <reference anchor="I-D.ietf-sidrops-rpki-ccr" target="https://datatracker.ietf.org/doc/html/draft-ietf-sidrops-rpki-ccr-11" xml:base="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-sidrops-rpki-ccr.xml">
          <front>
            <title>A Profile for Resource Public Key Infrastructure (RPKI) Canonical Cache Representation (CCR)</title>
            <author fullname="Job Snijders" initials="J." surname="Snijders">
              <organization>BSD Software Development</organization>
            </author>
            <author fullname="Bart Bakker" initials="B." surname="Bakker">
              <organization>RIPE NCC</organization>
            </author>
            <author fullname="Tim Bruijnzeels" initials="T." surname="Bruijnzeels">
              <organization>RIPE NCC</organization>
            </author>
            <author fullname="Theo Buehler" initials="T." surname="Buehler">
              <organization>OpenBSD</organization>
            </author>
            <date day="1" month="July" year="2026"/>
            <abstract>
              <t>This document specifies a Canonical Cache Representation (CCR) content type for use with the Resource Public Key Infrastructure (RPKI). CCR is a Distinguished Encoding Rules (DER) encoded data interchange format which can be used to represent various aspects of the state of a validated RPKI cache at a particular point in time. The CCR profile is a compact and versatile format, well-suited for a variety of applications, for example, audit trails, analytics pipelines, and validated payload dissemination.</t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-sidrops-rpki-ccr-11"/>
        </reference>
        <reference anchor="RSYNC" target="https://rsync.samba.org">
          <front>
            <title>The rsync web pages</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="BaRRy" target="https://github.com/lacnic/barry">
          <front>
            <title>BaRRy</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Rapport" target="https://github.com/lacnic/rapport">
          <front>
            <title>Rapport</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="FORT" target="https://nicmx.github.io/FORT-validator">
          <front>
            <title>FORT-validator</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Routinator" target="https://github.com/NLnetLabs/routinator">
          <front>
            <title>Routinator</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="rpki-client" target="https://www.rpki-client.org">
          <front>
            <title>rpki-client</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="rpki-prover" target="https://github.com/lolepezy/rpki-prover">
          <front>
            <title>rpki-prover</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 891?>

<section anchor="app-test-points">
      <name>Catalogue of Functional Test Points</name>
      <section anchor="app-cert-syntax">
        <name>Certificate Syntax Validation</name>
        <table anchor="tab-cer-tests">
          <name>Certificate Syntax Validation Test Points</name>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Test points</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left"> </td>
              <td align="left">Prohibited fields present</td>
            </tr>
            <tr>
              <td align="left">
                <tt>version</tt></td>
              <td align="left">Non v3 version</td>
            </tr>
            <tr>
              <td align="left">
                <tt>serialNumber</tt></td>
              <td align="left">Non-positive serial number; duplicate serial numbers under same issuer</td>
            </tr>
            <tr>
              <td align="left">
                <tt>signature</tt>/<tt>signatureAlgorithm</tt></td>
              <td align="left">Inner and outer algorithm identifiers mismatch; non-conforming signature algorithm identifiers</td>
            </tr>
            <tr>
              <td align="left">
                <tt>issuer</tt></td>
              <td align="left">Missing <tt>commonName</tt>; multiple <tt>commonName</tt> attributes; wrong string type</td>
            </tr>
            <tr>
              <td align="left">
                <tt>subject</tt></td>
              <td align="left">Missing <tt>commonName</tt>; multiple <tt>commonName</tt> attributes; wrong string type; duplicate subject names under same issuer</td>
            </tr>
            <tr>
              <td align="left">
                <tt>validity</tt></td>
              <td align="left">
                <tt>notAfter</tt> earlier than <tt>notBefore</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>subjectPublicKeyInfo</tt></td>
              <td align="left">Incorrect public key algorithm identifier; malformed RSA public key encoding</td>
            </tr>
            <tr>
              <td align="left">
                <tt>basicConstraints</tt></td>
              <td align="left">Missing in a CA certificate; present in an EE certificate; wrong criticality marking; disallowed <tt>pathLenConstraint</tt> field present</td>
            </tr>
            <tr>
              <td align="left">
                <tt>subjectKeyIdentifier</tt></td>
              <td align="left">Missing extension; non-conforming key identifier; wrong criticality marking</td>
            </tr>
            <tr>
              <td align="left">
                <tt>authorityKeyIdentifier</tt></td>
              <td align="left">Missing extension; non-conforming key identifier; disallowed <tt>authorityCertIssuer</tt>/<tt>authorityCertSerialNumber</tt> fields present; wrong criticality marking</td>
            </tr>
            <tr>
              <td align="left">
                <tt>keyUsage</tt></td>
              <td align="left">Missing extension; non-conforming bits setting; wrong criticality marking</td>
            </tr>
            <tr>
              <td align="left">
                <tt>extendedKeyUsage</tt></td>
              <td align="left">Incorrectly present in CA and EE certificates used to verify RPKI objects</td>
            </tr>
            <tr>
              <td align="left">
                <tt>cRLDistributionPoints</tt></td>
              <td align="left">Missing extension; disallowed <tt>reasons</tt>/<tt>cRLIssuer</tt> fields present; relative distribution point name; non-URI <tt>generalName</tt>; multiple distribution points; wrong criticality marking</td>
            </tr>
            <tr>
              <td align="left">AIA</td>
              <td align="left">Missing in a subordinate CA certificate; incorrectly present in a self-signed certificate; incorrect access method value; URI referencing a different issuer certificate; wrong criticality marking</td>
            </tr>
            <tr>
              <td align="left">SIA for CA</td>
              <td align="left">Missing extension; missing <tt>caRepository</tt> access description; non-rsync repository URI; missing <tt>rpkiManifest</tt> access description; wrong criticality marking</td>
            </tr>
            <tr>
              <td align="left">SIA for EE</td>
              <td align="left">Missing <tt>signedObject</tt> access description; disallowed <tt>caRepository</tt> access description present; wrong criticality marking</td>
            </tr>
            <tr>
              <td align="left">
                <tt>certificatePolicies</tt></td>
              <td align="left">Missing extension; multiple policy entries; wrong criticality marking</td>
            </tr>
            <tr>
              <td align="left">IP resource</td>
              <td align="left">Missing extension; disallowed subsequent AFI present; empty IP resource set; wrong criticality marking</td>
            </tr>
            <tr>
              <td align="left">AS resource</td>
              <td align="left">Missing extension; disallowed RDI value present; empty AS resource set; wrong criticality marking</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="app-crl-syntax">
        <name>CRL Syntax Validation</name>
        <table anchor="tab-crl-syntax">
          <name>CRL Syntax Validation Test Points</name>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Test points</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>version</tt></td>
              <td align="left">Non-v2 CRL version</td>
            </tr>
            <tr>
              <td align="left">
                <tt>signature</tt>/<tt>signatureAlgorithm</tt></td>
              <td align="left">Invalid signature algorithm OID; inner and outer signature algorithm mismatch</td>
            </tr>
            <tr>
              <td align="left">
                <tt>issuer</tt></td>
              <td align="left">Missing <tt>commonName</tt>; multiple <tt>commonName</tt> attributes; wrong string type</td>
            </tr>
            <tr>
              <td align="left">
                <tt>thisUpdate</tt>/<tt>nextUpdate</tt></td>
              <td align="left">Stale CRL; invalid time format</td>
            </tr>
            <tr>
              <td align="left">
                <tt>revokedCertificates</tt></td>
              <td align="left">Missing certificate serial number in an entry; missing revocation date in an entry; disallowed CRL entry extensions present</td>
            </tr>
            <tr>
              <td align="left">
                <tt>crlExtensions</tt></td>
              <td align="left">Disallowed CRL extension present</td>
            </tr>
            <tr>
              <td align="left">
                <tt>crlExtensions.authorityKeyIdentifier</tt></td>
              <td align="left">Missing extension; wrong criticality marking; key identifier inconsistent with issuer's SKI; disallowed field <tt>authorityCertIssuer</tt>/<tt>authorityCertSerialNumber</tt> present</td>
            </tr>
            <tr>
              <td align="left">
                <tt>crlExtensions.cRLNumber</tt></td>
              <td align="left">Missing extension; wrong criticality marking; negative value; value exceeding <tt>2^159−1</tt></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="app-cms-syntax">
        <name>CMS Signed Object Syntax Validation</name>
        <table anchor="tab-cms-syntax">
          <name>CMS Signed Object Syntax Validation Test Points</name>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Test points</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>contentType</tt></td>
              <td align="left">Content type other than <tt>id-signedData</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>signerInfos</tt></td>
              <td align="left">Multiple <tt>SignerInfo</tt> objects</td>
            </tr>
            <tr>
              <td align="left">
                <tt>version</tt></td>
              <td align="left">Version other than 3</td>
            </tr>
            <tr>
              <td align="left">
                <tt>digestAlgorithms</tt></td>
              <td align="left">Multiple digest algorithm identifiers; unsupported digest algorithm OID</td>
            </tr>
            <tr>
              <td align="left">
                <tt>certificates</tt></td>
              <td align="left">Missing certificates field; multiple EE certificates</td>
            </tr>
            <tr>
              <td align="left">
                <tt>crls</tt></td>
              <td align="left">
                <tt>crls</tt> field present</td>
            </tr>
            <tr>
              <td align="left">
                <tt>SignerInfo.version</tt></td>
              <td align="left">Version other than 3</td>
            </tr>
            <tr>
              <td align="left">
                <tt>SignerInfo.sid</tt></td>
              <td align="left">Signer identifier mismatched with the embedded EE certificate’s SKI</td>
            </tr>
            <tr>
              <td align="left">
                <tt>SignerInfo.digestAlgorithm</tt></td>
              <td align="left">Unsupported digest algorithm OID</td>
            </tr>
            <tr>
              <td align="left">
                <tt>SignerInfo.signedAttrs</tt></td>
              <td align="left">Missing <tt>signedAttrs</tt> field; missing <tt>content-type</tt> attribute; missing <tt>message-digest</tt> attribute; missing <tt>signing-time</tt> attribute; disallowed signed attribute; duplicate signed attribute; multiple values in one attribute</td>
            </tr>
            <tr>
              <td align="left">
                <tt>SignerInfo.signatureAlgorithm</tt></td>
              <td align="left">Unsupported signature algorithm OID</td>
            </tr>
            <tr>
              <td align="left">
                <tt>SignerInfo.unsignedAttrs</tt></td>
              <td align="left">
                <tt>unsignedAttrs</tt> field present</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="app-mft-syntax">
        <name>Manifest-Specific Syntax Validation</name>
        <table anchor="tab-mft-tests">
          <name>Manifest-Specific Syntax Validation Test Points</name>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Test points</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>version</tt></td>
              <td align="left">Nonzero manifest version</td>
            </tr>
            <tr>
              <td align="left">
                <tt>manifestNumber</tt></td>
              <td align="left">Negative manifest number; manifest number exceeding 20 octets</td>
            </tr>
            <tr>
              <td align="left">
                <tt>thisUpdate</tt>/<tt>nextUpdate</tt></td>
              <td align="left">Stale manifest; non-GeneralizedTime encoding; <tt>nextUpdate</tt> earlier than <tt>thisUpdate</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>fileHashAlg</tt></td>
              <td align="left">Unsupported file hashing algorithm</td>
            </tr>
            <tr>
              <td align="left">
                <tt>fileList</tt></td>
              <td align="left">Empty file list; filename containing prohibited character</td>
            </tr>
            <tr>
              <td align="left">
                <tt>eContentType</tt>/<tt>content-type</tt></td>
              <td align="left">
                <tt>content-type</tt> OID inconsistent with manifest <tt>eContentType</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>certificates</tt></td>
              <td align="left">Explicit IP resources instead of inherit</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="app-roa-syntax">
        <name>ROA-Specific Syntax Validation</name>
        <table anchor="tab-roa-tests">
          <name>ROA-Specific Syntax Validation Test Points</name>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Test points</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>version</tt></td>
              <td align="left">Nonzero ROA version</td>
            </tr>
            <tr>
              <td align="left">
                <tt>asID</tt></td>
              <td align="left">AS identifier outside the permitted range</td>
            </tr>
            <tr>
              <td align="left">
                <tt>addressFamily</tt></td>
              <td align="left">Unsupported AFI; duplicate AFI; more than two address-family entries</td>
            </tr>
            <tr>
              <td align="left">
                <tt>maxLength</tt></td>
              <td align="left">
                <tt>maxLength</tt> shorter than the prefix length; <tt>maxLength</tt> exceeding the address-family limit</td>
            </tr>
            <tr>
              <td align="left">
                <tt>eContentType</tt>/<tt>content-type</tt></td>
              <td align="left">
                <tt>content-type</tt> OID inconsistent with ROA <tt>eContentType</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>certificates</tt></td>
              <td align="left">IP resources specified using <tt>inherit</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>certificates</tt></td>
              <td align="left">Disallowed AS resource extension present</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="app-cms-signature">
        <name>CMS Signed Object Signature Validation</name>
        <table anchor="tab-sig-tests">
          <name>CMS Signed Object Signature Validation Test Points</name>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Test points</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>eContent</tt></td>
              <td align="left">Encapsulated content modified after signing</td>
            </tr>
            <tr>
              <td align="left">
                <tt>SignerInfo.signature</tt></td>
              <td align="left">Signature value not verifiable with the public key in the associated EE certificate</td>
            </tr>
            <tr>
              <td align="left">
                <tt>signedAttrs.message-digest</tt></td>
              <td align="left">Message digest inconsistent with the encapsulated content</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
irdPGuwJ3v9BxxmumAAvO5ztArUFpHS3UhmTyt8ryLWZrRbuMa6ayfQOBxjf
oA0ByMho9LDOTjmdEUSVGuEPa2nmZP555wzQpgWcUTrCiTGE1BTCE+1n1Ifw
KpayAGtOFkFL9kCv37sZhZoxbjWTkIPYhumcnGa1LTly3CZ2qSiSDVxOZ1QR
h155f9pvnNvGg2yVsqsMGJ/QOXYioB2Kn3/F/SYZcHUi3SXA/WFMstWBk3re
2W+SDGfk8cvKh2M0ZjV8rNTwYVwQyW8Vh1kJuTm4DK3uCUd8PoD7lj3OGTvE
pq/qZe29OsFdZUctAUf+PmC8hS5XI8MdhN9B+B2E3wqE1xyUmUJGvWmzxXZ3
YmGfFdNdy/pn7TztokN2+xt1VLfUoRHMWnQ/BBDadW1fuM5hHbDx4CY6dj/A
yp7zATvYLdw0WNqVL0+Dcis5v2POf4ZXastljZeuvgvzs+iCmttrFUFojolo
DOx3vGnlDu/v8P6z4n1d3tZZ6OIzoPnIBroUnl85OmnO/9YnoNRCZyR4bqhQ
RS/bYlWW/83pVnzeQ57Ng4lZRmy24ZJch844ZIsrKG2HstjTDPWimIVBp37y
InYH7gi6vLz5p6KWb6j3g+gsmEYBjlfdJ6KfwxxBtc5c3HyDzaCpTfHaKrqy
Su1MwT30NhSlqJwWANZ8OI2uzb+pg06zoHCdPmIkt0PwB/hZ9SAfstVQg2bn
kdUY3r5aRzVg59TYvjblx8S5031/LN2HT/Gwt2aCzyfSej52Gk/l9bJjhKiX
eLxcaw8bJwo58Gkw2AXRW0hbYWvZuc3NR/GVmIqKbXfwuXGwvqPuKkCID2sD
Vm4oN+oeEmix8neddbHMU7jbTPf1w6WPlg5zb5ppIdphcik2njcBZYl8cXbj
9ZIsfKQ89CzSm9ucdNUT3WcrSz5rf8xnWuOdfW0IooVeX35pEsXjwkVRtwhg
1ec/3epTAqlGks9pcYrOl4KjNODLWIep7hD1d4uot2aAilsxGimekctxYlzZ
rspqWTb1XZZHm/6+xJ0XFIxRF84SEBqYW30sNzICAqY6I3OzyxH9HLKbhgr0
Pkyzk5eN3sati27Gh7nt0KZ8rMI3/F2fP9pypgft7IU5Hvk5U16itLojCIAX
z2mdyJ7exKs1q3+wouX5NAzmwNiMNCoJnIMz3tp5xblZnMvi3sThpLKokSx1
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
mStcMrJGxbbRvzmP0Dk9j/8fh8qbGf/qAAA=

-->

</rfc>
