kdc: provide kdc_request_get_explicit_armor_{clientdb,client,pac}()
_kdc_fast_check_armor_pac() already checks the PAC of the armor, but it should also remember it if it's an TGS-REQ with explicit armor. This will allow the kdc pac hooks to generate a compound identity PAC with PAC_TYPE_DEVICE_INFO. Signed-off-by: Stefan Metzmacher <metze@samba.org> Closes: #967
This commit is contained in:

committed by
Luke Howard

parent
11d8a053f5
commit
8495f63bc3
18
kdc/fast.c
18
kdc/fast.c
@@ -465,7 +465,6 @@ fast_unwrap_request(astgs_request_t r,
|
|||||||
krb5_flags ap_req_options;
|
krb5_flags ap_req_options;
|
||||||
krb5_keyblock armorkey;
|
krb5_keyblock armorkey;
|
||||||
krb5_keyblock explicit_armorkey;
|
krb5_keyblock explicit_armorkey;
|
||||||
krb5_boolean explicit_armor;
|
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
krb5_ap_req ap_req;
|
krb5_ap_req ap_req;
|
||||||
KrbFastReq fastreq;
|
KrbFastReq fastreq;
|
||||||
@@ -519,7 +518,7 @@ fast_unwrap_request(astgs_request_t r,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
explicit_armor = fxreq.u.armored_data.armor != NULL && tgs_ac != NULL;
|
r->explicit_armor_present = fxreq.u.armored_data.armor != NULL && tgs_ac != NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
@@ -626,11 +625,11 @@ fast_unwrap_request(astgs_request_t r,
|
|||||||
ac->remote_subkey,
|
ac->remote_subkey,
|
||||||
&ticket->ticket.key,
|
&ticket->ticket.key,
|
||||||
&armorkey,
|
&armorkey,
|
||||||
explicit_armor ? NULL : &r->armor_crypto);
|
r->explicit_armor_present ? NULL : &r->armor_crypto);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (explicit_armor) {
|
if (r->explicit_armor_present) {
|
||||||
ret = _krb5_fast_explicit_armor_key(r->context,
|
ret = _krb5_fast_explicit_armor_key(r->context,
|
||||||
&armorkey,
|
&armorkey,
|
||||||
tgs_ac->remote_subkey,
|
tgs_ac->remote_subkey,
|
||||||
@@ -888,6 +887,17 @@ _kdc_fast_check_armor_pac(astgs_request_t r)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (r->explicit_armor_present) {
|
||||||
|
r->explicit_armor_clientdb = armor_db;
|
||||||
|
armor_db = NULL;
|
||||||
|
|
||||||
|
r->explicit_armor_client = armor_client;
|
||||||
|
armor_client = NULL;
|
||||||
|
|
||||||
|
r->explicit_armor_pac = mspac;
|
||||||
|
mspac = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
krb5_xfree(armor_client_principal_name);
|
krb5_xfree(armor_client_principal_name);
|
||||||
if (armor_client)
|
if (armor_client)
|
||||||
|
@@ -346,4 +346,24 @@ ASTGS_REQUEST_GET_ACCESSOR(uint64_t, pac_attributes)
|
|||||||
|
|
||||||
ASTGS_REQUEST_SET_ACCESSOR(uint64_t, pac_attributes)
|
ASTGS_REQUEST_SET_ACCESSOR(uint64_t, pac_attributes)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* const HDB *
|
||||||
|
* kdc_request_get_explicit_armor_clientdb(astgs_request_t);
|
||||||
|
*/
|
||||||
|
|
||||||
|
ASTGS_REQUEST_GET_ACCESSOR_PTR(HDB *, explicit_armor_clientdb)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* const hdb_entry *
|
||||||
|
* kdc_request_get_explicit_armor_client(astgs_request_t);
|
||||||
|
*/
|
||||||
|
ASTGS_REQUEST_GET_ACCESSOR_PTR(hdb_entry *, explicit_armor_client);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* krb5_const_pac
|
||||||
|
* kdc_request_get_explicit_armor_pac(astgs_request_t);
|
||||||
|
*/
|
||||||
|
|
||||||
|
ASTGS_REQUEST_GET_ACCESSOR_PTR(struct krb5_pac_data *, explicit_armor_pac);
|
||||||
|
|
||||||
#endif /* HEIMDAL_KDC_KDC_ACCESSORS_H */
|
#endif /* HEIMDAL_KDC_KDC_ACCESSORS_H */
|
||||||
|
@@ -182,6 +182,7 @@ struct astgs_request_desc {
|
|||||||
/* only valid for tgs-req */
|
/* only valid for tgs-req */
|
||||||
unsigned int rk_is_subkey : 1;
|
unsigned int rk_is_subkey : 1;
|
||||||
unsigned int fast_asserted : 1;
|
unsigned int fast_asserted : 1;
|
||||||
|
unsigned int explicit_armor_present : 1;
|
||||||
|
|
||||||
krb5_crypto armor_crypto;
|
krb5_crypto armor_crypto;
|
||||||
hdb_entry *armor_server;
|
hdb_entry *armor_server;
|
||||||
@@ -189,6 +190,10 @@ struct astgs_request_desc {
|
|||||||
krb5_ticket *armor_ticket;
|
krb5_ticket *armor_ticket;
|
||||||
Key *armor_key;
|
Key *armor_key;
|
||||||
|
|
||||||
|
hdb_entry *explicit_armor_client;
|
||||||
|
HDB *explicit_armor_clientdb;
|
||||||
|
krb5_pac explicit_armor_pac;
|
||||||
|
|
||||||
KDCFastState fast;
|
KDCFastState fast;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -2204,6 +2204,12 @@ out:
|
|||||||
krb5_free_ticket(r->context, r->armor_ticket);
|
krb5_free_ticket(r->context, r->armor_ticket);
|
||||||
if (r->armor_server)
|
if (r->armor_server)
|
||||||
_kdc_free_ent(r->context, r->armor_serverdb, r->armor_server);
|
_kdc_free_ent(r->context, r->armor_serverdb, r->armor_server);
|
||||||
|
if (r->explicit_armor_client)
|
||||||
|
_kdc_free_ent(r->context,
|
||||||
|
r->explicit_armor_clientdb,
|
||||||
|
r->explicit_armor_client);
|
||||||
|
if (r->explicit_armor_pac)
|
||||||
|
krb5_pac_free(r->context, r->explicit_armor_pac);
|
||||||
krb5_free_keyblock_contents(r->context, &r->reply_key);
|
krb5_free_keyblock_contents(r->context, &r->reply_key);
|
||||||
krb5_free_keyblock_contents(r->context, &r->strengthen_key);
|
krb5_free_keyblock_contents(r->context, &r->strengthen_key);
|
||||||
|
|
||||||
|
@@ -32,6 +32,9 @@ EXPORTS
|
|||||||
kdc_request_get_config
|
kdc_request_get_config
|
||||||
kdc_request_get_cname
|
kdc_request_get_cname
|
||||||
kdc_request_get_error_code
|
kdc_request_get_error_code
|
||||||
|
kdc_request_get_explicit_armor_pac
|
||||||
|
kdc_request_get_explicit_armor_clientdb
|
||||||
|
kdc_request_get_explicit_armor_client
|
||||||
kdc_request_get_from
|
kdc_request_get_from
|
||||||
kdc_request_get_krbtgt
|
kdc_request_get_krbtgt
|
||||||
kdc_request_get_krbtgtdb
|
kdc_request_get_krbtgtdb
|
||||||
|
@@ -35,6 +35,9 @@ HEIMDAL_KDC_1.0 {
|
|||||||
kdc_request_get_config;
|
kdc_request_get_config;
|
||||||
kdc_request_get_cname;
|
kdc_request_get_cname;
|
||||||
kdc_request_get_error_code;
|
kdc_request_get_error_code;
|
||||||
|
kdc_request_get_explicit_armor_pac;
|
||||||
|
kdc_request_get_explicit_armor_clientdb;
|
||||||
|
kdc_request_get_explicit_armor_client;
|
||||||
kdc_request_get_from;
|
kdc_request_get_from;
|
||||||
kdc_request_get_krbtgt;
|
kdc_request_get_krbtgt;
|
||||||
kdc_request_get_krbtgtdb;
|
kdc_request_get_krbtgtdb;
|
||||||
|
Reference in New Issue
Block a user