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

📄 rd_req.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
	    goto out;	}    }    if (ac->authenticator->seq_number)	krb5_auth_con_setremoteseqnumber(context, ac,					 *ac->authenticator->seq_number);    /* XXX - Xor sequence numbers */    if (ac->authenticator->subkey) {	ret = krb5_auth_con_setremotesubkey(context, ac,					    ac->authenticator->subkey);	if (ret)	    goto out;    }    ret = find_etypelist(context, ac, &etypes);    if (ret)	goto out;    ac->keytype = ETYPE_NULL;    if (etypes.val) {	int i;	for (i = 0; i < etypes.len; i++) {	    if (krb5_enctype_valid(context, etypes.val[i]) == 0) {		ac->keytype = etypes.val[i];		break;	    }	}    }    if (ap_req_options) {	*ap_req_options = 0;	if (ac->keytype != ETYPE_NULL)	    *ap_req_options |= AP_OPTS_USE_SUBKEY;	if (ap_req->ap_options.use_session_key)	    *ap_req_options |= AP_OPTS_USE_SESSION_KEY;	if (ap_req->ap_options.mutual_required)	    *ap_req_options |= AP_OPTS_MUTUAL_REQUIRED;    }    if(ticket)	*ticket = t;    else	krb5_free_ticket (context, t);    if (auth_context) {	if (*auth_context == NULL)	    *auth_context = ac;    } else	krb5_auth_con_free (context, ac);    free_EtypeList(&etypes);    return 0; out:    if (t)	krb5_free_ticket (context, t);    if (auth_context == NULL || *auth_context == NULL)	krb5_auth_con_free (context, ac);    return ret;}		   /* * */struct krb5_rd_req_in_ctx_data {    krb5_keytab keytab;    krb5_keyblock *keyblock;    krb5_boolean check_pac;};struct krb5_rd_req_out_ctx_data {    krb5_keyblock *keyblock;    krb5_flags ap_req_options;    krb5_ticket *ticket;};/* * */krb5_error_code KRB5_LIB_FUNCTIONkrb5_rd_req_in_ctx_alloc(krb5_context context, krb5_rd_req_in_ctx *ctx){    *ctx = calloc(1, sizeof(**ctx));    if (*ctx == NULL) {	krb5_set_error_string(context, "out of memory");	return ENOMEM;    }    (*ctx)->check_pac = (context->flags & KRB5_CTX_F_CHECK_PAC) ? 1 : 0;    return 0;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_rd_req_in_set_keytab(krb5_context context, 			  krb5_rd_req_in_ctx in,			  krb5_keytab keytab){    in->keytab = keytab; /* XXX should make copy */    return 0;}/** * Set if krb5_rq_red() is going to check the Windows PAC or not *  * @param context Keberos 5 context. * @param in krb5_rd_req_in_ctx to check the option on. * @param flag flag to select if to check the pac (TRUE) or not (FALSE). * * @return Kerberos 5 error code, see krb5_get_error_message(). * * @ingroup krb5 */krb5_error_code KRB5_LIB_FUNCTIONkrb5_rd_req_in_set_pac_check(krb5_context context, 			     krb5_rd_req_in_ctx in,			     krb5_boolean flag){    in->check_pac = flag;    return 0;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_rd_req_in_set_keyblock(krb5_context context, 			    krb5_rd_req_in_ctx in,			    krb5_keyblock *keyblock){    in->keyblock = keyblock; /* XXX should make copy */    return 0;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_rd_req_out_get_ap_req_options(krb5_context context, 				   krb5_rd_req_out_ctx out,				   krb5_flags *ap_req_options){    *ap_req_options = out->ap_req_options;    return 0;}krb5_error_code KRB5_LIB_FUNCTIONkrb5_rd_req_out_get_ticket(krb5_context context, 			    krb5_rd_req_out_ctx out,			    krb5_ticket **ticket){    return krb5_copy_ticket(context, out->ticket, ticket);}krb5_error_code KRB5_LIB_FUNCTIONkrb5_rd_req_out_get_keyblock(krb5_context context, 			    krb5_rd_req_out_ctx out,			    krb5_keyblock **keyblock){    return krb5_copy_keyblock(context, out->keyblock, keyblock);}void  KRB5_LIB_FUNCTIONkrb5_rd_req_in_ctx_free(krb5_context context, krb5_rd_req_in_ctx ctx){    free(ctx);}krb5_error_code KRB5_LIB_FUNCTION_krb5_rd_req_out_ctx_alloc(krb5_context context, krb5_rd_req_out_ctx *ctx){    *ctx = calloc(1, sizeof(**ctx));    if (*ctx == NULL) {	krb5_set_error_string(context, "out of memory");	return ENOMEM;    }    return 0;}void  KRB5_LIB_FUNCTIONkrb5_rd_req_out_ctx_free(krb5_context context, krb5_rd_req_out_ctx ctx){    krb5_free_keyblock(context, ctx->keyblock);    free(ctx);}/* * */krb5_error_code KRB5_LIB_FUNCTIONkrb5_rd_req(krb5_context context,	    krb5_auth_context *auth_context,	    const krb5_data *inbuf,	    krb5_const_principal server,	    krb5_keytab keytab,	    krb5_flags *ap_req_options,	    krb5_ticket **ticket){    krb5_error_code ret;    krb5_rd_req_in_ctx in;    krb5_rd_req_out_ctx out;    ret = krb5_rd_req_in_ctx_alloc(context, &in);    if (ret)	return ret;        ret = krb5_rd_req_in_set_keytab(context, in, keytab);    if (ret) {	krb5_rd_req_in_ctx_free(context, in);	return ret;    }    ret = krb5_rd_req_ctx(context, auth_context, inbuf, server, in, &out);    krb5_rd_req_in_ctx_free(context, in);    if (ret)	return ret;    if (ap_req_options)	*ap_req_options = out->ap_req_options;    if (ticket) {	ret = krb5_copy_ticket(context, out->ticket, ticket);	if (ret)	    goto out;    }out:    krb5_rd_req_out_ctx_free(context, out);    return ret;}/* * */krb5_error_code KRB5_LIB_FUNCTIONkrb5_rd_req_with_keyblock(krb5_context context,			  krb5_auth_context *auth_context,			  const krb5_data *inbuf,			  krb5_const_principal server,			  krb5_keyblock *keyblock,			  krb5_flags *ap_req_options,			  krb5_ticket **ticket){    krb5_error_code ret;    krb5_rd_req_in_ctx in;    krb5_rd_req_out_ctx out;    ret = krb5_rd_req_in_ctx_alloc(context, &in);    if (ret)	return ret;        ret = krb5_rd_req_in_set_keyblock(context, in, keyblock);    if (ret) {	krb5_rd_req_in_ctx_free(context, in);	return ret;    }    ret = krb5_rd_req_ctx(context, auth_context, inbuf, server, in, &out);    krb5_rd_req_in_ctx_free(context, in);    if (ret)	return ret;    if (ap_req_options)	*ap_req_options = out->ap_req_options;    if (ticket) {	ret = krb5_copy_ticket(context, out->ticket, ticket);	if (ret)	    goto out;    }out:    krb5_rd_req_out_ctx_free(context, out);    return ret;}/* * */static krb5_error_codeget_key_from_keytab(krb5_context context,		    krb5_auth_context *auth_context,		    krb5_ap_req *ap_req,		    krb5_const_principal server,		    krb5_keytab keytab,		    krb5_keyblock **out_key){    krb5_keytab_entry entry;    krb5_error_code ret;    int kvno;    krb5_keytab real_keytab;    if(keytab == NULL)	krb5_kt_default(context, &real_keytab);    else	real_keytab = keytab;        if (ap_req->ticket.enc_part.kvno)	kvno = *ap_req->ticket.enc_part.kvno;    else	kvno = 0;    ret = krb5_kt_get_entry (context,			     real_keytab,			     server,			     kvno,			     ap_req->ticket.enc_part.etype,			     &entry);    if(ret)	goto out;    ret = krb5_copy_keyblock(context, &entry.keyblock, out_key);    krb5_kt_free_entry (context, &entry);out:        if(keytab == NULL)	krb5_kt_close(context, real_keytab);        return ret;}/* * */krb5_error_code KRB5_LIB_FUNCTIONkrb5_rd_req_ctx(krb5_context context,		krb5_auth_context *auth_context,		const krb5_data *inbuf,		krb5_const_principal server,		krb5_rd_req_in_ctx inctx,		krb5_rd_req_out_ctx *outctx){    krb5_error_code ret;    krb5_ap_req ap_req;    krb5_principal service = NULL;    krb5_rd_req_out_ctx o = NULL;    ret = _krb5_rd_req_out_ctx_alloc(context, &o);    if (ret)	goto out;    if (*auth_context == NULL) {	ret = krb5_auth_con_init(context, auth_context);	if (ret)	    goto out;    }    ret = krb5_decode_ap_req(context, inbuf, &ap_req);    if(ret)	goto out;    if(server == NULL){	ret = _krb5_principalname2krb5_principal(context,						 &service,						 ap_req.ticket.sname,						 ap_req.ticket.realm);	if (ret)	    goto out;	server = service;    }    if (ap_req.ap_options.use_session_key &&	(*auth_context)->keyblock == NULL) {	krb5_set_error_string(context, "krb5_rd_req: user to user auth "			      "without session key given");	ret = KRB5KRB_AP_ERR_NOKEY;	goto out;    }    if((*auth_context)->keyblock){	ret = krb5_copy_keyblock(context,				 (*auth_context)->keyblock,				 &o->keyblock);	if (ret)	    goto out;    } else if(inctx->keyblock){	ret = krb5_copy_keyblock(context,				 inctx->keyblock,				 &o->keyblock);	if (ret)	    goto out;    } else {	krb5_keytab keytab = NULL;	if (inctx && inctx->keytab)	    keytab = inctx->keytab;	ret = get_key_from_keytab(context, 				  auth_context, 				  &ap_req,				  server,				  keytab,				  &o->keyblock);	if(ret)	    goto out;    }    ret = krb5_verify_ap_req2(context,			      auth_context,			      &ap_req,			      server,			      o->keyblock,			      0,			      &o->ap_req_options,			      &o->ticket,			      KRB5_KU_AP_REQ_AUTH);    if (ret)	goto out;    /* If there is a PAC, verify its server signature */    if (inctx->check_pac) {	krb5_pac pac;	krb5_data data;	ret = krb5_ticket_get_authorization_data_type(context,						      o->ticket,						      KRB5_AUTHDATA_WIN2K_PAC,						      &data);	if (ret == 0) {	    ret = krb5_pac_parse(context, data.data, data.length, &pac);	    krb5_data_free(&data);	    if (ret)		goto out;		    ret = krb5_pac_verify(context,				  pac, 				  o->ticket->ticket.authtime,				  o->ticket->client, 				  o->keyblock, 				  NULL);	    krb5_pac_free(context, pac);	    if (ret)		goto out;	}	ret = 0;    }out:    if (ret || outctx == NULL) {	krb5_rd_req_out_ctx_free(context, o);    } else 	*outctx = o;    free_AP_REQ(&ap_req);    if(service)	krb5_free_principal(context, service);    return ret;}

⌨️ 快捷键说明

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