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

📄 sshconnect2.c

📁 OpenSSL Source code for SFTP, SSH, and many others
💻 C
📖 第 1 页 / 共 3 页
字号:
		}		if ((key = key_from_blob(pkblob, blen)) == NULL) {			debug("no key from blob. pkalg %s", pkalg);			break;		}		if (key->type != pktype) {			error("input_userauth_pk_ok: type mismatch "			    "for decoded key (received %d, expected %d)",			    key->type, pktype);			break;		}		fp = key_fingerprint(key, SSH_FP_MD5, SSH_FP_HEX);		debug2("input_userauth_pk_ok: fp %s", fp);		xfree(fp);		if (!key_equal(key, authctxt->last_key)) {			debug("key != last_key");			break;		}		sent = sign_and_send_pubkey(authctxt, key,		   authctxt->last_key_sign);	} while (0);	if (key != NULL)		key_free(key);	xfree(pkalg);	xfree(pkblob);	/* unregister */	clear_auth_state(authctxt);	dispatch_set(SSH2_MSG_USERAUTH_PK_OK, NULL);	/* try another method if we did not send a packet*/	if (sent == 0)		userauth(authctxt, NULL);}intuserauth_none(Authctxt *authctxt){	/* initial userauth request */	packet_start(SSH2_MSG_USERAUTH_REQUEST);	packet_put_cstring(authctxt->server_user);	packet_put_cstring(authctxt->service);	packet_put_cstring(authctxt->method->name);	packet_send();	return 1;}intuserauth_passwd(Authctxt *authctxt){	static int attempt = 0;	char prompt[150];	char *password;	if (attempt++ >= options.number_of_password_prompts)		return 0;	if (attempt != 1)		error("Permission denied, please try again.");	snprintf(prompt, sizeof(prompt), "%.30s@%.128s's password: ",	    authctxt->server_user, authctxt->host);	password = read_passphrase(prompt, 0);	packet_start(SSH2_MSG_USERAUTH_REQUEST);	packet_put_cstring(authctxt->server_user);	packet_put_cstring(authctxt->service);	packet_put_cstring(authctxt->method->name);	packet_put_char(0);	packet_put_cstring(password);	memset(password, 0, strlen(password));	xfree(password);	packet_add_padding(64);	packet_send();	dispatch_set(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ,	    &input_userauth_passwd_changereq);	return 1;}/* * parse PASSWD_CHANGEREQ, prompt user and send SSH2_MSG_USERAUTH_REQUEST */voidinput_userauth_passwd_changereq(int type, u_int32_t seqnr, void *ctxt){	Authctxt *authctxt = ctxt;	char *info, *lang, *password = NULL, *retype = NULL;	char prompt[150];	debug2("input_userauth_passwd_changereq");	if (authctxt == NULL)		fatal("input_userauth_passwd_changereq: "		    "no authentication context");	info = packet_get_string(NULL);	lang = packet_get_string(NULL);	if (strlen(info) > 0)		log("%s", info);	xfree(info);	xfree(lang);	packet_start(SSH2_MSG_USERAUTH_REQUEST);	packet_put_cstring(authctxt->server_user);	packet_put_cstring(authctxt->service);	packet_put_cstring(authctxt->method->name);	packet_put_char(1);			/* additional info */	snprintf(prompt, sizeof(prompt),	    "Enter %.30s@%.128s's old password: ",	    authctxt->server_user, authctxt->host);	password = read_passphrase(prompt, 0);	packet_put_cstring(password);	memset(password, 0, strlen(password));	xfree(password);	password = NULL;	while (password == NULL) {		snprintf(prompt, sizeof(prompt),		    "Enter %.30s@%.128s's new password: ",		    authctxt->server_user, authctxt->host);		password = read_passphrase(prompt, RP_ALLOW_EOF);		if (password == NULL) {			/* bail out */			return;		}		snprintf(prompt, sizeof(prompt),		    "Retype %.30s@%.128s's new password: ",		    authctxt->server_user, authctxt->host);		retype = read_passphrase(prompt, 0);		if (strcmp(password, retype) != 0) {			memset(password, 0, strlen(password));			xfree(password);			log("Mismatch; try again, EOF to quit.");			password = NULL;		}		memset(retype, 0, strlen(retype));		xfree(retype);	}	packet_put_cstring(password);	memset(password, 0, strlen(password));	xfree(password);	packet_add_padding(64);	packet_send();	dispatch_set(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ,	    &input_userauth_passwd_changereq);}static voidclear_auth_state(Authctxt *authctxt){	/* XXX clear authentication state */	dispatch_set(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ, NULL);	if (authctxt->last_key != NULL && authctxt->last_key_hint == -1) {		debug3("clear_auth_state: key_free %p", authctxt->last_key);		key_free(authctxt->last_key);	}	authctxt->last_key = NULL;	authctxt->last_key_hint = -2;	authctxt->last_key_sign = NULL;}static intsign_and_send_pubkey(Authctxt *authctxt, Key *k, sign_cb_fn *sign_callback){	Buffer b;	u_char *blob, *signature;	u_int bloblen, slen;	int skip = 0;	int ret = -1;	int have_sig = 1;	debug3("sign_and_send_pubkey");	if (key_to_blob(k, &blob, &bloblen) == 0) {		/* we cannot handle this key */		debug3("sign_and_send_pubkey: cannot handle key");		return 0;	}	/* data to be signed */	buffer_init(&b);	if (datafellows & SSH_OLD_SESSIONID) {		buffer_append(&b, session_id2, session_id2_len);		skip = session_id2_len;	} else {		buffer_put_string(&b, session_id2, session_id2_len);		skip = buffer_len(&b);	}	buffer_put_char(&b, SSH2_MSG_USERAUTH_REQUEST);	buffer_put_cstring(&b, authctxt->server_user);	buffer_put_cstring(&b,	    datafellows & SSH_BUG_PKSERVICE ?	    "ssh-userauth" :	    authctxt->service);	if (datafellows & SSH_BUG_PKAUTH) {		buffer_put_char(&b, have_sig);	} else {		buffer_put_cstring(&b, authctxt->method->name);		buffer_put_char(&b, have_sig);		buffer_put_cstring(&b, key_ssh_name(k));	}	buffer_put_string(&b, blob, bloblen);	/* generate signature */	ret = (*sign_callback)(authctxt, k, &signature, &slen,	    buffer_ptr(&b), buffer_len(&b));	if (ret == -1) {		xfree(blob);		buffer_free(&b);		return 0;	}#ifdef DEBUG_PK	buffer_dump(&b);#endif	if (datafellows & SSH_BUG_PKSERVICE) {		buffer_clear(&b);		buffer_append(&b, session_id2, session_id2_len);		skip = session_id2_len;		buffer_put_char(&b, SSH2_MSG_USERAUTH_REQUEST);		buffer_put_cstring(&b, authctxt->server_user);		buffer_put_cstring(&b, authctxt->service);		buffer_put_cstring(&b, authctxt->method->name);		buffer_put_char(&b, have_sig);		if (!(datafellows & SSH_BUG_PKAUTH))			buffer_put_cstring(&b, key_ssh_name(k));		buffer_put_string(&b, blob, bloblen);	}	xfree(blob);	/* append signature */	buffer_put_string(&b, signature, slen);	xfree(signature);	/* skip session id and packet type */	if (buffer_len(&b) < skip + 1)		fatal("userauth_pubkey: internal error");	buffer_consume(&b, skip + 1);	/* put remaining data from buffer into packet */	packet_start(SSH2_MSG_USERAUTH_REQUEST);	packet_put_raw(buffer_ptr(&b), buffer_len(&b));	buffer_free(&b);	packet_send();	return 1;}static intsend_pubkey_test(Authctxt *authctxt, Key *k, sign_cb_fn *sign_callback,    int hint){	u_char *blob;	u_int bloblen, have_sig = 0;	debug3("send_pubkey_test");	if (key_to_blob(k, &blob, &bloblen) == 0) {		/* we cannot handle this key */		debug3("send_pubkey_test: cannot handle key");		return 0;	}	/* register callback for USERAUTH_PK_OK message */	authctxt->last_key_sign = sign_callback;	authctxt->last_key_hint = hint;	authctxt->last_key = k;	dispatch_set(SSH2_MSG_USERAUTH_PK_OK, &input_userauth_pk_ok);	packet_start(SSH2_MSG_USERAUTH_REQUEST);	packet_put_cstring(authctxt->server_user);	packet_put_cstring(authctxt->service);	packet_put_cstring(authctxt->method->name);	packet_put_char(have_sig);	if (!(datafellows & SSH_BUG_PKAUTH))		packet_put_cstring(key_ssh_name(k));	packet_put_string(blob, bloblen);	xfree(blob);	packet_send();	return 1;}static Key *load_identity_file(char *filename){	Key *private;	char prompt[300], *passphrase;	int quit, i;	struct stat st;	if (stat(filename, &st) < 0) {		debug3("no such identity: %s", filename);		return NULL;	}	private = key_load_private_type(KEY_UNSPEC, filename, "", NULL);	if (private == NULL) {		if (options.batch_mode)			return NULL;		snprintf(prompt, sizeof prompt,		    "Enter passphrase for key '%.100s': ", filename);		for (i = 0; i < options.number_of_password_prompts; i++) {			passphrase = read_passphrase(prompt, 0);			if (strcmp(passphrase, "") != 0) {				private = key_load_private_type(KEY_UNSPEC, filename,				    passphrase, NULL);				quit = 0;			} else {				debug2("no passphrase given, try next key");				quit = 1;			}			memset(passphrase, 0, strlen(passphrase));			xfree(passphrase);			if (private != NULL || quit)				break;			debug2("bad passphrase given, try again...");		}	}	return private;}static intidentity_sign_cb(Authctxt *authctxt, Key *key, u_char **sigp, u_int *lenp,    u_char *data, u_int datalen){	Key *private;	int idx, ret;	idx = authctxt->last_key_hint;	if (idx < 0)		return -1;	/* private key is stored in external hardware */	if (options.identity_keys[idx]->flags & KEY_FLAG_EXT)		return key_sign(options.identity_keys[idx], sigp, lenp, data, datalen);	private = load_identity_file(options.identity_files[idx]);	if (private == NULL)		return -1;	ret = key_sign(private, sigp, lenp, data, datalen);	key_free(private);	return ret;}static intagent_sign_cb(Authctxt *authctxt, Key *key, u_char **sigp, u_int *lenp,    u_char *data, u_int datalen){	return ssh_agent_sign(authctxt->agent, key, sigp, lenp, data, datalen);}static intkey_sign_cb(Authctxt *authctxt, Key *key, u_char **sigp, u_int *lenp,    u_char *data, u_int datalen){	return key_sign(key, sigp, lenp, data, datalen);}static intuserauth_pubkey_agent(Authctxt *authctxt){	static int called = 0;	int ret = 0;	char *comment;	Key *k;	if (called == 0) {		if (ssh_get_num_identities(authctxt->agent, 2) == 0)			debug2("userauth_pubkey_agent: no keys at all");		called = 1;	}	k = ssh_get_next_identity(authctxt->agent, &comment, 2);	if (k == NULL) {		debug2("userauth_pubkey_agent: no more keys");	} else {		debug("userauth_pubkey_agent: testing agent key %s", comment);		xfree(comment);		ret = send_pubkey_test(authctxt, k, agent_sign_cb, -1);		if (ret == 0)			key_free(k);	}	if (ret == 0)		debug2("userauth_pubkey_agent: no message sent");	return ret;}intuserauth_pubkey(Authctxt *authctxt){	static int idx = 0;	int sent = 0;

⌨️ 快捷键说明

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