@@ -24,12 +24,8 @@ def run_pqc_test(use_tls):
2424 pytest .skip ("PQC integration test requires TLS (--tls or --mtls flag) to be enabled." )
2525
2626
27- def _verify_pqc_negotiated_group (client , interceptor , transport_name ):
28- # Make secure call using standard GAPIC client library fixture
29- response = client .echo (request = showcase .EchoRequest (content = "Verify PQC connection." ))
30- assert response .content == "Verify PQC connection."
31-
32- # Extract negotiated group and supported groups from response headers
27+ def _verify_pqc_metadata (interceptor , transport_name ):
28+ """Extracts and verifies negotiated PQC group and supported groups from interceptor metadata."""
3329 response_metadata = getattr (interceptor , "response_metadata" , []) or []
3430 headers = {key .lower (): value for key , value in response_metadata }
3531 negotiated_group = headers .get ("x-showcase-tls-group" )
@@ -38,12 +34,10 @@ def _verify_pqc_negotiated_group(client, interceptor, transport_name):
3834 assert negotiated_group is not None , "Failed: Showcase server did not return negotiated TLS group header."
3935 assert supported_groups is not None , "Failed: Showcase server did not return client advertised supported groups."
4036
41- print (f"\n [PQC Verification] ({ transport_name } ) Negotiated TLS Group: { negotiated_group } " )
42- print (f"[PQC Verification] ({ transport_name } ) Client Advertised Supported Groups: { supported_groups } " )
43-
4437 # Enforce PQC compliance (X25519MLKEM768 or Kyber)
45- assert "MLKEM" in negotiated_group or "Kyber" in negotiated_group , \
46- f"Failed: { transport_name } Connection is NOT PQC-compliant! Negotiated: { negotiated_group } "
38+ assert (
39+ "MLKEM" in negotiated_group or "Kyber" in negotiated_group
40+ ), f"Failed: { transport_name } Connection is NOT PQC-compliant! Negotiated: { negotiated_group } "
4741
4842
4943def test_pqc_grpc (run_pqc_test , intercepted_echo_grpc ):
@@ -53,12 +47,31 @@ def test_pqc_grpc(run_pqc_test, intercepted_echo_grpc):
5347 pytest .skip (f"gRPC PQC negotiation requires grpcio >= 1.83.0 (current: { grpc .__version__ } )" )
5448
5549 client , interceptor = intercepted_echo_grpc
56- _verify_pqc_negotiated_group (client , interceptor , "grpc" )
50+ response = client .echo (request = showcase .EchoRequest (content = "Verify PQC connection." ))
51+ assert response .content == "Verify PQC connection."
52+ _verify_pqc_metadata (interceptor , "grpc" )
5753
5854
5955def test_pqc_rest (run_pqc_test , intercepted_echo_rest ):
6056 """Verifies that the REST client library negotiates PQC (X25519MLKEM768) with Showcase server."""
6157 client , interceptor = intercepted_echo_rest
62- _verify_pqc_negotiated_group (client , interceptor , "rest" )
58+ response = client .echo (request = showcase .EchoRequest (content = "Verify PQC connection." ))
59+ assert response .content == "Verify PQC connection."
60+ _verify_pqc_metadata (interceptor , "rest" )
61+
62+
63+ @pytest .mark .asyncio
64+ async def test_pqc_grpc_async (run_pqc_test , intercepted_echo_grpc_async ):
65+ """Verifies that the async gRPC client library negotiates PQC (X25519MLKEM768) with Showcase server."""
66+ # TODO(Phase 3): Remove this check once grpcio >= 1.83.0 is enforced across all client libraries.
67+ if Version (grpc .__version__ ) < Version ("1.83.0rc0" ):
68+ pytest .skip (f"gRPC PQC negotiation requires grpcio >= 1.83.0 (current: { grpc .__version__ } )" )
69+
70+ client , interceptor = intercepted_echo_grpc_async
71+ response = await client .echo (request = showcase .EchoRequest (content = "Verify PQC connection." ))
72+ assert response .content == "Verify PQC connection."
73+ _verify_pqc_metadata (interceptor , "grpc_asyncio" )
74+
75+
6376
6477
0 commit comments