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

📄 e_ubsec.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 3 页
字号:
#ifndef OPENSSL_NO_RSA 	/* Do in software if the key is too large for the hardware. */	if (BN_num_bits(m) > max_key_len)                {		const RSA_METHOD *meth = RSA_PKCS1_SSLeay();		ret = (*meth->bn_mod_exp)(r, a, p, m, ctx, m_ctx);                }        else#endif                {		ret = ubsec_mod_exp(r, a, p, m, ctx);                }		return ret;        }#ifndef OPENSSL_NO_DH/* This function is aliased to mod_exp (with the dh and mont dropped). */static int ubsec_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 ubsec_mod_exp(r, a, p, m, ctx);	}#endif#ifndef OPENSSL_NO_DSAstatic DSA_SIG *ubsec_dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa)	{	DSA_SIG *to_return = NULL;	int s_len = 160, r_len = 160, d_len, fd;	BIGNUM m, *r=NULL, *s=NULL;	BN_init(&m);	s = BN_new();	r = BN_new();	if ((s == NULL) || (r==NULL))		goto err;	d_len = p_UBSEC_ubsec_bytes_to_bits((unsigned char *)dgst, dlen);        if(!bn_wexpand(r, (160+BN_BITS2-1)/BN_BITS2) ||       	   (!bn_wexpand(s, (160+BN_BITS2-1)/BN_BITS2))) {		UBSECerr(UBSEC_F_UBSEC_DSA_DO_SIGN, UBSEC_R_BN_EXPAND_FAIL);		goto err;	}	if (BN_bin2bn(dgst,dlen,&m) == NULL) {		UBSECerr(UBSEC_F_UBSEC_DSA_DO_SIGN, UBSEC_R_BN_EXPAND_FAIL);		goto err;	} 	if ((fd = p_UBSEC_ubsec_open(UBSEC_KEY_DEVICE_NAME)) <= 0) {                const DSA_METHOD *meth;		fd = 0;		UBSECerr(UBSEC_F_UBSEC_DSA_DO_SIGN, UBSEC_R_UNIT_FAILURE);                meth = DSA_OpenSSL();                to_return =  meth->dsa_do_sign(dgst, dlen, dsa);		goto err;	}	if (p_UBSEC_dsa_sign_ioctl(fd, 0, /* compute hash before signing */		(unsigned char *)dgst, d_len,		NULL, 0,  /* compute random value */		(unsigned char *)dsa->p->d, BN_num_bits(dsa->p), 		(unsigned char *)dsa->q->d, BN_num_bits(dsa->q),		(unsigned char *)dsa->g->d, BN_num_bits(dsa->g),		(unsigned char *)dsa->priv_key->d, BN_num_bits(dsa->priv_key),		(unsigned char *)r->d, &r_len,		(unsigned char *)s->d, &s_len ) != 0) {                const DSA_METHOD *meth;		UBSECerr(UBSEC_F_UBSEC_DSA_DO_SIGN, UBSEC_R_REQUEST_FAILED);                p_UBSEC_ubsec_close(fd);                meth = DSA_OpenSSL();                to_return = meth->dsa_do_sign(dgst, dlen, dsa);		goto err;	}	p_UBSEC_ubsec_close(fd);	r->top = (160+BN_BITS2-1)/BN_BITS2;	s->top = (160+BN_BITS2-1)/BN_BITS2;	to_return = DSA_SIG_new();	if(to_return == NULL) {		UBSECerr(UBSEC_F_UBSEC_DSA_DO_SIGN, UBSEC_R_BN_EXPAND_FAIL);		goto err;	}	to_return->r = r;	to_return->s = s;err:	if (!to_return) {		if (r) BN_free(r);		if (s) BN_free(s);	}                                 	BN_clear_free(&m);	return to_return;}static int ubsec_dsa_verify(const unsigned char *dgst, int dgst_len,                                DSA_SIG *sig, DSA *dsa)	{	int v_len, d_len;	int to_return = 0;	int fd;	BIGNUM v;	BN_init(&v);	if(!bn_wexpand(&v, dsa->p->top)) {		UBSECerr(UBSEC_F_UBSEC_DSA_VERIFY, UBSEC_R_BN_EXPAND_FAIL);		goto err;	}	v_len = BN_num_bits(dsa->p);	d_len = p_UBSEC_ubsec_bytes_to_bits((unsigned char *)dgst, dgst_len);	if ((fd = p_UBSEC_ubsec_open(UBSEC_KEY_DEVICE_NAME)) <= 0) {                const DSA_METHOD *meth;		fd = 0;		UBSECerr(UBSEC_F_UBSEC_DSA_VERIFY, UBSEC_R_UNIT_FAILURE);                meth = DSA_OpenSSL();                to_return = meth->dsa_do_verify(dgst, dgst_len, sig, dsa);		goto err;	}	if (p_UBSEC_dsa_verify_ioctl(fd, 0, /* compute hash before signing */		(unsigned char *)dgst, d_len,		(unsigned char *)dsa->p->d, BN_num_bits(dsa->p), 		(unsigned char *)dsa->q->d, BN_num_bits(dsa->q),		(unsigned char *)dsa->g->d, BN_num_bits(dsa->g),		(unsigned char *)dsa->pub_key->d, BN_num_bits(dsa->pub_key),		(unsigned char *)sig->r->d, BN_num_bits(sig->r),		(unsigned char *)sig->s->d, BN_num_bits(sig->s),		(unsigned char *)v.d, &v_len) != 0) {                const DSA_METHOD *meth;		UBSECerr(UBSEC_F_UBSEC_DSA_VERIFY, UBSEC_R_REQUEST_FAILED);                p_UBSEC_ubsec_close(fd);                meth = DSA_OpenSSL();                to_return = meth->dsa_do_verify(dgst, dgst_len, sig, dsa);		goto err;	}	p_UBSEC_ubsec_close(fd);	to_return = 1;err:	BN_clear_free(&v);	return to_return;	}#endif#ifndef OPENSSL_NO_DHstatic int ubsec_dh_compute_key(unsigned char *key,const BIGNUM *pub_key,DH *dh)        {        int      ret      = -1,                 k_len,                 fd;        k_len = BN_num_bits(dh->p);        if ((fd = p_UBSEC_ubsec_open(UBSEC_KEY_DEVICE_NAME)) <= 0)                {                const DH_METHOD *meth;                UBSECerr(UBSEC_F_UBSEC_DH_COMPUTE_KEY, UBSEC_R_UNIT_FAILURE);                meth = DH_OpenSSL();                ret = meth->compute_key(key, pub_key, dh);                goto err;                }        if (p_UBSEC_diffie_hellman_agree_ioctl(fd,                                               (unsigned char *)dh->priv_key->d, BN_num_bits(dh->priv_key),                                               (unsigned char *)pub_key->d, BN_num_bits(pub_key),                                               (unsigned char *)dh->p->d, BN_num_bits(dh->p),                                               key, &k_len) != 0)                {                /* Hardware's a no go, failover to software */                const DH_METHOD *meth;                UBSECerr(UBSEC_F_UBSEC_DH_COMPUTE_KEY, UBSEC_R_REQUEST_FAILED);                p_UBSEC_ubsec_close(fd);                meth = DH_OpenSSL();                ret = meth->compute_key(key, pub_key, dh);                goto err;                }        p_UBSEC_ubsec_close(fd);        ret = p_UBSEC_ubsec_bits_to_bytes(k_len);err:        return ret;        }static int ubsec_dh_generate_key(DH *dh)        {        int      ret               = 0,                 random_bits       = 0,                 pub_key_len       = 0,                 priv_key_len      = 0,                 fd;        BIGNUM   *pub_key          = NULL;        BIGNUM   *priv_key         = NULL;        /*          *  How many bits should Random x be? dh_key.c         *  sets the range from 0 to num_bits(modulus) ???         */        if (dh->priv_key == NULL)                {                priv_key = BN_new();                if (priv_key == NULL) goto err;                priv_key_len = BN_num_bits(dh->p);                bn_wexpand(priv_key, dh->p->top);                do                        if (!BN_rand_range(priv_key, dh->p)) goto err;                while (BN_is_zero(priv_key));                random_bits = BN_num_bits(priv_key);                }        else                {                priv_key = dh->priv_key;                }        if (dh->pub_key == NULL)                {                pub_key = BN_new();                pub_key_len = BN_num_bits(dh->p);                bn_wexpand(pub_key, dh->p->top);                if(pub_key == NULL) goto err;                }        else                {                pub_key = dh->pub_key;                }        if ((fd = p_UBSEC_ubsec_open(UBSEC_KEY_DEVICE_NAME)) <= 0)                {                const DH_METHOD *meth;                UBSECerr(UBSEC_F_UBSEC_DH_GENERATE_KEY, UBSEC_R_UNIT_FAILURE);                meth = DH_OpenSSL();                ret = meth->generate_key(dh);                goto err;                }        if (p_UBSEC_diffie_hellman_generate_ioctl(fd,                                                  (unsigned char *)priv_key->d, &priv_key_len,                                                  (unsigned char *)pub_key->d,  &pub_key_len,                                                  (unsigned char *)dh->g->d, BN_num_bits(dh->g),                                                  (unsigned char *)dh->p->d, BN_num_bits(dh->p),                                                  0, 0, random_bits) != 0)                {                /* Hardware's a no go, failover to software */                const DH_METHOD *meth;                UBSECerr(UBSEC_F_UBSEC_DH_GENERATE_KEY, UBSEC_R_REQUEST_FAILED);                p_UBSEC_ubsec_close(fd);                meth = DH_OpenSSL();                ret = meth->generate_key(dh);                goto err;                }        p_UBSEC_ubsec_close(fd);        dh->pub_key = pub_key;        dh->pub_key->top = (pub_key_len + BN_BITS2-1) / BN_BITS2;        dh->priv_key = priv_key;        dh->priv_key->top = (priv_key_len + BN_BITS2-1) / BN_BITS2;        ret = 1;err:        return ret;        }#endif#ifdef NOT_USEDstatic int ubsec_rand_bytes(unsigned char * buf,                            int num)        {        int      ret      = 0,                 fd;        if ((fd = p_UBSEC_ubsec_open(UBSEC_KEY_DEVICE_NAME)) <= 0)                {                const RAND_METHOD *meth;                UBSECerr(UBSEC_F_UBSEC_RAND_BYTES, UBSEC_R_UNIT_FAILURE);                num = p_UBSEC_ubsec_bits_to_bytes(num);                meth = RAND_SSLeay();                meth->seed(buf, num);                ret = meth->bytes(buf, num);                goto err;                }        num *= 8; /* bytes to bits */        if (p_UBSEC_rng_ioctl(fd,                              UBSEC_RNG_DIRECT,                              buf,                              &num) != 0)                {                /* Hardware's a no go, failover to software */                const RAND_METHOD *meth;                UBSECerr(UBSEC_F_UBSEC_RAND_BYTES, UBSEC_R_REQUEST_FAILED);                p_UBSEC_ubsec_close(fd);                num = p_UBSEC_ubsec_bits_to_bytes(num);                meth = RAND_SSLeay();                meth->seed(buf, num);                ret = meth->bytes(buf, num);                goto err;                }        p_UBSEC_ubsec_close(fd);        ret = 1;err:        return(ret);        }static int ubsec_rand_status(void)	{	return 0;	}#endif/* This stuff is needed if this ENGINE is being compiled into a self-contained * shared-library. */#ifndef OPENSSL_NO_DYNAMIC_ENGINEstatic int bind_fn(ENGINE *e, const char *id)	{	if(id && (strcmp(id, engine_ubsec_id) != 0))		return 0;	if(!bind_helper(e))		return 0;	return 1;	}IMPLEMENT_DYNAMIC_CHECK_FN()IMPLEMENT_DYNAMIC_BIND_FN(bind_fn)#endif /* OPENSSL_NO_DYNAMIC_ENGINE */#endif /* !OPENSSL_NO_HW_UBSEC */#endif /* !OPENSSL_NO_HW */

⌨️ 快捷键说明

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