Skip to content

Commit b2864d2

Browse files
committed
test: add test/test_proto.c and migrate proto tests from test.c
Signed-off-by: Hans Zandbelt <[email protected]>
1 parent 5c8ccb4 commit b2864d2

File tree

5 files changed

+294
-237
lines changed

5 files changed

+294
-237
lines changed

ChangeLog

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
11/14/2025
2+
- test: add test/test_proto.c and migrate proto tests from test.c
3+
14
11/12/2025
25
- test: add test/test_cache.c coverage tests
36

test/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@
2020
/test_cfg
2121
/test_http
2222
/test_cache
23+
/test_proto

test/Makefile.am

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ TESTS += \
5858
test_util \
5959
test_jose \
6060
test_http \
61-
test_cache
61+
test_cache \
62+
test_proto
6263

6364
endif
6465

test/test.c

Lines changed: 0 additions & 236 deletions
Original file line numberDiff line numberDiff line change
@@ -964,234 +964,6 @@ static char *test_jwt_decrypt_gcm(apr_pool_t *pool) {
964964

965965
#endif
966966

967-
static char *test_proto_validate_access_token(request_rec *r) {
968-
969-
// from http://openid.net/specs/openid-connect-core-1_0.html#id_token-tokenExample
970-
// A.3 Example using response_type=id_token token
971-
const char *s = "eyJraWQiOiIxZTlnZGs3IiwiYWxnIjoiUlMyNTYifQ.ewogIml"
972-
"zcyI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ"
973-
"4Mjg5NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiA"
974-
"ibi0wUzZfV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDE"
975-
"zMTEyODA5NzAsCiAiYXRfaGFzaCI6ICI3N1FtVVB0alBmeld0RjJBbnBLOVJ"
976-
"RIgp9.F9gRev0Dt2tKcrBkHy72cmRqnLdzw9FLCCSebV7mWs7o_sv2O5s6zM"
977-
"ky2kmhHTVx9HmdvNnx9GaZ8XMYRFeYk8L5NZ7aYlA5W56nsG1iWOou_-gji0"
978-
"ibWIuuf4Owaho3YSoi7EvsTuLFz6tq-dLyz0dKABMDsiCmJ5wqkPUDTE3QTX"
979-
"jzbUmOzUDli-gCh5QPuZAq0cNW3pf_2n4zpvTYtbmj12cVcxGIMZby7TMWES"
980-
"RjQ9_o3jvhVNcCGcE0KAQXejhA1ocJhNEvQNqMFGlBb6_0RxxKjDZ-Oa329e"
981-
"GDidOvvp0h5hoES4a8IuGKS7NOcpp-aFwp0qVMDLI-Xnm-Pg";
982-
983-
oidc_jose_error_t err;
984-
oidc_jwt_t *jwt = NULL;
985-
TST_ASSERT_ERR("oidc_jwt_parse", oidc_jwt_parse(r->pool, s, &jwt, NULL, FALSE, &err), r->pool, err);
986-
987-
const char *access_token = "jHkWEdUXMU1BwAsC4vtUsZwnNvTIxEl0z9K3vx5KF0Y";
988-
TST_ASSERT("oidc_proto_validate_access_token",
989-
oidc_proto_idtoken_validate_access_token(r, NULL, jwt, "id_token token", access_token));
990-
991-
oidc_jwt_destroy(jwt);
992-
993-
return 0;
994-
}
995-
996-
static char *test_proto_validate_code(request_rec *r) {
997-
998-
// from http://openid.net/specs/openid-connect-core-1_0.html#code-id_tokenExample
999-
// A.4 Example using response_type=code id_token
1000-
const char *s = "eyJraWQiOiIxZTlnZGs3IiwiYWxnIjoiUlMyNTYifQ.ewogIml"
1001-
"zcyI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ"
1002-
"4Mjg5NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiA"
1003-
"ibi0wUzZfV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDE"
1004-
"zMTEyODA5NzAsCiAiY19oYXNoIjogIkxEa3RLZG9RYWszUGswY25YeENsdEE"
1005-
"iCn0.XW6uhdrkBgcGx6zVIrCiROpWURs-4goO1sKA4m9jhJIImiGg5muPUcN"
1006-
"egx6sSv43c5DSn37sxCRrDZZm4ZPBKKgtYASMcE20SDgvYJdJS0cyuFw7Ijp"
1007-
"_7WnIjcrl6B5cmoM6ylCvsLMwkoQAxVublMwH10oAxjzD6NEFsu9nipkszWh"
1008-
"sPePf_rM4eMpkmCbTzume-fzZIi5VjdWGGEmzTg32h3jiex-r5WTHbj-u5HL"
1009-
"7u_KP3rmbdYNzlzd1xWRYTUs4E8nOTgzAUwvwXkIQhOh5TPcSMBYy6X3E7-_"
1010-
"gr9Ue6n4ND7hTFhtjYs3cjNKIA08qm5cpVYFMFMG6PkhzLQ";
1011-
1012-
oidc_jose_error_t err;
1013-
oidc_jwt_t *jwt = NULL;
1014-
TST_ASSERT_ERR("oidc_jwt_parse", oidc_jwt_parse(r->pool, s, &jwt, NULL, FALSE, &err), r->pool, err);
1015-
1016-
const char *code = "Qcb0Orv1zh30vL1MPRsbm-diHiMwcLyZvn1arpZv-Jxf_11jnpEX3Tgfvk";
1017-
TST_ASSERT("oidc_proto_validate_code", oidc_proto_idtoken_validate_code(r, NULL, jwt, "code id_token", code));
1018-
1019-
oidc_jwt_destroy(jwt);
1020-
1021-
return 0;
1022-
}
1023-
1024-
static char *test_proto_authorization_request(request_rec *r) {
1025-
1026-
oidc_provider_t *provider = oidc_cfg_provider_create(r->pool);
1027-
1028-
oidc_cfg_provider_issuer_set(r->pool, provider, "https://idp.example.com");
1029-
oidc_cfg_provider_authorization_endpoint_url_set(r->pool, provider, "https://idp.example.com/authorize");
1030-
oidc_cfg_provider_client_id_set(r->pool, provider, "client_id");
1031-
oidc_cfg_provider_auth_request_params_set(r->pool, provider, "jan=piet&foo=#");
1032-
1033-
const char *redirect_uri = "https://www.example.com/protected/";
1034-
const char *state = "12345";
1035-
1036-
oidc_proto_state_t *proto_state = oidc_proto_state_new();
1037-
oidc_proto_state_set_nonce(proto_state, "anonce");
1038-
oidc_proto_state_set_original_url(proto_state, "https://localhost/protected/index.php");
1039-
oidc_proto_state_set_original_method(proto_state, OIDC_METHOD_GET);
1040-
oidc_proto_state_set_issuer(proto_state, oidc_cfg_provider_issuer_get(provider));
1041-
oidc_proto_state_set_response_type(proto_state, oidc_cfg_provider_response_type_get(provider));
1042-
oidc_proto_state_set_timestamp_now(proto_state);
1043-
1044-
TST_ASSERT("oidc_proto_request_auth (1)",
1045-
oidc_proto_request_auth(r, provider, NULL, redirect_uri, state, proto_state, NULL, NULL, NULL,
1046-
NULL) == HTTP_MOVED_TEMPORARILY);
1047-
1048-
TST_ASSERT_STR("oidc_proto_request_auth (2)", apr_table_get(r->headers_out, "Location"),
1049-
"https://idp.example.com/"
1050-
"authorize?response_type=code&scope=openid&client_id=client_id&state=12345&redirect_uri=https%"
1051-
"3A%2F%2Fwww.example.com%2Fprotected%2F&nonce=anonce&jan=piet&foo=bar");
1052-
1053-
return 0;
1054-
}
1055-
1056-
static char *test_logout_request(request_rec *r) {
1057-
1058-
oidc_cfg_t *c = ap_get_module_config(r->server->module_config, &auth_openidc_module);
1059-
oidc_session_t *session = NULL;
1060-
1061-
oidc_session_load(r, &session);
1062-
oidc_session_set_issuer(r, session, oidc_cfg_provider_issuer_get(oidc_cfg_provider_get(c)));
1063-
1064-
oidc_cfg_provider_end_session_endpoint_set(r->pool, oidc_cfg_provider_get(c),
1065-
"https://idp.example.com/endsession");
1066-
oidc_cfg_provider_logout_request_params_set(r->pool, oidc_cfg_provider_get(c), "client_id=myclient&foo=bar");
1067-
1068-
r->args = "logout=https%3A%2F%2Fwww.example.com%2Floggedout";
1069-
1070-
TST_ASSERT("oidc_handle_logout (1)", oidc_logout(r, c, session) == HTTP_MOVED_TEMPORARILY);
1071-
TST_ASSERT_STR(
1072-
"oidc_handle_logout (2)", apr_table_get(r->headers_out, "Location"),
1073-
"https://idp.example.com/"
1074-
"endsession?post_logout_redirect_uri=https%3A%2F%2Fwww.example.com%2Floggedout&client_id=myclient&foo=bar");
1075-
1076-
oidc_session_free(r, session);
1077-
1078-
return 0;
1079-
}
1080-
1081-
static char *test_proto_validate_nonce(request_rec *r) {
1082-
1083-
oidc_cfg_t *c = ap_get_module_config(r->server->module_config, &auth_openidc_module);
1084-
const char *nonce = "avSk7S69G4kEE8Km4bPiOjrfChHt6nO4Z397Lp_bQnc,";
1085-
1086-
/*
1087-
* {
1088-
* "typ": "JWT",
1089-
* "alg": "RS256",
1090-
* "x5t": "Z1NCjojeiHAib-Gm8vFE6ya6lPM"
1091-
* }
1092-
* {
1093-
* "nonce": "avSk7S69G4kEE8Km4bPiOjrfChHt6nO4Z397Lp_bQnc,",
1094-
* "iat": 1411580876,
1095-
* "at_hash": "yTqsoONZbuWbN6TbgevuDQ",
1096-
* "sub": "6343a29c-5399-44a7-9b35-4990f4377c96",
1097-
* "amr": "password",
1098-
* "auth_time": 1411577267,
1099-
* "idp": "idsrv",
1100-
* "name": "ksonaty",
1101-
* "iss": "https://agsync.com",
1102-
* "aud": "agsync_implicit",
1103-
* "exp": 1411584475,
1104-
* "nbf": 1411580875
1105-
* }
1106-
*/
1107-
char *s_jwt = apr_pstrdup(
1108-
r->pool,
1109-
"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IloxTkNqb2plaUhBaWItR204dkZFNnlhNmxQTSJ9."
1110-
"eyJub25jZSI6ImF2U2s3UzY5RzRrRUU4S200YlBpT2pyZkNoSHQ2bk80WjM5N0xwX2JRbmMsIiwiaWF0IjoxNDExNTgwODc2LCJhdF9oYX"
1111-
"NoIjoieVRxc29PTlpidVdiTjZUYmdldnVEUSIsInN1YiI6IjYzNDNhMjljLTUzOTktNDRhNy05YjM1LTQ5OTBmNDM3N2M5NiIsImFtciI6"
1112-
"InBhc3N3b3JkIiwiYXV0aF90aW1lIjoxNDExNTc3MjY3LCJpZHAiOiJpZHNydiIsIm5hbWUiOiJrc29uYXR5IiwiaXNzIjoiaHR0cHM6Ly"
1113-
"9hZ3N5bmMuY29tIiwiYXVkIjoiYWdzeW5jX2ltcGxpY2l0IiwiZXhwIjoxNDExNTg0NDc1LCJuYmYiOjE0MTE1ODA4NzV9.lEG-"
1114-
"DgHHa0JuOEuOTBvCqyexjRVcKXBnJJm289o2HyTgclpH80DsOMED9RlXCFfuDY7nw9i2cxUmIMAV42AdTxkMPomK3chytcajvpAZJirlk6"
1115-
"53bo9GTDXJSKZr5fwyEu--qahsoT5t9qvoWyFdYkvmMHFw1-"
1116-
"mAHDGgVe23voc9jPuFFIhRRqIn4e8ikzN4VQeEV1UXJD02kYYFn2TRWURgiFyVeTr2r0MTn-auCEsFS_AfR1Bl_"
1117-
"kmpMfqwrsicf5MTBvfPJeuSMt3t3d3LOGBkg36_z21X-ZRN7wy1KTjagr7iQ_y5csIpmtqs_QM55TTB9dW1HIosJPhiuMEJEA");
1118-
oidc_jwt_t *jwt = NULL;
1119-
oidc_jose_error_t err;
1120-
TST_ASSERT_ERR("oidc_jwt_parse", oidc_jwt_parse(r->pool, s_jwt, &jwt, NULL, FALSE, &err), r->pool, err);
1121-
1122-
TST_ASSERT("oidc_proto_idtoken_validate_nonce (1)",
1123-
oidc_proto_idtoken_validate_nonce(r, c, oidc_cfg_provider_get(c), nonce, jwt));
1124-
TST_ASSERT("oidc_proto_idtoken_validate_nonce (2)",
1125-
oidc_proto_idtoken_validate_nonce(r, c, oidc_cfg_provider_get(c), nonce, jwt) == FALSE);
1126-
1127-
oidc_jwt_destroy(jwt);
1128-
1129-
return 0;
1130-
}
1131-
1132-
static char *test_proto_validate_jwt(request_rec *r) {
1133-
1134-
oidc_jwt_t *jwt = NULL;
1135-
oidc_jose_error_t err;
1136-
1137-
const char *s_secret = "secret";
1138-
const char *s_issuer = "https://localhost";
1139-
apr_time_t now = apr_time_sec(apr_time_now());
1140-
1141-
const char *s_jwt_header = "{"
1142-
"\"alg\": \"HS256\""
1143-
"}";
1144-
1145-
const char *s_jwt_payload = "{"
1146-
"\"nonce\": \"543210,\","
1147-
"\"iat\": %" APR_TIME_T_FMT ","
1148-
"\"sub\": \"alice\","
1149-
"\"iss\": \"%s\","
1150-
"\"aud\": \"bob\","
1151-
"\"exp\": %" APR_TIME_T_FMT "}";
1152-
s_jwt_payload = apr_psprintf(r->pool, s_jwt_payload, now, s_issuer, now + 600);
1153-
1154-
char *s_jwt_header_encoded = NULL;
1155-
oidc_util_base64url_encode(r, &s_jwt_header_encoded, s_jwt_header, _oidc_strlen(s_jwt_header), 1);
1156-
1157-
char *s_jwt_payload_encoded = NULL;
1158-
oidc_util_base64url_encode(r, &s_jwt_payload_encoded, s_jwt_payload, _oidc_strlen(s_jwt_payload), 1);
1159-
1160-
char *s_jwt_message = apr_psprintf(r->pool, "%s.%s", s_jwt_header_encoded, s_jwt_payload_encoded);
1161-
1162-
unsigned int md_len = 0;
1163-
unsigned char md[EVP_MAX_MD_SIZE];
1164-
const EVP_MD *digest = EVP_get_digestbyname("sha256");
1165-
1166-
TST_ASSERT("HMAC", HMAC(digest, (const unsigned char *)s_secret, _oidc_strlen(s_secret),
1167-
(const unsigned char *)s_jwt_message, _oidc_strlen(s_jwt_message), md, &md_len) != 0);
1168-
1169-
char *s_jwt_signature_encoded = NULL;
1170-
oidc_util_base64url_encode(r, &s_jwt_signature_encoded, (const char *)md, md_len, 1);
1171-
1172-
char *s_jwt =
1173-
apr_psprintf(r->pool, "%s.%s.%s", s_jwt_header_encoded, s_jwt_payload_encoded, s_jwt_signature_encoded);
1174-
1175-
TST_ASSERT_ERR("oidc_jwt_parse", oidc_jwt_parse(r->pool, s_jwt, &jwt, NULL, FALSE, &err), r->pool, err);
1176-
1177-
oidc_jwk_t *jwk = NULL;
1178-
TST_ASSERT_ERR("oidc_util_create_symmetric_key",
1179-
oidc_util_key_symmetric_create(r, s_secret, 0, NULL, TRUE, &jwk) == TRUE, r->pool, err);
1180-
TST_ASSERT_ERR("oidc_util_create_symmetric_key (jwk)", jwk != NULL, r->pool, err);
1181-
1182-
TST_ASSERT_ERR("oidc_jwt_verify",
1183-
oidc_jwt_verify(r->pool, jwt, oidc_util_key_symmetric_merge(r->pool, NULL, jwk), &err), r->pool,
1184-
err);
1185-
1186-
TST_ASSERT_ERR("oidc_proto_validate_jwt", oidc_proto_jwt_validate(r, jwt, s_issuer, TRUE, TRUE, 10), r->pool,
1187-
err);
1188-
1189-
oidc_jwk_destroy(jwk);
1190-
oidc_jwt_destroy(jwt);
1191-
1192-
return 0;
1193-
}
1194-
1195967
#if HAVE_APACHE_24
1196968

1197969
static char *test_authz_worker(request_rec *r) {
@@ -1638,13 +1410,6 @@ static char *all_tests(apr_pool_t *pool, request_rec *r) {
16381410
TST_RUN(test_jwt_verify_rsa, pool);
16391411
TST_RUN(test_jwt_sign_verify, pool);
16401412

1641-
TST_RUN(test_proto_validate_access_token, r);
1642-
TST_RUN(test_proto_validate_code, r);
1643-
1644-
TST_RUN(test_proto_authorization_request, r);
1645-
TST_RUN(test_proto_validate_nonce, r);
1646-
TST_RUN(test_proto_validate_jwt, r);
1647-
16481413
TST_RUN(test_decode_json_object, r);
16491414

16501415
TST_RUN(test_remote_user, r);
@@ -1655,7 +1420,6 @@ static char *all_tests(apr_pool_t *pool, request_rec *r) {
16551420
TST_RUN(test_authz_worker, r);
16561421
#endif
16571422

1658-
TST_RUN(test_logout_request, r);
16591423
TST_RUN(test_check_cookie_domain, r);
16601424

16611425
return 0;

0 commit comments

Comments
 (0)