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

📄 eng_cryptodev.c

📁 OpenSSL 0.9.8k 最新版OpenSSL
💻 C
📖 第 1 页 / 共 2 页
字号:
 * a particular NID in the ENGINE. this says what we'll do at the * top level - note, that list is restricted by what we answer with */static intcryptodev_engine_ciphers(ENGINE *e, const EVP_CIPHER **cipher,    const int **nids, int nid){	if (!cipher)		return (cryptodev_usable_ciphers(nids));	switch (nid) {	case NID_des_ede3_cbc:		*cipher = &cryptodev_3des_cbc;		break;	case NID_des_cbc:		*cipher = &cryptodev_des_cbc;		break;	case NID_bf_cbc:		*cipher = &cryptodev_bf_cbc;		break;	case NID_cast5_cbc:		*cipher = &cryptodev_cast_cbc;		break;	case NID_aes_128_cbc:		*cipher = &cryptodev_aes_cbc;		break;	default:		*cipher = NULL;		break;	}	return (*cipher != NULL);}static intcryptodev_engine_digests(ENGINE *e, const EVP_MD **digest,    const int **nids, int nid){	if (!digest)		return (cryptodev_usable_digests(nids));	switch (nid) {	case NID_md5:		*digest = NULL; /* need to make a clean md5 critter */		break;	default:		*digest = NULL;		break;	}	return (*digest != NULL);}/* * Convert a BIGNUM to the representation that /dev/crypto needs. * Upon completion of use, the caller is responsible for freeing * crp->crp_p. */static intbn2crparam(const BIGNUM *a, struct crparam *crp){	int i, j, k;	ssize_t words, bytes, bits;	u_char *b;	crp->crp_p = NULL;	crp->crp_nbits = 0;	bits = BN_num_bits(a);	bytes = (bits + 7) / 8;	b = malloc(bytes);	if (b == NULL)		return (1);	crp->crp_p = b;	crp->crp_nbits = bits;	for (i = 0, j = 0; i < a->top; i++) {		for (k = 0; k < BN_BITS2 / 8; k++) {			if ((j + k) >= bytes)				return (0);			b[j + k] = a->d[i] >> (k * 8);		}		j += BN_BITS2 / 8;	}	return (0);}/* Convert a /dev/crypto parameter to a BIGNUM */static intcrparam2bn(struct crparam *crp, BIGNUM *a){	u_int8_t *pd;	int i, bytes;	bytes = (crp->crp_nbits + 7) / 8;	if (bytes == 0)		return (-1);	if ((pd = (u_int8_t *) malloc(bytes)) == NULL)		return (-1);	for (i = 0; i < bytes; i++)		pd[i] = crp->crp_p[bytes - i - 1];	BN_bin2bn(pd, bytes, a);	free(pd);	return (0);}static voidzapparams(struct crypt_kop *kop){	int i;	for (i = 0; i <= kop->crk_iparams + kop->crk_oparams; i++) {		if (kop->crk_param[i].crp_p)			free(kop->crk_param[i].crp_p);		kop->crk_param[i].crp_p = NULL;		kop->crk_param[i].crp_nbits = 0;	}}static intcryptodev_asym(struct crypt_kop *kop, int rlen, BIGNUM *r, int slen, BIGNUM *s){	int fd, ret = -1;	if ((fd = get_asym_dev_crypto()) < 0)		return (ret);	if (r) {		kop->crk_param[kop->crk_iparams].crp_p = calloc(rlen, sizeof(char));		kop->crk_param[kop->crk_iparams].crp_nbits = rlen * 8;		kop->crk_oparams++;	}	if (s) {		kop->crk_param[kop->crk_iparams+1].crp_p = calloc(slen, sizeof(char));		kop->crk_param[kop->crk_iparams+1].crp_nbits = slen * 8;		kop->crk_oparams++;	}	if (ioctl(fd, CIOCKEY, kop) == 0) {		if (r)			crparam2bn(&kop->crk_param[kop->crk_iparams], r);		if (s)			crparam2bn(&kop->crk_param[kop->crk_iparams+1], s);		ret = 0;	}	return (ret);}static intcryptodev_bn_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,    const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont){	struct crypt_kop kop;	int ret = 1;	/* Currently, we know we can do mod exp iff we can do any	 * asymmetric operations at all.	 */	if (cryptodev_asymfeat == 0) {		ret = BN_mod_exp(r, a, p, m, ctx);		return (ret);	}	memset(&kop, 0, sizeof kop);	kop.crk_op = CRK_MOD_EXP;	/* inputs: a^p % m */	if (bn2crparam(a, &kop.crk_param[0]))		goto err;	if (bn2crparam(p, &kop.crk_param[1]))		goto err;	if (bn2crparam(m, &kop.crk_param[2]))		goto err;	kop.crk_iparams = 3;	if (cryptodev_asym(&kop, BN_num_bytes(m), r, 0, NULL) == -1) {		const RSA_METHOD *meth = RSA_PKCS1_SSLeay();		ret = meth->bn_mod_exp(r, a, p, m, ctx, in_mont);	}err:	zapparams(&kop);	return (ret);}static intcryptodev_rsa_nocrt_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa){	int r;	BN_CTX *ctx;	ctx = BN_CTX_new();	r = cryptodev_bn_mod_exp(r0, I, rsa->d, rsa->n, ctx, NULL);	BN_CTX_free(ctx);	return (r);}static intcryptodev_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx){	struct crypt_kop kop;	int ret = 1;	if (!rsa->p || !rsa->q || !rsa->dmp1 || !rsa->dmq1 || !rsa->iqmp) {		/* XXX 0 means failure?? */		return (0);	}	memset(&kop, 0, sizeof kop);	kop.crk_op = CRK_MOD_EXP_CRT;	/* inputs: rsa->p rsa->q I rsa->dmp1 rsa->dmq1 rsa->iqmp */	if (bn2crparam(rsa->p, &kop.crk_param[0]))		goto err;	if (bn2crparam(rsa->q, &kop.crk_param[1]))		goto err;	if (bn2crparam(I, &kop.crk_param[2]))		goto err;	if (bn2crparam(rsa->dmp1, &kop.crk_param[3]))		goto err;	if (bn2crparam(rsa->dmq1, &kop.crk_param[4]))		goto err;	if (bn2crparam(rsa->iqmp, &kop.crk_param[5]))		goto err;	kop.crk_iparams = 6;	if (cryptodev_asym(&kop, BN_num_bytes(rsa->n), r0, 0, NULL) == -1) {		const RSA_METHOD *meth = RSA_PKCS1_SSLeay();		ret = (*meth->rsa_mod_exp)(r0, I, rsa, ctx);	}err:	zapparams(&kop);	return (ret);}static RSA_METHOD cryptodev_rsa = {	"cryptodev RSA method",	NULL,				/* rsa_pub_enc */	NULL,				/* rsa_pub_dec */	NULL,				/* rsa_priv_enc */	NULL,				/* rsa_priv_dec */	NULL,	NULL,	NULL,				/* init */	NULL,				/* finish */	0,				/* flags */	NULL,				/* app_data */	NULL,				/* rsa_sign */	NULL				/* rsa_verify */};static intcryptodev_dsa_bn_mod_exp(DSA *dsa, BIGNUM *r, BIGNUM *a, const BIGNUM *p,    const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx){	return (cryptodev_bn_mod_exp(r, a, p, m, ctx, m_ctx));}static intcryptodev_dsa_dsa_mod_exp(DSA *dsa, BIGNUM *t1, BIGNUM *g,    BIGNUM *u1, BIGNUM *pub_key, BIGNUM *u2, BIGNUM *p,    BN_CTX *ctx, BN_MONT_CTX *mont){	BIGNUM t2;	int ret = 0;	BN_init(&t2);	/* v = ( g^u1 * y^u2 mod p ) mod q */	/* let t1 = g ^ u1 mod p */	ret = 0;	if (!dsa->meth->bn_mod_exp(dsa,t1,dsa->g,u1,dsa->p,ctx,mont))		goto err;	/* let t2 = y ^ u2 mod p */	if (!dsa->meth->bn_mod_exp(dsa,&t2,dsa->pub_key,u2,dsa->p,ctx,mont))		goto err;	/* let u1 = t1 * t2 mod p */	if (!BN_mod_mul(u1,t1,&t2,dsa->p,ctx))		goto err;	BN_copy(t1,u1);	ret = 1;err:	BN_free(&t2);	return(ret);}static DSA_SIG *cryptodev_dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa){	struct crypt_kop kop;	BIGNUM *r = NULL, *s = NULL;	DSA_SIG *dsaret = NULL;	if ((r = BN_new()) == NULL)		goto err;	if ((s = BN_new()) == NULL) {		BN_free(r);		goto err;	}	memset(&kop, 0, sizeof kop);	kop.crk_op = CRK_DSA_SIGN;	/* inputs: dgst dsa->p dsa->q dsa->g dsa->priv_key */	kop.crk_param[0].crp_p = (caddr_t)dgst;	kop.crk_param[0].crp_nbits = dlen * 8;	if (bn2crparam(dsa->p, &kop.crk_param[1]))		goto err;	if (bn2crparam(dsa->q, &kop.crk_param[2]))		goto err;	if (bn2crparam(dsa->g, &kop.crk_param[3]))		goto err;	if (bn2crparam(dsa->priv_key, &kop.crk_param[4]))		goto err;	kop.crk_iparams = 5;	if (cryptodev_asym(&kop, BN_num_bytes(dsa->q), r,	    BN_num_bytes(dsa->q), s) == 0) {		dsaret = DSA_SIG_new();		dsaret->r = r;		dsaret->s = s;	} else {		const DSA_METHOD *meth = DSA_OpenSSL();		BN_free(r);		BN_free(s);		dsaret = (meth->dsa_do_sign)(dgst, dlen, dsa);	}err:	kop.crk_param[0].crp_p = NULL;	zapparams(&kop);	return (dsaret);}static intcryptodev_dsa_verify(const unsigned char *dgst, int dlen,    DSA_SIG *sig, DSA *dsa){	struct crypt_kop kop;	int dsaret = 1;	memset(&kop, 0, sizeof kop);	kop.crk_op = CRK_DSA_VERIFY;	/* inputs: dgst dsa->p dsa->q dsa->g dsa->pub_key sig->r sig->s */	kop.crk_param[0].crp_p = (caddr_t)dgst;	kop.crk_param[0].crp_nbits = dlen * 8;	if (bn2crparam(dsa->p, &kop.crk_param[1]))		goto err;	if (bn2crparam(dsa->q, &kop.crk_param[2]))		goto err;	if (bn2crparam(dsa->g, &kop.crk_param[3]))		goto err;	if (bn2crparam(dsa->pub_key, &kop.crk_param[4]))		goto err;	if (bn2crparam(sig->r, &kop.crk_param[5]))		goto err;	if (bn2crparam(sig->s, &kop.crk_param[6]))		goto err;	kop.crk_iparams = 7;	if (cryptodev_asym(&kop, 0, NULL, 0, NULL) == 0) {		dsaret = kop.crk_status;	} else {		const DSA_METHOD *meth = DSA_OpenSSL();		dsaret = (meth->dsa_do_verify)(dgst, dlen, sig, dsa);	}err:	kop.crk_param[0].crp_p = NULL;	zapparams(&kop);	return (dsaret);}static DSA_METHOD cryptodev_dsa = {	"cryptodev DSA method",	NULL,	NULL,				/* dsa_sign_setup */	NULL,	NULL,				/* dsa_mod_exp */	NULL,	NULL,				/* init */	NULL,				/* finish */	0,	/* flags */	NULL	/* app_data */};static intcryptodev_mod_exp_dh(const DH *dh, BIGNUM *r, const BIGNUM *a,    const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx,    BN_MONT_CTX *m_ctx){	return (cryptodev_bn_mod_exp(r, a, p, m, ctx, m_ctx));}static intcryptodev_dh_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh){	struct crypt_kop kop;	int dhret = 1;	int fd, keylen;	if ((fd = get_asym_dev_crypto()) < 0) {		const DH_METHOD *meth = DH_OpenSSL();		return ((meth->compute_key)(key, pub_key, dh));	}	keylen = BN_num_bits(dh->p);	memset(&kop, 0, sizeof kop);	kop.crk_op = CRK_DH_COMPUTE_KEY;	/* inputs: dh->priv_key pub_key dh->p key */	if (bn2crparam(dh->priv_key, &kop.crk_param[0]))		goto err;	if (bn2crparam(pub_key, &kop.crk_param[1]))		goto err;	if (bn2crparam(dh->p, &kop.crk_param[2]))		goto err;	kop.crk_iparams = 3;	kop.crk_param[3].crp_p = key;	kop.crk_param[3].crp_nbits = keylen * 8;	kop.crk_oparams = 1;	if (ioctl(fd, CIOCKEY, &kop) == -1) {		const DH_METHOD *meth = DH_OpenSSL();		dhret = (meth->compute_key)(key, pub_key, dh);	}err:	kop.crk_param[3].crp_p = NULL;	zapparams(&kop);	return (dhret);}static DH_METHOD cryptodev_dh = {	"cryptodev DH method",	NULL,				/* cryptodev_dh_generate_key */	NULL,	NULL,	NULL,	NULL,	0,	/* flags */	NULL	/* app_data */};/* * ctrl right now is just a wrapper that doesn't do much * but I expect we'll want some options soon. */static intcryptodev_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)()){#ifdef HAVE_SYSLOG_R	struct syslog_data sd = SYSLOG_DATA_INIT;#endif	switch (cmd) {	default:#ifdef HAVE_SYSLOG_R		syslog_r(LOG_ERR, &sd,		    "cryptodev_ctrl: unknown command %d", cmd);#else		syslog(LOG_ERR, "cryptodev_ctrl: unknown command %d", cmd);#endif		break;	}	return (1);}voidENGINE_load_cryptodev(void){	ENGINE *engine = ENGINE_new();	int fd;	if (engine == NULL)		return;	if ((fd = get_dev_crypto()) < 0) {		ENGINE_free(engine);		return;	}	/*	 * find out what asymmetric crypto algorithms we support	 */	if (ioctl(fd, CIOCASYMFEAT, &cryptodev_asymfeat) == -1) {		close(fd);		ENGINE_free(engine);		return;	}	close(fd);	if (!ENGINE_set_id(engine, "cryptodev") ||	    !ENGINE_set_name(engine, "BSD cryptodev engine") ||	    !ENGINE_set_ciphers(engine, cryptodev_engine_ciphers) ||	    !ENGINE_set_digests(engine, cryptodev_engine_digests) ||	    !ENGINE_set_ctrl_function(engine, cryptodev_ctrl) ||	    !ENGINE_set_cmd_defns(engine, cryptodev_defns)) {		ENGINE_free(engine);		return;	}	if (ENGINE_set_RSA(engine, &cryptodev_rsa)) {		const RSA_METHOD *rsa_meth = RSA_PKCS1_SSLeay();		cryptodev_rsa.bn_mod_exp = rsa_meth->bn_mod_exp;		cryptodev_rsa.rsa_mod_exp = rsa_meth->rsa_mod_exp;		cryptodev_rsa.rsa_pub_enc = rsa_meth->rsa_pub_enc;		cryptodev_rsa.rsa_pub_dec = rsa_meth->rsa_pub_dec;		cryptodev_rsa.rsa_priv_enc = rsa_meth->rsa_priv_enc;		cryptodev_rsa.rsa_priv_dec = rsa_meth->rsa_priv_dec;		if (cryptodev_asymfeat & CRF_MOD_EXP) {			cryptodev_rsa.bn_mod_exp = cryptodev_bn_mod_exp;			if (cryptodev_asymfeat & CRF_MOD_EXP_CRT)				cryptodev_rsa.rsa_mod_exp =				    cryptodev_rsa_mod_exp;			else				cryptodev_rsa.rsa_mod_exp =				    cryptodev_rsa_nocrt_mod_exp;		}	}	if (ENGINE_set_DSA(engine, &cryptodev_dsa)) {		const DSA_METHOD *meth = DSA_OpenSSL();		memcpy(&cryptodev_dsa, meth, sizeof(DSA_METHOD));		if (cryptodev_asymfeat & CRF_DSA_SIGN)			cryptodev_dsa.dsa_do_sign = cryptodev_dsa_do_sign;		if (cryptodev_asymfeat & CRF_MOD_EXP) {			cryptodev_dsa.bn_mod_exp = cryptodev_dsa_bn_mod_exp;			cryptodev_dsa.dsa_mod_exp = cryptodev_dsa_dsa_mod_exp;		}		if (cryptodev_asymfeat & CRF_DSA_VERIFY)			cryptodev_dsa.dsa_do_verify = cryptodev_dsa_verify;	}	if (ENGINE_set_DH(engine, &cryptodev_dh)){		const DH_METHOD *dh_meth = DH_OpenSSL();		cryptodev_dh.generate_key = dh_meth->generate_key;		cryptodev_dh.compute_key = dh_meth->compute_key;		cryptodev_dh.bn_mod_exp = dh_meth->bn_mod_exp;		if (cryptodev_asymfeat & CRF_MOD_EXP) {			cryptodev_dh.bn_mod_exp = cryptodev_mod_exp_dh;			if (cryptodev_asymfeat & CRF_DH_COMPUTE_KEY)				cryptodev_dh.compute_key =				    cryptodev_dh_compute_key;		}	}	ENGINE_add(engine);	ENGINE_free(engine);	ERR_clear_error();}#endif /* HAVE_CRYPTODEV */

⌨️ 快捷键说明

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