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

📄 key.c

📁 OpenSSL Source code for SFTP, SSH, and many others
💻 C
📖 第 1 页 / 共 2 页
字号:
		} else if (ret->type != type) {			/* is a key, but different type */			debug3("key_read: type mismatch");			return -1;		}		len = 2*strlen(cp);		blob = xmalloc(len);		n = uudecode(cp, blob, len);		if (n < 0) {			error("key_read: uudecode %s failed", cp);			xfree(blob);			return -1;		}		k = key_from_blob(blob, n);		xfree(blob);		if (k == NULL) {			error("key_read: key_from_blob %s failed", cp);			return -1;		}		if (k->type != type) {			error("key_read: type mismatch: encoding error");			key_free(k);			return -1;		}/*XXXX*/		if (ret->type == KEY_RSA) {			if (ret->rsa != NULL)				RSA_free(ret->rsa);			ret->rsa = k->rsa;			k->rsa = NULL;			success = 1;#ifdef DEBUG_PK			RSA_print_fp(stderr, ret->rsa, 8);#endif		} else {			if (ret->dsa != NULL)				DSA_free(ret->dsa);			ret->dsa = k->dsa;			k->dsa = NULL;			success = 1;#ifdef DEBUG_PK			DSA_print_fp(stderr, ret->dsa, 8);#endif		}/*XXXX*/		key_free(k);		if (success != 1)			break;		/* advance cp: skip whitespace and data */		while (*cp == ' ' || *cp == '\t')			cp++;		while (*cp != '\0' && *cp != ' ' && *cp != '\t')			cp++;		*cpp = cp;		break;	default:		fatal("key_read: bad key type: %d", ret->type);		break;	}	return success;}intkey_write(Key *key, FILE *f){	int n, success = 0;	u_int len, bits = 0;	u_char *blob, *uu;	if (key->type == KEY_RSA1 && key->rsa != NULL) {		/* size of modulus 'n' */		bits = BN_num_bits(key->rsa->n);		fprintf(f, "%u", bits);		if (write_bignum(f, key->rsa->e) &&		    write_bignum(f, key->rsa->n)) {			success = 1;		} else {			error("key_write: failed for RSA key");		}	} else if ((key->type == KEY_DSA && key->dsa != NULL) ||	    (key->type == KEY_RSA && key->rsa != NULL)) {		key_to_blob(key, &blob, &len);		uu = xmalloc(2*len);		n = uuencode(blob, len, uu, 2*len);		if (n > 0) {			fprintf(f, "%s %s", key_ssh_name(key), uu);			success = 1;		}		xfree(blob);		xfree(uu);	}	return success;}char *key_type(Key *k){	switch (k->type) {	case KEY_RSA1:		return "RSA1";		break;	case KEY_RSA:		return "RSA";		break;	case KEY_DSA:		return "DSA";		break;	}	return "unknown";}char *key_ssh_name(Key *k){	switch (k->type) {	case KEY_RSA:		return "ssh-rsa";		break;	case KEY_DSA:		return "ssh-dss";		break;	}	return "ssh-unknown";}u_intkey_size(Key *k){	switch (k->type) {	case KEY_RSA1:	case KEY_RSA:		return BN_num_bits(k->rsa->n);		break;	case KEY_DSA:		return BN_num_bits(k->dsa->p);		break;	}	return 0;}static RSA *rsa_generate_private_key(u_int bits){	RSA *private;	private = RSA_generate_key(bits, 35, NULL, NULL);	if (private == NULL)		fatal("rsa_generate_private_key: key generation failed.");	return private;}static DSA*dsa_generate_private_key(u_int bits){	DSA *private = DSA_generate_parameters(bits, NULL, 0, NULL, NULL, NULL, NULL);	if (private == NULL)		fatal("dsa_generate_private_key: DSA_generate_parameters failed");	if (!DSA_generate_key(private))		fatal("dsa_generate_private_key: DSA_generate_key failed.");	if (private == NULL)		fatal("dsa_generate_private_key: NULL.");	return private;}Key *key_generate(int type, u_int bits){	Key *k = key_new(KEY_UNSPEC);	switch (type) {	case KEY_DSA:		k->dsa = dsa_generate_private_key(bits);		break;	case KEY_RSA:	case KEY_RSA1:		k->rsa = rsa_generate_private_key(bits);		break;	default:		fatal("key_generate: unknown type %d", type);	}	k->type = type;	return k;}Key *key_from_private(Key *k){	Key *n = NULL;	switch (k->type) {	case KEY_DSA:		n = key_new(k->type);		BN_copy(n->dsa->p, k->dsa->p);		BN_copy(n->dsa->q, k->dsa->q);		BN_copy(n->dsa->g, k->dsa->g);		BN_copy(n->dsa->pub_key, k->dsa->pub_key);		break;	case KEY_RSA:	case KEY_RSA1:		n = key_new(k->type);		BN_copy(n->rsa->n, k->rsa->n);		BN_copy(n->rsa->e, k->rsa->e);		break;	default:		fatal("key_from_private: unknown type %d", k->type);		break;	}	return n;}intkey_type_from_name(char *name){	if (strcmp(name, "rsa1") == 0) {		return KEY_RSA1;	} else if (strcmp(name, "rsa") == 0) {		return KEY_RSA;	} else if (strcmp(name, "dsa") == 0) {		return KEY_DSA;	} else if (strcmp(name, "ssh-rsa") == 0) {		return KEY_RSA;	} else if (strcmp(name, "ssh-dss") == 0) {		return KEY_DSA;	}	debug2("key_type_from_name: unknown key type '%s'", name);	return KEY_UNSPEC;}intkey_names_valid2(const char *names){	char *s, *cp, *p;	if (names == NULL || strcmp(names, "") == 0)		return 0;	s = cp = xstrdup(names);	for ((p = strsep(&cp, ",")); p && *p != '\0';	    (p = strsep(&cp, ","))) {		switch (key_type_from_name(p)) {		case KEY_RSA1:		case KEY_UNSPEC:			xfree(s);			return 0;		}	}	debug3("key names ok: [%s]", names);	xfree(s);	return 1;}Key *key_from_blob(u_char *blob, int blen){	Buffer b;	char *ktype;	int rlen, type;	Key *key = NULL;#ifdef DEBUG_PK	dump_base64(stderr, blob, blen);#endif	buffer_init(&b);	buffer_append(&b, blob, blen);	ktype = buffer_get_string(&b, NULL);	type = key_type_from_name(ktype);	switch (type) {	case KEY_RSA:		key = key_new(type);		buffer_get_bignum2(&b, key->rsa->e);		buffer_get_bignum2(&b, key->rsa->n);#ifdef DEBUG_PK		RSA_print_fp(stderr, key->rsa, 8);#endif		break;	case KEY_DSA:		key = key_new(type);		buffer_get_bignum2(&b, key->dsa->p);		buffer_get_bignum2(&b, key->dsa->q);		buffer_get_bignum2(&b, key->dsa->g);		buffer_get_bignum2(&b, key->dsa->pub_key);#ifdef DEBUG_PK		DSA_print_fp(stderr, key->dsa, 8);#endif		break;	case KEY_UNSPEC:		key = key_new(type);		break;	default:		error("key_from_blob: cannot handle type %s", ktype);		break;	}	rlen = buffer_len(&b);	if (key != NULL && rlen != 0)		error("key_from_blob: remaining bytes in key blob %d", rlen);	xfree(ktype);	buffer_free(&b);	return key;}intkey_to_blob(Key *key, u_char **blobp, u_int *lenp){	Buffer b;	int len;	u_char *buf;	if (key == NULL) {		error("key_to_blob: key == NULL");		return 0;	}	buffer_init(&b);	switch (key->type) {	case KEY_DSA:		buffer_put_cstring(&b, key_ssh_name(key));		buffer_put_bignum2(&b, key->dsa->p);		buffer_put_bignum2(&b, key->dsa->q);		buffer_put_bignum2(&b, key->dsa->g);		buffer_put_bignum2(&b, key->dsa->pub_key);		break;	case KEY_RSA:		buffer_put_cstring(&b, key_ssh_name(key));		buffer_put_bignum2(&b, key->rsa->e);		buffer_put_bignum2(&b, key->rsa->n);		break;	default:		error("key_to_blob: unsupported key type %d", key->type);		buffer_free(&b);		return 0;	}	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;}intkey_sign(    Key *key,    u_char **sigp, u_int *lenp,    u_char *data, u_int datalen){	switch (key->type) {	case KEY_DSA:		return ssh_dss_sign(key, sigp, lenp, data, datalen);		break;	case KEY_RSA:		return ssh_rsa_sign(key, sigp, lenp, data, datalen);		break;	default:		error("key_sign: illegal key type %d", key->type);		return -1;		break;	}}/* * key_verify returns 1 for a correct signature, 0 for an incorrect signature * and -1 on error. */intkey_verify(    Key *key,    u_char *signature, u_int signaturelen,    u_char *data, u_int datalen){	if (signaturelen == 0)		return -1;	switch (key->type) {	case KEY_DSA:		return ssh_dss_verify(key, signature, signaturelen, data, datalen);		break;	case KEY_RSA:		return ssh_rsa_verify(key, signature, signaturelen, data, datalen);		break;	default:		error("key_verify: illegal key type %d", key->type);		return -1;		break;	}}/* Converts a private to a public key */Key *key_demote(Key *k){	Key *pk;	pk = xmalloc(sizeof(*pk));	pk->type = k->type;	pk->flags = k->flags;	pk->dsa = NULL;	pk->rsa = NULL;	switch (k->type) {	case KEY_RSA1:	case KEY_RSA:		if ((pk->rsa = RSA_new()) == NULL)			fatal("key_demote: RSA_new failed");		if ((pk->rsa->e = BN_dup(k->rsa->e)) == NULL)			fatal("key_demote: BN_dup failed");		if ((pk->rsa->n = BN_dup(k->rsa->n)) == NULL)			fatal("key_demote: BN_dup failed");		break;	case KEY_DSA:		if ((pk->dsa = DSA_new()) == NULL)			fatal("key_demote: DSA_new failed");		if ((pk->dsa->p = BN_dup(k->dsa->p)) == NULL)			fatal("key_demote: BN_dup failed");		if ((pk->dsa->q = BN_dup(k->dsa->q)) == NULL)			fatal("key_demote: BN_dup failed");		if ((pk->dsa->g = BN_dup(k->dsa->g)) == NULL)			fatal("key_demote: BN_dup failed");		if ((pk->dsa->pub_key = BN_dup(k->dsa->pub_key)) == NULL)			fatal("key_demote: BN_dup failed");		break;	default:		fatal("key_free: bad key type %d", k->type);		break;	}	return (pk);}

⌨️ 快捷键说明

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