summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/krb5/krb/preauth2.c103
-rw-r--r--src/lib/krb5/krb/preauth_ec.c32
2 files changed, 27 insertions, 108 deletions
diff --git a/src/lib/krb5/krb/preauth2.c b/src/lib/krb5/krb/preauth2.c
index 9807eeafd..8c43938ef 100644
--- a/src/lib/krb5/krb/preauth2.c
+++ b/src/lib/krb5/krb/preauth2.c
@@ -372,94 +372,24 @@ grow_pa_list(krb5_pa_data ***out_pa_list, int *out_pa_list_size,
return 0;
}
-/*
- * Retrieve a specific piece of information required by the plugin and
- * return it in a new krb5_data item. There are separate request_types
- * to obtain the data and free it.
- *
- * This may require massaging data into a contrived format, but it will
- * hopefully keep us from having to reveal library-internal functions
- * or data to the plugin modules.
- */
-
-static krb5_error_code
-client_data_proc(krb5_context kcontext, krb5_clpreauth_rock rock,
- krb5_int32 request_type, krb5_data **retdata)
+static krb5_enctype
+get_etype(krb5_context context, krb5_clpreauth_rock rock)
{
- krb5_data *ret;
- krb5_error_code retval;
- char *data;
-
- if (rock->magic != CLIENT_ROCK_MAGIC)
- return EINVAL;
- if (retdata == NULL)
- return EINVAL;
+ return *rock->etype;
+}
- switch (request_type) {
- case krb5_clpreauth_get_etype:
- {
- krb5_enctype *eptr;
- ret = malloc(sizeof(krb5_data));
- if (ret == NULL)
- return ENOMEM;
- data = malloc(sizeof(krb5_enctype));
- if (data == NULL) {
- free(ret);
- return ENOMEM;
- }
- ret->data = data;
- ret->length = sizeof(krb5_enctype);
- eptr = (krb5_enctype *)data;
- *eptr = *rock->etype;
- *retdata = ret;
- return 0;
- }
- break;
- case krb5_clpreauth_free_etype:
- ret = *retdata;
- if (ret == NULL)
- return 0;
- if (ret->data)
- free(ret->data);
- free(ret);
- return 0;
- break;
- case krb5_clpreauth_fast_armor: {
- krb5_keyblock *key = NULL;
- ret = calloc(1, sizeof(krb5_data));
- if (ret == NULL)
- return ENOMEM;
- retval = 0;
- if (rock->fast_state->armor_key)
- retval = krb5_copy_keyblock(kcontext, rock->fast_state->armor_key,
- &key);
- if (retval == 0) {
- ret->data = (char *) key;
- ret->length = key?sizeof(krb5_keyblock):0;
- key = NULL;
- }
- if (retval == 0) {
- *retdata = ret;
- ret = NULL;
- }
- if (ret)
- free(ret);
- return retval;
- }
- case krb5_clpreauth_free_fast_armor:
- ret = *retdata;
- if (ret) {
- if (ret->data)
- krb5_free_keyblock(kcontext, (krb5_keyblock *) ret->data);
- free(ret);
- *retdata = NULL;
- }
- return 0;
- default:
- return EINVAL;
- }
+static krb5_keyblock *
+fast_armor(krb5_context context, krb5_clpreauth_rock rock)
+{
+ return rock->fast_state->armor_key;
}
+static struct krb5_clpreauth_callbacks_st callbacks = {
+ 1,
+ get_etype,
+ fast_armor
+};
+
/* Tweak the request body, for now adding any enctypes which the module claims
* to add support for to the list, but in the future perhaps doing more
* involved things. */
@@ -545,7 +475,7 @@ run_preauth_plugins(krb5_context kcontext,
ret = module->client_process(kcontext, module->moddata,
*module->modreq_p,
(krb5_get_init_creds_opt *)opte,
- client_data_proc, preauth_rock,
+ &callbacks, preauth_rock,
request, encoded_request_body,
encoded_previous_request, in_padata,
prompter, prompter_data, gak_fct,
@@ -1535,8 +1465,7 @@ krb5_do_preauth_tryagain(krb5_context kcontext,
if ((*module->client_tryagain)(kcontext, module->moddata,
*module->modreq_p,
(krb5_get_init_creds_opt *)opte,
- client_data_proc,
- preauth_rock,
+ &callbacks, preauth_rock,
request,
encoded_request_body,
encoded_previous_request,
diff --git a/src/lib/krb5/krb/preauth_ec.c b/src/lib/krb5/krb/preauth_ec.c
index 94c928461..6ef397568 100644
--- a/src/lib/krb5/krb/preauth_ec.c
+++ b/src/lib/krb5/krb/preauth_ec.c
@@ -43,7 +43,7 @@ preauth_flags(krb5_context context, krb5_preauthtype pa_type)
static krb5_error_code
process_preauth(krb5_context context, krb5_clpreauth_moddata moddata,
krb5_clpreauth_modreq modreq, krb5_get_init_creds_opt *opt,
- krb5_clpreauth_get_data_fn get_data_proc,
+ krb5_clpreauth_callbacks cb,
krb5_clpreauth_rock rock, krb5_kdc_req *request,
krb5_data *encoded_request_body,
krb5_data *encoded_previous_request, krb5_pa_data *padata,
@@ -53,22 +53,16 @@ process_preauth(krb5_context context, krb5_clpreauth_moddata moddata,
krb5_pa_data ***out_padata)
{
krb5_error_code retval = 0;
- krb5_enctype enctype = 0;
- krb5_keyblock *challenge_key = NULL, *armor_key = NULL;
- krb5_data *etype_data = NULL;
+ krb5_enctype enctype;
+ krb5_keyblock *challenge_key = NULL, *armor_key;
- retval = fast_get_armor_key(context, get_data_proc, rock, &armor_key);
- if (retval || armor_key == NULL)
- return 0;
- retval = get_data_proc(context, rock, krb5_clpreauth_get_etype,
- &etype_data);
- if (retval == 0) {
- enctype = *((krb5_enctype *)etype_data->data);
- if (as_key->length == 0 ||as_key->enctype != enctype)
- retval = gak_fct(context, request->client,
- enctype, prompter, prompter_data,
- salt, s2kparams,
- as_key, gak_data);
+ armor_key = cb->fast_armor(context, rock);
+ enctype = cb->get_etype(context, rock);
+ if (as_key->length == 0 ||as_key->enctype != enctype) {
+ retval = gak_fct(context, request->client,
+ enctype, prompter, prompter_data,
+ salt, s2kparams,
+ as_key, gak_data);
}
if (retval == 0 && padata->length) {
krb5_enc_data *enc = NULL;
@@ -99,7 +93,7 @@ process_preauth(krb5_context context, krb5_clpreauth_moddata moddata,
if (scratch.data)
krb5_free_data_contents(context, &scratch);
if (retval == 0)
- fast_set_kdc_verified(context, get_data_proc, rock);
+ fast_set_kdc_verified(context, cb, rock);
if (enc)
krb5_free_enc_data(context, enc);
} else if (retval == 0) { /*No padata; we send*/
@@ -158,10 +152,6 @@ process_preauth(krb5_context context, krb5_clpreauth_moddata moddata,
}
if (challenge_key)
krb5_free_keyblock(context, challenge_key);
- if (armor_key)
- krb5_free_keyblock(context, armor_key);
- if (etype_data != NULL)
- get_data_proc(context, rock, krb5_clpreauth_free_etype, &etype_data);
return retval;
}