📄 e_sureware.c
字号:
#ifndef OPENSSL_NO_DSA case 2:/*DSA*/ /* set private/public external reference */ dsatmp = DSA_new_method(e); DSA_set_ex_data(dsatmp,dsaHndidx,hptr); /*dsatmp->flags |= DSA_FLAG_EXT_PKEY;*/ /* set public key*/ dsatmp->pub_key = BN_new(); dsatmp->p = BN_new(); dsatmp->q = BN_new(); dsatmp->g = BN_new(); bn_expand2(dsatmp->pub_key, el/sizeof(BN_ULONG)); bn_expand2(dsatmp->p, el/sizeof(BN_ULONG)); bn_expand2(dsatmp->q, 20/sizeof(BN_ULONG)); bn_expand2(dsatmp->g, el/sizeof(BN_ULONG)); if (!dsatmp->pub_key || dsatmp->pub_key->dmax!=(int)(el/sizeof(BN_ULONG))|| !dsatmp->p || dsatmp->p->dmax!=(int)(el/sizeof(BN_ULONG)) || !dsatmp->q || dsatmp->q->dmax!=20/sizeof(BN_ULONG) || !dsatmp->g || dsatmp->g->dmax!=(int)(el/sizeof(BN_ULONG))) goto err; ret=p_surewarehk_Load_Dsa_Pubkey(msg,key_id,el, (unsigned long *)dsatmp->pub_key->d, (unsigned long *)dsatmp->p->d, (unsigned long *)dsatmp->q->d, (unsigned long *)dsatmp->g->d); surewarehk_error_handling(msg,SUREWARE_F_SUREWARE_LOAD_PUBLIC,ret); if (ret!=1) { SUREWAREerr(SUREWARE_F_SUREWARE_LOAD_PUBLIC,ENGINE_R_FAILED_LOADING_PUBLIC_KEY); goto err; } /* set parameters */ /* normalise pubkey and parameters in case of */ dsatmp->pub_key->top=el/sizeof(BN_ULONG); bn_fix_top(dsatmp->pub_key); dsatmp->p->top=el/sizeof(BN_ULONG); bn_fix_top(dsatmp->p); dsatmp->q->top=20/sizeof(BN_ULONG); bn_fix_top(dsatmp->q); dsatmp->g->top=el/sizeof(BN_ULONG); bn_fix_top(dsatmp->g); /* create an EVP object: engine + rsa key */ res = EVP_PKEY_new(); EVP_PKEY_assign_DSA(res, dsatmp); break;#endif default: SUREWAREerr(SUREWARE_F_SUREWARE_LOAD_PUBLIC,ENGINE_R_FAILED_LOADING_PRIVATE_KEY); goto err; } return res; err: if (res) EVP_PKEY_free(res);#ifndef OPENSSL_NO_RSA if (rsatmp) RSA_free(rsatmp);#endif#ifndef OPENSSL_NO_DSA if (dsatmp) DSA_free(dsatmp);#endif return NULL;}static EVP_PKEY *surewarehk_load_privkey(ENGINE *e, const char *key_id, UI_METHOD *ui_method, void *callback_data){ EVP_PKEY *res = NULL; int ret=0; unsigned long el=0; char *hptr=NULL; char keytype=0; char msg[64]="ENGINE_load_privkey"; if(!p_surewarehk_Load_Privkey) { SUREWAREerr(SUREWARE_F_SUREWAREHK_LOAD_PRIVKEY,ENGINE_R_NOT_INITIALISED); } else { ret=p_surewarehk_Load_Privkey(msg,key_id,&hptr,&el,&keytype); if (ret!=1) { SUREWAREerr(SUREWARE_F_SUREWAREHK_LOAD_PRIVKEY,ENGINE_R_FAILED_LOADING_PRIVATE_KEY); ERR_add_error_data(1,msg); } else res=sureware_load_public(e,key_id,hptr,el,keytype); } return res;}static EVP_PKEY *surewarehk_load_pubkey(ENGINE *e, const char *key_id, UI_METHOD *ui_method, void *callback_data){ EVP_PKEY *res = NULL; int ret=0; unsigned long el=0; char *hptr=NULL; char keytype=0; char msg[64]="ENGINE_load_pubkey"; if(!p_surewarehk_Info_Pubkey) { SUREWAREerr(SUREWARE_F_SUREWAREHK_LOAD_PUBKEY,ENGINE_R_NOT_INITIALISED); } else { /* call once to identify if DSA or RSA */ ret=p_surewarehk_Info_Pubkey(msg,key_id,&el,&keytype); if (ret!=1) { SUREWAREerr(SUREWARE_F_SUREWAREHK_LOAD_PUBKEY,ENGINE_R_FAILED_LOADING_PUBLIC_KEY); ERR_add_error_data(1,msg); } else res=sureware_load_public(e,key_id,hptr,el,keytype); } return res;}/* This cleans up an RSA/DSA KM key(do not destroy the key into the hardware), called when ex_data is freed */static void surewarehk_ex_free(void *obj, void *item, CRYPTO_EX_DATA *ad, int idx,long argl, void *argp){ if(!p_surewarehk_Free) { SUREWAREerr(SUREWARE_F_SUREWAREHK_EX_FREE,ENGINE_R_NOT_INITIALISED); } else p_surewarehk_Free((char *)item,0);}#if 0/* not currently used (bug?) *//* This cleans up an DH KM key (destroys the key into hardware), called when ex_data is freed */static void surewarehk_dh_ex_free(void *obj, void *item, CRYPTO_EX_DATA *ad, int idx,long argl, void *argp){ if(!p_surewarehk_Free) { SUREWAREerr(SUREWARE_F_SUREWAREHK_DH_EX_FREE,ENGINE_R_NOT_INITIALISED); } else p_surewarehk_Free((char *)item,1);}#endif/** return number of decrypted bytes*/#ifndef OPENSSL_NO_RSAstatic int surewarehk_rsa_priv_dec(int flen,const unsigned char *from,unsigned char *to, RSA *rsa,int padding){ int ret=0,tlen; char *buf=NULL,*hptr=NULL; char msg[64]="ENGINE_rsa_priv_dec"; if (!p_surewarehk_Rsa_Priv_Dec) { SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,ENGINE_R_NOT_INITIALISED); } /* extract ref to private key */ else if (!(hptr=RSA_get_ex_data(rsa, rsaHndidx))) { SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,SUREWARE_R_MISSING_KEY_COMPONENTS); goto err; } /* analyse what padding we can do into the hardware */ if (padding==RSA_PKCS1_PADDING) { /* do it one shot */ ret=p_surewarehk_Rsa_Priv_Dec(msg,flen,(unsigned char *)from,&tlen,to,hptr,SUREWARE_PKCS1_PAD); surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,ret); if (ret!=1) goto err; ret=tlen; } else /* do with no padding into hardware */ { ret=p_surewarehk_Rsa_Priv_Dec(msg,flen,(unsigned char *)from,&tlen,to,hptr,SUREWARE_NO_PAD); surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,ret); if (ret!=1) goto err; /* intermediate buffer for padding */ if ((buf=OPENSSL_malloc(tlen)) == NULL) { SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,ERR_R_MALLOC_FAILURE); goto err; } memcpy(buf,to,tlen);/* transfert to into buf */ switch (padding) /* check padding in software */ {#ifndef OPENSSL_NO_SHA case RSA_PKCS1_OAEP_PADDING: ret=RSA_padding_check_PKCS1_OAEP(to,tlen,(unsigned char *)buf,tlen,tlen,NULL,0); break;#endif case RSA_SSLV23_PADDING: ret=RSA_padding_check_SSLv23(to,tlen,(unsigned char *)buf,flen,tlen); break; case RSA_NO_PADDING: ret=RSA_padding_check_none(to,tlen,(unsigned char *)buf,flen,tlen); break; default: SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,SUREWARE_R_UNKNOWN_PADDING_TYPE); goto err; } if (ret < 0) SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_PRIV_DEC,SUREWARE_R_PADDING_CHECK_FAILED); }err: if (buf) { OPENSSL_cleanse(buf,tlen); OPENSSL_free(buf); } return ret;}/** Does what OpenSSL rsa_priv_enc does.*/static int surewarehk_rsa_sign(int flen,const unsigned char *from,unsigned char *to, RSA *rsa,int padding){ int ret=0,tlen; char *hptr=NULL; char msg[64]="ENGINE_rsa_sign"; if (!p_surewarehk_Rsa_Sign) { SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_SIGN,ENGINE_R_NOT_INITIALISED); } /* extract ref to private key */ else if (!(hptr=RSA_get_ex_data(rsa, rsaHndidx))) { SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_SIGN,SUREWARE_R_MISSING_KEY_COMPONENTS); } else { switch (padding) { case RSA_PKCS1_PADDING: /* do it in one shot */ ret=p_surewarehk_Rsa_Sign(msg,flen,(unsigned char *)from,&tlen,to,hptr,SUREWARE_PKCS1_PAD); surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_RSA_SIGN,ret); break; case RSA_NO_PADDING: default: SUREWAREerr(SUREWARE_F_SUREWAREHK_RSA_SIGN,SUREWARE_R_UNKNOWN_PADDING_TYPE); } } return ret==1 ? tlen : ret;}#endif#ifndef OPENSSL_NO_DSA/* DSA sign and verify */static DSA_SIG * surewarehk_dsa_do_sign(const unsigned char *from, int flen, DSA *dsa){ int ret=0; char *hptr=NULL; DSA_SIG *psign=NULL; char msg[64]="ENGINE_dsa_do_sign"; if (!p_surewarehk_Dsa_Sign) { SUREWAREerr(SUREWARE_F_SUREWAREHK_DSA_DO_SIGN,ENGINE_R_NOT_INITIALISED); } /* extract ref to private key */ else if (!(hptr=DSA_get_ex_data(dsa, dsaHndidx))) { SUREWAREerr(SUREWARE_F_SUREWAREHK_DSA_DO_SIGN,SUREWARE_R_MISSING_KEY_COMPONENTS); } else { if((psign = DSA_SIG_new()) == NULL) { SUREWAREerr(SUREWARE_F_SUREWAREHK_DSA_DO_SIGN,ERR_R_MALLOC_FAILURE); goto err; } psign->r=BN_new(); psign->s=BN_new(); bn_expand2(psign->r, 20/sizeof(BN_ULONG)); bn_expand2(psign->s, 20/sizeof(BN_ULONG)); if (!psign->r || psign->r->dmax!=20/sizeof(BN_ULONG) || !psign->s || psign->s->dmax!=20/sizeof(BN_ULONG)) goto err; ret=p_surewarehk_Dsa_Sign(msg,flen,from, (unsigned long *)psign->r->d, (unsigned long *)psign->s->d, hptr); surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_DSA_DO_SIGN,ret); } psign->r->top=20/sizeof(BN_ULONG); bn_fix_top(psign->r); psign->s->top=20/sizeof(BN_ULONG); bn_fix_top(psign->s);err: if (psign) { DSA_SIG_free(psign); psign=NULL; } return psign;}#endifstatic int surewarehk_modexp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx){ int ret=0; char msg[64]="ENGINE_modexp"; if (!p_surewarehk_Mod_Exp) { SUREWAREerr(SUREWARE_F_SUREWAREHK_MODEXP,ENGINE_R_NOT_INITIALISED); } else { bn_expand2(r,m->top); if (r && r->dmax==m->top) { /* do it*/ ret=p_surewarehk_Mod_Exp(msg, m->top*sizeof(BN_ULONG), (unsigned long *)m->d, p->top*sizeof(BN_ULONG), (unsigned long *)p->d, a->top*sizeof(BN_ULONG), (unsigned long *)a->d, (unsigned long *)r->d); surewarehk_error_handling(msg,SUREWARE_F_SUREWAREHK_MODEXP,ret); if (ret==1) { /* normalise result */ r->top=m->top; bn_fix_top(r); } } } return ret;}#endif /* !OPENSSL_NO_HW_SureWare */#endif /* !OPENSSL_NO_HW */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -