)]}'
{"octavia/certificates/generator/local.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"5a468b0fe8fed99c4f4e894e51738eb99a4440df","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# ML-DSA availability check"},{"line_number":38,"context_line":"try:"},{"line_number":39,"context_line":"    from cryptography.hazmat.primitives.asymmetric import mldsa"},{"line_number":40,"context_line":"    HAS_MLDSA \u003d True"},{"line_number":41,"context_line":"except ImportError:"},{"line_number":42,"context_line":"    HAS_MLDSA \u003d False"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ba45d6c_51e485ad","line":39,"updated":"2026-08-31 16:29:15.000000000","message":"pep8: C0412: Imports from package cryptography are not grouped (ungrouped-imports)","commit_id":"eb7ad2e7c97c46c11f917bbafb1e924ae9678c89"},{"author":{"_account_id":38360,"name":"Zachary Mark Raines","display_name":"Zachary Raines","email":"zachary.raines@canonical.com","username":"raineszm","status":"Sustaining Engineer @ Canonical"},"change_message_id":"e065bbfd5c4c9c7e845960d98562b61510a47460","unresolved":true,"context_lines":[{"line_number":46,"context_line":"    return HAS_MLDSA"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def _get_signing_algorithm(private_key):"},{"line_number":50,"context_line":"    \"\"\"Determine the algorithm to use for signing with the given key."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    ML-DSA keys require algorithm\u003dNone. RSA requires a digest algorithm."}],"source_content_type":"text/x-python","patch_set":5,"id":"180d9a5d_10ab395b","line":49,"updated":"2026-09-09 16:19:50.000000000","message":"Probably a nit, but it would be nice to add types for newly introduced methods at least.","commit_id":"35a7fda598385e59d0491663660f381264446390"},{"author":{"_account_id":38360,"name":"Zachary Mark Raines","display_name":"Zachary Raines","email":"zachary.raines@canonical.com","username":"raineszm","status":"Sustaining Engineer @ Canonical"},"change_message_id":"e065bbfd5c4c9c7e845960d98562b61510a47460","unresolved":true,"context_lines":[{"line_number":65,"context_line":"            return None, True"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    # RSA uses a digest algorithm"},{"line_number":68,"context_line":"    return getattr(hashes, CONF.certificates.signing_digest.upper())(), False"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"class LocalCertGenerator(cert_gen.CertGenerator):"}],"source_content_type":"text/x-python","patch_set":5,"id":"196ce258_b5e97556","line":68,"updated":"2026-09-09 16:19:50.000000000","message":"I think using upper may defuse it, but I\u0027m a little leery of passing user input directly to getattr since that effectively let\u0027s it access anything in the interpreter via __class__ and such. I do see that\u0027s what we were doing before though.","commit_id":"35a7fda598385e59d0491663660f381264446390"},{"author":{"_account_id":38360,"name":"Zachary Mark Raines","display_name":"Zachary Raines","email":"zachary.raines@canonical.com","username":"raineszm","status":"Sustaining Engineer @ Canonical"},"change_message_id":"e065bbfd5c4c9c7e845960d98562b61510a47460","unresolved":true,"context_lines":[{"line_number":254,"context_line":"                backend\u003dbackends.default_backend()"},{"line_number":255,"context_line":"            )"},{"line_number":256,"context_line":"            key_format \u003d serialization.PrivateFormat.TraditionalOpenSSL"},{"line_number":257,"context_line":"        elif key_type in (\u0027mldsa44\u0027, \u0027mldsa65\u0027, \u0027mldsa87\u0027):"},{"line_number":258,"context_line":"            if not _has_mldsa_support():"},{"line_number":259,"context_line":"                raise crypto_exceptions.UnsupportedAlgorithm("},{"line_number":260,"context_line":"                    f\"ML-DSA is not available. Requires cryptography \u003e\u003d 44 \""}],"source_content_type":"text/x-python","patch_set":5,"id":"c92ea5f2_9e8e221d","line":257,"updated":"2026-09-09 16:19:50.000000000","message":"maybe use a set literal here?","commit_id":"35a7fda598385e59d0491663660f381264446390"},{"author":{"_account_id":38360,"name":"Zachary Mark Raines","display_name":"Zachary Raines","email":"zachary.raines@canonical.com","username":"raineszm","status":"Sustaining Engineer @ Canonical"},"change_message_id":"e065bbfd5c4c9c7e845960d98562b61510a47460","unresolved":true,"context_lines":[{"line_number":261,"context_line":"                    f\"with OpenSSL 3.5+ support. (current version: \""},{"line_number":262,"context_line":"                    f\"{crypto_exceptions.__module__})\""},{"line_number":263,"context_line":"                )"},{"line_number":264,"context_line":"            if key_type \u003d\u003d \u0027mldsa44\u0027:"},{"line_number":265,"context_line":"                pk \u003d mldsa.MLDSA44PrivateKey.generate()"},{"line_number":266,"context_line":"            elif key_type \u003d\u003d \u0027mldsa65\u0027:"},{"line_number":267,"context_line":"                pk \u003d mldsa.MLDSA65PrivateKey.generate()"}],"source_content_type":"text/x-python","patch_set":5,"id":"784292a9_ecd8f118","line":264,"updated":"2026-09-09 16:19:50.000000000","message":"this seems a good candidate for a match statement and perhaps the key type above","commit_id":"35a7fda598385e59d0491663660f381264446390"}]}
