Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ bld/
[Bb]in/
[Oo]bj/
[Ll]og/
out/

# Visual Studio 2015 cache/options directory
.vs/
Expand Down
90 changes: 71 additions & 19 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ if(POLICY CMP0135) # DOWNLOAD_EXTRACT_TIMESTAMP
cmake_policy(SET CMP0135 NEW)
endif()

set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "d0edc3af-4c50-42ea-a356-e2862fe7a444")

# HUNTER_ENABLED is always set if this package is included in a project using hunter (HunterGate sets it) In this case
# we will use hunter as well to stay consistent. If not the use can supply it on configure to force using hunter.
if(HUNTER_ENABLED)
Expand All @@ -20,6 +22,8 @@ option(JWT_BUILD_TESTS "Configure CMake to build tests (or not)" OFF)
option(JWT_BUILD_DOCS "Adds a target for building the doxygen documentation" OFF)
option(JWT_ENABLE_COVERAGE "Enable code coverage testing" OFF)
option(JWT_ENABLE_FUZZING "Enable fuzz testing" OFF)
option(JWT_ENABLE_MODULES "Build C++ modules" OFF)
option(JWT_USE_IMPORT_STD "Use import std" OFF)

option(JWT_DISABLE_PICOJSON "Do not provide the picojson template specialiaze" OFF)
option(JWT_DISABLE_BASE64 "Do not include the base64 implementation from this library" OFF)
Expand Down Expand Up @@ -89,50 +93,94 @@ endif()

set(JWT_INCLUDE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/include)
set(JWT_HEADER_FILES ${JWT_INCLUDE_PATH}/jwt-cpp/jwt.h)
set(JWT_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/modules)
foreach(traits ${JWT_JSON_TRAITS_OPTIONS})
list(APPEND JWT_HEADER_FILES ${JWT_INCLUDE_PATH}/jwt-cpp/traits/${traits}/defaults.h
${JWT_INCLUDE_PATH}/jwt-cpp/traits/${traits}/traits.h)
endforeach()

if(NOT JWT_DISABLE_BASE64)
list(APPEND JWT_HEADER_FILES ${JWT_INCLUDE_PATH}/jwt-cpp/base.h)
list(APPEND JWT_HEADER_FILES ${JWT_INCLUDE_PATH}/jwt-cpp/base.h)
endif()

add_library(jwt-cpp INTERFACE)
if (JWT_ENABLE_MODULES)
add_library(jwt-cpp STATIC)
set(JWT_LIBRARY_TYPE PUBLIC)
else()
add_library(jwt-cpp INTERFACE)
set(JWT_LIBRARY_TYPE INTERFACE)
endif()
add_library(jwt-cpp::jwt-cpp ALIAS jwt-cpp) # To match export
target_compile_features(jwt-cpp INTERFACE cxx_std_11)

if (JWT_ENABLE_MODULES)
if(CMAKE_VERSION VERSION_LESS "4.0")
message(FATAL_ERROR "CMake >= 4.0 is required to build with modules")
endif()

set(CMAKE_CXX_SCAN_FOR_MODULES ON)

if(JWT_USE_IMPORT_STD)
target_compile_features(jwt-cpp ${JWT_LIBRARY_TYPE} cxx_std_23)
if (NOT CMAKE_GENERATOR MATCHES "Visual Studio")
set(CMAKE_CXX_MODULE_STD 1)
endif()
else()
target_compile_features(jwt-cpp ${JWT_LIBRARY_TYPE} cxx_std_20)
endif()

target_sources(jwt-cpp
PUBLIC
FILE_SET cxx_modules TYPE CXX_MODULES
BASE_DIRS ${JWT_MODULE_PATH}
FILES ${JWT_MODULE_PATH}/jwt.ixx
)
else()
target_compile_features(jwt-cpp ${JWT_LIBRARY_TYPE} cxx_std_11)
endif()

if (JWT_USE_IMPORT_STD)
target_compile_definitions(jwt-cpp ${JWT_LIBRARY_TYPE} JWT_USE_IMPORT_STD)
endif()

if(JWT_DISABLE_BASE64)
target_compile_definitions(jwt-cpp INTERFACE JWT_DISABLE_BASE64)
target_compile_definitions(jwt-cpp ${JWT_LIBRARY_TYPE} JWT_DISABLE_BASE64)
endif()
if(JWT_DISABLE_PICOJSON)
target_compile_definitions(jwt-cpp INTERFACE JWT_DISABLE_PICOJSON)
target_compile_definitions(jwt-cpp ${JWT_LIBRARY_TYPE} JWT_DISABLE_PICOJSON)
endif()


source_group(
TREE "${JWT_INCLUDE_PATH}"
PREFIX "Implementation files"
FILES ${JWT_HEADER_FILES}
)

