add krb5_store_creds_tag, krb5_ret_creds_tag
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@14535 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
166
lib/krb5/store.c
166
lib/krb5/store.c
@@ -721,3 +721,169 @@ cleanup:
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SC_CLIENT_PRINCIPAL 0x0001
|
||||||
|
#define SC_SERVER_PRINCIPAL 0x0002
|
||||||
|
#define SC_SESSION_KEY 0x0004
|
||||||
|
#define SC_TICKET 0x0008
|
||||||
|
#define SC_SECOND_TICKET 0x0010
|
||||||
|
#define SC_AUTHDATA 0x0020
|
||||||
|
#define SC_ADDRESSES 0x0040
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
krb5_error_code KRB5_LIB_FUNCTION
|
||||||
|
krb5_store_creds_tag(krb5_storage *sp,
|
||||||
|
krb5_creds *creds)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
int32_t header = 0;
|
||||||
|
|
||||||
|
if (creds->client)
|
||||||
|
header |= SC_CLIENT_PRINCIPAL;
|
||||||
|
if (creds->server)
|
||||||
|
header |= SC_SERVER_PRINCIPAL;
|
||||||
|
if (creds->session.keyvalue.data)
|
||||||
|
header |= SC_SESSION_KEY;
|
||||||
|
if (creds->ticket.data)
|
||||||
|
header |= SC_TICKET;
|
||||||
|
if (creds->second_ticket.length)
|
||||||
|
header |= SC_SECOND_TICKET;
|
||||||
|
if (creds->authdata.len)
|
||||||
|
header |= SC_AUTHDATA;
|
||||||
|
if (creds->addresses.len)
|
||||||
|
header |= SC_ADDRESSES;
|
||||||
|
|
||||||
|
ret = krb5_store_int32(sp, header);
|
||||||
|
|
||||||
|
if (creds->client) {
|
||||||
|
ret = krb5_store_principal(sp, creds->client);
|
||||||
|
if(ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (creds->server) {
|
||||||
|
ret = krb5_store_principal(sp, creds->server);
|
||||||
|
if(ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (creds->session.keyvalue.data) {
|
||||||
|
ret = krb5_store_keyblock(sp, creds->session);
|
||||||
|
if(ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = krb5_store_times(sp, creds->times);
|
||||||
|
if(ret)
|
||||||
|
return ret;
|
||||||
|
ret = krb5_store_int8(sp, creds->second_ticket.length != 0); /* is_skey */
|
||||||
|
if(ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = krb5_store_int32(sp, bitswap32(TicketFlags2int(creds->flags.b)));
|
||||||
|
if(ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (creds->addresses.len) {
|
||||||
|
ret = krb5_store_addrs(sp, creds->addresses);
|
||||||
|
if(ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (creds->authdata.len) {
|
||||||
|
ret = krb5_store_authdata(sp, creds->authdata);
|
||||||
|
if(ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (creds->ticket.data) {
|
||||||
|
ret = krb5_store_data(sp, creds->ticket);
|
||||||
|
if(ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (creds->second_ticket.data) {
|
||||||
|
ret = krb5_store_data(sp, creds->second_ticket);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
krb5_error_code KRB5_LIB_FUNCTION
|
||||||
|
krb5_ret_creds_tag(krb5_storage *sp,
|
||||||
|
krb5_creds *creds)
|
||||||
|
{
|
||||||
|
krb5_error_code ret;
|
||||||
|
int8_t dummy8;
|
||||||
|
int32_t dummy32, header;
|
||||||
|
|
||||||
|
memset(creds, 0, sizeof(*creds));
|
||||||
|
|
||||||
|
ret = krb5_ret_int32 (sp, &header);
|
||||||
|
if (ret) goto cleanup;
|
||||||
|
|
||||||
|
if (header & SC_CLIENT_PRINCIPAL) {
|
||||||
|
ret = krb5_ret_principal (sp, &creds->client);
|
||||||
|
if(ret) goto cleanup;
|
||||||
|
}
|
||||||
|
if (header & SC_SERVER_PRINCIPAL) {
|
||||||
|
ret = krb5_ret_principal (sp, &creds->server);
|
||||||
|
if(ret) goto cleanup;
|
||||||
|
}
|
||||||
|
if (header & SC_SESSION_KEY) {
|
||||||
|
ret = krb5_ret_keyblock (sp, &creds->session);
|
||||||
|
if(ret) goto cleanup;
|
||||||
|
}
|
||||||
|
ret = krb5_ret_times (sp, &creds->times);
|
||||||
|
if(ret) goto cleanup;
|
||||||
|
ret = krb5_ret_int8 (sp, &dummy8);
|
||||||
|
if(ret) goto cleanup;
|
||||||
|
ret = krb5_ret_int32 (sp, &dummy32);
|
||||||
|
if(ret) goto cleanup;
|
||||||
|
/*
|
||||||
|
* Runtime detect the what is the higher bits of the bitfield. If
|
||||||
|
* any of the higher bits are set in the input data, its either a
|
||||||
|
* new ticket flag (and this code need to be removed), or its a
|
||||||
|
* MIT cache (or new Heimdal cache), lets change it to our current
|
||||||
|
* format.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
u_int32_t mask = 0xffff0000;
|
||||||
|
creds->flags.i = 0;
|
||||||
|
creds->flags.b.anonymous = 1;
|
||||||
|
if (creds->flags.i & mask)
|
||||||
|
mask = ~mask;
|
||||||
|
if (dummy32 & mask)
|
||||||
|
dummy32 = bitswap32(dummy32);
|
||||||
|
}
|
||||||
|
creds->flags.i = dummy32;
|
||||||
|
if (header & SC_ADDRESSES) {
|
||||||
|
ret = krb5_ret_addrs (sp, &creds->addresses);
|
||||||
|
if(ret) goto cleanup;
|
||||||
|
}
|
||||||
|
if (header & SC_AUTHDATA) {
|
||||||
|
ret = krb5_ret_authdata (sp, &creds->authdata);
|
||||||
|
if(ret) goto cleanup;
|
||||||
|
}
|
||||||
|
if (header & SC_TICKET) {
|
||||||
|
ret = krb5_ret_data (sp, &creds->ticket);
|
||||||
|
if(ret) goto cleanup;
|
||||||
|
}
|
||||||
|
if (header & SC_SECOND_TICKET) {
|
||||||
|
ret = krb5_ret_data (sp, &creds->second_ticket);
|
||||||
|
if(ret) goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if(ret) {
|
||||||
|
#if 0
|
||||||
|
krb5_free_cred_contents(context, creds); /* XXX */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user