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

📄 monitor_wrap.c

📁 OpenSSL Source code for SFTP, SSH, and many others
💻 C
📖 第 1 页 / 共 2 页
字号:
	buffer_put_int(&b, enc->block_size);	buffer_put_string(&b, enc->key, enc->key_len);	packet_get_keyiv(mode, enc->iv, enc->block_size);	buffer_put_string(&b, enc->iv, enc->block_size);	/* Mac structure */	buffer_put_cstring(&b, mac->name);	buffer_put_int(&b, mac->enabled);	buffer_put_string(&b, mac->key, mac->key_len);	/* Comp structure */	buffer_put_int(&b, comp->type);	buffer_put_int(&b, comp->enabled);	buffer_put_cstring(&b, comp->name);	len = buffer_len(&b);	buf = xmalloc(len);	memcpy(buf, buffer_ptr(&b), len);	memset(buffer_ptr(&b), 0, len);	buffer_free(&b);	if (lenp != NULL)		*lenp = len;	if (blobp != NULL)		*blobp = buf;	return len;}static voidmm_send_kex(Buffer *m, Kex *kex){	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;	u_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;}#ifdef USE_PAMvoidmm_start_pam(char *user){	Buffer m;	debug3("%s entering", __func__);	buffer_init(&m);	buffer_put_cstring(&m, user);	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_START, &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;	int res;	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);	res = buffer_get_int(&m);	if (res == -1) {		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, res;	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);	res = buffer_get_int(&m);	if (res == -1) {		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;	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);	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);}

⌨️ 快捷键说明

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