Skip to content

Commit 57a38d0

Browse files
committed
passphrase: generate a crypto key when OIDCCryptoPassphrase is not set
Signed-off-by: Hans Zandbelt <[email protected]>
1 parent fe64efa commit 57a38d0

File tree

10 files changed

+60
-67
lines changed

10 files changed

+60
-67
lines changed

ChangeLog

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
11/18/2025
22
- id_token: add "off" option to OIDCPassIDTokenAs so no claims from the ID token will be passed on
3+
- passphrase: generate a crypto key when OIDCCryptoPassphrase is not set
34

45
11/17/2025
56
- metadata: avoid double-free when validation of provider metadata fails

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ How to Use It
4141

4242
1. install and load `mod_auth_openidc.so` in your Apache server
4343
1. set `OIDCRedirectURI` to a "vanity" URL within a location that is protected by mod_auth_openidc
44-
1. configure a random password in `OIDCCryptoPassphrase` for session/state encryption purposes
44+
4545
1. configure `OIDCProviderMetadataURL` so it points to the Discovery metadata of your OpenID Connect Provider served on the `.well-known/openid-configuration` endpoint
4646
1. register/generate a Client identifier and a secret with the OpenID Connect Provider and configure those in `OIDCClientID` and `OIDCClientSecret` respectively
4747
1. register the `OIDCRedirectURI` configured above as the Redirect or Callback URI for your client at the Provider
@@ -53,7 +53,6 @@ LoadModule auth_openidc_module modules/mod_auth_openidc.so
5353
5454
# OIDCRedirectURI is a vanity URL that must point to a path protected by this module but must NOT point to any content
5555
OIDCRedirectURI https://<hostname>/secure/redirect_uri
56-
OIDCCryptoPassphrase <password>
5756
5857
OIDCProviderMetadataURL <issuer>/.well-known/openid-configuration
5958
OIDCClientID <client_id>

auth_openidc.conf

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# support multiple vhosts that belong to the same security domain in a dynamic way
1313
#OIDCRedirectURI https://www.example.com/protected/redirect_uri
1414

15-
# (Mandatory)
15+
# (Optional, but required if sessions need to be preserved across server restarts or shared across a cluster)
1616
# Set a password for crypto purposes, this is used for:
1717
# - encryption of the (temporary) state cookie
1818
# - encryption of cache entries, that may include the session cookie, see: OIDCCacheEncrypt and OIDCSessionType
@@ -27,6 +27,7 @@
2727
# will be used for encryption of new values (including a "kid" in the JWEs during the time 2 values are defined),
2828
# both values will be used for verification (leveraging the "kid" if present); for seamless rollover one should
2929
# (at minimum) wait for OIDCSessionInActivityTimeout seconds before removing the 2nd (i.e. old) passprase again.
30+
# When not specified, a random passphrase will be generated at server start time.
3031
#OIDCCryptoPassphrase [ <passphrase> | "exec:/path/to/otherProgram arg1" ] [ <previous-passphrase> | "exec:/path/to/otherProgram arg2" ]
3132

3233
#

