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

📄 monitor_wrap.c

📁 OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。它用安全、加密的网络连接工具代替了 telnet、ftp、 rlogin、rsh 和 rcp 工具。OpenSSH 支持
💻 C
📖 第 1 页 / 共 2 页
字号:
	debug3("%s: New keys have been sent", __func__); skip:	/* More key context */	plen = packet_get_keycontext(MODE_OUT, NULL);	p = xmalloc(plen+1);	packet_get_keycontext(MODE_OUT, p);	buffer_put_string(&m, p, plen);	xfree(p);	plen = packet_get_keycontext(MODE_IN, NULL);	p = xmalloc(plen+1);	packet_get_keycontext(MODE_IN, p);	buffer_put_string(&m, p, plen);	xfree(p);	/* Compression state */	debug3("%s: Sending compression state", __func__);	buffer_put_string(&m, &outgoing_stream, sizeof(outgoing_stream));	buffer_put_string(&m, &incoming_stream, sizeof(incoming_stream));	/* Network I/O buffers */	buffer_put_string(&m, buffer_ptr(&input), buffer_len(&input));	buffer_put_string(&m, buffer_ptr(&output), buffer_len(&output));	mm_request_send(monitor->m_recvfd, MONITOR_REQ_KEYEXPORT, &m);	debug3("%s: Finished sending state", __func__);	buffer_free(&m);}intmm_pty_allocate(int *ptyfd, int *ttyfd, char *namebuf, int namebuflen){	Buffer m;	char *p, *msg;	int success = 0;	buffer_init(&m);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PTY, &m);	debug3("%s: waiting for MONITOR_ANS_PTY", __func__);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PTY, &m);	success = buffer_get_int(&m);	if (success == 0) {		debug3("%s: pty alloc failed", __func__);		buffer_free(&m);		return (0);	}	p = buffer_get_string(&m, NULL);	msg = buffer_get_string(&m, NULL);	buffer_free(&m);	strlcpy(namebuf, p, namebuflen); /* Possible truncation */	xfree(p);	buffer_append(&loginmsg, msg, strlen(msg));	xfree(msg);	*ptyfd = mm_receive_fd(pmonitor->m_recvfd);	*ttyfd = mm_receive_fd(pmonitor->m_recvfd);	/* Success */	return (1);}voidmm_session_pty_cleanup2(Session *s){	Buffer m;	if (s->ttyfd == -1)		return;	buffer_init(&m);	buffer_put_cstring(&m, s->tty);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PTYCLEANUP, &m);	buffer_free(&m);	/* closed dup'ed master */	if (close(s->ptymaster) < 0)		error("close(s->ptymaster): %s", strerror(errno));	/* unlink pty from session */	s->ttyfd = -1;}#ifdef USE_PAMvoidmm_start_pam(Authctxt *authctxt){	Buffer m;	debug3("%s entering", __func__);	if (!options.use_pam)		fatal("UsePAM=no, but ended up in %s anyway", __func__);	buffer_init(&m);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_START, &m);	buffer_free(&m);}u_intmm_do_pam_account(void){	Buffer m;	u_int ret;	char *msg;	debug3("%s entering", __func__);	if (!options.use_pam)		fatal("UsePAM=no, but ended up in %s anyway", __func__);	buffer_init(&m);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_ACCOUNT, &m);	mm_request_receive_expect(pmonitor->m_recvfd,	    MONITOR_ANS_PAM_ACCOUNT, &m);	ret = buffer_get_int(&m);	msg = buffer_get_string(&m, NULL);	buffer_append(&loginmsg, msg, strlen(msg));	xfree(msg);	buffer_free(&m);	debug3("%s returning %d", __func__, ret);	return (ret);}void *mm_sshpam_init_ctx(Authctxt *authctxt){	Buffer m;	int success;	debug3("%s", __func__);	buffer_init(&m);	buffer_put_cstring(&m, authctxt->user);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_INIT_CTX, &m);	debug3("%s: waiting for MONITOR_ANS_PAM_INIT_CTX", __func__);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_INIT_CTX, &m);	success = buffer_get_int(&m);	if (success == 0) {		debug3("%s: pam_init_ctx failed", __func__);		buffer_free(&m);		return (NULL);	}	buffer_free(&m);	return (authctxt);}intmm_sshpam_query(void *ctx, char **name, char **info,    u_int *num, char ***prompts, u_int **echo_on){	Buffer m;	int i, ret;	debug3("%s", __func__);	buffer_init(&m);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_QUERY, &m);	debug3("%s: waiting for MONITOR_ANS_PAM_QUERY", __func__);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_QUERY, &m);	ret = buffer_get_int(&m);	debug3("%s: pam_query returned %d", __func__, ret);	*name = buffer_get_string(&m, NULL);	*info = buffer_get_string(&m, NULL);	*num = buffer_get_int(&m);	*prompts = xmalloc((*num + 1) * sizeof(char *));	*echo_on = xmalloc((*num + 1) * sizeof(u_int));	for (i = 0; i < *num; ++i) {		(*prompts)[i] = buffer_get_string(&m, NULL);		(*echo_on)[i] = buffer_get_int(&m);	}	buffer_free(&m);	return (ret);}intmm_sshpam_respond(void *ctx, u_int num, char **resp){	Buffer m;	int i, ret;	debug3("%s", __func__);	buffer_init(&m);	buffer_put_int(&m, num);	for (i = 0; i < num; ++i)		buffer_put_cstring(&m, resp[i]);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_RESPOND, &m);	debug3("%s: waiting for MONITOR_ANS_PAM_RESPOND", __func__);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_RESPOND, &m);	ret = buffer_get_int(&m);	debug3("%s: pam_respond returned %d", __func__, ret);	buffer_free(&m);	return (ret);}voidmm_sshpam_free_ctx(void *ctxtp){	Buffer m;	debug3("%s", __func__);	buffer_init(&m);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_FREE_CTX, &m);	debug3("%s: waiting for MONITOR_ANS_PAM_FREE_CTX", __func__);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_FREE_CTX, &m);	buffer_free(&m);}#endif /* USE_PAM *//* Request process termination */voidmm_terminate(void){	Buffer m;	buffer_init(&m);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_TERM, &m);	buffer_free(&m);}intmm_ssh1_session_key(BIGNUM *num){	int rsafail;	Buffer m;	buffer_init(&m);	buffer_put_bignum2(&m, num);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_SESSKEY, &m);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_SESSKEY, &m);	rsafail = buffer_get_int(&m);	buffer_get_bignum2(&m, num);	buffer_free(&m);	return (rsafail);}static voidmm_chall_setup(char **name, char **infotxt, u_int *numprompts,    char ***prompts, u_int **echo_on){	*name = xstrdup("");	*infotxt = xstrdup("");	*numprompts = 1;	*prompts = xmalloc(*numprompts * sizeof(char *));	*echo_on = xmalloc(*numprompts * sizeof(u_int));	(*echo_on)[0] = 0;}intmm_bsdauth_query(void *ctx, char **name, char **infotxt,   u_int *numprompts, char ***prompts, u_int **echo_on){	Buffer m;	u_int success;	char *challenge;	debug3("%s: entering", __func__);	buffer_init(&m);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_BSDAUTHQUERY, &m);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_BSDAUTHQUERY,	    &m);	success = buffer_get_int(&m);	if (success == 0) {		debug3("%s: no challenge", __func__);		buffer_free(&m);		return (-1);	}	/* Get the challenge, and format the response */	challenge  = buffer_get_string(&m, NULL);	buffer_free(&m);	mm_chall_setup(name, infotxt, numprompts, prompts, echo_on);	(*prompts)[0] = challenge;	debug3("%s: received challenge: %s", __func__, challenge);	return (0);}intmm_bsdauth_respond(void *ctx, u_int numresponses, char **responses){	Buffer m;	int authok;	debug3("%s: entering", __func__);	if (numresponses != 1)		return (-1);	buffer_init(&m);	buffer_put_cstring(&m, responses[0]);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_BSDAUTHRESPOND, &m);	mm_request_receive_expect(pmonitor->m_recvfd,	    MONITOR_ANS_BSDAUTHRESPOND, &m);	authok = buffer_get_int(&m);	buffer_free(&m);	return ((authok == 0) ? -1 : 0);}#ifdef SKEYintmm_skey_query(void *ctx, char **name, char **infotxt,   u_int *numprompts, char ***prompts, u_int **echo_on){	Buffer m;	int len;	u_int success;	char *p, *challenge;	debug3("%s: entering", __func__);	buffer_init(&m);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_SKEYQUERY, &m);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_SKEYQUERY,	    &m);	success = buffer_get_int(&m);	if (success == 0) {		debug3("%s: no challenge", __func__);		buffer_free(&m);		return (-1);	}	/* Get the challenge, and format the response */	challenge  = buffer_get_string(&m, NULL);	buffer_free(&m);	debug3("%s: received challenge: %s", __func__, challenge);	mm_chall_setup(name, infotxt, numprompts, prompts, echo_on);	len = strlen(challenge) + strlen(SKEY_PROMPT) + 1;	p = xmalloc(len);	strlcpy(p, challenge, len);	strlcat(p, SKEY_PROMPT, len);	(*prompts)[0] = p;	xfree(challenge);	return (0);}intmm_skey_respond(void *ctx, u_int numresponses, char **responses){	Buffer m;	int authok;	debug3("%s: entering", __func__);	if (numresponses != 1)		return (-1);	buffer_init(&m);	buffer_put_cstring(&m, responses[0]);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_SKEYRESPOND, &m);	mm_request_receive_expect(pmonitor->m_recvfd,	    MONITOR_ANS_SKEYRESPOND, &m);	authok = buffer_get_int(&m);	buffer_free(&m);	return ((authok == 0) ? -1 : 0);}#endif /* SKEY */voidmm_ssh1_session_id(u_char session_id[16]){	Buffer m;	int i;	debug3("%s entering", __func__);	buffer_init(&m);	for (i = 0; i < 16; i++)		buffer_put_char(&m, session_id[i]);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_SESSID, &m);	buffer_free(&m);}intmm_auth_rsa_key_allowed(struct passwd *pw, BIGNUM *client_n, Key **rkey){	Buffer m;	Key *key;	u_char *blob;	u_int blen;	int allowed = 0, have_forced = 0;	debug3("%s entering", __func__);	buffer_init(&m);	buffer_put_bignum2(&m, client_n);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_RSAKEYALLOWED, &m);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_RSAKEYALLOWED, &m);	allowed = buffer_get_int(&m);	/* fake forced command */	auth_clear_options();	have_forced = buffer_get_int(&m);	forced_command = have_forced ? xstrdup("true") : NULL;	if (allowed && rkey != NULL) {		blob = buffer_get_string(&m, &blen);		if ((key = key_from_blob(blob, blen)) == NULL)			fatal("%s: key_from_blob failed", __func__);		*rkey = key;		xfree(blob);	}	mm_send_debug(&m);	buffer_free(&m);	return (allowed);}BIGNUM *mm_auth_rsa_generate_challenge(Key *key){	Buffer m;	BIGNUM *challenge;	u_char *blob;	u_int blen;	debug3("%s entering", __func__);	if ((challenge = BN_new()) == NULL)		fatal("%s: BN_new failed", __func__);	key->type = KEY_RSA;    /* XXX cheat for key_to_blob */	if (key_to_blob(key, &blob, &blen) == 0)		fatal("%s: key_to_blob failed", __func__);	key->type = KEY_RSA1;	buffer_init(&m);	buffer_put_string(&m, blob, blen);	xfree(blob);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_RSACHALLENGE, &m);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_RSACHALLENGE, &m);	buffer_get_bignum2(&m, challenge);	buffer_free(&m);	return (challenge);}intmm_auth_rsa_verify_response(Key *key, BIGNUM *p, u_char response[16]){	Buffer m;	u_char *blob;	u_int blen;	int success = 0;	debug3("%s entering", __func__);	key->type = KEY_RSA;    /* XXX cheat for key_to_blob */	if (key_to_blob(key, &blob, &blen) == 0)		fatal("%s: key_to_blob failed", __func__);	key->type = KEY_RSA1;	buffer_init(&m);	buffer_put_string(&m, blob, blen);	buffer_put_string(&m, response, 16);	xfree(blob);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_RSARESPONSE, &m);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_RSARESPONSE, &m);	success = buffer_get_int(&m);	buffer_free(&m);	return (success);}#ifdef SSH_AUDIT_EVENTSvoidmm_audit_event(ssh_audit_event_t event){	Buffer m;	debug3("%s entering", __func__);	buffer_init(&m);	buffer_put_int(&m, event);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_EVENT, &m);	buffer_free(&m);}voidmm_audit_run_command(const char *command){	Buffer m;	debug3("%s entering command %s", __func__, command);	buffer_init(&m);	buffer_put_cstring(&m, command);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_COMMAND, &m);	buffer_free(&m);}#endif /* SSH_AUDIT_EVENTS */#ifdef GSSAPIOM_uint32mm_ssh_gssapi_server_ctx(Gssctxt **ctx, gss_OID goid){	Buffer m;	OM_uint32 major;	/* Client doesn't get to see the context */	*ctx = NULL;	buffer_init(&m);	buffer_put_string(&m, goid->elements, goid->length);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSSETUP, &m);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSSETUP, &m);	major = buffer_get_int(&m);	buffer_free(&m);	return (major);}OM_uint32mm_ssh_gssapi_accept_ctx(Gssctxt *ctx, gss_buffer_desc *in,    gss_buffer_desc *out, OM_uint32 *flags){	Buffer m;	OM_uint32 major;	u_int len;	buffer_init(&m);	buffer_put_string(&m, in->value, in->length);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSSTEP, &m);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSSTEP, &m);	major = buffer_get_int(&m);	out->value = buffer_get_string(&m, &len);	out->length = len;	if (flags)		*flags = buffer_get_int(&m);	buffer_free(&m);	return (major);}OM_uint32mm_ssh_gssapi_checkmic(Gssctxt *ctx, gss_buffer_t gssbuf, gss_buffer_t gssmic){	Buffer m;	OM_uint32 major;	buffer_init(&m);	buffer_put_string(&m, gssbuf->value, gssbuf->length);	buffer_put_string(&m, gssmic->value, gssmic->length);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSCHECKMIC, &m);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSCHECKMIC,	    &m);	major = buffer_get_int(&m);	buffer_free(&m);	return(major);}intmm_ssh_gssapi_userok(char *user){	Buffer m;	int authenticated = 0;	buffer_init(&m);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSUSEROK, &m);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSUSEROK,				  &m);	authenticated = buffer_get_int(&m);	buffer_free(&m);	debug3("%s: user %sauthenticated",__func__, authenticated ? "" : "not ");	return (authenticated);}#endif /* GSSAPI */

⌨️ 快捷键说明

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