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

📄 get_in_tkt.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
    if(salt == &salt2)	krb5_free_salt(context, salt2);    return 0;}static krb5_error_codeinit_as_req (krb5_context context,	     KDCOptions opts,	     krb5_creds *creds,	     const krb5_addresses *addrs,	     const krb5_enctype *etypes,	     const krb5_preauthtype *ptypes,	     const krb5_preauthdata *preauth,	     krb5_key_proc key_proc,	     krb5_const_pointer keyseed,	     unsigned nonce,	     AS_REQ *a){    krb5_error_code ret;    krb5_salt salt;    memset(a, 0, sizeof(*a));    a->pvno = 5;    a->msg_type = krb_as_req;    a->req_body.kdc_options = opts;    a->req_body.cname = malloc(sizeof(*a->req_body.cname));    if (a->req_body.cname == NULL) {	ret = ENOMEM;	krb5_set_error_string(context, "malloc: out of memory");	goto fail;    }    a->req_body.sname = malloc(sizeof(*a->req_body.sname));    if (a->req_body.sname == NULL) {	ret = ENOMEM;	krb5_set_error_string(context, "malloc: out of memory");	goto fail;    }    ret = _krb5_principal2principalname (a->req_body.cname, creds->client);    if (ret)	goto fail;    ret = _krb5_principal2principalname (a->req_body.sname, creds->server);    if (ret)	goto fail;    ret = copy_Realm(&creds->client->realm, &a->req_body.realm);    if (ret)	goto fail;    if(creds->times.starttime) {	a->req_body.from = malloc(sizeof(*a->req_body.from));	if (a->req_body.from == NULL) {	    ret = ENOMEM;	    krb5_set_error_string(context, "malloc: out of memory");	    goto fail;	}	*a->req_body.from = creds->times.starttime;    }    if(creds->times.endtime){	ALLOC(a->req_body.till, 1);	*a->req_body.till = creds->times.endtime;    }    if(creds->times.renew_till){	a->req_body.rtime = malloc(sizeof(*a->req_body.rtime));	if (a->req_body.rtime == NULL) {	    ret = ENOMEM;	    krb5_set_error_string(context, "malloc: out of memory");	    goto fail;	}	*a->req_body.rtime = creds->times.renew_till;    }    a->req_body.nonce = nonce;    ret = krb5_init_etype (context,			   &a->req_body.etype.len,			   &a->req_body.etype.val,			   etypes);    if (ret)	goto fail;    /*     * This means no addresses     */    if (addrs && addrs->len == 0) {	a->req_body.addresses = NULL;    } else {	a->req_body.addresses = malloc(sizeof(*a->req_body.addresses));	if (a->req_body.addresses == NULL) {	    ret = ENOMEM;	    krb5_set_error_string(context, "malloc: out of memory");	    goto fail;	}	if (addrs)	    ret = krb5_copy_addresses(context, addrs, a->req_body.addresses);	else {	    ret = krb5_get_all_client_addrs (context, a->req_body.addresses);	    if(ret == 0 && a->req_body.addresses->len == 0) {		free(a->req_body.addresses);		a->req_body.addresses = NULL;	    }	}	if (ret)	    return ret;    }    a->req_body.enc_authorization_data = NULL;    a->req_body.additional_tickets = NULL;    if(preauth != NULL) {	int i;	ALLOC(a->padata, 1);	if(a->padata == NULL) {	    ret = ENOMEM;	    krb5_set_error_string(context, "malloc: out of memory");	    goto fail;	}	a->padata->val = NULL;	a->padata->len = 0;	for(i = 0; i < preauth->len; i++) {	    if(preauth->val[i].type == KRB5_PADATA_ENC_TIMESTAMP){		int j;		for(j = 0; j < preauth->val[i].info.len; j++) {		    krb5_salt *sp = &salt;		    if(preauth->val[i].info.val[j].salttype)			salt.salttype = *preauth->val[i].info.val[j].salttype;		    else			salt.salttype = KRB5_PW_SALT;		    if(preauth->val[i].info.val[j].salt)			salt.saltvalue = *preauth->val[i].info.val[j].salt;		    else			if(salt.salttype == KRB5_PW_SALT)			    sp = NULL;			else			    krb5_data_zero(&salt.saltvalue);		    ret = add_padata(context, a->padata, creds->client, 				     key_proc, keyseed, 				     &preauth->val[i].info.val[j].etype, 1,				     sp);		    if (ret == 0)			break;		}	    }	}    } else     /* not sure this is the way to use `ptypes' */    if (ptypes == NULL || *ptypes == KRB5_PADATA_NONE)	a->padata = NULL;    else if (*ptypes ==  KRB5_PADATA_ENC_TIMESTAMP) {	ALLOC(a->padata, 1);	if (a->padata == NULL) {	    ret = ENOMEM;	    krb5_set_error_string(context, "malloc: out of memory");	    goto fail;	}	a->padata->len = 0;	a->padata->val = NULL;	/* make a v5 salted pa-data */	add_padata(context, a->padata, creds->client, 		   key_proc, keyseed, a->req_body.etype.val,		   a->req_body.etype.len, NULL);		/* make a v4 salted pa-data */	salt.salttype = KRB5_PW_SALT;	krb5_data_zero(&salt.saltvalue);	add_padata(context, a->padata, creds->client, 		   key_proc, keyseed, a->req_body.etype.val,		   a->req_body.etype.len, &salt);    } else {	krb5_set_error_string (context, "pre-auth type %d not supported",			       *ptypes);	ret = KRB5_PREAUTH_BAD_TYPE;	goto fail;    }    return 0;fail:    free_AS_REQ(a);    return ret;}static intset_ptypes(krb5_context context,	   KRB_ERROR *error, 	   const krb5_preauthtype **ptypes,	   krb5_preauthdata **preauth){    static krb5_preauthdata preauth2;    static krb5_preauthtype ptypes2[] = { KRB5_PADATA_ENC_TIMESTAMP, KRB5_PADATA_NONE };    if(error->e_data) {	METHOD_DATA md;	int i;	decode_METHOD_DATA(error->e_data->data, 			   error->e_data->length, 			   &md, 			   NULL);	for(i = 0; i < md.len; i++){	    switch(md.val[i].padata_type){	    case KRB5_PADATA_ENC_TIMESTAMP:		*ptypes = ptypes2;		break;	    case KRB5_PADATA_ETYPE_INFO:		*preauth = &preauth2;		ALLOC_SEQ(*preauth, 1);		(*preauth)->val[0].type = KRB5_PADATA_ENC_TIMESTAMP;		krb5_decode_ETYPE_INFO(context,				       md.val[i].padata_value.data, 				       md.val[i].padata_value.length,				       &(*preauth)->val[0].info,				       NULL);		break;	    default:		break;	    }	}	free_METHOD_DATA(&md);    } else {	*ptypes = ptypes2;    }    return(1);}krb5_error_code KRB5_LIB_FUNCTIONkrb5_get_in_cred(krb5_context context,		 krb5_flags options,		 const krb5_addresses *addrs,		 const krb5_enctype *etypes,		 const krb5_preauthtype *ptypes,		 const krb5_preauthdata *preauth,		 krb5_key_proc key_proc,		 krb5_const_pointer keyseed,		 krb5_decrypt_proc decrypt_proc,		 krb5_const_pointer decryptarg,		 krb5_creds *creds,		 krb5_kdc_rep *ret_as_reply){    krb5_error_code ret;    AS_REQ a;    krb5_kdc_rep rep;    krb5_data req, resp;    size_t len;    krb5_salt salt;    krb5_keyblock *key;    size_t size;    KDCOptions opts;    PA_DATA *pa;    krb5_enctype etype;    krb5_preauthdata *my_preauth = NULL;    unsigned nonce;    int done;    opts = int2KDCOptions(options);    krb5_generate_random_block (&nonce, sizeof(nonce));    nonce &= 0xffffffff;    do {	done = 1;	ret = init_as_req (context,			   opts,			   creds,			   addrs,			   etypes,			   ptypes,			   preauth,			   key_proc,			   keyseed,			   nonce,			   &a);	if (my_preauth) {	    free_ETYPE_INFO(&my_preauth->val[0].info);	    free (my_preauth->val);	    my_preauth = NULL;	}	if (ret)	    return ret;	ASN1_MALLOC_ENCODE(AS_REQ, req.data, req.length, &a, &len, ret);	free_AS_REQ(&a);	if (ret)	    return ret;	if(len != req.length)	    krb5_abortx(context, "internal error in ASN.1 encoder");	ret = krb5_sendto_kdc (context, &req, &creds->client->realm, &resp);	krb5_data_free(&req);	if (ret)	    return ret;	memset (&rep, 0, sizeof(rep));	ret = decode_AS_REP(resp.data, resp.length, &rep.kdc_rep, &size);	if(ret) {	    /* let's try to parse it as a KRB-ERROR */	    KRB_ERROR error;	    int ret2;	    ret2 = krb5_rd_error(context, &resp, &error);	    if(ret2 && resp.data && ((char*)resp.data)[0] == 4)		ret = KRB5KRB_AP_ERR_V4_REPLY;	    krb5_data_free(&resp);	    if (ret2 == 0) {		ret = krb5_error_from_rd_error(context, &error, creds);		/* if no preauth was set and KDC requires it, give it                   one more try */		if (!ptypes && !preauth		    && ret == KRB5KDC_ERR_PREAUTH_REQUIRED#if 0			|| ret == KRB5KDC_ERR_BADOPTION#endif		    && set_ptypes(context, &error, &ptypes, &my_preauth)) {		    done = 0;		    preauth = my_preauth;		    krb5_free_error_contents(context, &error);		    krb5_clear_error_string(context);		    continue;		}		if(ret_as_reply)		    ret_as_reply->error = error;		else		    free_KRB_ERROR (&error);		return ret;	    }	    return ret;	}	krb5_data_free(&resp);    } while(!done);        pa = NULL;    etype = rep.kdc_rep.enc_part.etype;    if(rep.kdc_rep.padata){	int i = 0;	pa = krb5_find_padata(rep.kdc_rep.padata->val, rep.kdc_rep.padata->len, 			      KRB5_PADATA_PW_SALT, &i);	if(pa == NULL) {	    i = 0;	    pa = krb5_find_padata(rep.kdc_rep.padata->val, 				  rep.kdc_rep.padata->len, 				  KRB5_PADATA_AFS3_SALT, &i);	}    }    if(pa) {	salt.salttype = pa->padata_type;	salt.saltvalue = pa->padata_value;		ret = (*key_proc)(context, etype, salt, keyseed, &key);    } else {	/* make a v5 salted pa-data */	ret = krb5_get_pw_salt (context, creds->client, &salt);		if (ret)	    goto out;	ret = (*key_proc)(context, etype, salt, keyseed, &key);	krb5_free_salt(context, salt);    }    if (ret)	goto out;	    {	unsigned flags = 0;	if (opts.request_anonymous)	    flags |= EXTRACT_TICKET_ALLOW_SERVER_MISMATCH;	ret = _krb5_extract_ticket(context, 				   &rep, 				   creds, 				   key, 				   keyseed, 				   KRB5_KU_AS_REP_ENC_PART,				   NULL, 				   nonce, 				   flags,				   decrypt_proc, 				   decryptarg);    }    memset (key->keyvalue.data, 0, key->keyvalue.length);    krb5_free_keyblock_contents (context, key);    free (key);out:    if (ret == 0 && ret_as_reply)	*ret_as_reply = rep;    else	krb5_free_kdc_rep (context, &rep);    return ret;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_get_in_tkt(krb5_context context,		krb5_flags options,		const krb5_addresses *addrs,		const krb5_enctype *etypes,		const krb5_preauthtype *ptypes,		krb5_key_proc key_proc,		krb5_const_pointer keyseed,		krb5_decrypt_proc decrypt_proc,		krb5_const_pointer decryptarg,		krb5_creds *creds,		krb5_ccache ccache,		krb5_kdc_rep *ret_as_reply){    krb5_error_code ret;        ret = krb5_get_in_cred (context,			    options,			    addrs,			    etypes,			    ptypes,			    NULL,			    key_proc,			    keyseed,			    decrypt_proc,			    decryptarg,			    creds,			    ret_as_reply);    if(ret) 	return ret;    if (ccache)	ret = krb5_cc_store_cred (context, ccache, creds);    return ret;}

⌨️ 快捷键说明

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