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

📄 v4_glue.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1997 - 2005 Kungliga Tekniska H鰃skolan * (Royal Institute of Technology, Stockholm, Sweden).  * All rights reserved.  * * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  * * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright  *    notice, this list of conditions and the following disclaimer in the  *    documentation and/or other materials provided with the distribution.  * * 3. Neither the name of the Institute nor the names of its contributors  *    may be used to endorse or promote products derived from this software  *    without specific prior written permission.  * * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  * SUCH DAMAGE.  */#include "krb5_locl.h"RCSID("$Id: v4_glue.c 22071 2007-11-14 20:04:50Z lha $");#include "krb5-v4compat.h"/* * */#define RCHECK(r,func,label) \	do { (r) = func ; if (r) goto label; } while(0);/* include this here, to avoid dependencies on libkrb */static const int _tkt_lifetimes[TKTLIFENUMFIXED] = {   38400,   41055,   43894,   46929,   50174,   53643,   57352,   61318,   65558,   70091,   74937,   80119,   85658,   91581,   97914,  104684,  111922,  119661,  127935,  136781,  146239,  156350,  167161,  178720,  191077,  204289,  218415,  233517,  249664,  266926,  285383,  305116,  326213,  348769,  372885,  398668,  426234,  455705,  487215,  520904,  556921,  595430,  636601,  680618,  727680,  777995,  831789,  889303,  950794, 1016537, 1086825, 1161973, 1242318, 1328218, 1420057, 1518247, 1623226, 1735464, 1855462, 1983758, 2120925, 2267576, 2424367, 2592000};int KRB5_LIB_FUNCTION_krb5_krb_time_to_life(time_t start, time_t end){    int i;    time_t life = end - start;    if (life > MAXTKTLIFETIME || life <= 0) 	return 0;#if 0        if (krb_no_long_lifetimes) 	return (life + 5*60 - 1)/(5*60);#endif        if (end >= NEVERDATE)	return TKTLIFENOEXPIRE;    if (life < _tkt_lifetimes[0]) 	return (life + 5*60 - 1)/(5*60);    for (i=0; i<TKTLIFENUMFIXED; i++)	if (life <= _tkt_lifetimes[i])	    return i + TKTLIFEMINFIXED;    return 0;    }time_t KRB5_LIB_FUNCTION_krb5_krb_life_to_time(int start, int life_){    unsigned char life = (unsigned char) life_;#if 0        if (krb_no_long_lifetimes)	return start + life*5*60;#endif    if (life == TKTLIFENOEXPIRE)	return NEVERDATE;    if (life < TKTLIFEMINFIXED)	return start + life*5*60;    if (life > TKTLIFEMAXFIXED)	return start + MAXTKTLIFETIME;    return start + _tkt_lifetimes[life - TKTLIFEMINFIXED];}/* * Get the name of the krb4 credentials cache, will use `tkfile' as * the name if that is passed in. `cc' must be free()ed by caller, */static krb5_error_codeget_krb4_cc_name(const char *tkfile, char **cc){    *cc = NULL;    if(tkfile == NULL) {	char *path;	if(!issuid()) {	    path = getenv("KRBTKFILE");	    if (path)		*cc = strdup(path);	}	if(*cc == NULL)	    if (asprintf(cc, "%s%u", TKT_ROOT, (unsigned)getuid()) < 0)		return errno;    } else {	*cc = strdup(tkfile);	if (*cc == NULL)	    return ENOMEM;    }    return 0;}/* * Write a Kerberos 4 ticket file */#define KRB5_TF_LCK_RETRY_COUNT 50#define KRB5_TF_LCK_RETRY 1static krb5_error_codewrite_v4_cc(krb5_context context, const char *tkfile, 	    krb5_storage *sp, int append){    krb5_error_code ret;    struct stat sb;    krb5_data data;    char *path;    int fd, i;    ret = get_krb4_cc_name(tkfile, &path);    if (ret) {	krb5_set_error_string(context, 			      "krb5_krb_tf_setup: failed getting "			      "the krb4 credentials cache name"); 	return ret;    }    fd = open(path, O_WRONLY|O_CREAT, 0600);    if (fd < 0) {	ret = errno;	krb5_set_error_string(context, 			      "krb5_krb_tf_setup: error opening file %s", 			      path);	free(path);	return ret;    }    if (fstat(fd, &sb) != 0 || !S_ISREG(sb.st_mode)) {	krb5_set_error_string(context, 			      "krb5_krb_tf_setup: tktfile %s is not a file",			      path);	free(path);	close(fd);	return KRB5_FCC_PERM;    }    for (i = 0; i < KRB5_TF_LCK_RETRY_COUNT; i++) {	if (flock(fd, LOCK_EX | LOCK_NB) < 0) {	    sleep(KRB5_TF_LCK_RETRY);	} else	    break;    }    if (i == KRB5_TF_LCK_RETRY_COUNT) {	krb5_set_error_string(context,			      "krb5_krb_tf_setup: failed to lock %s",			      path);	free(path);	close(fd);	return KRB5_FCC_PERM;    }    if (!append) {	ret = ftruncate(fd, 0);	if (ret < 0) {	    flock(fd, LOCK_UN);	    krb5_set_error_string(context,				  "krb5_krb_tf_setup: failed to truncate %s",				  path);	    free(path);	    close(fd);	    return KRB5_FCC_PERM;	}    }    ret = lseek(fd, 0L, SEEK_END);    if (ret < 0) {	ret = errno;	flock(fd, LOCK_UN);	free(path);	close(fd);	return ret;    }    krb5_storage_to_data(sp, &data);    ret = write(fd, data.data, data.length);    if (ret != data.length)	ret = KRB5_CC_IO;    krb5_free_data_contents(context, &data);    flock(fd, LOCK_UN);    free(path);    close(fd);    return 0;}/* * */krb5_error_code KRB5_LIB_FUNCTION_krb5_krb_tf_setup(krb5_context context, 		   struct credentials *v4creds, 		   const char *tkfile,		   int append){    krb5_error_code ret;    krb5_storage *sp;    sp = krb5_storage_emem();    if (sp == NULL)	return ENOMEM;    krb5_storage_set_byteorder(sp, KRB5_STORAGE_BYTEORDER_HOST);    krb5_storage_set_eof_code(sp, KRB5_CC_IO);    krb5_clear_error_string(context);    if (!append) {	RCHECK(ret, krb5_store_stringz(sp, v4creds->pname), error);	RCHECK(ret, krb5_store_stringz(sp, v4creds->pinst), error);    }    /* cred */    RCHECK(ret, krb5_store_stringz(sp, v4creds->service), error);    RCHECK(ret, krb5_store_stringz(sp, v4creds->instance), error);    RCHECK(ret, krb5_store_stringz(sp, v4creds->realm), error);    ret = krb5_storage_write(sp, v4creds->session, 8);    if (ret != 8) {	ret = KRB5_CC_IO;	goto error;    }    RCHECK(ret, krb5_store_int32(sp, v4creds->lifetime), error);    RCHECK(ret, krb5_store_int32(sp, v4creds->kvno), error);    RCHECK(ret, krb5_store_int32(sp, v4creds->ticket_st.length), error);    ret = krb5_storage_write(sp, v4creds->ticket_st.dat, 			     v4creds->ticket_st.length);    if (ret != v4creds->ticket_st.length) {	ret = KRB5_CC_IO;	goto error;    }    RCHECK(ret, krb5_store_int32(sp, v4creds->issue_date), error);    ret = write_v4_cc(context, tkfile, sp, append); error:    krb5_storage_free(sp);    return ret;}/* * */krb5_error_code KRB5_LIB_FUNCTION_krb5_krb_dest_tkt(krb5_context context, const char *tkfile){    krb5_error_code ret;    char *path;    ret = get_krb4_cc_name(tkfile, &path);    if (ret) {	krb5_set_error_string(context, 			      "krb5_krb_tf_setup: failed getting "			      "the krb4 credentials cache name"); 	return ret;    }    if (unlink(path) < 0) {	ret = errno;	krb5_set_error_string(context, 			      "krb5_krb_dest_tkt failed removing the cache "			      "with error %s", strerror(ret));    }    free(path);    return ret;}/* * */static krb5_error_codedecrypt_etext(krb5_context context, const krb5_keyblock *key,	      const krb5_data *cdata, krb5_data *data){    krb5_error_code ret;    krb5_crypto crypto;    ret = krb5_crypto_init(context, key, ETYPE_DES_PCBC_NONE, &crypto);    if (ret)	return ret;    ret = krb5_decrypt(context, crypto, 0, cdata->data, cdata->length, data);    krb5_crypto_destroy(context, crypto);    return ret;}/* * */static const char eightzeros[8] = "\x00\x00\x00\x00\x00\x00\x00\x00";static krb5_error_codestorage_to_etext(krb5_context context,		 krb5_storage *sp,		 const krb5_keyblock *key, 		 krb5_data *enc_data){    krb5_error_code ret;    krb5_crypto crypto;    krb5_ssize_t size;    krb5_data data;    /* multiple of eight bytes */    size = krb5_storage_seek(sp, 0, SEEK_END);    if (size < 0)	return KRB4ET_RD_AP_UNDEC;    size = 8 - (size & 7);    ret = krb5_storage_write(sp, eightzeros, size);    if (ret != size)	return KRB4ET_RD_AP_UNDEC;    ret = krb5_storage_to_data(sp, &data);    if (ret)	return ret;    ret = krb5_crypto_init(context, key, ETYPE_DES_PCBC_NONE, &crypto);    if (ret) {	krb5_data_free(&data);	return ret;    }    ret = krb5_encrypt(context, crypto, 0, data.data, data.length, enc_data);    krb5_data_free(&data);    krb5_crypto_destroy(context, crypto);    return ret;}/* * */static krb5_error_codeput_nir(krb5_storage *sp, const char *name,	const char *instance, const char *realm){    krb5_error_code ret;    RCHECK(ret, krb5_store_stringz(sp, name), error);    RCHECK(ret, krb5_store_stringz(sp, instance), error);    if (realm) {	RCHECK(ret, krb5_store_stringz(sp, realm), error);    } error:    return ret;}/* * */krb5_error_code KRB5_LIB_FUNCTION_krb5_krb_create_ticket(krb5_context context,			unsigned char flags,			const char *pname,			const char *pinstance,			const char *prealm,			int32_t paddress,			const krb5_keyblock *session,			int16_t life,			int32_t life_sec,			const char *sname,			const char *sinstance,			const krb5_keyblock *key,			krb5_data *enc_data){    krb5_error_code ret;    krb5_storage *sp;    krb5_data_zero(enc_data);    sp = krb5_storage_emem();    if (sp == NULL) {	krb5_set_error_string(context, "malloc: out of memory");	return ENOMEM;    }    krb5_storage_set_byteorder(sp, KRB5_STORAGE_BYTEORDER_BE);    RCHECK(ret, krb5_store_int8(sp, flags), error);    RCHECK(ret, put_nir(sp, pname, pinstance, prealm), error);    RCHECK(ret, krb5_store_int32(sp, ntohl(paddress)), error);    /* session key */    ret = krb5_storage_write(sp,			     session->keyvalue.data, 			     session->keyvalue.length);    if (ret != session->keyvalue.length) {	ret = KRB4ET_INTK_PROT;	goto error;    }    RCHECK(ret, krb5_store_int8(sp, life), error);    RCHECK(ret, krb5_store_int32(sp, life_sec), error);    RCHECK(ret, put_nir(sp, sname, sinstance, NULL), error);    ret = storage_to_etext(context, sp, key, enc_data); error:    krb5_storage_free(sp);    if (ret)	krb5_set_error_string(context, "Failed to encode kerberos 4 ticket");    return ret;}/* * */krb5_error_code KRB5_LIB_FUNCTION_krb5_krb_create_ciph(krb5_context context,		      const krb5_keyblock *session,		      const char *service,		      const char *instance,		      const char *realm,		      uint32_t life,		      unsigned char kvno,		      const krb5_data *ticket,		      uint32_t kdc_time,		      const krb5_keyblock *key,

⌨️ 快捷键说明

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