Add random number generation capability to the cswift engine.
Should this be added to 0.9.6-stable as well? PR: 275
This commit is contained in:
parent
e984b2af64
commit
0638ced5cc
1 changed files with 71 additions and 1 deletions
|
@ -121,6 +121,10 @@ static int cswift_mod_exp_dh(const DH *dh, BIGNUM *r,
|
|||
const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
|
||||
#endif
|
||||
|
||||
/* RAND stuff */
|
||||
static int cswift_rand_bytes(unsigned char *buf, int num);
|
||||
static int cswift_rand_status(void);
|
||||
|
||||
/* The definitions for control commands specific to this engine */
|
||||
#define CSWIFT_CMD_SO_PATH ENGINE_CMD_BASE
|
||||
static const ENGINE_CMD_DEFN cswift_cmd_defns[] = {
|
||||
|
@ -183,6 +187,18 @@ static DH_METHOD cswift_dh =
|
|||
};
|
||||
#endif
|
||||
|
||||
static RAND_METHOD cswift_random =
|
||||
{
|
||||
/* "CryptoSwift RAND method", */
|
||||
NULL,
|
||||
cswift_rand_bytes,
|
||||
NULL,
|
||||
NULL,
|
||||
cswift_rand_bytes,
|
||||
cswift_rand_status,
|
||||
};
|
||||
|
||||
|
||||
/* Constants used when creating the ENGINE */
|
||||
static const char *engine_cswift_id = "cswift";
|
||||
static const char *engine_cswift_name = "CryptoSwift hardware engine support";
|
||||
|
@ -208,7 +224,7 @@ static int bind_helper(ENGINE *e)
|
|||
#ifndef OPENSSL_NO_DH
|
||||
!ENGINE_set_DH(e, &cswift_dh) ||
|
||||
#endif
|
||||
!ENGINE_set_destroy_function(e, cswift_destroy) ||
|
||||
!ENGINE_set_RAND(e, &cswift_random) ||
|
||||
!ENGINE_set_init_function(e, cswift_init) ||
|
||||
!ENGINE_set_finish_function(e, cswift_finish) ||
|
||||
!ENGINE_set_ctrl_function(e, cswift_ctrl) ||
|
||||
|
@ -905,6 +921,60 @@ static int cswift_mod_exp_dh(const DH *dh, BIGNUM *r,
|
|||
}
|
||||
#endif
|
||||
|
||||
/* Random bytes are good */
|
||||
static int cswift_rand_bytes(unsigned char *buf, int num)
|
||||
{
|
||||
SW_CONTEXT_HANDLE hac;
|
||||
SW_STATUS swrc;
|
||||
SW_LARGENUMBER largenum;
|
||||
size_t nbytes = 0;
|
||||
int acquired = 0;
|
||||
int to_return = 0; /* assume failure */
|
||||
|
||||
if (!get_context(&hac))
|
||||
{
|
||||
CSWIFTerr(CSWIFT_F_CSWIFT_CTRL, CSWIFT_R_UNIT_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
acquired = 1;
|
||||
|
||||
while (nbytes < num)
|
||||
{
|
||||
/* tell CryptoSwift how many bytes we want and where we want it.
|
||||
* Note: - CryptoSwift cannot do more than 4096 bytes at a time.
|
||||
* - CryptoSwift can only do multiple of 32-bits. */
|
||||
largenum.value = (SW_BYTE *) buf + nbytes;
|
||||
if (4096 > num - nbytes)
|
||||
largenum.nbytes = num - nbytes;
|
||||
else
|
||||
largenum.nbytes = 4096;
|
||||
|
||||
swrc = p_CSwift_SimpleRequest(hac, SW_CMD_RAND, NULL, 0, &largenum, 1);
|
||||
if (swrc != SW_OK)
|
||||
{
|
||||
char tmpbuf[20];
|
||||
CSWIFTerr(CSWIFT_F_CSWIFT_CTRL, CSWIFT_R_REQUEST_FAILED);
|
||||
sprintf(tmpbuf, "%ld", swrc);
|
||||
ERR_add_error_data(2, "CryptoSwift error number is ", tmpbuf);
|
||||
goto err;
|
||||
}
|
||||
|
||||
nbytes += largenum.nbytes;
|
||||
}
|
||||
to_return = 1; /* success */
|
||||
|
||||
err:
|
||||
if (acquired)
|
||||
release_context(hac);
|
||||
return to_return;
|
||||
}
|
||||
|
||||
static int cswift_rand_status(void)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* This stuff is needed if this ENGINE is being compiled into a self-contained
|
||||
* shared-library. */
|
||||
#ifdef ENGINE_DYNAMIC_SUPPORT
|
||||
|
|
Loading…
Reference in a new issue