Add gsskrb5_extract_authz_data_from_sec_context and keyblock
extraction functions. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@18915 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -263,7 +263,10 @@ gss_krb5_export_lucid_sec_context(OM_uint32 *minor_status, | |||||||
|     krb5_storage *sp = NULL; |     krb5_storage *sp = NULL; | ||||||
|     uint32_t num; |     uint32_t num; | ||||||
|  |  | ||||||
|     if (context_handle == NULL || *context_handle == GSS_C_NO_CONTEXT) { |     if (context_handle == NULL | ||||||
|  | 	|| *context_handle == GSS_C_NO_CONTEXT | ||||||
|  | 	|| version != 1) | ||||||
|  |     { | ||||||
| 	ret = EINVAL; | 	ret = EINVAL; | ||||||
| 	return GSS_S_FAILURE; | 	return GSS_S_FAILURE; | ||||||
|     } |     } | ||||||
| @@ -482,3 +485,201 @@ gsskrb5_extract_authtime_from_sec_context(OM_uint32 *minor_status, | |||||||
|     *minor_status = 0; |     *minor_status = 0; | ||||||
|     return GSS_S_COMPLETE; |     return GSS_S_COMPLETE; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | OM_uint32 | ||||||
|  | gsskrb5_extract_authz_data_from_sec_context(OM_uint32 *minor_status, | ||||||
|  | 					    gss_ctx_id_t context_handle, | ||||||
|  | 					    int ad_type, | ||||||
|  | 					    gss_buffer_t ad_data) | ||||||
|  | { | ||||||
|  |     gss_buffer_set_t data_set = GSS_C_NO_BUFFER_SET; | ||||||
|  |     OM_uint32 maj_stat; | ||||||
|  |     gss_OID_desc oid_flat; | ||||||
|  |     heim_oid baseoid, oid; | ||||||
|  |     size_t size; | ||||||
|  |  | ||||||
|  |     if (context_handle == GSS_C_NO_CONTEXT) { | ||||||
|  | 	*minor_status = EINVAL; | ||||||
|  | 	return GSS_S_FAILURE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /* All this to append an integer to an oid... */ | ||||||
|  |  | ||||||
|  |     if (der_get_oid(GSS_KRB5_EXTRACT_AUTHZ_DATA_FROM_SEC_CONTEXT_X->elements, | ||||||
|  | 		    GSS_KRB5_EXTRACT_AUTHZ_DATA_FROM_SEC_CONTEXT_X->length, | ||||||
|  | 		    &baseoid, NULL) != 0) { | ||||||
|  | 	*minor_status = EINVAL; | ||||||
|  | 	return GSS_S_FAILURE; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     oid.length = baseoid.length + 1; | ||||||
|  |     oid.components = calloc(oid.length, sizeof(*oid.components)); | ||||||
|  |     if (oid.components == NULL) { | ||||||
|  | 	der_free_oid(&baseoid); | ||||||
|  |  | ||||||
|  | 	*minor_status = ENOMEM; | ||||||
|  | 	return GSS_S_FAILURE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     memcpy(oid.components, baseoid.components,  | ||||||
|  | 	   baseoid.length * sizeof(*baseoid.components)); | ||||||
|  |      | ||||||
|  |     der_free_oid(&baseoid); | ||||||
|  |  | ||||||
|  |     oid.components[oid.length - 1] = ad_type; | ||||||
|  |  | ||||||
|  |     oid_flat.length = der_length_oid(&oid); | ||||||
|  |     oid_flat.elements = malloc(oid_flat.length); | ||||||
|  |     if (oid_flat.elements == NULL) { | ||||||
|  | 	free(oid.components); | ||||||
|  | 	*minor_status = ENOMEM; | ||||||
|  | 	return GSS_S_FAILURE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (der_put_oid((unsigned char *)oid_flat.elements + oid_flat.length - 1,  | ||||||
|  | 		    oid_flat.length, &oid, &size) != 0) { | ||||||
|  | 	free(oid.components); | ||||||
|  |  | ||||||
|  | 	*minor_status = EINVAL; | ||||||
|  | 	return GSS_S_FAILURE; | ||||||
|  |     } | ||||||
|  |     if (oid_flat.length != size) | ||||||
|  | 	abort(); | ||||||
|  |  | ||||||
|  |     free(oid.components); | ||||||
|  |  | ||||||
|  |     /* FINALLY, we have the OID */ | ||||||
|  |  | ||||||
|  |     maj_stat = gss_inquire_sec_context_by_oid (minor_status, | ||||||
|  | 					       context_handle, | ||||||
|  | 					       &oid_flat, | ||||||
|  | 					       &data_set); | ||||||
|  |  | ||||||
|  |     free(oid_flat.elements); | ||||||
|  |  | ||||||
|  |     if (maj_stat) | ||||||
|  | 	return maj_stat; | ||||||
|  |      | ||||||
|  |     if (data_set == GSS_C_NO_BUFFER_SET || data_set->count != 1) { | ||||||
|  | 	gss_release_buffer_set(minor_status, &data_set); | ||||||
|  | 	*minor_status = EINVAL; | ||||||
|  | 	return GSS_S_FAILURE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     ad_data->value = malloc(data_set->elements[0].length); | ||||||
|  |     if (ad_data->value == NULL) { | ||||||
|  | 	gss_release_buffer_set(minor_status, &data_set); | ||||||
|  | 	*minor_status = ENOMEM; | ||||||
|  | 	return GSS_S_FAILURE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     ad_data->length = data_set->elements[0].length; | ||||||
|  |     memcpy(ad_data->value, data_set->elements[0].value, ad_data->length); | ||||||
|  |     gss_release_buffer_set(minor_status, &data_set); | ||||||
|  |      | ||||||
|  |     *minor_status = 0; | ||||||
|  |     return GSS_S_COMPLETE; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static OM_uint32 | ||||||
|  | gsskrb5_extract_key(OM_uint32 *minor_status, | ||||||
|  | 		    gss_ctx_id_t context_handle, | ||||||
|  | 		    const gss_OID oid,  | ||||||
|  | 		    krb5_keyblock **keyblock) | ||||||
|  | { | ||||||
|  |     krb5_error_code ret; | ||||||
|  |     gss_buffer_set_t data_set = GSS_C_NO_BUFFER_SET; | ||||||
|  |     OM_uint32 major_status; | ||||||
|  |     krb5_context context = NULL; | ||||||
|  |     krb5_storage *sp = NULL; | ||||||
|  |  | ||||||
|  |     if (context_handle == GSS_C_NO_CONTEXT) { | ||||||
|  | 	ret = EINVAL; | ||||||
|  | 	return GSS_S_FAILURE; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     ret = krb5_init_context(&context); | ||||||
|  |     if(ret) { | ||||||
|  | 	*minor_status = ret; | ||||||
|  | 	return GSS_S_FAILURE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     major_status = | ||||||
|  | 	gss_inquire_sec_context_by_oid (minor_status, | ||||||
|  | 					context_handle, | ||||||
|  | 					oid, | ||||||
|  | 					&data_set); | ||||||
|  |     if (major_status) | ||||||
|  | 	return major_status; | ||||||
|  |      | ||||||
|  |     if (data_set == GSS_C_NO_BUFFER_SET || data_set->count != 1) { | ||||||
|  | 	gss_release_buffer_set(minor_status, &data_set); | ||||||
|  | 	*minor_status = EINVAL; | ||||||
|  | 	return GSS_S_FAILURE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     sp = krb5_storage_from_mem(data_set->elements[0].value, | ||||||
|  | 			       data_set->elements[0].length); | ||||||
|  |     if (sp == NULL) { | ||||||
|  | 	ret = ENOMEM; | ||||||
|  | 	goto out; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     *keyblock = calloc(1, sizeof(**keyblock)); | ||||||
|  |     if (keyblock == NULL) { | ||||||
|  | 	ret = ENOMEM; | ||||||
|  | 	goto out; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     ret = krb5_ret_keyblock(sp, *keyblock); | ||||||
|  |  | ||||||
|  | out:  | ||||||
|  |     gss_release_buffer_set(minor_status, &data_set); | ||||||
|  |     if (sp) | ||||||
|  | 	krb5_storage_free(sp); | ||||||
|  |     if (ret && keyblock) { | ||||||
|  | 	krb5_free_keyblock(context, *keyblock); | ||||||
|  | 	*keyblock = NULL; | ||||||
|  |     } | ||||||
|  |     if (context) | ||||||
|  | 	krb5_free_context(context); | ||||||
|  |  | ||||||
|  |     *minor_status = ret; | ||||||
|  |     if (ret) | ||||||
|  | 	return GSS_S_FAILURE; | ||||||
|  |  | ||||||
|  |     return GSS_S_COMPLETE; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | OM_uint32 | ||||||
|  | gsskrb5_extract_service_keyblock(OM_uint32 *minor_status, | ||||||
|  | 				 gss_ctx_id_t context_handle, | ||||||
|  | 				 krb5_keyblock **keyblock) | ||||||
|  | { | ||||||
|  |     return gsskrb5_extract_key(minor_status, | ||||||
|  | 			       context_handle, | ||||||
|  | 			       GSS_KRB5_GET_SERVICE_KEYBLOCK_X, | ||||||
|  | 			       keyblock); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | OM_uint32 | ||||||
|  | gsskrb5_get_initiator_subkey(OM_uint32 *minor_status, | ||||||
|  | 			     gss_ctx_id_t context_handle, | ||||||
|  | 			     krb5_keyblock **keyblock) | ||||||
|  | { | ||||||
|  |     return gsskrb5_extract_key(minor_status, | ||||||
|  | 			       context_handle, | ||||||
|  | 			       GSS_KRB5_GET_INITIATOR_SUBKEY_X, | ||||||
|  | 			       keyblock); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | OM_uint32 | ||||||
|  | gsskrb5_get_subkey(OM_uint32 *minor_status, | ||||||
|  | 		   gss_ctx_id_t context_handle, | ||||||
|  | 		   krb5_keyblock **keyblock) | ||||||
|  | { | ||||||
|  |     return gsskrb5_extract_key(minor_status, | ||||||
|  | 			       context_handle, | ||||||
|  | 			       GSS_KRB5_GET_ACCEPTOR_SUBKEY_X, | ||||||
|  | 			       keyblock); | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Love Hörnquist Åstrand
					Love Hörnquist Åstrand