Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
64be800
chore: [wip] PQC POC 2
diegomarquezp May 14, 2026
7c915c7
chore: update CI workflow to use googleapis/google-http-java-client b…
diegomarquezp May 14, 2026
f0478ae
chore: fix CI workflow setup order and step numbers
diegomarquezp May 14, 2026
408496f
chore: address Gemini review comments for PQC POC
diegomarquezp May 19, 2026
ae47748
Merge branch 'main' into chore/pqc-poc-2
diegomarquezp May 19, 2026
a61bd9d
test(bigquery): include bigquery for testing
diegomarquezp May 20, 2026
6b8816b
Merge remote-tracking branch 'origin/main' into chore/pqc-poc-2
diegomarquezp May 20, 2026
5be6b97
Merge branch 'chore/pqc-poc-2' of https://github.com/googleapis/googl…
diegomarquezp May 20, 2026
4d9e72c
refactor: zero-config programmatic PQC auto-upgrades using http-clien…
diegomarquezp May 20, 2026
6bbb7fc
test: Resolve Java 17 SSLParameters namedGroups compatibility with Bo…
diegomarquezp May 20, 2026
a472a87
fix(gax-grpc): use out of the box behavior for PQC
diegomarquezp May 21, 2026
2d59672
chore: revert changes in instantiating channel providers
diegomarquezp May 21, 2026
498bbb2
test: use vanilla client approach
diegomarquezp May 22, 2026
a50066c
test: use vanilla clients
diegomarquezp May 22, 2026
30acb1a
test: fix tests
diegomarquezp May 22, 2026
0225fac
test: partial implemnetation of programatically enabled PQC in local …
diegomarquezp May 23, 2026
5bff2c4
test: simplify tests
diegomarquezp May 23, 2026
f0e9e46
build: move test yaml to relevant folder
diegomarquezp May 23, 2026
35606e2
chore: simplify poms
diegomarquezp May 23, 2026
bf1afbe
fix: restore unwanted changes
diegomarquezp May 23, 2026
d536c3d
chore: format
diegomarquezp May 23, 2026
c38b4c9
Revert "build: move test yaml to relevant folder"
diegomarquezp May 23, 2026
99cf802
build: update pqc-tests.yml
diegomarquezp May 23, 2026
e290225
ci: explicitly install sdk-platform-java and snapshot bigquery/transl…
diegomarquezp May 23, 2026
fe4099e
test: fix pqc server
diegomarquezp Jun 1, 2026
38b7379
test: enable gax-grpc
diegomarquezp Jun 2, 2026
3152eb4
test: trim connectivity test
diegomarquezp Jun 2, 2026
5a0dc7a
fix: use netty shaded as compile dependency
diegomarquezp Jun 2, 2026
a3eb4c1
fix: include gax changes
diegomarquezp Jun 2, 2026
80661d7
test: simplify truststore
diegomarquezp Jun 2, 2026
66c1f25
build: fix pqc test
diegomarquezp Jun 2, 2026
c4ad546
ci(pqc): build and install google-cloud-shared-dependencies in Core step
diegomarquezp Jun 2, 2026
da6b640
ci(pqc): build and install first-party and third-party shared depende…
diegomarquezp Jun 2, 2026
5d1b445
ci(pqc): execute snapshot and release tests using monorepo reactor root
diegomarquezp Jun 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions .github/workflows/pqc-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: PQC Connectivity Integration Tests

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

jobs:
pqc-tests:
runs-on: ubuntu-latest

steps:
# 1. Checkout sibling HTTP Client repository
- name: Checkout google-http-java-client
uses: actions/checkout@v4
with:
repository: googleapis/google-http-java-client
ref: chore/pqc-poc-2
path: google-http-java-client

# 2. Checkout this monorepo
- name: Checkout google-cloud-java-pqc
uses: actions/checkout@v4
with:
path: google-cloud-java-pqc

# 3. Set up JDK 17
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: 'maven'
cache-dependency-path: 'google-cloud-java-pqc/pom.xml'

# 4. Build and install modified google-http-client SNAPSHOT locally
- name: Build and Install google-http-java-client
run: |
cd google-http-java-client
mvn clean install -DskipTests=true -Dcheckstyle.skip -Dclirr.skip -Denforcer.skip -Dfmt.skip

# 5. Build and Install sdk-platform-java core libraries first (using monorepo root reactor to resolve siblings)
- name: Build and Install sdk-platform-java Core
run: |
cd google-cloud-java-pqc
mvn clean install -pl :gax,:gax-grpc,:gax-httpjson,:google-cloud-shared-dependencies,:first-party-dependencies,:third-party-dependencies -am -Dcheckstyle.skip -Dclirr.skip -Denforcer.skip -Dfmt.skip -DskipTests=true

# 6. Build and Install snapshot bigquery, java-translate, and pqc-test targets (specifying actual sub-modules)
- name: Build and Install Client Snapshot Libraries and Test Modules
run: |
cd google-cloud-java-pqc
mvn clean install -pl java-bigquery/google-cloud-bigquery,java-translate/google-cloud-translate,sdk-platform-java/pqc-test/pqc-test-snapshot,sdk-platform-java/pqc-test/pqc-test-release -am -T 1.5C -Dcheckstyle.skip -Dclirr.skip -Denforcer.skip -Dfmt.skip -DskipTests=true

# 7. Run Snapshot PQC Tests (EXPECT PASS)
- name: Run Snapshot PQC Connectivity Tests (Expect PASS)
run: |
cd google-cloud-java-pqc
mvn install -pl sdk-platform-java/pqc-test/pqc-test-snapshot -Dcheckstyle.skip -Dclirr.skip -Denforcer.skip -Dfmt.skip -Dtest=RunPqcTest

