@@ -2308,6 +2308,240 @@ int test_NTOWF_UTF16(struct ntlm_ctx *ctx)
2308
2308
return test_keys ("results" , & expected , & result );
2309
2309
}
2310
2310
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
+
2311
2545
int main (int argc , const char * argv [])
2312
2546
{
2313
2547
struct ntlm_ctx * ctx ;
@@ -2528,6 +2762,10 @@ int main(int argc, const char *argv[])
2528
2762
2529
2763
fprintf (stderr , "Test NTOWF iwith UTF16\n" );
2530
2764
ret = test_NTOWF_UTF16 (ctx );
2765
+
2766
+ fprintf (stderr , "Test Anonymous Auth\n" );
2767
+ ret = test_gssapi_anon ();
2768
+
2531
2769
fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2532
2770
if (ret ) gret ++ ;
2533
2771
0 commit comments