gss: add tests for importing and exporting contexts
Add the --export-import-context flag to test_context, for validating that security contexts round-trip through GSS_Export_sec_context() and GSS_Import_sec_context().
This commit is contained in:
		| @@ -56,7 +56,8 @@ static int getverifymic_flag = 0; | |||||||
| static int deleg_flag = 0; | static int deleg_flag = 0; | ||||||
| static int policy_deleg_flag = 0; | static int policy_deleg_flag = 0; | ||||||
| static int server_no_deleg_flag = 0; | static int server_no_deleg_flag = 0; | ||||||
| static int ei_flag = 0; | static int ei_cred_flag = 0; | ||||||
|  | static int ei_ctx_flag = 0; | ||||||
| static char *client_ccache = NULL; | static char *client_ccache = NULL; | ||||||
| static char *client_keytab = NULL; | static char *client_keytab = NULL; | ||||||
| static char *gsskrb5_acceptor_identity = NULL; | static char *gsskrb5_acceptor_identity = NULL; | ||||||
| @@ -589,7 +590,8 @@ static struct getargs args[] = { | |||||||
|     {"policy-delegate",0,	arg_flag,	&policy_deleg_flag, "policy delegate credential", NULL }, |     {"policy-delegate",0,	arg_flag,	&policy_deleg_flag, "policy delegate credential", NULL }, | ||||||
|     {"server-no-delegate",0,	arg_flag,	&server_no_deleg_flag, |     {"server-no-delegate",0,	arg_flag,	&server_no_deleg_flag, | ||||||
|      "server should get a credential", NULL }, |      "server should get a credential", NULL }, | ||||||
|     {"export-import-cred",0,	arg_flag,	&ei_flag, "test export/import cred", NULL }, |     {"export-import-context",0,	arg_flag,	&ei_ctx_flag, "test export/import context", NULL }, | ||||||
|  |     {"export-import-cred",0,	arg_flag,	&ei_cred_flag, "test export/import cred", NULL }, | ||||||
|     {"gsskrb5-acceptor-identity", 0, arg_string, &gsskrb5_acceptor_identity, "keytab", NULL }, |     {"gsskrb5-acceptor-identity", 0, arg_string, &gsskrb5_acceptor_identity, "keytab", NULL }, | ||||||
|     {"session-enctype",	0, arg_string,	&session_enctype_string, "enctype", NULL }, |     {"session-enctype",	0, arg_string,	&session_enctype_string, "enctype", NULL }, | ||||||
|     {"client-time-offset",	0, arg_integer,	&client_time_offset, "time", NULL }, |     {"client-time-offset",	0, arg_integer,	&client_time_offset, "time", NULL }, | ||||||
| @@ -1012,6 +1014,40 @@ main(int argc, char **argv) | |||||||
| 	getverifymic_flag = 1; | 	getverifymic_flag = 1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     if (ei_ctx_flag) { | ||||||
|  | 	gss_buffer_desc ctx_token = GSS_C_EMPTY_BUFFER; | ||||||
|  |  | ||||||
|  | 	maj_stat = gss_export_sec_context(&min_stat, &cctx, &ctx_token); | ||||||
|  | 	if (maj_stat != GSS_S_COMPLETE) | ||||||
|  | 	    errx(1, "export client context failed: %s", | ||||||
|  | 		 gssapi_err(maj_stat, min_stat, NULL)); | ||||||
|  |  | ||||||
|  | 	heim_assert(cctx == GSS_C_NO_CONTEXT, | ||||||
|  | 		    "gss_export_sec_context did not delete context"); | ||||||
|  |  | ||||||
|  | 	maj_stat = gss_import_sec_context(&min_stat, &ctx_token, &cctx); | ||||||
|  | 	if (maj_stat != GSS_S_COMPLETE) | ||||||
|  | 	    errx(1, "import client context failed: %s", | ||||||
|  | 		 gssapi_err(maj_stat, min_stat, NULL)); | ||||||
|  |  | ||||||
|  | 	gss_release_buffer(&min_stat, &ctx_token); | ||||||
|  |  | ||||||
|  | 	maj_stat = gss_export_sec_context(&min_stat, &sctx, &ctx_token); | ||||||
|  | 	if (maj_stat != GSS_S_COMPLETE) | ||||||
|  | 	    errx(1, "export server context failed: %s", | ||||||
|  | 		 gssapi_err(maj_stat, min_stat, NULL)); | ||||||
|  |  | ||||||
|  | 	heim_assert(sctx == GSS_C_NO_CONTEXT, | ||||||
|  | 		    "gss_export_sec_context did not delete context"); | ||||||
|  |  | ||||||
|  | 	maj_stat = gss_import_sec_context(&min_stat, &ctx_token, &sctx); | ||||||
|  | 	if (maj_stat != GSS_S_COMPLETE) | ||||||
|  | 	    errx(1, "import server context failed: %s", | ||||||
|  | 		 gssapi_err(maj_stat, min_stat, NULL)); | ||||||
|  |  | ||||||
|  | 	gss_release_buffer(&min_stat, &ctx_token); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (wrapunwrap_flag) { |     if (wrapunwrap_flag) { | ||||||
| 	wrapunwrap(cctx, sctx, 0, actual_mech); | 	wrapunwrap(cctx, sctx, 0, actual_mech); | ||||||
| 	wrapunwrap(cctx, sctx, 1, actual_mech); | 	wrapunwrap(cctx, sctx, 1, actual_mech); | ||||||
| @@ -1119,7 +1155,6 @@ main(int argc, char **argv) | |||||||
| 	getverifymic(sctx, cctx, actual_mech); | 	getverifymic(sctx, cctx, actual_mech); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     gss_delete_sec_context(&min_stat, &cctx, NULL); |     gss_delete_sec_context(&min_stat, &cctx, NULL); | ||||||
|     gss_delete_sec_context(&min_stat, &sctx, NULL); |     gss_delete_sec_context(&min_stat, &sctx, NULL); | ||||||
|  |  | ||||||
| @@ -1157,16 +1192,16 @@ main(int argc, char **argv) | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	/* check export/import */ | 	/* check export/import */ | ||||||
| 	if (ei_flag) { | 	if (ei_cred_flag) { | ||||||
|  |  | ||||||
| 	    maj_stat = gss_export_cred(&min_stat, deleg_cred, &cb); | 	    maj_stat = gss_export_cred(&min_stat, deleg_cred, &cb); | ||||||
| 	    if (maj_stat != GSS_S_COMPLETE) | 	    if (maj_stat != GSS_S_COMPLETE) | ||||||
| 		errx(1, "export failed: %s", | 		errx(1, "export cred failed: %s", | ||||||
| 		     gssapi_err(maj_stat, min_stat, NULL)); | 		     gssapi_err(maj_stat, min_stat, NULL)); | ||||||
|  |  | ||||||
| 	    maj_stat = gss_import_cred(&min_stat, &cb, &cred2); | 	    maj_stat = gss_import_cred(&min_stat, &cb, &cred2); | ||||||
| 	    if (maj_stat != GSS_S_COMPLETE) | 	    if (maj_stat != GSS_S_COMPLETE) | ||||||
| 		errx(1, "import failed: %s", | 		errx(1, "import cred failed: %s", | ||||||
| 		     gssapi_err(maj_stat, min_stat, NULL)); | 		     gssapi_err(maj_stat, min_stat, NULL)); | ||||||
|  |  | ||||||
| 	    gss_release_buffer(&min_stat, &cb); | 	    gss_release_buffer(&min_stat, &cb); | ||||||
|   | |||||||
| @@ -265,6 +265,29 @@ for mech in krb5 krb5iov spnego; do | |||||||
|  |  | ||||||
| done | done | ||||||
|  |  | ||||||
|  | echo "======export-import-context" | ||||||
|  | for mech in krb5 krb5iov spnego spnegoiov; do | ||||||
|  | 	iov="" | ||||||
|  | 	if [ "$mech" = "krb5iov" ] ; then | ||||||
|  | 	    mech="krb5" | ||||||
|  | 	    iov="--iov" | ||||||
|  | 	fi | ||||||
|  | 	if [ "$mech" = "spnegoiov" ] ; then | ||||||
|  | 	    mech="spnego" | ||||||
|  | 	    iov="--iov" | ||||||
|  | 	fi | ||||||
|  |  | ||||||
|  | 	echo "${mech}: export-import-context ${iov}" ; > messages.log | ||||||
|  | 	${context} \ | ||||||
|  | 	    --mech-type=${mech} \ | ||||||
|  | 	    --mutual \ | ||||||
|  | 	    --export-import-context \ | ||||||
|  | 	    --wrapunwrap ${iov} \ | ||||||
|  | 	    --name-type=hostbased-service host@lucid.test.h5l.se || \ | ||||||
|  | 	    { eval "$testfailed"; } | ||||||
|  |  | ||||||
|  | done | ||||||
|  |  | ||||||
| echo "test gsskrb5_register_acceptor_identity (both positive and negative)" | echo "test gsskrb5_register_acceptor_identity (both positive and negative)" | ||||||
|  |  | ||||||
| cp ${keytabfile} ${keytabfile}.new | cp ${keytabfile} ${keytabfile}.new | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Luke Howard
					Luke Howard