@@ -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+
23112545int 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