src/cache/common.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ static inline apr_byte_t oidc_cache_crypto_encrypt(request_rec *r, const char *p
248248
/*
249249
* AES GCM decrypt using the crypto passphrase as symmetric key
250250
*/
251-
static inline apr_byte_t oidc_cache_crypto_decrypt(request_rec *r, const char *cache_value, char *secret,
251+
static inline apr_byte_t oidc_cache_crypto_decrypt(request_rec *r, const char *cache_value, const char *secret,
252252
char **plaintext) {
253253
oidc_crypto_passphrase_t passphrase;
254254
passphrase.secret1 = secret;
@@ -309,12 +309,12 @@ apr_byte_t oidc_cache_get(request_rec *r, const char *section, const char *key,
309309
char *msg = NULL;
310310
const char *s_key = NULL;
311311
char *cache_value = NULL;
312-
char *s_secret = NULL;
312+
const char *s_secret = NULL;
313313
const char *s_section = oidc_cache_section_get(r, section);
314314

315315
oidc_debug(r, "enter: %s (section=%s, decrypt=%d, type=%s)", key, s_section, encrypted, cfg->cache.impl->name);
316316

317-
s_secret = cfg->crypto_passphrase.secret1;
317+
s_secret = oidc_cfg_crypto_passphrase_secret1_get(cfg, r);
318318
if (oidc_cache_get_key(r, key, s_secret, encrypted, &s_key) == FALSE)
319319
goto end;
320320

@@ -325,9 +325,9 @@ apr_byte_t oidc_cache_get(request_rec *r, const char *section, const char *key,
325325
goto end;
326326

327327
/* see if it is any good */
328-
if ((cache_value == NULL) && (encrypted == 1) && (cfg->crypto_passphrase.secret2 != NULL)) {
328+
if ((cache_value == NULL) && (encrypted == 1) && (oidc_cfg_crypto_passphrase_secret2_get(cfg) != NULL)) {
329329
oidc_debug(r, "2nd try with previous passphrase");
330-
s_secret = cfg->crypto_passphrase.secret2;
330+
s_secret = oidc_cfg_crypto_passphrase_secret2_get(cfg);
331331
if (oidc_cache_get_key(r, key, s_secret, encrypted, &s_key) == FALSE)
332332
goto end;
333333
if (cfg->cache.impl->get(r, s_section, s_key, &cache_value) == FALSE)
@@ -385,12 +385,12 @@ apr_byte_t oidc_cache_set(request_rec *r, const char *section, const char *key,
385385
value ? (int)_oidc_strlen(value) : 0, encrypted, apr_time_sec(expiry - apr_time_now()),
386386
cfg->cache.impl->name);
387387

388-
if (oidc_cache_get_key(r, key, cfg->crypto_passphrase.secret1, encrypted, &s_key) == FALSE)
388+
if (oidc_cache_get_key(r, key, oidc_cfg_crypto_passphrase_secret1_get(cfg, r), encrypted, &s_key) == FALSE)
389389
goto end;
390390

391391
/* see if we need to encrypt */
392392
if ((encrypted == 1) && (value != NULL)) {
393-
if (oidc_cache_crypto_encrypt(r, value, &cfg->crypto_passphrase, &encoded) == FALSE)
393+
if (oidc_cache_crypto_encrypt(r, value, oidc_cfg_crypto_passphrase_get(cfg, r), &encoded) == FALSE)
394394
goto end;
395395
value = encoded;
396396
}

src/cfg/cfg.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,20 +102,28 @@ const char *oidc_cmd_crypto_passphrase_set(cmd_parms *cmd, void *struct_ptr, con
102102
oidc_cfg_t *cfg = (oidc_cfg_t *)ap_get_module_config(cmd->server->module_config, &auth_openidc_module);
103103
const char *rv = NULL;
104104
if (arg1)
105-
rv = oidc_cfg_parse_passphrase(cmd->pool, arg1, &cfg->crypto_passphrase.secret1);
105+
rv = oidc_cfg_parse_passphrase(cmd->pool, arg1, (char **)&cfg->crypto_passphrase.secret1);
106106
if ((rv == NULL) && (arg2 != NULL))
107-
rv = oidc_cfg_parse_passphrase(cmd->pool, arg2, &cfg->crypto_passphrase.secret2);
107+
rv = oidc_cfg_parse_passphrase(cmd->pool, arg2, (char **)&cfg->crypto_passphrase.secret2);
108108
return rv;
109109
}
110110

111-
const oidc_crypto_passphrase_t *oidc_cfg_crypto_passphrase_get(oidc_cfg_t *cfg) {
111+
const oidc_crypto_passphrase_t *oidc_cfg_crypto_passphrase_get(oidc_cfg_t *cfg, request_rec *r) {
112+
// make sure secret1 is set
113+
oidc_cfg_crypto_passphrase_secret1_get(cfg, r);
112114
return &cfg->crypto_passphrase;
113115
}
114116

115-
const char *oidc_cfg_crypto_passphrase_secret1_get(oidc_cfg_t *cfg) {
117+
const char *oidc_cfg_crypto_passphrase_secret1_get(oidc_cfg_t *cfg, request_rec *r) {
118+
if (cfg->crypto_passphrase.secret1 == NULL)
119+
oidc_util_rand_str(r, (char **)&cfg->crypto_passphrase.secret1, 32);
116120
return cfg->crypto_passphrase.secret1;
117121
}
118122

123+
const char *oidc_cfg_crypto_passphrase_secret2_get(oidc_cfg_t *cfg) {
124+
return cfg->crypto_passphrase.secret2;
125+
}
126+
119127
const char *oidc_cmd_outgoing_proxy_set(cmd_parms *cmd, void *ptr, const char *arg1, const char *arg2,
120128
const char *arg3) {
121129
oidc_cfg_t *cfg = (oidc_cfg_t *)ap_get_module_config(cmd->server->module_config, &auth_openidc_module);

src/cfg/cfg.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,8 @@ typedef struct oidc_apr_expr_t {
146146
} oidc_apr_expr_t;
147147

148148
typedef struct oidc_crypto_passphrase_t {
149-
char *secret1;
150-
char *secret2;
149+
const char *secret1;
150+
const char *secret2;
151151
} oidc_crypto_passphrase_t;
152152

153153
typedef struct oidc_remote_user_claim_t {
@@ -209,7 +209,9 @@ const char *oidc_cfg_endpoint_auth_set(apr_pool_t *pool, oidc_cfg_t *cfg, const
209209

210210
OIDC_CFG_MEMBER_FUNCS_DECL(delete_oldest_state_cookies, int)
211211
OIDC_CFG_MEMBER_FUNCS_DECL(action_on_userinfo_error, oidc_on_error_action_t)
212-
OIDC_CFG_MEMBER_FUNCS_DECL(crypto_passphrase_secret1, const char *)
212+
OIDC_CMD_MEMBER_FUNC_DECL(crypto_passphrase_secret1, const char *);
213+
const char *oidc_cfg_crypto_passphrase_secret1_get(oidc_cfg_t *cfg, request_rec *r);
214+
OIDC_CFG_MEMBER_FUNC_GET_DECL(crypto_passphrase_secret2, const char *)
213215
OIDC_CFG_MEMBER_FUNCS_DECL(refresh_mutex, oidc_cache_mutex_t *)
214216
OIDC_CFG_MEMBER_FUNCS_DECL(store_id_token, int)
215217
OIDC_CFG_MEMBER_FUNCS_DECL(post_preserve_template, const char *)
@@ -247,9 +249,11 @@ OIDC_CFG_MEMBER_FUNCS_DECL(dpop_api_enabled, int)
247249

248250
// 2 args
249251
OIDC_CFG_MEMBER_FUNCS_DECL(post_preserve_templates, const char *, const char *)
250-
OIDC_CFG_MEMBER_FUNCS_DECL(crypto_passphrase, const oidc_crypto_passphrase_t *, const char *)
251252
OIDC_CFG_MEMBER_FUNCS_DECL(max_number_of_state_cookies, int, const char *)
252253

254+
const char *oidc_cmd_crypto_passphrase_set(cmd_parms *, void *, const char *, const char *);
255+
const oidc_crypto_passphrase_t *oidc_cfg_crypto_passphrase_get(oidc_cfg_t *cfg, request_rec *r);
256+
253257
// 3 args
254258
OIDC_CFG_MEMBER_FUNCS_DECL(cookie_same_site_session, oidc_samesite_cookie_t, const char *, const char *)
255259
OIDC_CFG_MEMBER_FUNC_GET_DECL(cookie_same_site_state, oidc_samesite_cookie_t)

src/mod_auth_openidc.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,9 +1450,6 @@ static int oidc_check_config_openid_openidc(server_rec *s, oidc_cfg_t *c) {
14501450
return oidc_check_config_error(s, OIDCRedirectURI);
14511451
redirect_uri_is_relative = (oidc_cfg_redirect_uri_get(c)[0] == OIDC_CHAR_FORWARD_SLASH);
14521452

1453-
if (oidc_cfg_crypto_passphrase_secret1_get(c) == NULL)
1454-
return oidc_check_config_error(s, OIDCCryptoPassphrase);
1455-
14561453
if (oidc_cfg_metadata_dir_get(c) == NULL) {
14571454
if (oidc_cfg_provider_metadata_url_get(oidc_cfg_provider_get(c)) == NULL) {
14581455
if (oidc_cfg_provider_issuer_get(oidc_cfg_provider_get(c)) == NULL)
@@ -1556,9 +1553,6 @@ static int oidc_check_config_oauth(server_rec *s, oidc_cfg_t *c) {
15561553
return HTTP_INTERNAL_SERVER_ERROR;
15571554
}
15581555

1559-
if ((oidc_cfg_cache_encrypt_get(c) == 1) && (oidc_cfg_crypto_passphrase_secret1_get(c) == NULL))
1560-
return oidc_check_config_error(s, OIDCCryptoPassphrase);
1561-
15621556
return OK;
15631557
}
15641558

src/proto/state.c

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -231,30 +231,13 @@ void oidc_proto_state_set_timestamp_now(oidc_proto_state_t *proto_state) {
231231
json_object_set_new(proto_state, OIDC_PROTO_STATE_TIMESTAMP, json_integer(apr_time_sec(apr_time_now())));
232232
}
233233

234-
/*
235-
* sanity check on the configuration of OIDCCryptoPassphrase
236-
*/
237-
static apr_byte_t oidc_proto_check_crypto_passphrase(request_rec *r, oidc_cfg_t *c, const char *action) {
238-
if (oidc_cfg_crypto_passphrase_secret1_get(c) == NULL) {
239-
oidc_error(r,
240-
"cannot %s state cookie because " OIDCCryptoPassphrase
241-
" is not set; please check your OIDC Provider configuration as well or avoid using AuthType "
242-
"openid-connect",
243-
action);
244-
return FALSE;
245-
}
246-
return TRUE;
247-
}
248-
249234
/*
250235
* parse a state object from the provided cookie value
251236
*/
252237
oidc_proto_state_t *oidc_proto_state_from_cookie(request_rec *r, oidc_cfg_t *c, const char *cookieValue) {
253238
char *s_payload = NULL;
254239
json_t *result = NULL;
255-
if (oidc_proto_check_crypto_passphrase(r, c, "parse") == FALSE)
256-
return NULL;
257-
oidc_util_jwt_verify(r, oidc_cfg_crypto_passphrase_get(c), cookieValue, &s_payload);
240+
oidc_util_jwt_verify(r, oidc_cfg_crypto_passphrase_get(c, r), cookieValue, &s_payload);
258241
oidc_util_json_decode_object(r, s_payload, &result);
259242
return result;
260243
}
@@ -264,9 +247,7 @@ oidc_proto_state_t *oidc_proto_state_from_cookie(request_rec *r, oidc_cfg_t *c,
264247
*/
265248
char *oidc_proto_state_to_cookie(request_rec *r, oidc_cfg_t *c, oidc_proto_state_t *proto_state) {
266249
char *cookieValue = NULL;
267-
if (oidc_proto_check_crypto_passphrase(r, c, "create") == FALSE)
268-
return NULL;
269-
oidc_util_jwt_create(r, oidc_cfg_crypto_passphrase_get(c),
250+
oidc_util_jwt_create(r, oidc_cfg_crypto_passphrase_get(c, r),
270251
oidc_util_json_encode(r->pool, proto_state, JSON_COMPACT), &cookieValue);
271252
return cookieValue;
272253
}

src/session.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,12 @@ static apr_byte_t oidc_session_encode(request_rec *r, oidc_cfg_t *c, oidc_sessio
7171
if (encrypt == FALSE) {
7272
*s_value = oidc_util_json_encode(r->pool, z->state, JSON_COMPACT);
7373
return (*s_value != NULL);
74-
} else if (oidc_cfg_crypto_passphrase_secret1_get(c) == NULL) {
74+
} else if (oidc_cfg_crypto_passphrase_secret1_get(c, r) == NULL) {
7575
oidc_error(r, "cannot encrypt session state because " OIDCCryptoPassphrase " is not set");
7676
return FALSE;
7777
}
7878

79-
if (oidc_util_jwt_create(r, oidc_cfg_crypto_passphrase_get(c),
79+
if (oidc_util_jwt_create(r, oidc_cfg_crypto_passphrase_get(c, r),
8080
oidc_util_json_encode(r->pool, z->state, JSON_COMPACT), s_value) == FALSE)
8181
return FALSE;
8282

@@ -92,12 +92,12 @@ static apr_byte_t oidc_session_decode(request_rec *r, oidc_cfg_t *c, oidc_sessio
9292

9393
if (encrypt == FALSE) {
9494
return oidc_util_json_decode_object(r, s_json, &z->state);
95-
} else if (oidc_cfg_crypto_passphrase_secret1_get(c) == NULL) {
95+
} else if (oidc_cfg_crypto_passphrase_secret1_get(c, r) == NULL) {
9696
oidc_error(r, "cannot decrypt session state because " OIDCCryptoPassphrase " is not set");
9797
return FALSE;
9898
}
9999

100-
if (oidc_util_jwt_verify(r, oidc_cfg_crypto_passphrase_get(c), s_json, &s_payload) == FALSE) {
100+
if (oidc_util_jwt_verify(r, oidc_cfg_crypto_passphrase_get(c, r), s_json, &s_payload) == FALSE) {
101101
oidc_error(r, "could not verify secure JWT: cache value possibly corrupted");
102102
return FALSE;
103103
}

test/test_cache.c

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -169,15 +169,20 @@ START_TEST(test_cache_encrypt_no_secret) {
169169

170170
/* get cfg and temporarily remove the secret to simulate missing passphrase */
171171
oidc_cfg_t *cfg = oidc_test_cfg_get();
172-
const char *old_secret = cfg->crypto_passphrase.secret1;
172+
const char *old_secret = oidc_cfg_crypto_passphrase_secret1_get(cfg, r);
173173
cfg->crypto_passphrase.secret1 = NULL;
174174
cfg->cache.encrypt = 1;
175175

176-
/* set should fail when encryption is on but no secret is set */
176+
/* fail when value is too short and compression fails */
177177
ck_assert_int_eq(oidc_cache_set(r, OIDC_CACHE_SECTION_SESSION, "nokey", "v", expiry), FALSE);
178178

179-
/* get should also fail */
180-
ck_assert_int_eq(oidc_cache_get(r, OIDC_CACHE_SECTION_SESSION, "nokey", &value), FALSE);
179+
/* do not fail when encryption is on but no secret is set (long enough value to compress) */
180+
ck_assert_int_eq(oidc_cache_set(r, OIDC_CACHE_SECTION_SESSION, "nokey",
181+
"vadadfsssssssssssssssssssssssssssssssssssssssssssssssssssssssss", expiry),
182+
TRUE);
183+
184+
/* get should not fail because a secret should be generated */
185+
ck_assert_int_eq(oidc_cache_get(r, OIDC_CACHE_SECTION_SESSION, "nokey", &value), TRUE);
181186

182187
/* restore secret */
183188
cfg->crypto_passphrase.secret1 = (char *)old_secret;
@@ -199,8 +204,8 @@ START_TEST(test_cache_second_passphrase_retry) {
199204

200205
/* prepare cfg and secrets */
201206
oidc_cfg_t *cfg = oidc_test_cfg_get();
202-
const char *old_s1 = cfg->crypto_passphrase.secret1;
203-
const char *old_s2 = cfg->crypto_passphrase.secret2;
207+
const char *old_s1 = oidc_cfg_crypto_passphrase_secret1_get(cfg, r);
208+
const char *old_s2 = oidc_cfg_crypto_passphrase_secret2_get(cfg);
204209
int old_encrypt = cfg->cache.encrypt;
205210

206211
/* set initial secret and ensure encryption is enabled */
@@ -270,8 +275,8 @@ START_TEST(test_cache_secret1_empty_secret2_fallback) {
270275

271276
/* prepare cfg and secrets */
272277
oidc_cfg_t *cfg = oidc_test_cfg_get();
273-
const char *old_s1 = cfg->crypto_passphrase.secret1;
274-
const char *old_s2 = cfg->crypto_passphrase.secret2;
278+
const char *old_s1 = oidc_cfg_crypto_passphrase_secret1_get(cfg, r);
279+
const char *old_s2 = oidc_cfg_crypto_passphrase_secret2_get(cfg);
275280
int old_encrypt = cfg->cache.encrypt;
276281

277282
/* set initial secret and ensure encryption is enabled */
@@ -337,8 +342,8 @@ START_TEST(test_cache_compression_enabled_set_get) {
337342
/* verify encryption+compression works by trying to create a JWT with the current cfg secret */
338343
oidc_cfg_t *cfg = oidc_test_cfg_get();
339344
oidc_crypto_passphrase_t passphrase;
340-
passphrase.secret1 = cfg->crypto_passphrase.secret1;
341-
passphrase.secret2 = cfg->crypto_passphrase.secret2;
345+
passphrase.secret1 = oidc_cfg_crypto_passphrase_secret1_get(cfg, r);
346+
passphrase.secret2 = oidc_cfg_crypto_passphrase_secret2_get(cfg);
342347
char *encoded = NULL;
343348
apr_byte_t forced_no_compress = FALSE;
344349
if (!oidc_util_jwt_create(r, &passphrase, "probe", &encoded)) {
@@ -368,8 +373,8 @@ START_TEST(test_cache_compression_enabled_second_passphrase) {
368373

369374
/* prepare cfg and secrets */
370375
oidc_cfg_t *cfg = oidc_test_cfg_get();
371-
const char *old_s1 = cfg->crypto_passphrase.secret1;
372-
const char *old_s2 = cfg->crypto_passphrase.secret2;
376+
const char *old_s1 = oidc_cfg_crypto_passphrase_secret1_get(cfg, r);
377+
const char *old_s2 = oidc_cfg_crypto_passphrase_secret2_get(cfg);
373378
int old_encrypt = cfg->cache.encrypt;
374379

375380
/* set initial secret and ensure encryption is enabled */
@@ -379,8 +384,8 @@ START_TEST(test_cache_compression_enabled_second_passphrase) {
379384

380385
/* verify encryption+compression works for this cfg; fall back to no-compress if not */
381386
oidc_crypto_passphrase_t passphrase;
382-
passphrase.secret1 = cfg->crypto_passphrase.secret1;
383-
passphrase.secret2 = cfg->crypto_passphrase.secret2;
387+
passphrase.secret1 = oidc_cfg_crypto_passphrase_secret1_get(cfg, r);
388+
passphrase.secret2 = oidc_cfg_crypto_passphrase_secret2_get(cfg);
384389
char *encoded = NULL;
385390
apr_byte_t forced_no_compress = FALSE;
386391
if (!oidc_util_jwt_create(r, &passphrase, "probe", &encoded)) {
@@ -428,8 +433,8 @@ START_TEST(test_cache_compression_enabled_empty_secret2_fallback) {
428433

429434
/* prepare cfg and secrets */
430435
oidc_cfg_t *cfg = oidc_test_cfg_get();
431-
const char *old_s1 = cfg->crypto_passphrase.secret1;
432-
const char *old_s2 = cfg->crypto_passphrase.secret2;
436+
const char *old_s1 = oidc_cfg_crypto_passphrase_secret1_get(cfg, r);
437+
const char *old_s2 = oidc_cfg_crypto_passphrase_secret2_get(cfg);
433438
int old_encrypt = cfg->cache.encrypt;
434439

435440
cfg->crypto_passphrase.secret1 = "cmp_origsecret012345678901234567";
@@ -438,8 +443,8 @@ START_TEST(test_cache_compression_enabled_empty_secret2_fallback) {
438443

439444
/* verify encryption+compression works; fall back to no-compress if not */
440445
oidc_crypto_passphrase_t passphrase2;
441-
passphrase2.secret1 = cfg->crypto_passphrase.secret1;
442-
passphrase2.secret2 = cfg->crypto_passphrase.secret2;
446+
passphrase2.secret1 = oidc_cfg_crypto_passphrase_secret1_get(cfg, r);
447+
passphrase2.secret2 = oidc_cfg_crypto_passphrase_secret2_get(cfg);
443448
char *encoded2 = NULL;
444449
apr_byte_t forced_no_compress = FALSE;
445450
if (!oidc_util_jwt_create(r, &passphrase2, "probe", &encoded2)) {

0 commit comments

Comments
 (0)