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

📄 get_cred.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * Copyright (c) 1997 - 2007 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: get_cred.c 22530 2008-01-27 11:48:16Z lha $");/* * Take the `body' and encode it into `padata' using the credentials * in `creds'. */static krb5_error_codemake_pa_tgs_req(krb5_context context, 		krb5_auth_context ac,		KDC_REQ_BODY *body,		PA_DATA *padata,		krb5_creds *creds,		krb5_key_usage usage){    u_char *buf;    size_t buf_size;    size_t len;    krb5_data in_data;    krb5_error_code ret;    ASN1_MALLOC_ENCODE(KDC_REQ_BODY, buf, buf_size, body, &len, ret);    if (ret)	goto out;    if(buf_size != len)	krb5_abortx(context, "internal error in ASN.1 encoder");    in_data.length = len;    in_data.data   = buf;    ret = _krb5_mk_req_internal(context, &ac, 0, &in_data, creds,				&padata->padata_value,				KRB5_KU_TGS_REQ_AUTH_CKSUM,				usage				/* KRB5_KU_TGS_REQ_AUTH */); out:    free (buf);    if(ret)	return ret;    padata->padata_type = KRB5_PADATA_TGS_REQ;    return 0;}/* * Set the `enc-authorization-data' in `req_body' based on `authdata' */static krb5_error_codeset_auth_data (krb5_context context,	       KDC_REQ_BODY *req_body,	       krb5_authdata *authdata,	       krb5_keyblock *key){    if(authdata->len) {	size_t len, buf_size;	unsigned char *buf;	krb5_crypto crypto;	krb5_error_code ret;	ASN1_MALLOC_ENCODE(AuthorizationData, buf, buf_size, authdata,			   &len, ret);	if (ret)	    return ret;	if (buf_size != len)	    krb5_abortx(context, "internal error in ASN.1 encoder");	ALLOC(req_body->enc_authorization_data, 1);	if (req_body->enc_authorization_data == NULL) {	    free (buf);	    krb5_set_error_string(context, "malloc: out of memory");	    return ENOMEM;	}	ret = krb5_crypto_init(context, key, 0, &crypto);	if (ret) {	    free (buf);	    free (req_body->enc_authorization_data);	    req_body->enc_authorization_data = NULL;	    return ret;	}	krb5_encrypt_EncryptedData(context, 				   crypto,				   KRB5_KU_TGS_REQ_AUTH_DAT_SUBKEY, 				   /* KRB5_KU_TGS_REQ_AUTH_DAT_SESSION? */				   buf,				   len,				   0,				   req_body->enc_authorization_data);	free (buf);	krb5_crypto_destroy(context, crypto);    } else {	req_body->enc_authorization_data = NULL;    }    return 0;}    /* * Create a tgs-req in `t' with `addresses', `flags', `second_ticket' * (if not-NULL), `in_creds', `krbtgt', and returning the generated * subkey in `subkey'. */static krb5_error_codeinit_tgs_req (krb5_context context,	      krb5_ccache ccache,	      krb5_addresses *addresses,	      krb5_kdc_flags flags,	      Ticket *second_ticket,	      krb5_creds *in_creds,	      krb5_creds *krbtgt,	      unsigned nonce,	      const METHOD_DATA *padata,	      krb5_keyblock **subkey,	      TGS_REQ *t,	      krb5_key_usage usage){    krb5_error_code ret = 0;    memset(t, 0, sizeof(*t));    t->pvno = 5;    t->msg_type = krb_tgs_req;    if (in_creds->session.keytype) {	ALLOC_SEQ(&t->req_body.etype, 1);	if(t->req_body.etype.val == NULL) {	    ret = ENOMEM;	    krb5_set_error_string(context, "malloc: out of memory");	    goto fail;	}	t->req_body.etype.val[0] = in_creds->session.keytype;    } else {	ret = krb5_init_etype(context, 			      &t->req_body.etype.len, 			      &t->req_body.etype.val, 			      NULL);    }    if (ret)	goto fail;    t->req_body.addresses = addresses;    t->req_body.kdc_options = flags.b;    ret = copy_Realm(&in_creds->server->realm, &t->req_body.realm);    if (ret)	goto fail;    ALLOC(t->req_body.sname, 1);    if (t->req_body.sname == NULL) {	ret = ENOMEM;	krb5_set_error_string(context, "malloc: out of memory");	goto fail;    }    /* some versions of some code might require that the client be       present in TGS-REQs, but this is clearly against the spec */    ret = copy_PrincipalName(&in_creds->server->name, t->req_body.sname);    if (ret)	goto fail;    /* req_body.till should be NULL if there is no endtime specified,       but old MIT code (like DCE secd) doesn't like that */    ALLOC(t->req_body.till, 1);    if(t->req_body.till == NULL){	ret = ENOMEM;	krb5_set_error_string(context, "malloc: out of memory");	goto fail;    }    *t->req_body.till = in_creds->times.endtime;        t->req_body.nonce = nonce;    if(second_ticket){	ALLOC(t->req_body.additional_tickets, 1);	if (t->req_body.additional_tickets == NULL) {	    ret = ENOMEM;	    krb5_set_error_string(context, "malloc: out of memory");	    goto fail;	}	ALLOC_SEQ(t->req_body.additional_tickets, 1);	if (t->req_body.additional_tickets->val == NULL) {	    ret = ENOMEM;	    krb5_set_error_string(context, "malloc: out of memory");	    goto fail;	}	ret = copy_Ticket(second_ticket, t->req_body.additional_tickets->val); 	if (ret)	    goto fail;    }    ALLOC(t->padata, 1);    if (t->padata == NULL) {	ret = ENOMEM;	krb5_set_error_string(context, "malloc: out of memory");	goto fail;    }    ALLOC_SEQ(t->padata, 1 + padata->len);    if (t->padata->val == NULL) {	ret = ENOMEM;	krb5_set_error_string(context, "malloc: out of memory");	goto fail;    }    {	int i;	for (i = 0; i < padata->len; i++) {	    ret = copy_PA_DATA(&padata->val[i], &t->padata->val[i + 1]);	    if (ret) {		krb5_set_error_string(context, "malloc: out of memory");		goto fail;	    }	}    }    {	krb5_auth_context ac;	krb5_keyblock *key = NULL;	ret = krb5_auth_con_init(context, &ac);	if(ret)	    goto fail;	if (krb5_config_get_bool_default(context, NULL, FALSE,					 "realms",					 krbtgt->server->realm,					 "tgs_require_subkey",					 NULL))	{	    ret = krb5_generate_subkey (context, &krbtgt->session, &key);	    if (ret) {		krb5_auth_con_free (context, ac);		goto fail;	    }	    ret = krb5_auth_con_setlocalsubkey(context, ac, key);	    if (ret) {		if (key)		    krb5_free_keyblock (context, key);		krb5_auth_con_free (context, ac);		goto fail;	    }	}	ret = set_auth_data (context, &t->req_body, &in_creds->authdata,			     key ? key : &krbtgt->session);	if (ret) {	    if (key)		krb5_free_keyblock (context, key);	    krb5_auth_con_free (context, ac);	    goto fail;	}	ret = make_pa_tgs_req(context,			      ac,			      &t->req_body, 			      &t->padata->val[0],			      krbtgt,			      usage);	if(ret) {	    if (key)		krb5_free_keyblock (context, key);	    krb5_auth_con_free(context, ac);	    goto fail;	}	*subkey = key;		krb5_auth_con_free(context, ac);    }fail:    if (ret) {	t->req_body.addresses = NULL;	free_TGS_REQ (t);    }    return ret;}krb5_error_code_krb5_get_krbtgt(krb5_context context,		 krb5_ccache  id,		 krb5_realm realm,		 krb5_creds **cred){    krb5_error_code ret;    krb5_creds tmp_cred;    memset(&tmp_cred, 0, sizeof(tmp_cred));    ret = krb5_cc_get_principal(context, id, &tmp_cred.client);    if (ret)	return ret;    ret = krb5_make_principal(context, 			      &tmp_cred.server,			      realm,			      KRB5_TGS_NAME,			      realm,			      NULL);    if(ret) {	krb5_free_principal(context, tmp_cred.client);	return ret;    }    ret = krb5_get_credentials(context,			       KRB5_GC_CACHED,			       id,			       &tmp_cred,			       cred);    krb5_free_principal(context, tmp_cred.client);    krb5_free_principal(context, tmp_cred.server);    if(ret)	return ret;    return 0;}/* DCE compatible decrypt proc */static krb5_error_codedecrypt_tkt_with_subkey (krb5_context context,			 krb5_keyblock *key,			 krb5_key_usage usage,			 krb5_const_pointer subkey,			 krb5_kdc_rep *dec_rep){    krb5_error_code ret;    krb5_data data;    size_t size;    krb5_crypto crypto;        ret = krb5_crypto_init(context, key, 0, &crypto);    if (ret)	return ret;    ret = krb5_decrypt_EncryptedData (context,				      crypto,				      usage,				      &dec_rep->kdc_rep.enc_part,				      &data);    krb5_crypto_destroy(context, crypto);    if(ret && subkey){	/* DCE compat -- try to decrypt with subkey */	ret = krb5_crypto_init(context, subkey, 0, &crypto);	if (ret)	    return ret;	ret = krb5_decrypt_EncryptedData (context,					  crypto,					  KRB5_KU_TGS_REP_ENC_PART_SUB_KEY,					  &dec_rep->kdc_rep.enc_part,					  &data);	krb5_crypto_destroy(context, crypto);    }    if (ret)	return ret;        ret = krb5_decode_EncASRepPart(context,				   data.data,				   data.length,				   &dec_rep->enc_part, 				   &size);    if (ret)	ret = krb5_decode_EncTGSRepPart(context,					data.data,					data.length,					&dec_rep->enc_part, 					&size);    krb5_data_free (&data);    return ret;}static krb5_error_codeget_cred_kdc_usage(krb5_context context, 		   krb5_ccache id, 		   krb5_kdc_flags flags,		   krb5_addresses *addresses, 		   krb5_creds *in_creds,		   krb5_creds *krbtgt,		   krb5_principal impersonate_principal,		   Ticket *second_ticket,		   krb5_creds *out_creds,		   krb5_key_usage usage){    TGS_REQ req;    krb5_data enc;    krb5_data resp;    krb5_kdc_rep rep;    KRB_ERROR error;    krb5_error_code ret;    unsigned nonce;    krb5_keyblock *subkey = NULL;    size_t len;    Ticket second_ticket_data;    METHOD_DATA padata;        krb5_data_zero(&resp);    krb5_data_zero(&enc);    padata.val = NULL;    padata.len = 0;    krb5_generate_random_block(&nonce, sizeof(nonce));    nonce &= 0xffffffff;        if(flags.b.enc_tkt_in_skey && second_ticket == NULL){

⌨️ 快捷键说明

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