# 8. Run Release PQC Tests (Expect PASS because tests assert negative behavior and pass)
- name: Run Release PQC Connectivity Tests
run: |
cd google-cloud-java-pqc
mvn install -pl sdk-platform-java/pqc-test/pqc-test-release -Dcheckstyle.skip -Dclirr.skip -Denforcer.skip -Dfmt.skip -Dtest=RunPqcTest
11 changes: 10 additions & 1 deletion sdk-platform-java/gax-java/gax-grpc/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,6 @@
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<scope>runtime</scope>
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

this must be evaluated

</dependency>
<dependency>
<groupId>io.grpc</groupId>
Expand Down Expand Up @@ -131,6 +130,16 @@
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
<version>1.84</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bctls-jdk18on</artifactId>
<version>1.84</version>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder;
import io.grpc.netty.shaded.io.netty.handler.ssl.ApplicationProtocolConfig;
import io.grpc.netty.shaded.io.netty.handler.ssl.SslContext;
import io.grpc.netty.shaded.io.netty.handler.ssl.SslContextBuilder;
import io.grpc.netty.shaded.io.netty.handler.ssl.SslProvider;
import javax.annotation.Nullable;
import javax.net.ssl.KeyManagerFactory;

Expand Down Expand Up @@ -812,6 +817,8 @@ public ManagedChannelBuilder<?> createDecoratedChannelBuilder() throws IOExcepti
if (interceptorProvider != null) {
builder.intercept(interceptorProvider.getInterceptors());
}
configurePqc(builder);

if (channelConfigurator != null) {
builder = channelConfigurator.apply(builder);
}
Expand All @@ -829,6 +836,34 @@ private ManagedChannel createSingleChannel() throws IOException {
return managedChannel;
}

private void configurePqc(ManagedChannelBuilder<?> builder) {
NettyChannelBuilder nettyBuilder = (NettyChannelBuilder) builder;
try {
ApplicationProtocolConfig apn =
new ApplicationProtocolConfig(
ApplicationProtocolConfig.Protocol.ALPN,
ApplicationProtocolConfig.SelectorFailureBehavior.NO_ADVERTISE,
ApplicationProtocolConfig.SelectedListenerFailureBehavior.ACCEPT,
"h2");

java.security.Provider bcProvider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
java.security.Provider bcJsseProvider =
new org.bouncycastle.jsse.provider.BouncyCastleJsseProvider(bcProvider);

SslContext shadedSslContext =
SslContextBuilder.forClient()
.sslProvider(SslProvider.JDK)
.sslContextProvider(bcJsseProvider)
.protocols("TLSv1.3")
.applicationProtocolConfig(apn)
.build();

nettyBuilder.sslContext(shadedSslContext);
} catch (Exception e) {
LOG.log(Level.WARNING, "Failed to configure shaded gRPC Netty channel for PQC", e);
}
}

/* Remove provided headers that will also get set by {@link com.google.auth.ApiKeyCredentials}. They will be added as part of the grpc call when performing auth
* {@link io.grpc.auth.GoogleAuthLibraryCallCredentials#applyRequestMetadata}. GRPC does not dedup headers {@link https://github.com/grpc/grpc-java/blob/a140e1bb0cfa662bcdb7823d73320eb8d49046f1/api/src/main/java/io/grpc/Metadata.java#L504} so we must before initiating the call.
*
Expand Down
1 change: 1 addition & 0 deletions sdk-platform-java/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
<module>gapic-generator-java-bom</module>
<module>java-shared-dependencies</module>
<module>sdk-platform-java-config</module>
<module>pqc-test</module>
</modules>
<!-- Do not deploy the aggregator POM -->
<build>
Expand Down
39 changes: 39 additions & 0 deletions sdk-platform-java/pqc-test/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-shared-config</artifactId>
<version>1.17.0</version>
</parent>

<groupId>com.google.api</groupId>
<artifactId>pqc-test-parent</artifactId>
<packaging>pom</packaging>
<version>2.81.0-SNAPSHOT</version>

<modules>
<module>pqc-test-common</module>
<module>pqc-test-snapshot</module>
<module>pqc-test-release</module>
</modules>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>
-Djavax.net.ssl.trustStore=${project.basedir}/../pqc-test-common/target/classes/pqctest.p12
-Djavax.net.ssl.trustStorePassword=password
-Djavax.net.ssl.trustStoreType=PKCS12
</argLine>
</configuration>
</plugin>
</plugins>
</build>
</project>
73 changes: 73 additions & 0 deletions sdk-platform-java/pqc-test/pqc-test-common/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>com.google.api</groupId>
<artifactId>pqc-test-parent</artifactId>
<version>2.81.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

<artifactId>pqc-test-common</artifactId>

<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.10.2</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty</artifactId>
<version>1.81.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.81.0</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
<version>1.84</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bctls-jdk18on</artifactId>
<version>1.84</version>
</dependency>
<dependency>
<groupId>com.google.api</groupId>
<artifactId>gax</artifactId>
<version>2.81.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.google.api</groupId>
<artifactId>gax-httpjson</artifactId>
<version>2.81.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.google.api</groupId>
<artifactId>gax-grpc</artifactId>
<version>2.81.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client</artifactId>
<version>2.1.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-bigquery</artifactId>
<version>2.67.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-translate</artifactId>
<version>2.93.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
Loading
Loading