include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
target_include_directories(jwt-cpp INTERFACE $<BUILD_INTERFACE:${JWT_INCLUDE_PATH}>
target_include_directories(jwt-cpp ${JWT_LIBRARY_TYPE} $<BUILD_INTERFACE:${JWT_INCLUDE_PATH}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)

if(${JWT_SSL_LIBRARY} MATCHES "OpenSSL")
target_link_libraries(jwt-cpp INTERFACE OpenSSL::SSL OpenSSL::Crypto)
target_link_libraries(jwt-cpp ${JWT_LIBRARY_TYPE} OpenSSL::SSL OpenSSL::Crypto)
endif()

if(${JWT_SSL_LIBRARY} MATCHES "LibreSSL")
target_link_libraries(jwt-cpp INTERFACE LibreSSL::TLS)
target_link_libraries(jwt-cpp ${JWT_LIBRARY_TYPE} LibreSSL::TLS)
endif()

if(${JWT_SSL_LIBRARY} MATCHES "wolfSSL")
target_link_libraries(jwt-cpp INTERFACE PkgConfig::wolfssl)
target_link_libraries(jwt-cpp ${JWT_LIBRARY_TYPE} PkgConfig::wolfssl)
# This is required to access OpenSSL compatibility API
target_include_directories(jwt-cpp INTERFACE ${wolfssl_INCLUDE_DIRS})
target_include_directories(jwt-cpp ${JWT_LIBRARY_TYPE} ${wolfssl_INCLUDE_DIRS})
# This flag is required to have the mandatory header included automatically
# https://github.com/Thalhammer/jwt-cpp/pull/352#discussion_r1627971786
# https://github.com/wolfSSL/wolfssl/blob/3b74a6402998a8b8839e25e31ba8ac74749aa9b0/wolfssl/wolfcrypt/settings.h#L58
target_compile_definitions(jwt-cpp INTERFACE EXTERNAL_OPTS_OPENVPN)
target_compile_definitions(jwt-cpp ${JWT_LIBRARY_TYPE} EXTERNAL_OPTS_OPENVPN)
endif()

if(NOT JWT_DISABLE_PICOJSON AND JWT_EXTERNAL_PICOJSON)
target_link_libraries(jwt-cpp INTERFACE picojson::picojson)
target_link_libraries(jwt-cpp ${JWT_LIBRARY_TYPE} picojson::picojson)
endif()

# Hunter needs relative paths so the files are placed correctly
Expand All @@ -143,18 +191,22 @@ endif()
configure_package_config_file(
${CMAKE_CURRENT_LIST_DIR}/cmake/jwt-cpp-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/jwt-cpp-config.cmake
INSTALL_DESTINATION ${JWT_CMAKE_FILES_INSTALL_DIR})
write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/jwt-cpp-config-version.cmake VERSION 0.7.1
COMPATIBILITY ExactVersion)

install(TARGETS jwt-cpp EXPORT jwt-cpp-targets PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/jwt-cpp-config-version.cmake VERSION 0.7.1 COMPATIBILITY ExactVersion)
if (JWT_ENABLE_MODULES)
install(TARGETS jwt-cpp EXPORT jwt-cpp-targets
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILE_SET cxx_modules DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/modules)
else()
install(TARGETS jwt-cpp EXPORT jwt-cpp-targets
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
endif()
install(EXPORT jwt-cpp-targets NAMESPACE jwt-cpp:: FILE jwt-cpp-targets.cmake
DESTINATION ${JWT_CMAKE_FILES_INSTALL_DIR})
install(DIRECTORY ${JWT_INCLUDE_PATH}/jwt-cpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
if(NOT JWT_EXTERNAL_PICOJSON AND NOT JWT_DISABLE_PICOJSON)
install(FILES ${JWT_INCLUDE_PATH}/picojson/picojson.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/picojson)
endif()
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/jwt-cpp-config.cmake ${CMAKE_CURRENT_BINARY_DIR}/jwt-cpp-config-version.cmake
DESTINATION ${JWT_CMAKE_FILES_INSTALL_DIR})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/jwt-cpp-config.cmake ${CMAKE_CURRENT_BINARY_DIR}/jwt-cpp-config-version.cmake DESTINATION ${JWT_CMAKE_FILES_INSTALL_DIR})

if(JWT_BUILD_EXAMPLES)
add_subdirectory(example)
Expand All @@ -171,4 +223,4 @@ endif()

if(JWT_BUILD_DOCS)
add_subdirectory(docs)
endif()
endif()
20 changes: 19 additions & 1 deletion example/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.8)
cmake_minimum_required(VERSION 3.15)
project(jwt-cpp-examples)

if(NOT TARGET jwt-cpp)
Expand All @@ -14,25 +14,43 @@ endif()
add_executable(print-claims print-claims.cpp)
target_link_libraries(print-claims jwt-cpp::jwt-cpp)
add_custom_target(print-claims-run COMMAND print-claims)
if (JWT_ENABLE_MODULES)
target_compile_definitions(print-claims PRIVATE JWT_ENABLE_MODULES)
endif()

add_executable(private-claims private-claims.cpp)
target_link_libraries(private-claims jwt-cpp::jwt-cpp)
add_custom_target(private-claims-run COMMAND private-claims)
if (JWT_ENABLE_MODULES)
target_compile_definitions(private-claims PRIVATE JWT_ENABLE_MODULES)
endif()

