Skip to content

Commit c9ab294

Browse files
committed
Test anonymous authentication
Signed-off-by: Simo Sorce <[email protected]>
1 parent 313f32b commit c9ab294

File tree

1 file changed

+238
-0
lines changed

1 file changed

+238
-0
lines changed

tests/ntlmssptest.c

+238
Original file line numberDiff line numberDiff line change
@@ -2308,6 +2308,240 @@ int test_NTOWF_UTF16(struct ntlm_ctx *ctx)
23082308
return test_keys("results", &expected, &result);
23092309
}
23102310

2311+
int test_gssapi_anon(void)
2312+
{
2313+
gss_ctx_id_t cli_ctx = GSS_C_NO_CONTEXT;
2314+
gss_ctx_id_t srv_ctx = GSS_C_NO_CONTEXT;
2315+
gss_buffer_desc cli_token = { 0 };
2316+
gss_buffer_desc srv_token = { 0 };
2317+
gss_buffer_desc ctx_token;
2318+
gss_cred_id_t cli_cred = GSS_C_NO_CREDENTIAL;
2319+
gss_cred_id_t srv_cred = GSS_C_NO_CREDENTIAL;
2320+
const char *srvname = "test@testserver";
2321+
gss_name_t gss_username = NULL;
2322+
gss_name_t gss_srvname = NULL;
2323+
gss_buffer_desc nbuf;
2324+
uint32_t retmin, retmaj;
2325+
const char *msg = "Sample, payload checking, message.";
2326+
gss_buffer_desc message = { strlen(msg), discard_const(msg) };
2327+
int ret;
2328+
2329+
setenv("NTLM_ALLOW_ANONYMOUS", "1", 1);
2330+
2331+
retmaj = gssntlm_import_name(&retmin, &nbuf,
2332+
GSS_C_NT_ANONYMOUS,
2333+
&gss_username);
2334+
if (retmaj != GSS_S_COMPLETE) {
2335+
print_gss_error("gssntlm_import_name(anonymous) failed!",
2336+
retmaj, retmin);
2337+
return EINVAL;
2338+
}
2339+
2340+
nbuf.value = discard_const(srvname);
2341+
nbuf.length = strlen(srvname);
2342+
retmaj = gssntlm_import_name(&retmin, &nbuf,
2343+
GSS_C_NT_HOSTBASED_SERVICE,
2344+
&gss_srvname);
2345+
if (retmaj != GSS_S_COMPLETE) {
2346+
print_gss_error("gssntlm_import_name(srvname) failed!",
2347+
retmaj, retmin);
2348+
return EINVAL;
2349+
}
2350+
2351+
retmaj = gssntlm_acquire_cred(&retmin, (gss_name_t)gss_srvname,
2352+
GSS_C_INDEFINITE, GSS_C_NO_OID_SET,
2353+
GSS_C_ACCEPT, &srv_cred, NULL, NULL);
2354+
if (retmaj != GSS_S_COMPLETE) {
2355+
print_gss_error("gssntlm_acquire_cred(srvname) failed!",
2356+
retmaj, retmin);
2357+
ret = EINVAL;
2358+
goto done;
2359+
}
2360+
2361+
retmaj = gssntlm_init_sec_context(&retmin, cli_cred, &cli_ctx,
2362+
gss_srvname, GSS_C_NO_OID,
2363+
GSS_C_CONF_FLAG | GSS_C_INTEG_FLAG,
2364+
0, GSS_C_NO_CHANNEL_BINDINGS,
2365+
GSS_C_NO_BUFFER, NULL, &cli_token,
2366+
NULL, NULL);
2367+
if (retmaj != GSS_S_CONTINUE_NEEDED) {
2368+
print_gss_error("gssntlm_init_sec_context 1 failed!",
2369+
retmaj, retmin);
2370+
ret = EINVAL;
2371+
goto done;
2372+
}
2373+
2374+
retmaj = gssntlm_accept_sec_context(&retmin, &srv_ctx, srv_cred,
2375+
&cli_token, GSS_C_NO_CHANNEL_BINDINGS,
2376+
NULL, NULL, &srv_token,
2377+
NULL, NULL, NULL);
2378+
if (retmaj != GSS_S_CONTINUE_NEEDED) {
2379+
print_gss_error("gssntlm_accept_sec_context 1 failed!",
2380+
retmaj, retmin);
2381+
ret = EINVAL;
2382+
goto done;
2383+
}
2384+
2385+
gss_release_buffer(&retmin, &cli_token);
2386+
2387+
/* test importing and exporting context before it is fully estabished */
2388+
retmaj = gssntlm_export_sec_context(&retmin, &srv_ctx, &ctx_token);
2389+
if (retmaj != GSS_S_COMPLETE) {
2390+
print_gss_error("gssntlm_export_sec_context 1 failed!",
2391+
retmaj, retmin);
2392+
ret = EINVAL;
2393+
goto done;
2394+
}
2395+
retmaj = gssntlm_import_sec_context(&retmin, &ctx_token, &srv_ctx);
2396+
if (retmaj != GSS_S_COMPLETE) {
2397+
print_gss_error("gssntlm_import_sec_context 1 failed!",
2398+
retmaj, retmin);
2399+
ret = EINVAL;
2400+
goto done;
2401+
}
2402+
gss_release_buffer(&retmin, &ctx_token);
2403+
2404+
retmaj = gssntlm_init_sec_context(&retmin, cli_cred, &cli_ctx,
2405+
gss_srvname, GSS_C_NO_OID,
2406+
GSS_C_CONF_FLAG | GSS_C_INTEG_FLAG,
2407+
0, GSS_C_NO_CHANNEL_BINDINGS,
2408+
&srv_token, NULL, &cli_token,
2409+
NULL, NULL);
2410+
if (retmaj != GSS_S_COMPLETE) {
2411+
print_gss_error("gssntlm_init_sec_context 2 failed!",
2412+
retmaj, retmin);
2413+
ret = EINVAL;
2414+
goto done;
2415+
}
2416+
2417+
gss_release_buffer(&retmin, &srv_token);
2418+
2419+
retmaj = gssntlm_accept_sec_context(&retmin, &srv_ctx, srv_cred,
2420+
&cli_token, GSS_C_NO_CHANNEL_BINDINGS,
2421+
NULL, NULL, &srv_token,
2422+
NULL, NULL, NULL);
2423+
if (retmaj != GSS_S_COMPLETE) {
2424+
print_gss_error("gssntlm_accept_sec_context 2 failed!",
2425+
retmaj, retmin);
2426+
ret = EINVAL;
2427+
goto done;
2428+
}
2429+
2430+
gss_release_buffer(&retmin, &cli_token);
2431+
gss_release_buffer(&retmin, &srv_token);
2432+
2433+
/* test importing and exporting context after it is fully estabished */
2434+
retmaj = gssntlm_export_sec_context(&retmin, &cli_ctx, &ctx_token);
2435+
if (retmaj != GSS_S_COMPLETE) {
2436+
print_gss_error("gssntlm_export_sec_context 2 failed!",
2437+
retmaj, retmin);
2438+
ret = EINVAL;
2439+
goto done;
2440+
}
2441+
retmaj = gssntlm_import_sec_context(&retmin, &ctx_token, &cli_ctx);
2442+
if (retmaj != GSS_S_COMPLETE) {
2443+
print_gss_error("gssntlm_import_sec_context 2 failed!",
2444+
retmaj, retmin);
2445+
ret = EINVAL;
2446+
goto done;
2447+
}
2448+
gss_release_buffer(&retmin, &ctx_token);
2449+
2450+
retmaj = gssntlm_get_mic(&retmin, cli_ctx, 0, &message, &cli_token);
2451+
if (retmaj != GSS_S_COMPLETE) {
2452+
print_gss_error("gssntlm_get_mic(cli) failed!",
2453+
retmaj, retmin);
2454+
ret = EINVAL;
2455+
goto done;
2456+
}
2457+
2458+
retmaj = gssntlm_verify_mic(&retmin, srv_ctx, &message, &cli_token, NULL);
2459+
if (retmaj != GSS_S_COMPLETE) {
2460+
print_gss_error("gssntlm_verify_mic(srv) failed!",
2461+
retmaj, retmin);
2462+
ret = EINVAL;
2463+
goto done;
2464+
}
2465+
2466+
gss_release_buffer(&retmin, &cli_token);
2467+
2468+
retmaj = gssntlm_get_mic(&retmin, srv_ctx, 0, &message, &srv_token);
2469+
if (retmaj != GSS_S_COMPLETE) {
2470+
print_gss_error("gssntlm_get_mic(srv) failed!",
2471+
retmaj, retmin);
2472+
ret = EINVAL;
2473+
goto done;
2474+
}
2475+
2476+
retmaj = gssntlm_verify_mic(&retmin, cli_ctx, &message, &srv_token, NULL);
2477+
if (retmaj != GSS_S_COMPLETE) {
2478+
print_gss_error("gssntlm_verify_mic(cli) failed!",
2479+
retmaj, retmin);
2480+
ret = EINVAL;
2481+
goto done;
2482+
}
2483+
2484+
gss_release_buffer(&retmin, &srv_token);
2485+
2486+
retmaj = gssntlm_wrap(&retmin, cli_ctx, 1, 0, &message, NULL, &cli_token);
2487+
if (retmaj != GSS_S_COMPLETE) {
2488+
print_gss_error("gssntlm_wrap(cli) failed!",
2489+
retmaj, retmin);
2490+
ret = EINVAL;
2491+
goto done;
2492+
}
2493+
2494+
retmaj = gssntlm_unwrap(&retmin, srv_ctx, &cli_token, &srv_token,
2495+
NULL, NULL);
2496+
if (retmaj != GSS_S_COMPLETE) {
2497+
print_gss_error("gssntlm_unwrap(srv) failed!",
2498+
retmaj, retmin);
2499+
ret = EINVAL;
2500+
goto done;
2501+
}
2502+
2503+
gss_release_buffer(&retmin, &cli_token);
2504+
gss_release_buffer(&retmin, &srv_token);
2505+
2506+
retmaj = gssntlm_wrap(&retmin, srv_ctx, 1, 0, &message, NULL, &srv_token);
2507+
if (retmaj != GSS_S_COMPLETE) {
2508+
print_gss_error("gssntlm_wrap(srv) failed!",
2509+
retmaj, retmin);
2510+
ret = EINVAL;
2511+
goto done;
2512+
}
2513+
2514+
retmaj = gssntlm_unwrap(&retmin, cli_ctx, &srv_token, &cli_token,
2515+
NULL, NULL);
2516+
if (retmaj != GSS_S_COMPLETE) {
2517+
print_gss_error("gssntlm_unwrap(cli) failed!",
2518+
retmaj, retmin);
2519+
ret = EINVAL;
2520+
goto done;
2521+
}
2522+
2523+
if (memcmp(message.value, cli_token.value, cli_token.length) != 0) {
2524+
print_gss_error("sealing and unsealing failed to return the "
2525+
"same result",
2526+
retmaj, retmin);
2527+
ret = EINVAL;
2528+
goto done;
2529+
}
2530+
2531+
ret = 0;
2532+
2533+
done:
2534+
gssntlm_delete_sec_context(&retmin, &cli_ctx, GSS_C_NO_BUFFER);
2535+
gssntlm_delete_sec_context(&retmin, &srv_ctx, GSS_C_NO_BUFFER);
2536+
gssntlm_release_name(&retmin, &gss_username);
2537+
gssntlm_release_name(&retmin, &gss_srvname);
2538+
gssntlm_release_cred(&retmin, &cli_cred);
2539+
gssntlm_release_cred(&retmin, &srv_cred);
2540+
gss_release_buffer(&retmin, &cli_token);
2541+
gss_release_buffer(&retmin, &srv_token);
2542+
return ret;
2543+
}
2544+
23112545
int main(int argc, const char *argv[])
23122546
{
23132547
struct ntlm_ctx *ctx;
@@ -2528,6 +2762,10 @@ int main(int argc, const char *argv[])
25282762

25292763
fprintf(stderr, "Test NTOWF iwith UTF16\n");
25302764
ret = test_NTOWF_UTF16(ctx);
2765+
2766+
fprintf(stderr, "Test Anonymous Auth\n");
2767+
ret = test_gssapi_anon();
2768+
25312769
fprintf(stderr, "Test: %s\n", (ret ? "FAIL":"SUCCESS"));
25322770
if (ret) gret++;
25332771

0 commit comments

Comments
 (0)