Skip to content

Domain-based AOKI implementation - #852

Merged
FHatCSW merged 7 commits into
mainfrom
domain-aoki
Aug 5, 2026
Merged

Domain-based AOKI implementation#852
FHatCSW merged 7 commits into
mainfrom
domain-aoki

Conversation

@Aircoookie

Copy link
Copy Markdown
Collaborator

Description of changes

  • Generate domain-based CA pinning DevOwnerID in the test setup command
  • Dynamically use domain-based DevOwnerIDs if no DevOwnerID is present for the device IDevID
  • Support requesting domain-based DevOwnerIDs externally via EST/CMP

Notes

Legal

  • I certify that I have all necessary rights to publish this contribution under the MIT license. I agree to the Trustpoint CLA and have added my name to the AUTHORS.md file.

Fix incorrect private key usage in setup command
Rename menu Endpoints back to Devices
Copilot AI lite review requested due to automatic review settings July 29, 2026 15:10

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the AOKI onboarding flow to support a domain-based DevOwnerID lookup (CA-pinning) as a fallback when an IDevID-specific DevOwnerID is not present, and updates the demo/test tooling and UI to reflect/display this new reference type.

Changes:

  • Add domain-based DevOwnerID credential resolution in CMP authorization (fallback to domain CA pinning).
  • Extend test environment setup and certificate generation to include domain-based DevOwnerID artifacts.
  • Update UI templates to rename navigation (“Devices”) and to display either IDevID or pinned-CA fingerprints.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
trustpoint/templates/trustpoint/base.html Renames navigation label from “Endpoints” to “Devices”.
trustpoint/templates/devices/zero_touch_credentials/details.html Displays a new fingerprint “display” field that supports domain-based references.
trustpoint/request/authorization/base.py Adds fallback owner credential resolution using the request domain.
trustpoint/pki/models/credential.py Adds parsing/display helpers for domain-based dev-owner:ca: references.
trustpoint/help_pages/devices_help_views.py Adds domain-based DevOwnerID artifacts to the help/demo certificate listing.
trustpoint/aoki/views.py Implements domain-based DevOwnerID lookup by domain CA fingerprint.
trustpoint/aoki/tests/cmp_client.py Updates CMP client verification to accept domain-based DevOwnerID matching.
trustpoint/aoki/management/commands/aoki_setup_idevid_test_env.py Extends test env setup to create/store both IDevID-based and domain-based DevOwnerIDs.
trustpoint/aoki/management/commands/aoki_gen_test_certs.py Refactors test cert generation to create an Owner CA and use it to sign DevOwnerIDs.
Comments suppressed due to low confidence (1)

trustpoint/aoki/tests/cmp_client.py:226

  • The caught exception variable e is unused here. Dropping the binding avoids an unused-variable lint issue and keeps the intent clear.
        try:
            self._verify_matches_idevid_cert(owner_id_cert, idevid_cert)
        except AokiClientOwnerIdCertVerificationError as e:
            self._verify_matches_domain_ca_cert(owner_id_cert)

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 126 to 128
idevid_sha256_fingerprint = idevid_cert.fingerprint(hashes.SHA256()).hex()
# Build URI string "dev-owner:cert:<idevid_subj_sn>_<idevid_sha256_fingerprint>"
# If the IDevID Subject Serial Number is not present, '' shall be used as a placeholder
Comment on lines +109 to +111
self.log_and_stdout(f' Domain: {domain.unique_name}')
self.log_and_stdout(f' Owner Credential: {OWNER_CRED_UNIQUE_NAME}')
self.log_and_stdout(f' Domain-based Owner Cred.: {DOMAIN_BASED_OWNER_CRED_UNIQUE_NAME}')
Comment thread trustpoint/aoki/management/commands/aoki_setup_idevid_test_env.py
Comment thread trustpoint/pki/models/credential.py Outdated
def _verify_matches_domain_ca_cert(self, owner_id_cert: x509.Certificate) -> None:
"""Verify the Owner ID certificate is valid for the domain issuing CA certificate."""
print('Verifying Owner ID certificate matches Domain CA certificate')
candidate_ca_certs = self._load_certificates(CERTS_DIR / 'full_chain.pem')
@codecov

codecov Bot commented Jul 29, 2026

Copy link
Copy Markdown

❌ 13 Tests Failed:

Tests completed Failed Passed Skipped
3307 13 3294 12
View the full list of 13 ❄️ flaky test(s)
trustpoint/agents/tests/test_views.py::TestAgentJobResultView::test_post_result_failure

Flake rate in main: 100.00% (Passed 0 times, Failed 1 times)

