From 1273116db1e3ab8a42b07b31fa9f9f49d7233e6e Mon Sep 17 00:00:00 2001 From: James Netherton Date: Fri, 1 May 2026 09:16:54 +0100 Subject: [PATCH 1/2] Next is 3.36.0 --- amqp/pom.xml | 10 +++++----- artemis-elasticsearch/pom.xml | 10 +++++----- aws-lambda/pom.xml | 10 +++++----- aws2-s3/pom.xml | 10 +++++----- cluster-leader-election/pom.xml | 10 +++++----- cxf-soap/pom.xml | 10 +++++----- data-extract-langchain4j/pom.xml | 10 +++++----- fhir/pom.xml | 10 +++++----- fhir/src/main/kubernetes/kubernetes.yml | 10 +++++----- fhir/src/main/kubernetes/openshift.yml | 10 +++++----- file-bindy-ftp/pom.xml | 10 +++++----- file-bindy-ftp/src/main/kubernetes/kubernetes.yml | 12 ++++++------ file-bindy-ftp/src/main/kubernetes/openshift.yml | 12 ++++++------ file-split-log-xml/pom.xml | 10 +++++----- health/pom.xml | 10 +++++----- http-log/pom.xml | 10 +++++----- http-pqc-j17/pom.xml | 10 +++++----- jdbc-datasource/pom.xml | 10 +++++----- jms-jpa/pom.xml | 10 +++++----- jpa-idempotent-repository/pom.xml | 10 +++++----- .../src/main/kubernetes/kubernetes.yml | 12 ++++++------ .../src/main/kubernetes/openshift.yml | 14 +++++++------- jta-jpa/pom.xml | 10 +++++----- kafka/pom.xml | 10 +++++----- kamelet-chucknorris/pom.xml | 10 +++++----- message-bridge/pom.xml | 10 +++++----- netty-custom-correlation/pom.xml | 10 +++++----- observability/pom.xml | 10 +++++----- openapi-contract-first/pom.xml | 10 +++++----- platform-http-security-keycloak/pom.xml | 10 +++++----- quarkus-rest-json/pom.xml | 10 +++++----- rest-json/pom.xml | 10 +++++----- saga/pom.xml | 10 +++++----- saga/saga-app/pom.xml | 2 +- saga/saga-flight-service/pom.xml | 2 +- saga/saga-integration-tests/pom.xml | 2 +- saga/saga-payment-service/pom.xml | 2 +- saga/saga-train-service/pom.xml | 2 +- spring-redis/pom.xml | 10 +++++----- timer-log-main/pom.xml | 10 +++++----- timer-log/pom.xml | 10 +++++----- variables/pom.xml | 10 +++++----- vertx-websocket-chat/pom.xml | 10 +++++----- 43 files changed, 200 insertions(+), 200 deletions(-) diff --git a/amqp/pom.xml b/amqp/pom.xml index c4884c9c..06b65e39 100644 --- a/amqp/pom.xml +++ b/amqp/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-amqp org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: AMQP Camel Quarkus Example :: AMQP 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/artemis-elasticsearch/pom.xml b/artemis-elasticsearch/pom.xml index ba02977a..de38a2f5 100644 --- a/artemis-elasticsearch/pom.xml +++ b/artemis-elasticsearch/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-artemis-elasticsearch org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Artemis ElasticSearch Camel Quarkus Example :: Artemis ElasticSearch 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/aws-lambda/pom.xml b/aws-lambda/pom.xml index df165d43..2b418cb0 100644 --- a/aws-lambda/pom.xml +++ b/aws-lambda/pom.xml @@ -21,19 +21,19 @@ 4.0.0 org.apache.camel.quarkus.examples camel-quarkus-examples-aws-lambda - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: AWS Lambda Camel Quarkus Example :: Deploying a Camel Route in AWS Lambda 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/aws2-s3/pom.xml b/aws2-s3/pom.xml index 9e1d2d58..32485939 100644 --- a/aws2-s3/pom.xml +++ b/aws2-s3/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-aws2-s3 org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: aws2-s3 Camel Quarkus Example :: Upload a file to an AWS S3 bucket 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/cluster-leader-election/pom.xml b/cluster-leader-election/pom.xml index d4103495..bf8d6276 100644 --- a/cluster-leader-election/pom.xml +++ b/cluster-leader-election/pom.xml @@ -23,19 +23,19 @@ camel-quarkus-examples-cluster-leader-election org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Cluster leader election Camel Quarkus Example :: Cluster leader election 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/cxf-soap/pom.xml b/cxf-soap/pom.xml index e4b6e894..7245e604 100644 --- a/cxf-soap/pom.xml +++ b/cxf-soap/pom.xml @@ -23,19 +23,19 @@ camel-quarkus-examples-cxf-soap org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: CXF SOAP Camel Quarkus Example :: CXF SOAP 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/data-extract-langchain4j/pom.xml b/data-extract-langchain4j/pom.xml index 76c026f7..b91315db 100644 --- a/data-extract-langchain4j/pom.xml +++ b/data-extract-langchain4j/pom.xml @@ -24,7 +24,7 @@ camel-quarkus-examples-data-extract-langchain4j org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Data Extract LangChain4j Repository Camel Quarkus Example :: Data Extract LangChain4j Repository @@ -32,12 +32,12 @@ 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/fhir/pom.xml b/fhir/pom.xml index 62430a38..51ad0e7c 100644 --- a/fhir/pom.xml +++ b/fhir/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-fhir org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: FHIR Camel Quarkus Example :: FHIR 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/fhir/src/main/kubernetes/kubernetes.yml b/fhir/src/main/kubernetes/kubernetes.yml index 8502178a..9f3478c4 100644 --- a/fhir/src/main/kubernetes/kubernetes.yml +++ b/fhir/src/main/kubernetes/kubernetes.yml @@ -21,18 +21,18 @@ metadata: name: fhir-server-deployment labels: app.kubernetes.io/name: camel-quarkus-examples-fhir - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: camel-quarkus-examples-fhir - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT template: metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-fhir - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT spec: # Work around container permissions issues for /app/target # https://github.com/hapifhir/hapi-fhir-jpaserver-starter/issues/519 @@ -99,7 +99,7 @@ kind: Service metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-fhir - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT name: fhir-server spec: ports: @@ -108,5 +108,5 @@ spec: targetPort: 8080 selector: app.kubernetes.io/name: camel-quarkus-examples-fhir - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT type: ClusterIP diff --git a/fhir/src/main/kubernetes/openshift.yml b/fhir/src/main/kubernetes/openshift.yml index 055dcc45..b8a27de9 100644 --- a/fhir/src/main/kubernetes/openshift.yml +++ b/fhir/src/main/kubernetes/openshift.yml @@ -21,18 +21,18 @@ metadata: name: fhir-server labels: app.kubernetes.io/name: camel-quarkus-examples-fhir - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: camel-quarkus-examples-fhir - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT template: metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-fhir - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT spec: # Work around container permissions issues for /app/target # https://github.com/hapifhir/hapi-fhir-jpaserver-starter/issues/519 @@ -99,7 +99,7 @@ kind: Service metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-fhir - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT name: fhir-server spec: ports: @@ -108,5 +108,5 @@ spec: targetPort: 8080 selector: app.kubernetes.io/name: camel-quarkus-examples-fhir - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT type: ClusterIP diff --git a/file-bindy-ftp/pom.xml b/file-bindy-ftp/pom.xml index e29701da..6b35c646 100644 --- a/file-bindy-ftp/pom.xml +++ b/file-bindy-ftp/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-file-bindy-ftp org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: File Bindy FTP Camel Quarkus Example :: File Bindy FTP 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/file-bindy-ftp/src/main/kubernetes/kubernetes.yml b/file-bindy-ftp/src/main/kubernetes/kubernetes.yml index a018e803..ca646267 100644 --- a/file-bindy-ftp/src/main/kubernetes/kubernetes.yml +++ b/file-bindy-ftp/src/main/kubernetes/kubernetes.yml @@ -21,18 +21,18 @@ metadata: name: ssh-server-deployment labels: app.kubernetes.io/name: camel-quarkus-examples-file-bindy-ftp - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: camel-quarkus-examples-file-bindy-ftp - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT template: metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-file-bindy-ftp - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT spec: containers: - name: openssh-server @@ -57,7 +57,7 @@ kind: Service metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-file-bindy-ftp - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT name: ftp-server spec: ports: @@ -66,7 +66,7 @@ spec: targetPort: 2222 selector: app.kubernetes.io/name: camel-quarkus-examples-file-bindy-ftp - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT type: ClusterIP --- apiVersion: v1 @@ -77,7 +77,7 @@ kind: Secret metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-file-bindy-ftp - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT name: ftp-credentials type: Opaque --- diff --git a/file-bindy-ftp/src/main/kubernetes/openshift.yml b/file-bindy-ftp/src/main/kubernetes/openshift.yml index a018e803..ca646267 100644 --- a/file-bindy-ftp/src/main/kubernetes/openshift.yml +++ b/file-bindy-ftp/src/main/kubernetes/openshift.yml @@ -21,18 +21,18 @@ metadata: name: ssh-server-deployment labels: app.kubernetes.io/name: camel-quarkus-examples-file-bindy-ftp - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: camel-quarkus-examples-file-bindy-ftp - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT template: metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-file-bindy-ftp - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT spec: containers: - name: openssh-server @@ -57,7 +57,7 @@ kind: Service metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-file-bindy-ftp - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT name: ftp-server spec: ports: @@ -66,7 +66,7 @@ spec: targetPort: 2222 selector: app.kubernetes.io/name: camel-quarkus-examples-file-bindy-ftp - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT type: ClusterIP --- apiVersion: v1 @@ -77,7 +77,7 @@ kind: Secret metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-file-bindy-ftp - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT name: ftp-credentials type: Opaque --- diff --git a/file-split-log-xml/pom.xml b/file-split-log-xml/pom.xml index 00825566..087396ae 100644 --- a/file-split-log-xml/pom.xml +++ b/file-split-log-xml/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-file-log-xml org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: File To Log XML DSL Camel Quarkus Example :: File To Log XML DSL 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/health/pom.xml b/health/pom.xml index ba2c80a9..f9a4c2ba 100644 --- a/health/pom.xml +++ b/health/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-health org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Health Camel Quarkus Example :: Health Check 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/http-log/pom.xml b/http-log/pom.xml index 2b008240..12768a16 100644 --- a/http-log/pom.xml +++ b/http-log/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-http-log org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: HTTP Log Camel Quarkus Example :: HTTP to Log 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/http-pqc-j17/pom.xml b/http-pqc-j17/pom.xml index c39e746f..93fc4ab7 100644 --- a/http-pqc-j17/pom.xml +++ b/http-pqc-j17/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-http-pqc-j17 org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: HTTP PQC Camel Quarkus Example :: HTTP with Post-Quantum Cryptography 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/jdbc-datasource/pom.xml b/jdbc-datasource/pom.xml index c877b413..0adb9597 100644 --- a/jdbc-datasource/pom.xml +++ b/jdbc-datasource/pom.xml @@ -21,17 +21,17 @@ 4.0.0 org.apache.camel.quarkus.examples camel-quarkus-examples-jdbc-datasource - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Jdbc - DatataSource - Log Camel Quarkus Example :: Connect to Database using Datasource 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom 2.29.0 1.13.0 diff --git a/jms-jpa/pom.xml b/jms-jpa/pom.xml index 6342d19e..8273f6fe 100644 --- a/jms-jpa/pom.xml +++ b/jms-jpa/pom.xml @@ -21,18 +21,18 @@ 4.0.0 org.apache.camel.quarkus.examples camel-quarkus-examples-jms-jpa - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: JMS JPA Camel Quarkus Example :: JMS JPA 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT 3.14.1 - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom 2.29.0 1.13.0 diff --git a/jpa-idempotent-repository/pom.xml b/jpa-idempotent-repository/pom.xml index c76a81c2..4e4ad0ab 100644 --- a/jpa-idempotent-repository/pom.xml +++ b/jpa-idempotent-repository/pom.xml @@ -24,19 +24,19 @@ camel-quarkus-examples-jpa-idempotent-repository org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: JPA Idempotent Repository Camel Quarkus Example :: JPA Idempotent Repository 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/jpa-idempotent-repository/src/main/kubernetes/kubernetes.yml b/jpa-idempotent-repository/src/main/kubernetes/kubernetes.yml index 21a50868..abc20bfd 100644 --- a/jpa-idempotent-repository/src/main/kubernetes/kubernetes.yml +++ b/jpa-idempotent-repository/src/main/kubernetes/kubernetes.yml @@ -21,18 +21,18 @@ metadata: name: camel-quarkus-examples-mariadb-database-deployment labels: app.kubernetes.io/name: camel-quarkus-examples-mariadb-database - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: camel-quarkus-examples-mariadb-database - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT template: metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-mariadb-database - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT spec: containers: - name: mariadb-database @@ -68,7 +68,7 @@ kind: Service metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-mariadb-database - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT name: mariadb-database spec: ports: @@ -77,7 +77,7 @@ spec: targetPort: 3306 selector: app.kubernetes.io/name: camel-quarkus-examples-mariadb-database - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT type: ClusterIP --- apiVersion: v1 @@ -85,7 +85,7 @@ kind: Secret metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-mariadb-database - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT name: mariadb-secret type: Opaque data: diff --git a/jpa-idempotent-repository/src/main/kubernetes/openshift.yml b/jpa-idempotent-repository/src/main/kubernetes/openshift.yml index faf49240..9e382356 100644 --- a/jpa-idempotent-repository/src/main/kubernetes/openshift.yml +++ b/jpa-idempotent-repository/src/main/kubernetes/openshift.yml @@ -21,18 +21,18 @@ metadata: name: camel-quarkus-examples-mariadb-database-deployment labels: app.kubernetes.io/name: camel-quarkus-examples-mariadb-database - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: camel-quarkus-examples-mariadb-database - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT template: metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-mariadb-database - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT spec: containers: - name: mariadb-database @@ -68,7 +68,7 @@ kind: Service metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-mariadb-database - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT name: mariadb-database spec: ports: @@ -77,7 +77,7 @@ spec: targetPort: 3306 selector: app.kubernetes.io/name: camel-quarkus-examples-mariadb-database - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT type: ClusterIP --- apiVersion: v1 @@ -85,7 +85,7 @@ kind: Secret metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-mariadb-database - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT name: mariadb-secret type: Opaque data: @@ -104,7 +104,7 @@ spec: metadata: labels: app.kubernetes.io/name: camel-quarkus-examples-jpa-idempotent-repository-flyway-init - app.kubernetes.io/version: 3.35.0 + app.kubernetes.io/version: 3.36.0-SNAPSHOT spec: containers: - env: diff --git a/jta-jpa/pom.xml b/jta-jpa/pom.xml index f3ab00a2..b0f4af85 100644 --- a/jta-jpa/pom.xml +++ b/jta-jpa/pom.xml @@ -21,17 +21,17 @@ 4.0.0 org.apache.camel.quarkus.examples camel-quarkus-examples-jta-jpa - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: JTA JPA Camel Quarkus Example :: JTA JPA 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom 2.29.0 1.13.0 diff --git a/kafka/pom.xml b/kafka/pom.xml index bed56333..77e2832d 100644 --- a/kafka/pom.xml +++ b/kafka/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-kafka org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Kafka Camel Quarkus Example :: Kafka 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/kamelet-chucknorris/pom.xml b/kamelet-chucknorris/pom.xml index 31da1b05..b3fba9d3 100644 --- a/kamelet-chucknorris/pom.xml +++ b/kamelet-chucknorris/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-kamelet-chucknorris org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Kamelet Chuck Norris Camel Quarkus Example :: Kamelet Chuck Norris 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/message-bridge/pom.xml b/message-bridge/pom.xml index 616ce35f..aded99e1 100644 --- a/message-bridge/pom.xml +++ b/message-bridge/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-message-bridge org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Message Bridge Camel Quarkus Example :: Configure XA Transactions and connection pooling 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/netty-custom-correlation/pom.xml b/netty-custom-correlation/pom.xml index 09592d11..0de92cd2 100644 --- a/netty-custom-correlation/pom.xml +++ b/netty-custom-correlation/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-netty-custom-correlation org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Communication with Netty over TCP Camel Quarkus Example :: Communication with Netty over TCP 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/observability/pom.xml b/observability/pom.xml index 026f7146..004c116d 100644 --- a/observability/pom.xml +++ b/observability/pom.xml @@ -22,7 +22,7 @@ camel-quarkus-examples-observability org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Observability Camel Quarkus Example :: Observability @@ -30,12 +30,12 @@ 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/openapi-contract-first/pom.xml b/openapi-contract-first/pom.xml index 4b450a23..d0a6489b 100644 --- a/openapi-contract-first/pom.xml +++ b/openapi-contract-first/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-examples-openapi-contract-first org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: openapi-contract-first Camel Quarkus Example :: openapi-contract-first 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/platform-http-security-keycloak/pom.xml b/platform-http-security-keycloak/pom.xml index 47fdf7ad..f1b39c77 100644 --- a/platform-http-security-keycloak/pom.xml +++ b/platform-http-security-keycloak/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-platform-http-security-keycloak org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Platform HTTP Security Keycloak Camel Quarkus Example :: Platform HTTP Security Keycloak 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/quarkus-rest-json/pom.xml b/quarkus-rest-json/pom.xml index af51ae77..18466600 100644 --- a/quarkus-rest-json/pom.xml +++ b/quarkus-rest-json/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-rest-json org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Quarkus Rest Json Camel Quarkus Example :: Quarkus Rest Json 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/rest-json/pom.xml b/rest-json/pom.xml index 3a973797..afeb8a94 100644 --- a/rest-json/pom.xml +++ b/rest-json/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-rest-json org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Rest Json Camel Quarkus Example :: Rest Json 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/saga/pom.xml b/saga/pom.xml index 4dd8619e..04c88370 100644 --- a/saga/pom.xml +++ b/saga/pom.xml @@ -22,7 +22,7 @@ camel-quarkus-examples-saga org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Saga Camel Quarkus Example :: Saga @@ -30,13 +30,13 @@ 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT 3.14.1 - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/saga/saga-app/pom.xml b/saga/saga-app/pom.xml index 678f04b7..83e1e392 100644 --- a/saga/saga-app/pom.xml +++ b/saga/saga-app/pom.xml @@ -24,7 +24,7 @@ camel-quarkus-examples-saga org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT camel-quarkus-example-saga-app diff --git a/saga/saga-flight-service/pom.xml b/saga/saga-flight-service/pom.xml index 163e8c74..e94a9b9b 100644 --- a/saga/saga-flight-service/pom.xml +++ b/saga/saga-flight-service/pom.xml @@ -24,7 +24,7 @@ camel-quarkus-examples-saga org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT camel-quarkus-example-saga-flight diff --git a/saga/saga-integration-tests/pom.xml b/saga/saga-integration-tests/pom.xml index 2e3d3f0e..979a840c 100644 --- a/saga/saga-integration-tests/pom.xml +++ b/saga/saga-integration-tests/pom.xml @@ -24,7 +24,7 @@ camel-quarkus-examples-saga org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT camel-quarkus-example-saga-integration-tests diff --git a/saga/saga-payment-service/pom.xml b/saga/saga-payment-service/pom.xml index 501aaebe..b5b594e4 100644 --- a/saga/saga-payment-service/pom.xml +++ b/saga/saga-payment-service/pom.xml @@ -24,7 +24,7 @@ camel-quarkus-examples-saga org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT camel-quarkus-example-saga-payment diff --git a/saga/saga-train-service/pom.xml b/saga/saga-train-service/pom.xml index 9334e5cd..f7b6c742 100644 --- a/saga/saga-train-service/pom.xml +++ b/saga/saga-train-service/pom.xml @@ -24,7 +24,7 @@ camel-quarkus-examples-saga org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT camel-quarkus-example-saga-train diff --git a/spring-redis/pom.xml b/spring-redis/pom.xml index a97b92c1..63e55c67 100644 --- a/spring-redis/pom.xml +++ b/spring-redis/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-spring-redis org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: spring-redis Camel Quarkus Example :: Send and receive messages from Redis 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/timer-log-main/pom.xml b/timer-log-main/pom.xml index 3e4bf044..a5bdbcd6 100644 --- a/timer-log-main/pom.xml +++ b/timer-log-main/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-timer-log-main org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Timer Log Main Camel Quarkus Example :: Timer to Log Main 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/timer-log/pom.xml b/timer-log/pom.xml index 7acf3063..c2ad1fb7 100644 --- a/timer-log/pom.xml +++ b/timer-log/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-timer-log org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Timer Log Camel Quarkus Example :: Timer to Log 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/variables/pom.xml b/variables/pom.xml index 7f412413..b081907c 100644 --- a/variables/pom.xml +++ b/variables/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-variables org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Variables Camel Quarkus Example :: Variables 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 diff --git a/vertx-websocket-chat/pom.xml b/vertx-websocket-chat/pom.xml index f25c5e01..86fd710a 100644 --- a/vertx-websocket-chat/pom.xml +++ b/vertx-websocket-chat/pom.xml @@ -22,19 +22,19 @@ camel-quarkus-examples-vertx-websocket-chat org.apache.camel.quarkus.examples - 3.35.0 + 3.36.0-SNAPSHOT Camel Quarkus :: Examples :: Vertx-Websocket chat Camel Quarkus Example :: Implementing Websocket 3.35.1 - ${quarkus.platform.version} + 3.36.0-SNAPSHOT - io.quarkus.platform + io.quarkus quarkus-bom - ${quarkus.platform.group-id} - quarkus-camel-bom + org.apache.camel.quarkus + camel-quarkus-bom UTF-8 UTF-8 From 1a873b75440d4788ea0937749db0c154986901cd Mon Sep 17 00:00:00 2001 From: Jiri Ondrusek Date: Tue, 12 May 2026 14:05:49 +0200 Subject: [PATCH 2/2] Add HTTP PQC Example for Java 21 Adds a new Camel Quarkus example demonstrating native Post-Quantum Cryptography (PQC) support in TLS on Java 21 using BouncyCastle JSSE provider. Key features: - TLS 1.3 with X25519MLKEM768 hybrid cipher suite - Native PQC support via BouncyCastle JSSE provider (bctls-jdk18on) - Standard Quarkus SSL configuration - no custom trust managers needed - Auto-generated self-signed certificates - Comprehensive documentation comparing Java 17 vs Java 21 approaches This example demonstrates the recommended approach for PQC on Java 21+, which is significantly simpler than the Java 17 workaround (http-pqc-j17) that requires custom X509TrustManager and manual signature validation. Fixes #8648 Co-Authored-By: Claude Sonnet 4.5 --- docs/modules/ROOT/attachments/examples.json | 5 + http-pqc-j21/README.adoc | 300 +++++++++++++++++ http-pqc-j21/eclipse-formatter-config.xml | 276 ++++++++++++++++ http-pqc-j21/pom.xml | 308 ++++++++++++++++++ .../acme/http/pqc/CertificateGenerator.java | 134 ++++++++ .../java/org/acme/http/pqc/PqcCamelRoute.java | 58 ++++ .../acme/http/pqc/SecurityConfiguration.java | 32 ++ .../src/main/resources/application.properties | 53 +++ .../java/org/acme/http/pqc/HttpPqcIT.java | 23 ++ .../java/org/acme/http/pqc/HttpPqcTest.java | 75 +++++ 10 files changed, 1264 insertions(+) create mode 100644 http-pqc-j21/README.adoc create mode 100644 http-pqc-j21/eclipse-formatter-config.xml create mode 100644 http-pqc-j21/pom.xml create mode 100644 http-pqc-j21/src/main/java/org/acme/http/pqc/CertificateGenerator.java create mode 100644 http-pqc-j21/src/main/java/org/acme/http/pqc/PqcCamelRoute.java create mode 100644 http-pqc-j21/src/main/java/org/acme/http/pqc/SecurityConfiguration.java create mode 100644 http-pqc-j21/src/main/resources/application.properties create mode 100644 http-pqc-j21/src/test/java/org/acme/http/pqc/HttpPqcIT.java create mode 100644 http-pqc-j21/src/test/java/org/acme/http/pqc/HttpPqcTest.java diff --git a/docs/modules/ROOT/attachments/examples.json b/docs/modules/ROOT/attachments/examples.json index c69639f1..8d688d02 100644 --- a/docs/modules/ROOT/attachments/examples.json +++ b/docs/modules/ROOT/attachments/examples.json @@ -49,6 +49,11 @@ "description": "Shows how to implement quantum-resistant authentication using hybrid certificates that combine RSA with post-quantum ML-DSA-65 signatures on Java 17 using application-level validation", "link": "https://github.com/apache/camel-quarkus-examples/tree/main/http-pqc-j17" }, + { + "title": "HTTP with Post-Quantum Cryptography (PQC) (Java 21)", + "description": "Shows how to implement quantum-resistant TLS using Java 21 with BouncyCastle JSSE provider for native PQC support with hybrid cipher suites", + "link": "https://github.com/apache/camel-quarkus-examples/tree/main/http-pqc-j21" + }, { "title": "HTTP with vanilla JAX-RS or with Camel `platform-http` component", "description": "Shows how to create HTTP endpoints using either the RESTEasy", diff --git a/http-pqc-j21/README.adoc b/http-pqc-j21/README.adoc new file mode 100644 index 00000000..f448948b --- /dev/null +++ b/http-pqc-j21/README.adoc @@ -0,0 +1,300 @@ += HTTP with Post-Quantum Cryptography (PQC): A Camel Quarkus example (Java 21) +:cq-example-description: An example that shows how to implement quantum-resistant TLS using Java 21 with BouncyCastle JSSE provider for native PQC support + +{cq-description} + +This example demonstrates **native Post-Quantum Cryptography (PQC) support in TLS on Java 21** using BouncyCastle JSSE provider. Unlike the Java 17 example which requires application-level validation, this example uses TLS 1.3 with hybrid cipher suites that combine classical and post-quantum algorithms at the protocol level. + +TIP: Check the https://camel.apache.org/camel-quarkus/latest/first-steps.html[Camel Quarkus User guide] for prerequisites and other general information. + +== What is Post-Quantum Cryptography? + +Post-Quantum Cryptography (PQC) protects against "harvest now, decrypt later" attacks where adversaries capture encrypted data today to decrypt when quantum computers become available. + +=== Java 21 Native Approach + +**Java 21 with BouncyCastle JSSE** provides native PQC support through: + +* **TLS 1.3**: Modern protocol with built-in support for hybrid key exchange +* **X25519MLKEM768**: Hybrid cipher suite combining classical X25519 with quantum-resistant ML-KEM-768 +* **BouncyCastle JSSE Provider**: Drop-in replacement for Java's default JSSE that adds PQC algorithms +* **Standard TLS handshake**: No custom trust managers or application-level validation needed + +This is the **recommended approach** for production PQC deployments on Java 21+. + +=== Comparison with Java 17 Approach + +[cols="1,1,1"] +|=== +|Feature |Java 17 (Application-Level) |Java 21 (Native TLS) + +|PQC Location +|Application-level validation via custom X509TrustManager +|Native TLS 1.3 protocol support + +|Certificate Type +|Hybrid Chimera certificates (RSA + ML-DSA-65 signatures) +|Standard X.509 certificates + +|Cipher Suite +|Standard TLS, PQC validated separately +|TLS_X25519MLKEM768 hybrid key exchange + +|Complexity +|High - custom certificate generation, manual signature validation +|Low - standard Quarkus SSL configuration + +|Protocol +|TLS with manual PQC validation outside protocol +|TLS 1.3 with PQC integrated into protocol + +|Production Ready +|Workaround for Java 17 limitations +|Recommended approach for Java 21+ +|=== + +**Key Difference**: Java 21 handles PQC at the TLS protocol level, while Java 17 requires custom code to validate PQC signatures outside the TLS handshake. + +== How It Works + +=== Security Provider Registration + +The `SecurityConfiguration` class registers BouncyCastle JSSE as the primary security provider: + +[source,java] +---- +Security.insertProviderAt(new BouncyCastleJsseProvider(), 1); +---- + +This enables TLS 1.3 with hybrid cipher suites (X25519MLKEM768) without any additional configuration. + +=== Hybrid Key Exchange (X25519MLKEM768) + +The TLS handshake uses a hybrid approach: + +1. **Classical Security**: X25519 elliptic-curve Diffie-Hellman key exchange +2. **Quantum Resistance**: ML-KEM-768 (NIST FIPS 203) lattice-based key encapsulation + +Both algorithms must complete successfully for the connection to establish. If either fails, the handshake is rejected. + +=== Certificate Generation + +Self-signed certificates are auto-generated on startup in `target/certs/`: + +* `server-keystore.p12` - Server certificate and private key +* `server-truststore.p12` - Truststore for validating clients +* `client-keystore.p12` - Client certificate and private key +* `client-truststore.p12` - Truststore for validating server + +NOTE: These are standard X.509 certificates. The PQC protection comes from the TLS 1.3 hybrid cipher suite (X25519MLKEM768), not from the certificates themselves. + +== Prerequisites + +* **Java 21** or later (this example requires Java 21+ for BouncyCastle JSSE PQC support) +* Maven 3.9.9 or later +* GraalVM (for native mode only) + +== Start in Development Mode + +[source,shell] +---- +$ mvn clean compile quarkus:dev +---- + +The above command compiles the project, starts the application and lets the Quarkus tooling watch for changes in your workspace. Any modifications in your project will automatically take effect in the running application. + +TIP: Please refer to the Development mode section of https://camel.apache.org/camel-quarkus/latest/first-steps.html#_development_mode[Camel Quarkus User guide] for more details. + +The application starts on HTTPS port 8443 with mutual TLS (mTLS) enabled. + +Main endpoints: + +* `/pqc/secure` - Secure endpoint requiring client certificate +* `/pqc/info` - Information about PQC configuration + +=== Manual Testing + +Test the secure endpoint with curl (requires client certificate): + +[source,shell] +---- +$ curl --cert target/certs/client-keystore.p12:changeit \ + --cert-type P12 \ + -k \ + https://localhost:8443/pqc/secure + +✓ PQC TLS connection established! + +Your connection is quantum-safe using Java 21 with BouncyCastle JSSE provider. +This example demonstrates native PQC TLS support with hybrid cipher suites. + +TLS 1.3 with X25519MLKEM768 hybrid key exchange provides both: +- Classical security via X25519 elliptic-curve cryptography +- Quantum resistance via ML-KEM-768 (NIST FIPS 203) +---- + +Test the info endpoint: + +[source,shell] +---- +$ curl --cert target/certs/client-keystore.p12:changeit \ + --cert-type P12 \ + -k \ + https://localhost:8443/pqc/info + +Post-Quantum Cryptography Configuration +====================================== + +Java Version: 21.x.x +Provider: BouncyCastle JSSE +TLS Version: 1.3 +Hybrid Cipher Suite: X25519MLKEM768 +Classical Algorithm: X25519 +PQC Algorithm: ML-KEM-768 (NIST FIPS 203) + +This configuration provides protection against both classical and quantum attacks. +---- + +== Package and Run the Application + +Once you are done with developing you may want to package and run the application. + +TIP: Find more details about the JVM mode and Native mode in the Package and run section of https://camel.apache.org/camel-quarkus/latest/first-steps.html#_package_and_run_the_application[Camel Quarkus User guide] + +=== JVM Mode + +[source,shell] +---- +$ mvn clean package +$ java -jar target/quarkus-app/quarkus-run.jar +... +[io.quarkus] (main) camel-quarkus-examples-http-pqc-j21 started in 1.2s. Listening on: https://0.0.0.0:8443 +---- + +=== Native Mode + +IMPORTANT: Native mode requires having GraalVM and other tools installed. Please check the Prerequisites section of https://camel.apache.org/camel-quarkus/latest/first-steps.html#_prerequisites[Camel Quarkus User guide]. + +To prepare a native executable using GraalVM, run the following command: + +[source,shell] +---- +$ mvn clean package -Dnative +$ ./target/*-runner +... +[io.quarkus] (main) camel-quarkus-examples-http-pqc-j21 started in 0.012s. Listening on: https://0.0.0.0:8443 +... +---- + +== Testing + +Run the tests to verify PQC TLS functionality: + +[source,shell] +---- +$ mvn clean test +---- + +The test suite validates: + +* Certificates are generated automatically on startup +* `/pqc/secure` endpoint accepts requests with valid client certificates +* `/pqc/secure` endpoint rejects requests without client certificates +* `/pqc/info` endpoint provides PQC configuration information + +For native mode testing: + +[source,shell] +---- +$ mvn clean verify -Dnative +---- + +== Architecture + +=== TLS 1.3 Hybrid Key Exchange + +[source] +---- +Client Server + | | + | ClientHello (supported: X25519MLKEM768) | + |---------------------------------------------------------->| + | | + | ServerHello (chosen: X25519MLKEM768) | + |<----------------------------------------------------------| + | | + | Key Exchange: | + | - X25519: Classical ECDH key agreement | + | - ML-KEM-768: Post-quantum key encapsulation | + |<==========================================================>| + | | + | Both algorithms must succeed for connection to establish | + | | + | Encrypted Application Data (AES-256-GCM) | + |<==========================================================>| +---- + +The hybrid approach ensures: + +* **Backward compatibility**: If PQC is broken, X25519 still provides security +* **Future security**: If X25519 is broken by quantum computers, ML-KEM-768 provides protection +* **Defense in depth**: Attack must break BOTH algorithms simultaneously + +=== Comparison: Java 17 vs Java 21 Validation + +**Java 17 (Application-Level)**: +[source] +---- +TLS Handshake (Standard RSA) + ↓ +Custom X509TrustManager + ↓ +Application validates ML-DSA-65 signature manually + ↓ +Connection accepted/rejected +---- + +**Java 21 (Native TLS)**: +[source] +---- +TLS 1.3 Handshake with X25519MLKEM768 + ↓ +Both X25519 and ML-KEM-768 validated by TLS protocol + ↓ +Connection accepted/rejected +---- + +== Important Notes + +* **Java 21 Required**: This example requires Java 21+ for BouncyCastle JSSE PQC support. For Java 17, see the `http-pqc-j17` example. + +* **BouncyCastle JSSE**: Uses BouncyCastle as JSSE provider for PQC algorithms. This is a drop-in replacement for Java's default JSSE. + +* **Development Only**: Certificates are regenerated on every startup. For production, use persistent certificates from a trusted CA. + +* **NIST Standards**: ML-KEM-768 is standardized in NIST FIPS 203 (August 2024). This is production-ready cryptography. + +* **Hybrid Approach**: X25519MLKEM768 combines classical and PQC algorithms for defense-in-depth security. + +== Migration Path + +If you're currently using the Java 17 example (`http-pqc-j17`): + +1. **Upgrade to Java 21** +2. **Switch to this example** - much simpler implementation +3. **Remove custom trust managers** - no longer needed +4. **Use standard TLS 1.3 configuration** - PQC is built into the protocol +5. **Enjoy native PQC support** - less code, better security + +The Java 21 approach is significantly simpler and provides better integration with the TLS protocol. + +== Additional Resources + +* https://csrc.nist.gov/pubs/fips/203/final[NIST FIPS 203 - ML-KEM Standard] +* https://www.bouncycastle.org/java.html[BouncyCastle JSSE Provider Documentation] +* https://datatracker.ietf.org/doc/draft-connolly-tls-mlkem-key-agreement/[IETF Draft - ML-KEM in TLS 1.3] +* https://github.com/oscerd/camel-pqc-tls[Reference Implementation - Camel PQC TLS Examples] + +== Feedback and Contributions + +For issues or contributions, please submit to the https://github.com/apache/camel-quarkus-examples[Camel Quarkus Examples] repository. diff --git a/http-pqc-j21/eclipse-formatter-config.xml b/http-pqc-j21/eclipse-formatter-config.xml new file mode 100644 index 00000000..2248b2b8 --- /dev/null +++ b/http-pqc-j21/eclipse-formatter-config.xml @@ -0,0 +1,276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/http-pqc-j21/pom.xml b/http-pqc-j21/pom.xml new file mode 100644 index 00000000..86f8e6db --- /dev/null +++ b/http-pqc-j21/pom.xml @@ -0,0 +1,308 @@ + + + + 4.0.0 + + camel-quarkus-examples-http-pqc-j21 + org.apache.camel.quarkus.examples + 3.36.0-SNAPSHOT + + Camel Quarkus :: Examples :: HTTP PQC Java 21 + Camel Quarkus Example :: HTTP with Post-Quantum Cryptography on Java 21 + + + 3.35.1 + 3.36.0-SNAPSHOT + + io.quarkus + quarkus-bom + org.apache.camel.quarkus + camel-quarkus-bom + + UTF-8 + UTF-8 + 21 + + 2.29.0 + 1.13.0 + 5.0.0 + 3.15.0 + 3.5.0 + 3.3.1 + 3.5.5 + + + + + + + ${quarkus.platform.group-id} + ${quarkus.platform.artifact-id} + ${quarkus.platform.version} + pom + import + + + ${camel-quarkus.platform.group-id} + ${camel-quarkus.platform.artifact-id} + ${camel-quarkus.platform.version} + pom + import + + + + + + + org.apache.camel.quarkus + camel-quarkus-log + + + org.apache.camel.quarkus + camel-quarkus-platform-http + + + org.apache.camel.quarkus + camel-quarkus-support-bouncycastle + + + org.bouncycastle + bctls-jdk18on + 1.84 + + + org.apache.camel.quarkus + camel-quarkus-microprofile-health + + + + + io.quarkus + quarkus-junit5 + test + + + io.rest-assured + rest-assured + test + + + org.awaitility + awaitility + test + + + + + + + + + net.revelc.code.formatter + formatter-maven-plugin + ${formatter-maven-plugin.version} + + ${maven.multiModuleProjectDirectory}/eclipse-formatter-config.xml + LF + + + + + net.revelc.code + impsort-maven-plugin + ${impsort-maven-plugin.version} + + java.,javax.,org.w3c.,org.xml.,junit. + true + true + java.,javax.,org.w3c.,org.xml.,junit. + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + true + true + + -Xlint:unchecked + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + false + + org.jboss.logmanager.LogManager + + + + + + ${quarkus.platform.group-id} + quarkus-maven-plugin + ${quarkus.platform.version} + true + + + + org.apache.maven.plugins + maven-failsafe-plugin + ${maven-surefire-plugin.version} + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + com.mycila + license-maven-plugin + ${license-maven-plugin.version} + + true +
${maven.multiModuleProjectDirectory}/header.txt
+ + **/*.adoc + **/*.txt + **/LICENSE.txt + **/LICENSE + **/NOTICE.txt + **/NOTICE + **/README + **/pom.xml.versionsBackup + **/quarkus.log* + **/*.p12 + + + SLASHSTAR_STYLE + CAMEL_PROPERTIES_STYLE + SLASHSTAR_STYLE + + + ${maven.multiModuleProjectDirectory}/license-properties-headerdefinition.xml + +
+
+
+
+ + + + ${quarkus.platform.group-id} + quarkus-maven-plugin + + + build + + build + + + + + + + net.revelc.code.formatter + formatter-maven-plugin + + + format + + format + + process-sources + + + + + + net.revelc.code + impsort-maven-plugin + + + sort-imports + + sort + + process-sources + + + + + + com.mycila + license-maven-plugin + + + license-format + + format + + process-sources + + + + +
+ + + + native + + + native + + + + true + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + + integration-test + verify + + + + ${quarkus.native.enabled} + + + + + + + + + + +
diff --git a/http-pqc-j21/src/main/java/org/acme/http/pqc/CertificateGenerator.java b/http-pqc-j21/src/main/java/org/acme/http/pqc/CertificateGenerator.java new file mode 100644 index 00000000..3986d2d6 --- /dev/null +++ b/http-pqc-j21/src/main/java/org/acme/http/pqc/CertificateGenerator.java @@ -0,0 +1,134 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.acme.http.pqc; + +import java.io.FileOutputStream; +import java.math.BigInteger; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.KeyStore; +import java.security.SecureRandom; +import java.security.cert.Certificate; +import java.security.cert.X509Certificate; +import java.util.Date; + +import io.quarkus.runtime.Startup; +import jakarta.enterprise.context.ApplicationScoped; +import org.bouncycastle.asn1.x500.X500Name; +import org.bouncycastle.asn1.x509.BasicConstraints; +import org.bouncycastle.asn1.x509.Extension; +import org.bouncycastle.cert.X509v3CertificateBuilder; +import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; +import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder; +import org.bouncycastle.operator.ContentSigner; +import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; +import org.jboss.logging.Logger; + +@ApplicationScoped +@Startup +public class CertificateGenerator { + + private static final Logger LOG = Logger.getLogger(CertificateGenerator.class); + private static final String KEYSTORE_PASSWORD = "changeit"; + private static final String CERT_DIR = "target/certs"; + + public CertificateGenerator() { + try { + generateCertificates(); + } catch (Exception e) { + throw new RuntimeException("Failed to generate PQC certificates", e); + } + } + + private void generateCertificates() throws Exception { + Path certDir = Paths.get(CERT_DIR); + Files.createDirectories(certDir); + + LOG.info("Generating PQC-ready certificates for Java 21..."); + + KeyPair serverKeyPair = generateKeyPair(); + X509Certificate serverCert = generateCertificate(serverKeyPair, "CN=localhost,O=Camel Quarkus,C=US", true); + + KeyPair clientKeyPair = generateKeyPair(); + X509Certificate clientCert = generateCertificate(clientKeyPair, "CN=client,O=Camel Quarkus,C=US", false); + + saveKeyStore(certDir.resolve("server-keystore.p12"), serverKeyPair, serverCert); + saveKeyStore(certDir.resolve("client-keystore.p12"), clientKeyPair, clientCert); + + saveTrustStore(certDir.resolve("server-truststore.p12"), clientCert); + saveTrustStore(certDir.resolve("client-truststore.p12"), serverCert); + + LOG.info("PQC certificates generated successfully in " + CERT_DIR); + } + + private KeyPair generateKeyPair() throws Exception { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC"); + keyPairGenerator.initialize(2048, new SecureRandom()); + return keyPairGenerator.generateKeyPair(); + } + + private X509Certificate generateCertificate(KeyPair keyPair, String dn, boolean isCA) throws Exception { + long now = System.currentTimeMillis(); + Date notBefore = new Date(now); + Date notAfter = new Date(now + 365L * 24 * 60 * 60 * 1000); + + X500Name dnName = new X500Name(dn); + BigInteger serial = BigInteger.valueOf(now); + + X509v3CertificateBuilder certBuilder = new JcaX509v3CertificateBuilder( + dnName, + serial, + notBefore, + notAfter, + dnName, + keyPair.getPublic()); + + certBuilder.addExtension(Extension.basicConstraints, true, new BasicConstraints(isCA)); + + ContentSigner signer = new JcaContentSignerBuilder("SHA256WithRSA") + .setProvider("BC") + .build(keyPair.getPrivate()); + + return new JcaX509CertificateConverter() + .setProvider("BC") + .getCertificate(certBuilder.build(signer)); + } + + private void saveKeyStore(Path path, KeyPair keyPair, X509Certificate cert) throws Exception { + KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC"); + keyStore.load(null, null); + keyStore.setKeyEntry("key", keyPair.getPrivate(), KEYSTORE_PASSWORD.toCharArray(), + new Certificate[] { cert }); + + try (FileOutputStream fos = new FileOutputStream(path.toFile())) { + keyStore.store(fos, KEYSTORE_PASSWORD.toCharArray()); + } + } + + private void saveTrustStore(Path path, X509Certificate cert) throws Exception { + KeyStore trustStore = KeyStore.getInstance("PKCS12", "BC"); + trustStore.load(null, null); + trustStore.setCertificateEntry("cert", cert); + + try (FileOutputStream fos = new FileOutputStream(path.toFile())) { + trustStore.store(fos, KEYSTORE_PASSWORD.toCharArray()); + } + } +} diff --git a/http-pqc-j21/src/main/java/org/acme/http/pqc/PqcCamelRoute.java b/http-pqc-j21/src/main/java/org/acme/http/pqc/PqcCamelRoute.java new file mode 100644 index 00000000..e5fb7674 --- /dev/null +++ b/http-pqc-j21/src/main/java/org/acme/http/pqc/PqcCamelRoute.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.acme.http.pqc; + +import jakarta.enterprise.context.ApplicationScoped; +import org.apache.camel.builder.endpoint.EndpointRouteBuilder; + +@ApplicationScoped +public class PqcCamelRoute extends EndpointRouteBuilder { + + @Override + public void configure() throws Exception { + from(platformHttp("/pqc/secure")) + .routeId("pqc-secure-route") + .log("Processing request with PQC-enabled TLS connection") + .setBody(constant( + "✓ PQC TLS connection established!\n\n" + + "Your connection is quantum-safe using Java 21 with BouncyCastle JSSE provider.\n" + + "This example demonstrates native PQC TLS support with hybrid cipher suites.\n\n" + + "TLS 1.3 with X25519MLKEM768 hybrid key exchange provides both:\n" + + "- Classical security via X25519 elliptic-curve cryptography\n" + + "- Quantum resistance via ML-KEM-768 (NIST FIPS 203)\n")) + .to(log("pqc-secure").showExchangePattern(false).showBodyType(false)); + + from(platformHttp("/pqc/info")) + .routeId("pqc-info-route") + .log("Providing PQC configuration information") + .process(exchange -> { + String info = String.format( + "Post-Quantum Cryptography Configuration\n" + + "======================================\n\n" + + "Java Version: %s\n" + + "Provider: BouncyCastle JSSE\n" + + "TLS Version: 1.3\n" + + "Hybrid Cipher Suite: X25519MLKEM768\n" + + "Classical Algorithm: X25519\n" + + "PQC Algorithm: ML-KEM-768 (NIST FIPS 203)\n\n" + + "This configuration provides protection against both classical and quantum attacks.", + System.getProperty("java.version")); + exchange.getMessage().setBody(info); + }) + .to(log("pqc-info").showExchangePattern(false).showBodyType(false)); + } +} diff --git a/http-pqc-j21/src/main/java/org/acme/http/pqc/SecurityConfiguration.java b/http-pqc-j21/src/main/java/org/acme/http/pqc/SecurityConfiguration.java new file mode 100644 index 00000000..4fb4a71d --- /dev/null +++ b/http-pqc-j21/src/main/java/org/acme/http/pqc/SecurityConfiguration.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.acme.http.pqc; + +import java.security.Security; + +import io.quarkus.runtime.Startup; +import jakarta.enterprise.context.ApplicationScoped; +import org.bouncycastle.jsse.provider.BouncyCastleJsseProvider; + +@ApplicationScoped +@Startup +public class SecurityConfiguration { + + public SecurityConfiguration() { + Security.insertProviderAt(new BouncyCastleJsseProvider(), 1); + } +} diff --git a/http-pqc-j21/src/main/resources/application.properties b/http-pqc-j21/src/main/resources/application.properties new file mode 100644 index 00000000..330e2567 --- /dev/null +++ b/http-pqc-j21/src/main/resources/application.properties @@ -0,0 +1,53 @@ +## --------------------------------------------------------------------------- +## Licensed to the Apache Software Foundation (ASF) under one or more +## contributor license agreements. See the NOTICE file distributed with +## this work for additional information regarding copyright ownership. +## The ASF licenses this file to You under the Apache License, Version 2.0 +## (the "License"); you may not use this file except in compliance with +## the License. You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## --------------------------------------------------------------------------- +# +# Quarkus +# +quarkus.banner.enabled = false +quarkus.log.file.enabled = true + +# HTTPS Configuration with PQC Support (Java 21 + BouncyCastle JSSE) +quarkus.http.ssl-port = 8443 +quarkus.http.insecure-requests = disabled + +# Server keystore +quarkus.http.ssl.certificate.key-store-file = target/certs/server-keystore.p12 +quarkus.http.ssl.certificate.key-store-password = changeit +quarkus.http.ssl.certificate.key-store-file-type = PKCS12 + +# Require client certificates +quarkus.http.ssl.client-auth = required + +# Truststore for client certificate validation +quarkus.http.ssl.certificate.trust-store-file = target/certs/server-truststore.p12 +quarkus.http.ssl.certificate.trust-store-password = changeit +quarkus.http.ssl.certificate.trust-store-file-type = PKCS12 + +# TLS 1.3 with PQC hybrid cipher suites +# X25519MLKEM768 combines classical X25519 with quantum-resistant ML-KEM-768 +quarkus.http.ssl.protocols = TLSv1.3 +quarkus.http.ssl.cipher-suites = TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256 + +# +# Quarkus - Camel +# +quarkus.camel.health.enabled = true + +# +# Camel +# +camel.context.name = quarkus-camel-example-http-pqc-j21 diff --git a/http-pqc-j21/src/test/java/org/acme/http/pqc/HttpPqcIT.java b/http-pqc-j21/src/test/java/org/acme/http/pqc/HttpPqcIT.java new file mode 100644 index 00000000..2eb54b9e --- /dev/null +++ b/http-pqc-j21/src/test/java/org/acme/http/pqc/HttpPqcIT.java @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.acme.http.pqc; + +import io.quarkus.test.junit.QuarkusIntegrationTest; + +@QuarkusIntegrationTest +class HttpPqcIT extends HttpPqcTest { +} diff --git a/http-pqc-j21/src/test/java/org/acme/http/pqc/HttpPqcTest.java b/http-pqc-j21/src/test/java/org/acme/http/pqc/HttpPqcTest.java new file mode 100644 index 00000000..21dc52b5 --- /dev/null +++ b/http-pqc-j21/src/test/java/org/acme/http/pqc/HttpPqcTest.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.acme.http.pqc; + +import java.io.File; + +import io.quarkus.test.junit.QuarkusTest; +import io.restassured.RestAssured; +import org.junit.jupiter.api.Test; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@QuarkusTest +class HttpPqcTest { + + @Test + void testCertificatesGenerated() { + File serverKeystore = new File("target/certs/server-keystore.p12"); + File clientKeystore = new File("target/certs/client-keystore.p12"); + File serverTruststore = new File("target/certs/server-truststore.p12"); + File clientTruststore = new File("target/certs/client-truststore.p12"); + + assertTrue(serverKeystore.exists(), "Server keystore should be generated"); + assertTrue(clientKeystore.exists(), "Client keystore should be generated"); + assertTrue(serverTruststore.exists(), "Server truststore should be generated"); + assertTrue(clientTruststore.exists(), "Client truststore should be generated"); + } + + @Test + void testPqcSecureEndpoint() { + RestAssured.keyStore("target/certs/client-keystore.p12", "changeit"); + RestAssured.trustStore("target/certs/client-truststore.p12", "changeit"); + + given() + .when() + .get("/pqc/secure") + .then() + .statusCode(200) + .body(containsString("PQC TLS connection established")) + .body(containsString("quantum-safe")) + .body(containsString("ML-KEM-768")); + } + + @Test + void testPqcInfoEndpoint() { + RestAssured.keyStore("target/certs/client-keystore.p12", "changeit"); + RestAssured.trustStore("target/certs/client-truststore.p12", "changeit"); + + given() + .when() + .get("/pqc/info") + .then() + .statusCode(200) + .body(containsString("Post-Quantum Cryptography Configuration")) + .body(containsString("BouncyCastle JSSE")) + .body(containsString("ML-KEM-768")) + .body(containsString("X25519MLKEM768")); + } +}