add_executable(rsa-create rsa-create.cpp)
target_link_libraries(rsa-create jwt-cpp::jwt-cpp)
add_custom_target(rsa-create-run COMMAND rsa-create)
if (JWT_ENABLE_MODULES)
target_compile_definitions(rsa-create PRIVATE JWT_ENABLE_MODULES)
endif()

add_executable(rsa-verify rsa-verify.cpp)
target_link_libraries(rsa-verify jwt-cpp::jwt-cpp)
add_custom_target(rsa-verify-run COMMAND rsa-verify)
if (JWT_ENABLE_MODULES)
target_compile_definitions(rsa-verify PRIVATE JWT_ENABLE_MODULES)
endif()

add_executable(jwks-verify jwks-verify.cpp)
target_link_libraries(jwks-verify jwt-cpp::jwt-cpp)
add_custom_target(jwks-verify-run COMMAND jwks-verify)
if (JWT_ENABLE_MODULES)
target_compile_definitions(jwks-verify PRIVATE JWT_ENABLE_MODULES)
endif()

add_executable(es256k es256k.cpp)
target_link_libraries(es256k jwt-cpp::jwt-cpp)
if (JWT_ENABLE_MODULES)
target_compile_definitions(es256k PRIVATE JWT_ENABLE_MODULES)
endif()

add_executable(partial-claim-verifier partial-claim-verifier.cpp)
target_link_libraries(partial-claim-verifier jwt-cpp::jwt-cpp nlohmann_json::nlohmann_json)
6 changes: 6 additions & 0 deletions example/es256k.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
/// @file es256k.cpp
#include <iostream>
#include <chrono>

#ifndef JWT_ENABLE_MODULES
#include <jwt-cpp/jwt.h>
#else
import jwt_cpp;
#endif

int main() {
// openssl ecparam -name secp256k1 -genkey -noout -out ec-secp256k1-priv-key.pem
Expand Down
6 changes: 6 additions & 0 deletions example/jwks-verify.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,13 @@
* and using the corresponding x5c from the JWK to verify the token
*/
#include <iostream>
#include <chrono>

#ifndef JWT_ENABLE_MODULES
#include <jwt-cpp/jwt.h>
#else
import jwt_cpp;
#endif
#include <openssl/rand.h>

int main() {
Expand Down
5 changes: 5 additions & 0 deletions example/print-claims.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
/// @file print-claims.cpp
#include <iostream>

#ifndef JWT_ENABLE_MODULES
#include <jwt-cpp/jwt.h>
#else
import jwt_cpp;
#endif

int main() {
const std::string token =
Expand Down
9 changes: 7 additions & 2 deletions example/private-claims.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
/// @file private-claims.cpp
#include <jwt-cpp/jwt.h>

#include <iostream>
#include <sstream>
#include <chrono>

#ifndef JWT_ENABLE_MODULES
#include <jwt-cpp/jwt.h>
#else
import jwt_cpp;
#endif

using sec = std::chrono::seconds;
using min = std::chrono::minutes;
Expand Down
6 changes: 6 additions & 0 deletions example/rsa-create.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
/// @file rsa-create.cpp
#include <iostream>
#include <chrono>

#ifndef JWT_ENABLE_MODULES
#include <jwt-cpp/jwt.h>
#else
import jwt_cpp;
#endif

int main() {
std::string const rsa_priv_key = R"(-----BEGIN PRIVATE KEY-----
Expand Down
6 changes: 6 additions & 0 deletions example/rsa-verify.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
/// \file rsa-verify.cpp
#include <iostream>
#include <chrono>

#ifndef JWT_ENABLE_MODULES
#include <jwt-cpp/jwt.h>
#else
import jwt_cpp;
#endif

int main() {
const std::string rsa_pub_key = R"(-----BEGIN PUBLIC KEY-----
Expand Down
4 changes: 4 additions & 0 deletions include/jwt-cpp/base.h
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
#ifndef JWT_CPP_BASE_H
#define JWT_CPP_BASE_H

#ifdef JWT_USE_IMPORT_STD
import std;
#else
#include <algorithm>
#include <array>
#include <cstdint>
#include <stdexcept>
#include <string>
#include <vector>
#endif

#ifdef __has_cpp_attribute
#if __has_cpp_attribute(fallthrough)
Expand Down
5 changes: 5 additions & 0 deletions include/jwt-cpp/jwt.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
#include <openssl/rsa.h>
#include <openssl/ssl.h>

#ifdef JWT_USE_IMPORT_STD
import std;
#else
#include <algorithm>
#include <chrono>
#include <climits>
Expand All @@ -45,6 +48,8 @@
#endif
#endif

#endif

#if OPENSSL_VERSION_NUMBER >= 0x30000000L // 3.0.0
#define JWT_OPENSSL_3_0
#include <openssl/param_build.h>
Expand Down
Loading