Stack Traces | 0.006s run time
file .../agents/tests/test_views.py, line 647
      @patch('agents.api_views.AgentCertificateAuthentication.authenticate')
      def test_post_result_failure(
file .../agents/tests/test_views.py, line 121
  @pytest.fixture
  def assigned_profile(
E       fixture 'workflow_definition' not found
>       available fixtures: _class_scoped_runner, _dj_autoclear_mailbox, _django_clear_site_cache, _django_db_helper, _django_db_marker, _django_isolate_apps, _django_set_urlconf, _django_setup_unittest, _fail_for_invalid_template_variable, _function_scoped_runner, _live_server_helper, _module_scoped_runner, _package_scoped_runner, _session_scoped_runner, _template_string_if_invalid_marker, admin_client, admin_user, agent, api_client, assigned_profile, async_client, async_rf, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, capteesys, cert_profile_instance, cert_profile_instance_tls_server, client, cmp_device_with_onboarding, cmp_device_without_onboarding, complete_setup_wizard_by_default, configure_app_secret_backend_for_tests, cov, credential_instance, db, device, device_instance, device_instance_onboarding, django_assert_max_num_queries, django_assert_num_queries, django_capture_on_commit_callbacks, django_db_blocker, django_db_createdb, django_db_keepdb, django_db_modify_db_settings, django_db_modify_db_settings_parallel_suffix, django_db_modify_db_settings_tox_suffix, django_db_modify_db_settings_xdist_suffix, django_db_reset_sequences, django_db_serialized_rollback, django_db_setup, django_db_use_migrations, django_isolated_apps, django_mail_dnsname, django_mail_patch_dns, django_test_environment, django_user_model, django_username_field, doctest_namespace, domain, domain_credential_cmp_onboarding, domain_credential_est_onboarding, domain_credential_instance_for_cmp, domain_instance, ec_private_key, enable_db_access_for_all_tests, est_device_with_onboarding, est_device_without_onboarding, event_loop_policy, extra, extras, include_metadata_in_junit_xml, insert_assert, insert_assert_add_to_builtins, insert_assert_maybe_fail, insert_assert_session, issuing_ca_instance, live_server, mailoutbox, metadata, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, remote_device_credential_download_instance, rf, rsa_private_key, settings, subtests, test_cert, test_csr_fixture, tls_client_certificate_instance_est_no_onboarding, tls_client_certificate_instance_est_onboarding, tls_client_credential_instance, tls_client_request_with_client_cert_header, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, transactional_db, unused_tcp_port, unused_tcp_port_factory, unused_udp_port, unused_udp_port_factory, web_client
>       use 'pytest --fixtures [testpath]' for help on them.

.../agents/tests/test_views.py:121
trustpoint/agents/tests/test_views.py::TestAgentJobResultView::test_post_result_success

Flake rate in main: 100.00% (Passed 0 times, Failed 1 times)

Stack Traces | 0.006s run time
file .../agents/tests/test_views.py, line 618
      @patch('agents.api_views.AgentCertificateAuthentication.authenticate')
      def test_post_result_success(
file .../agents/tests/test_views.py, line 121
  @pytest.fixture
  def assigned_profile(
E       fixture 'workflow_definition' not found
>       available fixtures: _class_scoped_runner, _dj_autoclear_mailbox, _django_clear_site_cache, _django_db_helper, _django_db_marker, _django_isolate_apps, _django_set_urlconf, _django_setup_unittest, _fail_for_invalid_template_variable, _function_scoped_runner, _live_server_helper, _module_scoped_runner, _package_scoped_runner, _session_scoped_runner, _template_string_if_invalid_marker, admin_client, admin_user, agent, api_client, assigned_profile, async_client, async_rf, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, capteesys, cert_profile_instance, cert_profile_instance_tls_server, client, cmp_device_with_onboarding, cmp_device_without_onboarding, complete_setup_wizard_by_default, configure_app_secret_backend_for_tests, cov, credential_instance, db, device, device_instance, device_instance_onboarding, django_assert_max_num_queries, django_assert_num_queries, django_capture_on_commit_callbacks, django_db_blocker, django_db_createdb, django_db_keepdb, django_db_modify_db_settings, django_db_modify_db_settings_parallel_suffix, django_db_modify_db_settings_tox_suffix, django_db_modify_db_settings_xdist_suffix, django_db_reset_sequences, django_db_serialized_rollback, django_db_setup, django_db_use_migrations, django_isolated_apps, django_mail_dnsname, django_mail_patch_dns, django_test_environment, django_user_model, django_username_field, doctest_namespace, domain, domain_credential_cmp_onboarding, domain_credential_est_onboarding, domain_credential_instance_for_cmp, domain_instance, ec_private_key, enable_db_access_for_all_tests, est_device_with_onboarding, est_device_without_onboarding, event_loop_policy, extra, extras, include_metadata_in_junit_xml, insert_assert, insert_assert_add_to_builtins, insert_assert_maybe_fail, insert_assert_session, issuing_ca_instance, live_server, mailoutbox, metadata, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, remote_device_credential_download_instance, rf, rsa_private_key, settings, subtests, test_cert, test_csr_fixture, tls_client_certificate_instance_est_no_onboarding, tls_client_certificate_instance_est_onboarding, tls_client_credential_instance, tls_client_request_with_client_cert_header, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, transactional_db, unused_tcp_port, unused_tcp_port_factory, unused_udp_port, unused_udp_port_factory, web_client
>       use 'pytest --fixtures [testpath]' for help on them.

.../agents/tests/test_views.py:121
trustpoint/agents/tests/test_views.py::TestAgentJobsView::test_get_jobs_disabled_profile_not_included

Flake rate in main: 100.00% (Passed 0 times, Failed 1 times)

Stack Traces | 0.006s run time
file .../agents/tests/test_views.py, line 567
      @patch('agents.api_views.AgentCertificateAuthentication.authenticate')
      def test_get_jobs_disabled_profile_not_included(
file .../agents/tests/test_views.py, line 121
  @pytest.fixture
  def assigned_profile(
E       fixture 'workflow_definition' not found
>       available fixtures: _class_scoped_runner, _dj_autoclear_mailbox, _django_clear_site_cache, _django_db_helper, _django_db_marker, _django_isolate_apps, _django_set_urlconf, _django_setup_unittest, _fail_for_invalid_template_variable, _function_scoped_runner, _live_server_helper, _module_scoped_runner, _package_scoped_runner, _session_scoped_runner, _template_string_if_invalid_marker, admin_client, admin_user, agent, api_client, assigned_profile, async_client, async_rf, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, capteesys, cert_profile_instance, cert_profile_instance_tls_server, client, cmp_device_with_onboarding, cmp_device_without_onboarding, complete_setup_wizard_by_default, configure_app_secret_backend_for_tests, cov, credential_instance, db, device, device_instance, device_instance_onboarding, django_assert_max_num_queries, django_assert_num_queries, django_capture_on_commit_callbacks, django_db_blocker, django_db_createdb, django_db_keepdb, django_db_modify_db_settings, django_db_modify_db_settings_parallel_suffix, django_db_modify_db_settings_tox_suffix, django_db_modify_db_settings_xdist_suffix, django_db_reset_sequences, django_db_serialized_rollback, django_db_setup, django_db_use_migrations, django_isolated_apps, django_mail_dnsname, django_mail_patch_dns, django_test_environment, django_user_model, django_username_field, doctest_namespace, domain, domain_credential_cmp_onboarding, domain_credential_est_onboarding, domain_credential_instance_for_cmp, domain_instance, ec_private_key, enable_db_access_for_all_tests, est_device_with_onboarding, est_device_without_onboarding, event_loop_policy, extra, extras, include_metadata_in_junit_xml, insert_assert, insert_assert_add_to_builtins, insert_assert_maybe_fail, insert_assert_session, issuing_ca_instance, live_server, mailoutbox, metadata, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, remote_device_credential_download_instance, rf, rsa_private_key, settings, subtests, test_cert, test_csr_fixture, tls_client_certificate_instance_est_no_onboarding, tls_client_certificate_instance_est_onboarding, tls_client_credential_instance, tls_client_request_with_client_cert_header, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, transactional_db, unused_tcp_port, unused_tcp_port_factory, unused_udp_port, unused_udp_port_factory, web_client
>       use 'pytest --fixtures [testpath]' for help on them.

.../agents/tests/test_views.py:121
trustpoint/agents/tests/test_views.py::TestAgentJobsView::test_get_jobs_not_due_not_included

Flake rate in main: 100.00% (Passed 0 times, Failed 1 times)

Stack Traces | 0.006s run time
file .../agents/tests/test_views.py, line 586
      @patch('agents.api_views._build_resolved_profile')
      @patch('agents.api_views.AgentCertificateAuthentication.authenticate')
      def test_get_jobs_not_due_not_included(
file .../agents/tests/test_views.py, line 121
  @pytest.fixture
  def assigned_profile(
E       fixture 'workflow_definition' not found
>       available fixtures: _class_scoped_runner, _dj_autoclear_mailbox, _django_clear_site_cache, _django_db_helper, _django_db_marker, _django_isolate_apps, _django_set_urlconf, _django_setup_unittest, _fail_for_invalid_template_variable, _function_scoped_runner, _live_server_helper, _module_scoped_runner, _package_scoped_runner, _session_scoped_runner, _template_string_if_invalid_marker, admin_client, admin_user, agent, api_client, assigned_profile, async_client, async_rf, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, capteesys, cert_profile_instance, cert_profile_instance_tls_server, client, cmp_device_with_onboarding, cmp_device_without_onboarding, complete_setup_wizard_by_default, configure_app_secret_backend_for_tests, cov, credential_instance, db, device, device_instance, device_instance_onboarding, django_assert_max_num_queries, django_assert_num_queries, django_capture_on_commit_callbacks, django_db_blocker, django_db_createdb, django_db_keepdb, django_db_modify_db_settings, django_db_modify_db_settings_parallel_suffix, django_db_modify_db_settings_tox_suffix, django_db_modify_db_settings_xdist_suffix, django_db_reset_sequences, django_db_serialized_rollback, django_db_setup, django_db_use_migrations, django_isolated_apps, django_mail_dnsname, django_mail_patch_dns, django_test_environment, django_user_model, django_username_field, doctest_namespace, domain, domain_credential_cmp_onboarding, domain_credential_est_onboarding, domain_credential_instance_for_cmp, domain_instance, ec_private_key, enable_db_access_for_all_tests, est_device_with_onboarding, est_device_without_onboarding, event_loop_policy, extra, extras, include_metadata_in_junit_xml, insert_assert, insert_assert_add_to_builtins, insert_assert_maybe_fail, insert_assert_session, issuing_ca_instance, live_server, mailoutbox, metadata, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, remote_device_credential_download_instance, rf, rsa_private_key, settings, subtests, test_cert, test_csr_fixture, tls_client_certificate_instance_est_no_onboarding, tls_client_certificate_instance_est_onboarding, tls_client_credential_instance, tls_client_request_with_client_cert_header, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, transactional_db, unused_tcp_port, unused_tcp_port_factory, unused_udp_port, unused_udp_port_factory, web_client
>       use 'pytest --fixtures [testpath]' for help on them.

.../agents/tests/test_views.py:121
trustpoint/agents/tests/test_views.py::TestAgentProfileDefinitionConfigView::test_get_existing_profile

Flake rate in main: 100.00% (Passed 0 times, Failed 1 times)

Stack Traces | 0.285s run time
file .../agents/tests/test_views.py, line 756
      def test_get_existing_profile(self, web_client: Client, workflow_definition: AgentProfileDefinition):
E       fixture 'workflow_definition' not found
>       available fixtures: _class_scoped_runner, _dj_autoclear_mailbox, _django_clear_site_cache, _django_db_helper, _django_db_marker, _django_isolate_apps, _django_set_urlconf, _django_setup_unittest, _fail_for_invalid_template_variable, _function_scoped_runner, _live_server_helper, _module_scoped_runner, _package_scoped_runner, _session_scoped_runner, _template_string_if_invalid_marker, admin_client, admin_user, agent, api_client, assigned_profile, async_client, async_rf, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, capteesys, cert_profile_instance, cert_profile_instance_tls_server, client, cmp_device_with_onboarding, cmp_device_without_onboarding, complete_setup_wizard_by_default, configure_app_secret_backend_for_tests, cov, credential_instance, db, device, device_instance, device_instance_onboarding, django_assert_max_num_queries, django_assert_num_queries, django_capture_on_commit_callbacks, django_db_blocker, django_db_createdb, django_db_keepdb, django_db_modify_db_settings, django_db_modify_db_settings_parallel_suffix, django_db_modify_db_settings_tox_suffix, django_db_modify_db_settings_xdist_suffix, django_db_reset_sequences, django_db_serialized_rollback, django_db_setup, django_db_use_migrations, django_isolated_apps, django_mail_dnsname, django_mail_patch_dns, django_test_environment, django_user_model, django_username_field, doctest_namespace, domain, domain_credential_cmp_onboarding, domain_credential_est_onboarding, domain_credential_instance_for_cmp, domain_instance, ec_private_key, enable_db_access_for_all_tests, est_device_with_onboarding, est_device_without_onboarding, event_loop_policy, extra, extras, include_metadata_in_junit_xml, insert_assert, insert_assert_add_to_builtins, insert_assert_maybe_fail, insert_assert_session, issuing_ca_instance, live_server, mailoutbox, metadata, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, remote_device_credential_download_instance, rf, rsa_private_key, settings, subtests, test_cert, test_csr_fixture, tls_client_certificate_instance_est_no_onboarding, tls_client_certificate_instance_est_onboarding, tls_client_credential_instance, tls_client_request_with_client_cert_header, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, transactional_db, unused_tcp_port, unused_tcp_port_factory, unused_udp_port, unused_udp_port_factory, web_client
>       use 'pytest --fixtures [testpath]' for help on them.

.../agents/tests/test_views.py:756
trustpoint/agents/tests/test_views.py::TestAgentProfileDefinitionConfigView::test_get_profile_with_non_dict_json

Flake rate in main: 100.00% (Passed 0 times, Failed 1 times)

Stack Traces | 0.285s run time
file .../agents/tests/test_views.py, line 842
      def test_get_profile_with_non_dict_json(
E       fixture 'workflow_definition' not found
>       available fixtures: _class_scoped_runner, _dj_autoclear_mailbox, _django_clear_site_cache, _django_db_helper, _django_db_marker, _django_isolate_apps, _django_set_urlconf, _django_setup_unittest, _fail_for_invalid_template_variable, _function_scoped_runner, _live_server_helper, _module_scoped_runner, _package_scoped_runner, _session_scoped_runner, _template_string_if_invalid_marker, admin_client, admin_user, agent, api_client, assigned_profile, async_client, async_rf, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, capteesys, cert_profile_instance, cert_profile_instance_tls_server, client, cmp_device_with_onboarding, cmp_device_without_onboarding, complete_setup_wizard_by_default, configure_app_secret_backend_for_tests, cov, credential_instance, db, device, device_instance, device_instance_onboarding, django_assert_max_num_queries, django_assert_num_queries, django_capture_on_commit_callbacks, django_db_blocker, django_db_createdb, django_db_keepdb, django_db_modify_db_settings, django_db_modify_db_settings_parallel_suffix, django_db_modify_db_settings_tox_suffix, django_db_modify_db_settings_xdist_suffix, django_db_reset_sequences, django_db_serialized_rollback, django_db_setup, django_db_use_migrations, django_isolated_apps, django_mail_dnsname, django_mail_patch_dns, django_test_environment, django_user_model, django_username_field, doctest_namespace, domain, domain_credential_cmp_onboarding, domain_credential_est_onboarding, domain_credential_instance_for_cmp, domain_instance, ec_private_key, enable_db_access_for_all_tests, est_device_with_onboarding, est_device_without_onboarding, event_loop_policy, extra, extras, include_metadata_in_junit_xml, insert_assert, insert_assert_add_to_builtins, insert_assert_maybe_fail, insert_assert_session, issuing_ca_instance, live_server, mailoutbox, metadata, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, remote_device_credential_download_instance, rf, rsa_private_key, settings, subtests, test_cert, test_csr_fixture, tls_client_certificate_instance_est_no_onboarding, tls_client_certificate_instance_est_onboarding, tls_client_credential_instance, tls_client_request_with_client_cert_header, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, transactional_db, unused_tcp_port, unused_tcp_port_factory, unused_udp_port, unused_udp_port_factory, web_client
>       use 'pytest --fixtures [testpath]' for help on them.

.../agents/tests/test_views.py:842
trustpoint/agents/tests/test_views.py::TestAgentProfileDefinitionConfigView::test_post_update_profile

Flake rate in main: 100.00% (Passed 0 times, Failed 1 times)

Stack Traces | 0.285s run time
file .../agents/tests/test_views.py, line 804
      def test_post_update_profile(self, web_client: Client, workflow_definition: AgentProfileDefinition):
E       fixture 'workflow_definition' not found
>       available fixtures: _class_scoped_runner, _dj_autoclear_mailbox, _django_clear_site_cache, _django_db_helper, _django_db_marker, _django_isolate_apps, _django_set_urlconf, _django_setup_unittest, _fail_for_invalid_template_variable, _function_scoped_runner, _live_server_helper, _module_scoped_runner, _package_scoped_runner, _session_scoped_runner, _template_string_if_invalid_marker, admin_client, admin_user, agent, api_client, assigned_profile, async_client, async_rf, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, capteesys, cert_profile_instance, cert_profile_instance_tls_server, client, cmp_device_with_onboarding, cmp_device_without_onboarding, complete_setup_wizard_by_default, configure_app_secret_backend_for_tests, cov, credential_instance, db, device, device_instance, device_instance_onboarding, django_assert_max_num_queries, django_assert_num_queries, django_capture_on_commit_callbacks, django_db_blocker, django_db_createdb, django_db_keepdb, django_db_modify_db_settings, django_db_modify_db_settings_parallel_suffix, django_db_modify_db_settings_tox_suffix, django_db_modify_db_settings_xdist_suffix, django_db_reset_sequences, django_db_serialized_rollback, django_db_setup, django_db_use_migrations, django_isolated_apps, django_mail_dnsname, django_mail_patch_dns, django_test_environment, django_user_model, django_username_field, doctest_namespace, domain, domain_credential_cmp_onboarding, domain_credential_est_onboarding, domain_credential_instance_for_cmp, domain_instance, ec_private_key, enable_db_access_for_all_tests, est_device_with_onboarding, est_device_without_onboarding, event_loop_policy, extra, extras, include_metadata_in_junit_xml, insert_assert, insert_assert_add_to_builtins, insert_assert_maybe_fail, insert_assert_session, issuing_ca_instance, live_server, mailoutbox, metadata, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, remote_device_credential_download_instance, rf, rsa_private_key, settings, subtests, test_cert, test_csr_fixture, tls_client_certificate_instance_est_no_onboarding, tls_client_certificate_instance_est_onboarding, tls_client_credential_instance, tls_client_request_with_client_cert_header, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, transactional_db, unused_tcp_port, unused_tcp_port_factory, unused_udp_port, unused_udp_port_factory, web_client
>       use 'pytest --fixtures [testpath]' for help on them.

.../agents/tests/test_views.py:804
trustpoint/agents/tests/test_views.py::TestAgentProfileDefinitionTableView::test_get_list

Flake rate in main: 100.00% (Passed 0 times, Failed 1 times)

Stack Traces | 0.286s run time
file .../agents/tests/test_views.py, line 721
      def test_get_list(self, web_client: Client, workflow_definition: AgentProfileDefinition):
E       fixture 'workflow_definition' not found
>       available fixtures: _class_scoped_runner, _dj_autoclear_mailbox, _django_clear_site_cache, _django_db_helper, _django_db_marker, _django_isolate_apps, _django_set_urlconf, _django_setup_unittest, _fail_for_invalid_template_variable, _function_scoped_runner, _live_server_helper, _module_scoped_runner, _package_scoped_runner, _session_scoped_runner, _template_string_if_invalid_marker, admin_client, admin_user, agent, api_client, assigned_profile, async_client, async_rf, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, capteesys, cert_profile_instance, cert_profile_instance_tls_server, client, cmp_device_with_onboarding, cmp_device_without_onboarding, complete_setup_wizard_by_default, configure_app_secret_backend_for_tests, cov, credential_instance, db, device, device_instance, device_instance_onboarding, django_assert_max_num_queries, django_assert_num_queries, django_capture_on_commit_callbacks, django_db_blocker, django_db_createdb, django_db_keepdb, django_db_modify_db_settings, django_db_modify_db_settings_parallel_suffix, django_db_modify_db_settings_tox_suffix, django_db_modify_db_settings_xdist_suffix, django_db_reset_sequences, django_db_serialized_rollback, django_db_setup, django_db_use_migrations, django_isolated_apps, django_mail_dnsname, django_mail_patch_dns, django_test_environment, django_user_model, django_username_field, doctest_namespace, domain, domain_credential_cmp_onboarding, domain_credential_est_onboarding, domain_credential_instance_for_cmp, domain_instance, ec_private_key, enable_db_access_for_all_tests, est_device_with_onboarding, est_device_without_onboarding, event_loop_policy, extra, extras, include_metadata_in_junit_xml, insert_assert, insert_assert_add_to_builtins, insert_assert_maybe_fail, insert_assert_session, issuing_ca_instance, live_server, mailoutbox, metadata, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, remote_device_credential_download_instance, rf, rsa_private_key, settings, subtests, test_cert, test_csr_fixture, tls_client_certificate_instance_est_no_onboarding, tls_client_certificate_instance_est_onboarding, tls_client_credential_instance, tls_client_request_with_client_cert_header, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, transactional_db, unused_tcp_port, unused_tcp_port_factory, unused_udp_port, unused_udp_port_factory, web_client
>       use 'pytest --fixtures [testpath]' for help on them.

.../agents/tests/test_views.py:721
trustpoint/agents/tests/test_views.py::TestProfileResolution::test_build_resolved_profile_basic

Flake rate in main: 100.00% (Passed 0 times, Failed 1 times)

Stack Traces | 0.006s run time
file .../agents/tests/test_views.py, line 411
      @patch('agents.api_views._resolve_enrollment_url')
      def test_build_resolved_profile_basic(
file .../agents/tests/test_views.py, line 121
  @pytest.fixture
  def assigned_profile(
E       fixture 'workflow_definition' not found
>       available fixtures: _class_scoped_runner, _dj_autoclear_mailbox, _django_clear_site_cache, _django_db_helper, _django_db_marker, _django_isolate_apps, _django_set_urlconf, _django_setup_unittest, _fail_for_invalid_template_variable, _function_scoped_runner, _live_server_helper, _module_scoped_runner, _package_scoped_runner, _session_scoped_runner, _template_string_if_invalid_marker, admin_client, admin_user, agent, api_client, assigned_profile, async_client, async_rf, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, capteesys, cert_profile_instance, cert_profile_instance_tls_server, client, cmp_device_with_onboarding, cmp_device_without_onboarding, complete_setup_wizard_by_default, configure_app_secret_backend_for_tests, cov, credential_instance, db, device, device_instance, device_instance_onboarding, django_assert_max_num_queries, django_assert_num_queries, django_capture_on_commit_callbacks, django_db_blocker, django_db_createdb, django_db_keepdb, django_db_modify_db_settings, django_db_modify_db_settings_parallel_suffix, django_db_modify_db_settings_tox_suffix, django_db_modify_db_settings_xdist_suffix, django_db_reset_sequences, django_db_serialized_rollback, django_db_setup, django_db_use_migrations, django_isolated_apps, django_mail_dnsname, django_mail_patch_dns, django_test_environment, django_user_model, django_username_field, doctest_namespace, domain, domain_credential_cmp_onboarding, domain_credential_est_onboarding, domain_credential_instance_for_cmp, domain_instance, ec_private_key, enable_db_access_for_all_tests, est_device_with_onboarding, est_device_without_onboarding, event_loop_policy, extra, extras, include_metadata_in_junit_xml, insert_assert, insert_assert_add_to_builtins, insert_assert_maybe_fail, insert_assert_session, issuing_ca_instance, live_server, mailoutbox, metadata, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, remote_device_credential_download_instance, rf, rsa_private_key, settings, subtests, test_cert, test_csr_fixture, tls_client_certificate_instance_est_no_onboarding, tls_client_certificate_instance_est_onboarding, tls_client_credential_instance, tls_client_request_with_client_cert_header, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, transactional_db, unused_tcp_port, unused_tcp_port_factory, unused_udp_port, unused_udp_port_factory, web_client
>       use 'pytest --fixtures [testpath]' for help on them.

.../agents/tests/test_views.py:121
trustpoint/agents/tests/test_views.py::TestProfileResolution::test_build_resolved_profile_enrollment_path

Flake rate in main: 100.00% (Passed 0 times, Failed 1 times)

Stack Traces | 0.006s run time
file .../agents/tests/test_views.py, line 435
      @patch('agents.api_views._resolve_enrollment_url')
      def test_build_resolved_profile_enrollment_path(
file .../agents/tests/test_views.py, line 121
  @pytest.fixture
  def assigned_profile(
E       fixture 'workflow_definition' not found
>       available fixtures: _class_scoped_runner, _dj_autoclear_mailbox, _django_clear_site_cache, _django_db_helper, _django_db_marker, _django_isolate_apps, _django_set_urlconf, _django_setup_unittest, _fail_for_invalid_template_variable, _function_scoped_runner, _live_server_helper, _module_scoped_runner, _package_scoped_runner, _session_scoped_runner, _template_string_if_invalid_marker, admin_client, admin_user, agent, api_client, assigned_profile, async_client, async_rf, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, capteesys, cert_profile_instance, cert_profile_instance_tls_server, client, cmp_device_with_onboarding, cmp_device_without_onboarding, complete_setup_wizard_by_default, configure_app_secret_backend_for_tests, cov, credential_instance, db, device, device_instance, device_instance_onboarding, django_assert_max_num_queries, django_assert_num_queries, django_capture_on_commit_callbacks, django_db_blocker, django_db_createdb, django_db_keepdb, django_db_modify_db_settings, django_db_modify_db_settings_parallel_suffix, django_db_modify_db_settings_tox_suffix, django_db_modify_db_settings_xdist_suffix, django_db_reset_sequences, django_db_serialized_rollback, django_db_setup, django_db_use_migrations, django_isolated_apps, django_mail_dnsname, django_mail_patch_dns, django_test_environment, django_user_model, django_username_field, doctest_namespace, domain, domain_credential_cmp_onboarding, domain_credential_est_onboarding, domain_credential_instance_for_cmp, domain_instance, ec_private_key, enable_db_access_for_all_tests, est_device_with_onboarding, est_device_without_onboarding, event_loop_policy, extra, extras, include_metadata_in_junit_xml, insert_assert, insert_assert_add_to_builtins, insert_assert_maybe_fail, insert_assert_session, issuing_ca_instance, live_server, mailoutbox, metadata, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, remote_device_credential_download_instance, rf, rsa_private_key, settings, subtests, test_cert, test_csr_fixture, tls_client_certificate_instance_est_no_onboarding, tls_client_certificate_instance_est_onboarding, tls_client_credential_instance, tls_client_request_with_client_cert_header, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, transactional_db, unused_tcp_port, unused_tcp_port_factory, unused_udp_port, unused_udp_port_factory, web_client
>       use 'pytest --fixtures [testpath]' for help on them.

.../agents/tests/test_views.py:121
trustpoint/agents/tests/test_views.py::TestProfileResolution::test_build_resolved_profile_removes_empty_subject

Flake rate in main: 100.00% (Passed 0 times, Failed 1 times)

Stack Traces | 0.006s run time
file .../agents/tests/test_views.py, line 500
      @patch('agents.api_views._resolve_enrollment_url')
      def test_build_resolved_profile_removes_empty_subject(
file .../agents/tests/test_views.py, line 121
  @pytest.fixture
  def assigned_profile(
E       fixture 'workflow_definition' not found
>       available fixtures: _class_scoped_runner, _dj_autoclear_mailbox, _django_clear_site_cache, _django_db_helper, _django_db_marker, _django_isolate_apps, _django_set_urlconf, _django_setup_unittest, _fail_for_invalid_template_variable, _function_scoped_runner, _live_server_helper, _module_scoped_runner, _package_scoped_runner, _session_scoped_runner, _template_string_if_invalid_marker, admin_client, admin_user, agent, api_client, assigned_profile, async_client, async_rf, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, capteesys, cert_profile_instance, cert_profile_instance_tls_server, client, cmp_device_with_onboarding, cmp_device_without_onboarding, complete_setup_wizard_by_default, configure_app_secret_backend_for_tests, cov, credential_instance, db, device, device_instance, device_instance_onboarding, django_assert_max_num_queries, django_assert_num_queries, django_capture_on_commit_callbacks, django_db_blocker, django_db_createdb, django_db_keepdb, django_db_modify_db_settings, django_db_modify_db_settings_parallel_suffix, django_db_modify_db_settings_tox_suffix, django_db_modify_db_settings_xdist_suffix, django_db_reset_sequences, django_db_serialized_rollback, django_db_setup, django_db_use_migrations, django_isolated_apps, django_mail_dnsname, django_mail_patch_dns, django_test_environment, django_user_model, django_username_field, doctest_namespace, domain, domain_credential_cmp_onboarding, domain_credential_est_onboarding, domain_credential_instance_for_cmp, domain_instance, ec_private_key, enable_db_access_for_all_tests, est_device_with_onboarding, est_device_without_onboarding, event_loop_policy, extra, extras, include_metadata_in_junit_xml, insert_assert, insert_assert_add_to_builtins, insert_assert_maybe_fail, insert_assert_session, issuing_ca_instance, live_server, mailoutbox, metadata, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, remote_device_credential_download_instance, rf, rsa_private_key, settings, subtests, test_cert, test_csr_fixture, tls_client_certificate_instance_est_no_onboarding, tls_client_certificate_instance_est_onboarding, tls_client_credential_instance, tls_client_request_with_client_cert_header, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, transactional_db, unused_tcp_port, unused_tcp_port_factory, unused_udp_port, unused_udp_port_factory, web_client
>       use 'pytest --fixtures [testpath]' for help on them.

.../agents/tests/test_views.py:121
trustpoint/agents/tests/test_views.py::TestProfileResolution::test_build_resolved_profile_subject

Flake rate in main: 100.00% (Passed 0 times, Failed 1 times)

Stack Traces | 0.006s run time
file .../agents/tests/test_views.py, line 460
      @patch('agents.api_views._resolve_enrollment_url')
      def test_build_resolved_profile_subject(
file .../agents/tests/test_views.py, line 121
  @pytest.fixture
  def assigned_profile(
E       fixture 'workflow_definition' not found
>       available fixtures: _class_scoped_runner, _dj_autoclear_mailbox, _django_clear_site_cache, _django_db_helper, _django_db_marker, _django_isolate_apps, _django_set_urlconf, _django_setup_unittest, _fail_for_invalid_template_variable, _function_scoped_runner, _live_server_helper, _module_scoped_runner, _package_scoped_runner, _session_scoped_runner, _template_string_if_invalid_marker, admin_client, admin_user, agent, api_client, assigned_profile, async_client, async_rf, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, capteesys, cert_profile_instance, cert_profile_instance_tls_server, client, cmp_device_with_onboarding, cmp_device_without_onboarding, complete_setup_wizard_by_default, configure_app_secret_backend_for_tests, cov, credential_instance, db, device, device_instance, device_instance_onboarding, django_assert_max_num_queries, django_assert_num_queries, django_capture_on_commit_callbacks, django_db_blocker, django_db_createdb, django_db_keepdb, django_db_modify_db_settings, django_db_modify_db_settings_parallel_suffix, django_db_modify_db_settings_tox_suffix, django_db_modify_db_settings_xdist_suffix, django_db_reset_sequences, django_db_serialized_rollback, django_db_setup, django_db_use_migrations, django_isolated_apps, django_mail_dnsname, django_mail_patch_dns, django_test_environment, django_user_model, django_username_field, doctest_namespace, domain, domain_credential_cmp_onboarding, domain_credential_est_onboarding, domain_credential_instance_for_cmp, domain_instance, ec_private_key, enable_db_access_for_all_tests, est_device_with_onboarding, est_device_without_onboarding, event_loop_policy, extra, extras, include_metadata_in_junit_xml, insert_assert, insert_assert_add_to_builtins, insert_assert_maybe_fail, insert_assert_session, issuing_ca_instance, live_server, mailoutbox, metadata, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, remote_device_credential_download_instance, rf, rsa_private_key, settings, subtests, test_cert, test_csr_fixture, tls_client_certificate_instance_est_no_onboarding, tls_client_certificate_instance_est_onboarding, tls_client_credential_instance, tls_client_request_with_client_cert_header, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, transactional_db, unused_tcp_port, unused_tcp_port_factory, unused_udp_port, unused_udp_port_factory, web_client
>       use 'pytest --fixtures [testpath]' for help on them.

.../agents/tests/test_views.py:121
trustpoint/agents/tests/test_views.py::TestProfileResolution::test_build_resolved_profile_subject_alt_name

Flake rate in main: 100.00% (Passed 0 times, Failed 1 times)

Stack Traces | 0.006s run time
file .../agents/tests/test_views.py, line 480
      @patch('agents.api_views._resolve_enrollment_url')
      def test_build_resolved_profile_subject_alt_name(
file .../agents/tests/test_views.py, line 121
  @pytest.fixture
  def assigned_profile(
E       fixture 'workflow_definition' not found
>       available fixtures: _class_scoped_runner, _dj_autoclear_mailbox, _django_clear_site_cache, _django_db_helper, _django_db_marker, _django_isolate_apps, _django_set_urlconf, _django_setup_unittest, _fail_for_invalid_template_variable, _function_scoped_runner, _live_server_helper, _module_scoped_runner, _package_scoped_runner, _session_scoped_runner, _template_string_if_invalid_marker, admin_client, admin_user, agent, api_client, assigned_profile, async_client, async_rf, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, capteesys, cert_profile_instance, cert_profile_instance_tls_server, client, cmp_device_with_onboarding, cmp_device_without_onboarding, complete_setup_wizard_by_default, configure_app_secret_backend_for_tests, cov, credential_instance, db, device, device_instance, device_instance_onboarding, django_assert_max_num_queries, django_assert_num_queries, django_capture_on_commit_callbacks, django_db_blocker, django_db_createdb, django_db_keepdb, django_db_modify_db_settings, django_db_modify_db_settings_parallel_suffix, django_db_modify_db_settings_tox_suffix, django_db_modify_db_settings_xdist_suffix, django_db_reset_sequences, django_db_serialized_rollback, django_db_setup, django_db_use_migrations, django_isolated_apps, django_mail_dnsname, django_mail_patch_dns, django_test_environment, django_user_model, django_username_field, doctest_namespace, domain, domain_credential_cmp_onboarding, domain_credential_est_onboarding, domain_credential_instance_for_cmp, domain_instance, ec_private_key, enable_db_access_for_all_tests, est_device_with_onboarding, est_device_without_onboarding, event_loop_policy, extra, extras, include_metadata_in_junit_xml, insert_assert, insert_assert_add_to_builtins, insert_assert_maybe_fail, insert_assert_session, issuing_ca_instance, live_server, mailoutbox, metadata, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, remote_device_credential_download_instance, rf, rsa_private_key, settings, subtests, test_cert, test_csr_fixture, tls_client_certificate_instance_est_no_onboarding, tls_client_certificate_instance_est_onboarding, tls_client_credential_instance, tls_client_request_with_client_cert_header, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, transactional_db, unused_tcp_port, unused_tcp_port_factory, unused_udp_port, unused_udp_port_factory, web_client
>       use 'pytest --fixtures [testpath]' for help on them.

.../agents/tests/test_views.py:121

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

Copilot AI review requested due to automatic review settings August 4, 2026 11:24

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated no new comments.

Suppressed comments (4)

trustpoint/aoki/management/commands/aoki_setup_idevid_test_env.py:180

  • _get_or_create_domain_ca_owner_id_cert unconditionally regenerates and overwrites the domain-based DevOwnerID cert/key on every run, and it reads OWNER_CA_KEY_PATH without ensuring it exists. This can break repeatable test environments (DB credential may no longer match regenerated files) and can crash if only the owner CA cert exists but the key is missing.
    def _get_or_create_domain_ca_owner_id_cert(self, domain_ca: CaModel) -> None:
        """Generates a domain-based DevOwnerID, pinning the certificate of the domain CA."""
        domain_ca_cert = domain_ca.get_certificate()
        owner_ca_cert = x509.load_pem_x509_certificate(OWNER_CA_CERT_PATH.read_bytes())
        owner_ca_key = load_pem_private_key(OWNER_CA_KEY_PATH.read_bytes(), password=None)

trustpoint/pki/models/credential.py:839

  • domain_ca_sha256_fingerprint docstring is incorrect (it references “Third dot-separated segment” and dev-owner:), and the try/except IndexError is dead code because removeprefix() cannot raise IndexError. This makes the parsing rules for dev-owner:ca:<fingerprint> unclear.
        Third dot-separated segment after stripping the ``dev-owner:`` prefix.
        """
        if not self.idevid_ref.startswith('dev-owner:ca:'):
            return ''
        try:

trustpoint/aoki/management/commands/aoki_gen_test_certs.py:49

  • handle() includes a large commented-out call for domain-based DevOwnerID generation and uses a single long line for generate_owner_id_cert(...). The commented block is dead code and makes it unclear where domain-based certs should be generated.
        idevid_cert = AokiTestCertGenerator.generate_idevid_pki()
        owner_ca_cert, owner_ca_key = AokiTestCertGenerator.generate_owner_id_ca()
        AokiTestCertGenerator.generate_owner_id_cert(idevid_cert, owner_ca_cert=owner_ca_cert, owner_ca_key=owner_ca_key)
        # AokiTestCertGenerator.generate_domain_ca_owner_id_cert(
        #     domain_ca_cert=idevid_cert, owner_ca_cert=owner_ca_cert, owner_ca_key=owner_ca_key
        # )

trustpoint/aoki/tests/cmp_client.py:226

  • The caught exception is bound to e but never used. This triggers unused-variable lint and makes the intent less clear.
        try:
            self._verify_matches_idevid_cert(owner_id_cert, idevid_cert)
        except AokiClientOwnerIdCertVerificationError as e:
            self._verify_matches_domain_ca_cert(owner_id_cert)

@Aircoookie
Aircoookie marked this pull request as ready for review August 4, 2026 11:40
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings August 5, 2026 09:03

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 1 comment.

Suppressed comments (3)

trustpoint/aoki/management/commands/aoki_setup_idevid_test_env.py:186

  • _get_or_create_domain_ca_owner_id_cert() reads OWNER_CA_KEY_PATH without first ensuring it exists. If ownerid_ca.pem is present but ownerid_ca_pk.pem is missing (e.g., from an older test-certs set), this will crash with FileNotFoundError before the command can self-heal.
        domain_ca_cert = domain_ca.get_certificate()
        owner_ca_cert = x509.load_pem_x509_certificate(OWNER_CA_CERT_PATH.read_bytes())
        owner_ca_key = load_pem_private_key(OWNER_CA_KEY_PATH.read_bytes(), password=None)

        AokiTestCertGenerator.generate_domain_ca_owner_id_cert(

trustpoint/aoki/tests/cmp_client.py:225

  • The exception variable e is unused here; this will trigger an F841/unused-variable lint error.
        except AokiClientOwnerIdCertVerificationError as e:

trustpoint/pki/models/credential.py:848

  • New parsing/display behavior for dev-owner:ca:<sha256> refs (domain_ca_sha256_fingerprint / sha256_fingerprint_display) isn’t covered by the existing IDevIDReferenceModel property tests. Adding a couple of pytest cases would prevent regressions for the new domain-based AOKI flow.
    @property
    def sha256_fingerprint_display(self) -> str:
        """Returns the SHA256 Fingerprint for display purposes.

        This property returns the SHA256 Fingerprint of the IDevID if available, otherwise that of the domain CA.
        """
        if fingerprint := self.idevid_sha256_fingerprint:
            return fingerprint
        if domain_fp := self.domain_ca_sha256_fingerprint:
            return f'Pinned CA: {domain_fp}'
        return ''

Comment thread trustpoint/pki/models/credential.py
Copilot AI review requested due to automatic review settings August 5, 2026 09:11

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated no new comments.

Suppressed comments (5)

trustpoint/aoki/management/commands/aoki_setup_idevid_test_env.py:185

  • This method loads ownerid_ca_pk.pem but _ensure_certs_exist() doesn’t require it, so an environment created with an older aoki_gen_test_certs (or partial files) can pass the initial check and then fail here with FileNotFoundError. Add an explicit existence check with a clear error (or trigger regeneration) before attempting to read the key.
        domain_ca_cert = domain_ca.get_certificate()
        owner_ca_cert = x509.load_pem_x509_certificate(OWNER_CA_CERT_PATH.read_bytes())
        owner_ca_key = load_pem_private_key(OWNER_CA_KEY_PATH.read_bytes(), password=None)

trustpoint/aoki/tests/cmp_client.py:226

  • The exception variable is unused here; use as _ to avoid lint failures (and to make it clear the exception is intentionally ignored).
        except AokiClientOwnerIdCertVerificationError as e:
            self._verify_matches_domain_ca_cert(owner_id_cert)

trustpoint/aoki/management/commands/aoki_gen_test_certs.py:49

  • Leaving a commented-out call block in the command makes it unclear how domain-based DevOwnerID certs are expected to be generated and invites accidental re-enabling. Either remove it or replace it with a short explanatory comment pointing to the command that actually generates these certs.
        # AokiTestCertGenerator.generate_domain_ca_owner_id_cert(
        #     domain_ca_cert=idevid_cert, owner_ca_cert=owner_ca_cert, owner_ca_key=owner_ca_key
        # )

trustpoint/aoki/management/commands/aoki_setup_idevid_test_env.py:191

  • There should be a blank line between the end of this method and the next method definition; without it, formatters/linters typically flag the file.
        )
    def _get_or_create_idevid_truststore(self) -> TruststoreModel:

trustpoint/templates/devices/zero_touch_credentials/define_cert_content_est.html:64

  • The example SHA-256 fingerprint is much shorter than a real SHA-256 hex digest (64 hex chars), which can mislead users when forming URIs. Use a full-length example or explicitly mark it as truncated.
                                            <code>dev-owner:cert:&lt;IDevID_Subject_SN&gt;_&lt;IDevID_SHA256_Fingerprint&gt;</code> or<br>
                                            <code>dev-owner:uri:urn:uuid:&lt;Device UUID&gt;</code><br>
                                            Example: <code>dev-owner:cert:SN-12345678_8a58abcdef123456789</code>

Copilot AI review requested due to automatic review settings August 5, 2026 09:16

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated no new comments.

Suppressed comments (5)

trustpoint/aoki/management/commands/aoki_setup_idevid_test_env.py:120

  • _ensure_certs_exist() does not include OWNER_CA_KEY_PATH in required_files, but _get_or_create_domain_ca_owner_id_cert() reads that key to generate the domain-based DevOwnerID. If the CA key file is missing while the other files exist, the command will skip regeneration and then fail later when trying to read the key.
    def _ensure_certs_exist(self) -> None:
        """Run ``aoki_gen_test_certs`` if any required certificate file is missing."""
        required_files = [
            IDEVID_CA_CERT_PATH,
            OWNER_ID_CERT_PATH,
            OWNER_ID_KEY_PATH,
            OWNER_CA_CERT_PATH,
        ]

trustpoint/aoki/tests/cmp_client.py:116

  • _verify_matches_domain_ca_cert() currently treats every certificate in full_chain.pem as a potential domain CA and will also crash with an unhandled exception if the OwnerID cert has no SAN extension. Filter to CA certificates (BasicConstraints.ca == True) and handle missing SAN explicitly so the verification cannot produce false positives or unexpected crashes.
    def _verify_matches_domain_ca_cert(self, owner_id_cert: x509.Certificate) -> None:
        """Verify the Owner ID certificate is valid for the domain issuing CA certificate."""
        print('Verifying Owner ID certificate matches Domain CA certificate')
        candidate_ca_certs = self._load_certificates(CERTS_DIR / 'full_chain.pem')
        for domain_ca_cert in candidate_ca_certs:

trustpoint/templates/devices/zero_touch_credentials/define_cert_content_est.html:64

  • The example dev-owner:cert: URI shows a truncated SHA-256 fingerprint, but the actual value produced by Certificate.fingerprint(...).hex() is 64 hex characters. This example may lead users to enter an invalid reference; use a clear placeholder (or a full-length example) to avoid confusion.
                                            One URI per line. The Zero-Touch Credential profile requires at least one URI
                                            referencing an IDevID in the format:<br>
                                            <code>dev-owner:cert:&lt;IDevID_Subject_SN&gt;_&lt;IDevID_SHA256_Fingerprint&gt;</code> or<br>
                                            <code>dev-owner:uri:urn:uuid:&lt;Device UUID&gt;</code><br>
                                            Example: <code>dev-owner:cert:SN-12345678_8a58abcdef123456789</code>

trustpoint/request/authorization/base.py:234

  • The new domain-based fallback (get_domain_based_owner_credential(context.domain)) changes the authorization behavior for AOKI CMP requests but is not covered by tests. Please add request-layer tests that assert: (1) direct DevOwnerID match is preferred when present, (2) domain-based credential is accepted when direct match is missing, and (3) missing/invalid domain information does not accidentally authorize.
        owner_credential = (
            AokiServiceMixin.get_owner_credential(client_cert)
            or AokiServiceMixin.get_domain_based_owner_credential(context.domain)
        )

trustpoint/aoki/management/commands/aoki_gen_test_certs.py:49

  • The commented-out generate_domain_ca_owner_id_cert(...) call leaves dead code in a management command. If the domain-based DevOwnerID is intentionally generated elsewhere (e.g., in aoki_setup_idevid_test_env), replace this commented block with a short explanatory comment (or remove it) to avoid confusion about the intended workflow.
        idevid_cert = AokiTestCertGenerator.generate_idevid_pki()
        owner_ca_cert, owner_ca_key = AokiTestCertGenerator.generate_owner_id_ca()
        AokiTestCertGenerator.generate_owner_id_cert(idevid_cert, owner_ca_cert=owner_ca_cert, owner_ca_key=owner_ca_key)
        # AokiTestCertGenerator.generate_domain_ca_owner_id_cert(
        #     domain_ca_cert=idevid_cert, owner_ca_cert=owner_ca_cert, owner_ca_key=owner_ca_key
        # )
        print('Certificates generated successfully.')

Copilot AI review requested due to automatic review settings August 5, 2026 09:24

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated no new comments.

Suppressed comments (5)

trustpoint/aoki/management/commands/aoki_setup_idevid_test_env.py:184

  • CaModel.get_certificate() can return None. If the issuing/domain CA certificate is missing, this will pass None into generate_domain_ca_owner_id_cert(), causing an attribute error when fingerprint() is called. This should fail fast with a clear error message.
        domain_ca_cert = domain_ca.get_certificate()
        owner_ca_cert = x509.load_pem_x509_certificate(OWNER_CA_CERT_PATH.read_bytes())

trustpoint/aoki/tests/cmp_client.py:226

  • The caught exception variable "e" is unused here. With ruff enabled in this module, this will trigger F841 (local variable assigned but never used).
        try:
            self._verify_matches_idevid_cert(owner_id_cert, idevid_cert)
        except AokiClientOwnerIdCertVerificationError as e:
            self._verify_matches_domain_ca_cert(owner_id_cert)

trustpoint/aoki/management/commands/aoki_gen_test_certs.py:161

  • This comment says the URI is built from an "idevid" fingerprint, but it is actually pinning the domain CA certificate fingerprint. The mismatch is confusing when debugging SAN formats.
        # Build URI string "dev-owner:ca:<idevid_sha256_fingerprint>"
        ca_san_uri = f'dev-owner:ca:{ca_sha256_fingerprint}'

trustpoint/aoki/views.py:96

  • Domain-based DevOwnerID lookup is newly introduced here, but there are no unit tests covering the fallback behavior (e.g., when no IDevID-specific DevOwnerID exists, the domain CA pinning reference is used). Adding tests would prevent regressions in the lookup/ref resolution logic.
        ca_sha256_fingerprint = domain_ca_cert.fingerprint(hashes.SHA256()).hex()
        owner_cred_ref = IDevIDReferenceModel.objects.filter(idevid_ref=f'dev-owner:ca:{ca_sha256_fingerprint}').first()
        if not owner_cred_ref:
            return None
        owner_cred = owner_cred_ref.dev_owner_id

trustpoint/pki/models/credential.py:847

  • sha256_fingerprint_display() returns a user-facing string with a hard-coded English prefix ("Pinned CA:"). Since the UI uses Django i18n elsewhere, this should be translated (or the label should be moved into the template where {% trans %} can be used).
        if domain_fp := self.domain_ca_sha256_fingerprint:
            return f'Pinned CA: {domain_fp}'

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
filepath passed error skipped SUBTOTAL
trustpoint/agents/tests/test_views.py 25 13 0 38
trustpoint/appsecrets/tests/test_service.py 11 0 0 11
trustpoint/cmp/tests/test_views.py 29 0 0 29
trustpoint/crypto/tests/test_application_backend.py 9 0 0 9
trustpoint/crypto/tests/test_local_development_backend.py 4 0 0 4
trustpoint/crypto/tests/test_managed_key_repository.py 4 0 0 4
trustpoint/crypto/tests/test_repositories.py 5 0 0 5
trustpoint/devices/tests/test_api/test_device_viewset.py 30 0 0 30
trustpoint/devices/tests/test_credential_download.py 4 0 0 4
trustpoint/devices/tests/test_forms/test_base_credential_forms.py 31 0 0 31
trustpoint/devices/tests/test_forms/test_browser_login.py 5 0 0 5
trustpoint/devices/tests/test_forms/test_clm_forms.py 23 0 0 23
trustpoint/devices/tests/test_forms/test_create_device_form.py 3 0 0 3
trustpoint/devices/tests/test_forms/test_credential_download_form.py 3 0 0 3
trustpoint/devices/tests/test_forms/test_credential_forms.py 16 0 0 16
trustpoint/devices/tests/test_forms/test_device_creation_forms.py 28 0 0 28
trustpoint/devices/tests/test_forms/test_forms_coverage_boost.py 9 0 0 9
trustpoint/devices/tests/test_issuer/test_domain_credential.py 1 0 0 1
trustpoint/devices/tests/test_issuer/test_issuer_extended.py 24 0 0 24
trustpoint/devices/tests/test_issuer/test_opcua_client_credential.py 1 0 0 1
trustpoint/devices/tests/test_issuer/test_opcua_server_credential.py 1 0 0 1
trustpoint/devices/tests/test_issuer/test_tls_client_credential.py 2 0 0 2
trustpoint/devices/tests/test_issuer/test_tls_server_credential.py 1 0 0 1
trustpoint/devices/tests/test_model_delete.py 4 0 0 4
trustpoint/devices/tests/test_models/test_device_model.py 8 0 0 8
trustpoint/devices/tests/test_models/test_remote_device_credential.py 14 0 0 14
trustpoint/devices/tests/test_revocation/test_device_credential_revocation.py 3 0 0 3
trustpoint/devices/tests/test_tasks.py 19 0 0 19
trustpoint/devices/tests/test_urls/test_urls.py 10 0 0 10
trustpoint/devices/tests/test_utils.py 6 0 0 6
trustpoint/devices/tests/test_views/test_device_views.py 29 0 0 29
trustpoint/devices/tests/test_views/test_device_views_clm.py 11 0 0 11
trustpoint/devices/tests/test_views/test_device_views_extended.py 26 0 0 26
trustpoint/help_pages/tests/test_base.py 20 0 0 20
trustpoint/help_pages/tests/test_devices_help_views.py 27 0 0 27
trustpoint/help_pages/tests/test_pki_help_views.py 12 0 0 12
trustpoint/home/tests/test_filters.py 11 0 0 11
trustpoint/home/tests/test_integration.py 6 0 0 6
trustpoint/home/tests/test_views.py 27 0 0 27
trustpoint/management/tests/test_api/test_backup_viewset.py 13 0 0 13
trustpoint/management/tests/test_api/test_health_viewset.py 3 0 0 3
trustpoint/management/tests/test_api/test_logging_viewset.py 19 0 0 19
trustpoint/management/tests/test_api/test_tls_viewset.py 12 0 0 12
trustpoint/management/tests/test_commands.py 26 0 0 26
trustpoint/management/tests/test_filters/test_audit_log.py 2 0 0 2
trustpoint/management/tests/test_forms/test_backup.py 5 0 0 5
trustpoint/management/tests/test_forms/test_ipv4_address_form.py 5 0 0 5
trustpoint/management/tests/test_forms/test_pkcs11configform.py 4 0 0 4
trustpoint/management/tests/test_forms/test_security_config.py 15 0 0 15
trustpoint/management/tests/test_forms/test_tls_import.py 27 0 0 27
trustpoint/management/tests/test_models/test_audit_log.py 2 0 0 2
trustpoint/management/tests/test_models/test_backup.py 7 0 0 7
trustpoint/management/tests/test_models/test_notifications.py 15 0 0 15
trustpoint/management/tests/test_security_decorators.py 14 0 0 14
trustpoint/management/tests/test_security_features.py 21 0 0 21
trustpoint/management/tests/test_security_manager.py 22 0 0 22
trustpoint/management/tests/test_security_mixins.py 17 0 0 17
trustpoint/management/tests/test_urls.py 25 0 0 25
trustpoint/management/tests/test_util/test_output_wrapper.py 11 0 0 11
trustpoint/management/tests/test_util/test_startup_context.py 5 0 0 5
trustpoint/management/tests/test_util/test_startup_strategies.py 6 0 0 6
trustpoint/management/tests/test_views/test_audit_log.py 5 0 0 5
trustpoint/management/tests/test_views/test_backend_configuration.py 15 0 0 15
trustpoint/management/tests/test_views/test_backup.py 40 0 0 40
trustpoint/management/tests/test_views/test_help_support.py 10 0 0 10
trustpoint/management/tests/test_views/test_logging.py 32 0 0 32
trustpoint/management/tests/test_views/test_notifications.py 8 0 0 8
trustpoint/management/tests/test_views/test_organization_management.py 6 0 0 6
trustpoint/management/tests/test_views/test_pkcs11.py 4 0 0 4
trustpoint/management/tests/test_views/test_role_management.py 8 0 0 8
trustpoint/management/tests/test_views/test_settings.py 43 0 0 43
trustpoint/management/tests/test_views/test_tls.py 38 0 0 38
trustpoint/management/tests/test_views/test_user_management.py 12 0 0 12
trustpoint/pki/tests/test_auto_gen_pki.py 2 0 0 2
trustpoint/pki/tests/test_ca_rollover_model.py 18 0 0 18
trustpoint/pki/tests/test_ca_rollover_service.py 17 0 0 17
trustpoint/pki/tests/test_cert_profiles.py 42 0 0 42
trustpoint/pki/tests/test_crl.py 48 0 0 48
trustpoint/pki/tests/test_crl_cycle.py 12 0 0 12
trustpoint/pki/tests/test_crl_cycle_form.py 9 0 0 9
trustpoint/pki/tests/test_crl_cycle_signals.py 5 0 0 5
trustpoint/pki/tests/test_crl_cycle_views.py 4 0 0 4
trustpoint/pki/tests/test_crl_on_revocation.py 5 0 0 5
trustpoint/pki/tests/test_filters.py 16 0 0 16
trustpoint/pki/tests/test_forms_extended.py 77 0 0 77
trustpoint/pki/tests/test_idevid_authenticator.py 6 0 0 6
trustpoint/pki/tests/test_idevid_verifier.py 10 0 0 10
trustpoint/pki/tests/test_issued_credential.py 5 0 0 5
trustpoint/pki/tests/test_models/test_certificate_extensions.py 17 0 0 17
trustpoint/pki/tests/test_models/test_certificate_model.py 2 0 0 2
trustpoint/pki/tests/test_models/test_certificate_values.py 17 0 0 17
trustpoint/pki/tests/test_models/test_credential.py 9 0 0 9
trustpoint/pki/tests/test_models/test_domain_model.py 1 0 0 1
trustpoint/pki/tests/test_models/test_extension_models.py 90 0 0 90
trustpoint/pki/tests/test_models/test_issuing_ca_model.py 8 0 0 8
trustpoint/pki/tests/test_owner_credential_forms.py 30 0 0 30
trustpoint/pki/tests/test_owner_credential_models.py 13 0 0 13
trustpoint/pki/tests/test_owner_credential_views.py 48 0 0 48
trustpoint/pki/tests/test_rollover_import_ca.py 25 0 0 25
trustpoint/pki/tests/test_rollover_tasks.py 8 0 0 8
trustpoint/pki/tests/test_serializer_truststore.py 16 0 0 16
trustpoint/pki/tests/test_services.py 19 0 0 19
trustpoint/pki/tests/test_util_cert_req_converter.py 37 0 0 37
trustpoint/pki/tests/test_util_keys.py 13 0 0 13
trustpoint/pki/tests/test_views_certificates.py 28 0 0 28
trustpoint/pki/tests/test_views_domains.py 27 0 0 27
trustpoint/pki/tests/test_views_issuing_cas.py 2 0 0 2
trustpoint/pki/tests/test_views_truststores.py 21 0 0 21
trustpoint/request/tests/test_authentication_extended.py 18 0 0 18
trustpoint/request/tests/test_cmp_authorization.py 30 0 0 30
trustpoint/request/tests/test_cmp_transaction_pipeline.py 4 0 0 4
trustpoint/request/tests/test_message_responder.py 26 0 0 26
trustpoint/request/tests/test_profile_validator.py 7 0 0 7
trustpoint/request/tests/test_workflow2_issuance.py 8 0 0 8
trustpoint/request/tests/test_workflows2_handler.py 13 0 0 13
trustpoint/setup_wizard/tests/test_forms/test_fresh_install_backend_config_form.py 17 0 0 17
trustpoint/setup_wizard/tests/test_forms/test_fresh_install_forms.py 41 0 0 41
trustpoint/setup_wizard/tests/test_models.py 29 0 0 29
trustpoint/setup_wizard/tests/test_restore_backup.py 5 0 0 5
trustpoint/setup_wizard/tests/test_urls.py 6 0 0 6
trustpoint/setup_wizard/tests/test_views/test_fresh_install_views.py 11 0 0 11
trustpoint/setup_wizard/tests/test_views/test_utility_functions.py 9 0 0 9
trustpoint/signer/tests/test_api_views.py 22 0 0 22
trustpoint/signer/tests/test_forms.py 43 0 0 43
trustpoint/signer/tests/test_models.py 21 0 0 21
trustpoint/signer/tests/test_views.py 38 0 0 38
trustpoint/trustpoint/tests/test_forms.py 8 0 0 8
trustpoint/trustpoint/tests/test_middleware.py 13 0 0 13
trustpoint/trustpoint/tests/test_page_context.py 9 0 0 9
trustpoint/trustpoint/tests/test_views/test_bulk_delete.py 13 0 0 13
trustpoint/trustpoint/tests/test_views/test_context_data.py 4 0 0 4
trustpoint/trustpoint/tests/test_views/test_index_view.py 2 0 0 2
trustpoint/trustpoint/tests/test_views/test_list_in_detail_view.py 5 0 0 5
trustpoint/trustpoint/tests/test_views/test_logged_response.py 7 0 0 7
trustpoint/trustpoint/tests/test_views/test_sortable_is_active.py 2 0 0 2
trustpoint/trustpoint/tests/test_views/test_sortable_table.py 5 0 0 5
trustpoint/users/tests/test_integration.py 12 0 0 12
trustpoint/users/tests/test_views.py 3 0 0 3
trustpoint/util/tests/test_email.py 6 0 0 6
trustpoint/util/tests/test_email_service.py 19 0 0 19
trustpoint/util/tests/test_encrypted_fields.py 18 0 0 18
trustpoint/util/tests/test_sftp.py 18 0 0 18
trustpoint/workflows2/tests/test_adapters.py 7 0 1 8
trustpoint/workflows2/tests/test_api_views.py 7 0 0 7
trustpoint/workflows2/tests/test_crash_recovery.py 3 0 0 3
trustpoint/workflows2/tests/test_dispatch.py 16 0 0 16
trustpoint/workflows2/tests/test_dispatch_signal.py 2 0 0 2
trustpoint/workflows2/tests/test_jobs.py 2 0 0 2
trustpoint/workflows2/tests/test_persistence.py 1 0 0 1
trustpoint/workflows2/tests/test_views_http.py 20 0 0 20
trustpoint/workflows2/tests/test_worker.py 2 0 0 2
trustpoint/workflows2/tests/test_workflow2_bundle_approval_reject.py 14 0 0 14
trustpoint/workflows2/tests/test_worker_heartbeat.py 1 0 0 1
trustpoint/agents/tests/test_agent.py 137 0 0 137
trustpoint/aoki/tests/test_apps.py 3 0 0 3
trustpoint/aoki/tests/test_management_commands.py 8 0 0 8
trustpoint/aoki/tests/test_urls.py 2 0 0 2
trustpoint/aoki/tests/test_views.py 14 0 0 14
trustpoint/cmp/tests/test_apps.py 3 0 0 3
trustpoint/cmp/tests/test_urls.py 9 0 0 9
trustpoint/cmp/tests/test_util.py 22 0 0 22
trustpoint/crypto/tests/test_backend.py 11 0 0 11
trustpoint/crypto/tests/test_backend_placeholders.py 2 0 0 2
trustpoint/crypto/tests/test_capability_probe.py 4 0 0 4
trustpoint/crypto/tests/test_config.py 9 0 0 9
trustpoint/crypto/tests/test_error_map.py 7 0 0 7
trustpoint/crypto/tests/test_mechanisms.py 11 0 0 11
trustpoint/crypto/tests/test_session_pool.py 1 0 0 1
trustpoint/discovery/tests/test_discovery_views.py 18 0 0 18
trustpoint/discovery/tests/test_scanner.py 10 0 0 10
trustpoint/est/tests/test_est_interface.py 7 0 0 7
trustpoint/est/tests/test_urls.py 24 0 0 24
trustpoint/est/tests/test_views.py 33 0 0 33
trustpoint/help_pages/tests/test_commands.py 17 0 0 17
trustpoint/help_pages/tests/test_help_section.py 11 0 0 11
trustpoint/home/tests/test_urls.py 5 0 0 5
trustpoint/management/tests/test_pkcs11_aes_key.py 34 0 0 34
trustpoint/management/tests/test_pkcs11_private_key.py 23 0 0 23
trustpoint/request/tests/test_authentication.py 11 0 0 11
trustpoint/request/tests/test_authorization.py 44 0 0 44
trustpoint/request/tests/test_certificate_request_processors.py 2 0 0 2
trustpoint/request/tests/test_cmp_client.py 24 0 0 24
trustpoint/request/tests/test_cmp_message_builder.py 29 0 0 29
trustpoint/request/tests/test_cmp_workflow.py 3 0 0 3
trustpoint/request/tests/test_est_workflow.py 2 0 0 2
trustpoint/request/tests/test_gds_push_service.py 45 0 0 45
trustpoint/request/tests/test_http_request_validator.py 44 0 0 44
trustpoint/request/tests/test_message_builder_base.py 13 0 0 13
trustpoint/request/tests/test_operation_processors_csr.py 33 0 0 33
trustpoint/request/tests/test_pki_message_parser.py 46 0 0 46
trustpoint/request/tests/test_request_context.py 10 0 0 10
trustpoint/request/tests/test_rest_message_parser.py 30 0 0 30
trustpoint/request/tests/test_template_vars.py 18 0 0 18
trustpoint/rest_pki/tests/test_views.py 4 0 0 4
trustpoint/setup_wizard/tests/test_operational_attach.py 15 0 0 15
trustpoint/setup_wizard/tests/test_operational_handoff.py 2 0 0 2
trustpoint/setup_wizard/tests/test_tls_credential.py 22 0 0 22
trustpoint/setup_wizard/tests/test_tls_credential_parser.py 33 0 0 33
trustpoint/shared/tests/test_templatetags.py 22 0 0 22
trustpoint/trustpoint/tests/test_asgi.py 1 0 0 1
trustpoint/trustpoint/tests/test_logger.py 4 0 0 4
trustpoint/trustpoint/tests/test_settings.py 25 0 0 25
trustpoint/trustpoint/tests/test_urls.py 8 0 0 8
trustpoint/trustpoint/tests/test_wsgi.py 1 0 0 1
trustpoint/users/tests/test_urls.py 5 0 0 5
trustpoint/util/tests/test_field.py 17 0 0 17
trustpoint/util/tests/test_mult_obj_views.py 15 0 0 15
trustpoint/util/tests/test_validation.py 21 0 0 21
trustpoint/workflows2/tests/test_certificate_integration.py 3 0 0 3
trustpoint/workflows2/tests/test_compiler.py 34 0 0 34
trustpoint/workflows2/tests/test_device_integration.py 4 0 0 4
trustpoint/workflows2/tests/test_eval.py 2 0 0 2
trustpoint/workflows2/tests/test_executor.py 4 0 0 4
trustpoint/crypto/tests/test_pkcs11_integration_keys.py 0 0 2 2
trustpoint/crypto/tests/test_pkcs11_integration_probe.py 0 0 2 2
trustpoint/crypto/tests/test_pkcs11_integration_signing_contract.py 0 0 4 4
trustpoint/crypto/tests/test_pkcs11_integration_verify.py 0 0 3 3
TOTAL 3294 13 12 3319

@FHatCSW
FHatCSW merged commit f26c7ac into main Aug 5, 2026
20 of 24 checks passed
@FHatCSW
FHatCSW deleted the domain-aoki branch August 5, 2026 12:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants