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

📄 monitor_wrap.c

📁 C++编写
💻 C
📖 第 1 页 / 共 2 页
字号:
{	buffer_put_string(m, kex->session_id, kex->session_id_len);	buffer_put_int(m, kex->we_need);	buffer_put_int(m, kex->hostkey_type);	buffer_put_int(m, kex->kex_type);	buffer_put_string(m, buffer_ptr(&kex->my), buffer_len(&kex->my));	buffer_put_string(m, buffer_ptr(&kex->peer), buffer_len(&kex->peer));	buffer_put_int(m, kex->flags);	buffer_put_cstring(m, kex->client_version_string);	buffer_put_cstring(m, kex->server_version_string);}voidmm_send_keystate(struct monitor *pmonitor){	Buffer m;	u_char *blob, *p;	u_int bloblen, plen;	buffer_init(&m);	if (!compat20) {		u_char iv[24];		u_char *key;		u_int ivlen, keylen;		buffer_put_int(&m, packet_get_protocol_flags());		buffer_put_int(&m, packet_get_ssh1_cipher());		debug3("%s: Sending ssh1 KEY+IV", __func__);		keylen = packet_get_encryption_key(NULL);		key = xmalloc(keylen+1);	/* add 1 if keylen == 0 */		keylen = packet_get_encryption_key(key);		buffer_put_string(&m, key, keylen);		memset(key, 0, keylen);		xfree(key);		ivlen = packet_get_keyiv_len(MODE_OUT);		packet_get_keyiv(MODE_OUT, iv, ivlen);		buffer_put_string(&m, iv, ivlen);		ivlen = packet_get_keyiv_len(MODE_OUT);		packet_get_keyiv(MODE_IN, iv, ivlen);		buffer_put_string(&m, iv, ivlen);		goto skip;	} else {		/* Kex for rekeying */		mm_send_kex(&m, *pmonitor->m_pkex);	}	debug3("%s: Sending new keys: %p %p",	    __func__, newkeys[MODE_OUT], newkeys[MODE_IN]);	/* Keys from Kex */	if (!mm_newkeys_to_blob(MODE_OUT, &blob, &bloblen))		fatal("%s: conversion of newkeys failed", __func__);	buffer_put_string(&m, blob, bloblen);	xfree(blob);	if (!mm_newkeys_to_blob(MODE_IN, &blob, &bloblen))		fatal("%s: conversion of newkeys failed", __func__);	buffer_put_string(&m, blob, bloblen);	xfree(blob);	buffer_put_int(&m, packet_get_seqnr(MODE_OUT));	buffer_put_int(&m, packet_get_seqnr(MODE_IN));	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(pmonitor->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;	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);	buffer_free(&m);	strlcpy(namebuf, p, namebuflen); /* Possible truncation */	xfree(p);	*ptyfd = mm_receive_fd(pmonitor->m_recvfd);	*ttyfd = mm_receive_fd(pmonitor->m_recvfd);	/* Success */	return (1);}voidmm_session_pty_cleanup2(void *session){	Session *s = session;	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;}/* 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);}intmm_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);}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 KRB4intmm_auth_krb4(Authctxt *authctxt, void *_auth, char **client, void *_reply){	KTEXT auth, reply; 	Buffer m;	u_int rlen;	int success = 0;	char *p;	debug3("%s entering", __func__);	auth = _auth;	reply = _reply;	buffer_init(&m);	buffer_put_string(&m, auth->dat, auth->length);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_KRB4, &m);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_KRB4, &m);	success = buffer_get_int(&m);	if (success) {		*client = buffer_get_string(&m, NULL);		p = buffer_get_string(&m, &rlen);		if (rlen >= MAX_KTXT_LEN)			fatal("%s: reply from monitor too large", __func__);		reply->length = rlen;		memcpy(reply->dat, p, rlen);		memset(p, 0, rlen);		xfree(p);	}	buffer_free(&m);	return (success);}#endif#ifdef KRB5intmm_auth_krb5(void *ctx, void *argp, char **userp, void *resp){	krb5_data *tkt, *reply;	Buffer m;	int success;	debug3("%s entering", __func__);	tkt = (krb5_data *) argp;	reply = (krb5_data *) resp;	buffer_init(&m);	buffer_put_string(&m, tkt->data, tkt->length);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_KRB5, &m);	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_KRB5, &m);	success = buffer_get_int(&m);	if (success) {		u_int len;		*userp = buffer_get_string(&m, NULL);		reply->data = buffer_get_string(&m, &len);		reply->length = len;	} else {		memset(reply, 0, sizeof(*reply));		*userp = NULL;	}	buffer_free(&m);	return (success);}#endif

⌨️ 快捷键说明

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