⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 store.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
    int ret;    if(!krb5_storage_is_flags(sp, KRB5_STORAGE_PRINCIPAL_NO_NAME_TYPE)) {	ret = krb5_store_int32(sp, p->name.name_type);	if(ret) return ret;    }    if(krb5_storage_is_flags(sp, KRB5_STORAGE_PRINCIPAL_WRONG_NUM_COMPONENTS))	ret = krb5_store_int32(sp, p->name.name_string.len + 1);    else	ret = krb5_store_int32(sp, p->name.name_string.len);        if(ret) return ret;    ret = krb5_store_string(sp, p->realm);    if(ret) return ret;    for(i = 0; i < p->name.name_string.len; i++){	ret = krb5_store_string(sp, p->name.name_string.val[i]);	if(ret) return ret;    }    return 0;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_ret_principal(krb5_storage *sp,		   krb5_principal *princ){    int i;    int ret;    krb5_principal p;    int32_t type;    int32_t ncomp;        p = calloc(1, sizeof(*p));    if(p == NULL)	return ENOMEM;    if(krb5_storage_is_flags(sp, KRB5_STORAGE_PRINCIPAL_NO_NAME_TYPE))	type = KRB5_NT_UNKNOWN;    else if((ret = krb5_ret_int32(sp, &type))){	free(p);	return ret;    }    if((ret = krb5_ret_int32(sp, &ncomp))){	free(p);	return ret;    }    if(krb5_storage_is_flags(sp, KRB5_STORAGE_PRINCIPAL_WRONG_NUM_COMPONENTS))	ncomp--;    if (ncomp < 0) {	free(p);	return EINVAL;    }    p->name.name_type = type;    p->name.name_string.len = ncomp;    ret = krb5_ret_string(sp, &p->realm);    if(ret) {	free(p);	return ret;    }    p->name.name_string.val = calloc(ncomp, sizeof(*p->name.name_string.val));    if(p->name.name_string.val == NULL && ncomp != 0){	free(p->realm);	free(p);	return ENOMEM;    }    for(i = 0; i < ncomp; i++){	ret = krb5_ret_string(sp, &p->name.name_string.val[i]);	if(ret) {	    while (i >= 0)		free(p->name.name_string.val[i--]);	    free(p->realm);	    free(p);	    return ret;	}    }    *princ = p;    return 0;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_store_keyblock(krb5_storage *sp, krb5_keyblock p){    int ret;    ret = krb5_store_int16(sp, p.keytype);    if(ret) return ret;    if(krb5_storage_is_flags(sp, KRB5_STORAGE_KEYBLOCK_KEYTYPE_TWICE)){	/* this should really be enctype, but it is the same as           keytype nowadays */    ret = krb5_store_int16(sp, p.keytype);    if(ret) return ret;    }    ret = krb5_store_data(sp, p.keyvalue);    return ret;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_ret_keyblock(krb5_storage *sp, krb5_keyblock *p){    int ret;    int16_t tmp;    ret = krb5_ret_int16(sp, &tmp);    if(ret) return ret;    p->keytype = tmp;    if(krb5_storage_is_flags(sp, KRB5_STORAGE_KEYBLOCK_KEYTYPE_TWICE)){    ret = krb5_ret_int16(sp, &tmp);    if(ret) return ret;    }    ret = krb5_ret_data(sp, &p->keyvalue);    return ret;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_store_times(krb5_storage *sp, krb5_times times){    int ret;    ret = krb5_store_int32(sp, times.authtime);    if(ret) return ret;    ret = krb5_store_int32(sp, times.starttime);    if(ret) return ret;    ret = krb5_store_int32(sp, times.endtime);    if(ret) return ret;    ret = krb5_store_int32(sp, times.renew_till);    return ret;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_ret_times(krb5_storage *sp, krb5_times *times){    int ret;    int32_t tmp;    ret = krb5_ret_int32(sp, &tmp);    times->authtime = tmp;    if(ret) return ret;    ret = krb5_ret_int32(sp, &tmp);    times->starttime = tmp;    if(ret) return ret;    ret = krb5_ret_int32(sp, &tmp);    times->endtime = tmp;    if(ret) return ret;    ret = krb5_ret_int32(sp, &tmp);    times->renew_till = tmp;    return ret;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_store_address(krb5_storage *sp, krb5_address p){    int ret;    ret = krb5_store_int16(sp, p.addr_type);    if(ret) return ret;    ret = krb5_store_data(sp, p.address);    return ret;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_ret_address(krb5_storage *sp, krb5_address *adr){    int16_t t;    int ret;    ret = krb5_ret_int16(sp, &t);    if(ret) return ret;    adr->addr_type = t;    ret = krb5_ret_data(sp, &adr->address);    return ret;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_store_addrs(krb5_storage *sp, krb5_addresses p){    int i;    int ret;    ret = krb5_store_int32(sp, p.len);    if(ret) return ret;    for(i = 0; i<p.len; i++){	ret = krb5_store_address(sp, p.val[i]);	if(ret) break;    }    return ret;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_ret_addrs(krb5_storage *sp, krb5_addresses *adr){    int i;    int ret;    int32_t tmp;    ret = krb5_ret_int32(sp, &tmp);    if(ret) return ret;    adr->len = tmp;    ALLOC(adr->val, adr->len);    if (adr->val == NULL && adr->len != 0)	return ENOMEM;    for(i = 0; i < adr->len; i++){	ret = krb5_ret_address(sp, &adr->val[i]);	if(ret) break;    }    return ret;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_store_authdata(krb5_storage *sp, krb5_authdata auth){    krb5_error_code ret;    int i;    ret = krb5_store_int32(sp, auth.len);    if(ret) return ret;    for(i = 0; i < auth.len; i++){	ret = krb5_store_int16(sp, auth.val[i].ad_type);	if(ret) break;	ret = krb5_store_data(sp, auth.val[i].ad_data);	if(ret) break;    }    return 0;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_ret_authdata(krb5_storage *sp, krb5_authdata *auth){    krb5_error_code ret;    int32_t tmp;    int16_t tmp2;    int i;    ret = krb5_ret_int32(sp, &tmp);    if(ret) return ret;    ALLOC_SEQ(auth, tmp);    if (auth->val == NULL && tmp != 0)	return ENOMEM;    for(i = 0; i < tmp; i++){	ret = krb5_ret_int16(sp, &tmp2);	if(ret) break;	auth->val[i].ad_type = tmp2;	ret = krb5_ret_data(sp, &auth->val[i].ad_data);	if(ret) break;    }    return ret;}static int32_tbitswap32(int32_t b){    int32_t r = 0;    int i;    for (i = 0; i < 32; i++) {	r = r << 1 | (b & 1);	b = b >> 1;    }    return r;}/* * */krb5_error_code KRB5_LIB_FUNCTIONkrb5_store_creds(krb5_storage *sp, krb5_creds *creds){    int ret;    ret = krb5_store_principal(sp, creds->client);    if(ret)	return ret;    ret = krb5_store_principal(sp, creds->server);    if(ret)	return ret;    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;    if(krb5_storage_is_flags(sp, KRB5_STORAGE_CREDS_FLAGS_WRONG_BITORDER))	ret = krb5_store_int32(sp, creds->flags.i);    else	ret = krb5_store_int32(sp, bitswap32(TicketFlags2int(creds->flags.b)));    if(ret)	return ret;    ret = krb5_store_addrs(sp, creds->addresses);    if(ret)	return ret;    ret = krb5_store_authdata(sp, creds->authdata);    if(ret)	return ret;    ret = krb5_store_data(sp, creds->ticket);    if(ret)	return ret;    ret = krb5_store_data(sp, creds->second_ticket);    return ret;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_ret_creds(krb5_storage *sp, krb5_creds *creds){    krb5_error_code ret;    int8_t dummy8;    int32_t dummy32;    memset(creds, 0, sizeof(*creds));    ret = krb5_ret_principal (sp,  &creds->client);    if(ret) goto cleanup;    ret = krb5_ret_principal (sp,  &creds->server);    if(ret) goto cleanup;    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, it's either a     * new ticket flag (and this code need to be removed), or it's a     * MIT cache (or new Heimdal cache), lets change it to our current     * format.     */    {	uint32_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;    ret = krb5_ret_addrs (sp,  &creds->addresses);    if(ret) goto cleanup;    ret = krb5_ret_authdata (sp,  &creds->authdata);    if(ret) goto cleanup;    ret = krb5_ret_data (sp,  &creds->ticket);    if(ret) goto cleanup;    ret = krb5_ret_data (sp,  &creds->second_ticket);cleanup:    if(ret) {#if 0		krb5_free_cred_contents(context, creds); /* XXX */#endif    }    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_FUNCTIONkrb5_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.keytype != ETYPE_NULL)	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.keytype != ETYPE_NULL) {	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_FUNCTIONkrb5_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, it's either a     * new ticket flag (and this code need to be removed), or it's a     * MIT cache (or new Heimdal cache), lets change it to our current     * format.     */    {	uint32_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;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -