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;
|
||||
}
|
||||
|
||||
#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