Have you reported this to Sun?
Cheers,
Ben.
Eric Laroche wrote:
>
> Hi all,
>
> While performing performance tests on a Sun Crypto Accelerator I Board
> (also known as CryptoSwift) on sparc-sun-solaris architecture, I
> noticed a race condition between the libswift.so-hardware-I/O and the
> alarm signal speed.c uses.
>
> The symptom was the openssl speed program terminating with the
> following openssl error message:
>
> 9728:error:26066072:engine routines:CSWIFT_MOD_EXP:request failed:
> hw_cswift.c:413:CryptoSwift error number is -10004
>
> [or on the latest source snapshot:
> 2197:error:80068076:cswift engine code:cswift_mod_exp_crt:request
> failed:hw_cswift.c:680:CryptoSwift error number is -10004]
>
> [from cswift.h: -10004 is SW_ERR_NO_EXECUTE 'The Card failed to
> execute the command']
>
> Obviously, libswift.so does not restart the ioctl call(s) that fails
> with EINTR when SIGALRM is received, as observed in a truss output.
>
> I don't know which libswift versions are affected by this problem; see
> below for version details on the one I tested.
>
> This problem does not only affect the 'openssl speed' code, but any
> code that uses the openssl engine library, cswift and signal handlers.
>
> There may be some other problematic signals besides SIGALRM (e.g.
> SIGCHLD, SIGUSR1, SIGUSR2, and probably more), so I decided to block
> (hold) all signals (but the non-blockable SIGKILL, etc.) during the
> libswift calls. [It is probably not necessary to protect the attach-
> parameters call and maybe neither the require-context and release-
> context, but it's safe, and the time penalty is probably minimal.]
>
> The tested libswift.so version is the following: libswift.so.5.2.2
> (file date Jul 28 2000, 87196 bytes, md5sum
> fc43e2e71bdacf30337ce4f3f6252f6d, SUNWsecsn sun-solaris package
> version 1.0.0,REV=2000.08.09).
>
> Regards,
> Eric
>
> --
> Eric Laroche <[EMAIL PROTECTED]>, AdNovum Informatik AG
>
> ------------------------------------------------------------------------
> diff -ur openssl-SNAP-20011126.orig/crypto/engine/hw_cswift.c
>openssl-SNAP-20011126/crypto/engine/hw_cswift.c
> --- openssl-SNAP-20011126.orig/crypto/engine/hw_cswift.c Tue Sep 25 22:02:20
>2001
> +++ openssl-SNAP-20011126/crypto/engine/hw_cswift.c Tue Nov 27 10:17:17 2001
> @@ -255,6 +255,40 @@
> static const char *engine_cswift_id = "cswift";
> static const char *engine_cswift_name = "CryptoSwift hardware engine support";
>
> +/* Signal blocking during libswift calls */
> +
> +#if defined(unix)
> +#include <signal.h>
> +#endif
> +
> +static void crit_sect_on(void* sigctx, int size) {
> +#if defined(unix)
> + sigset_t s, t;
> + if (size < sizeof(s))
> + return;
> + /* Block all signals. Note that typically, the sigprocmask
> + ** manual page states that it is not possible to block those
> + ** signals that cannot be ignored (e.g. SIGKILL and SIGSTOP)
> + ** but that this restriction is silently imposed by the system.
> + */
> + sigfillset(&t);
> + sigprocmask(SIG_SETMASK, &t, &s);
> + /* [To have proper data alignment, don't use 'sigctx' directly.] */
> + memcpy(sigctx, &s, sizeof(s));
> +#endif
> +}
> +
> +static void crit_sect_off(void* sigctx, int size) {
> +#if defined(unix)
> + sigset_t s;
> + if (size < sizeof(s))
> + return;
> + /* [To have proper data alignment, don't use 'sigctx' directly.] */
> + memcpy(&s, sigctx, sizeof(s));
> + sigprocmask(SIG_SETMASK, &s, NULL);
> +#endif
> +}
> +
> /* This internal function is used by ENGINE_cswift() and possibly by the
> * "dynamic" ENGINE support too */
> static int bind_helper(ENGINE *e)
> @@ -365,8 +399,11 @@
> static int get_context(SW_CONTEXT_HANDLE *hac)
> {
> SW_STATUS status;
> + char sigctx[32];
>
> + crit_sect_on(sigctx, sizeof(sigctx));
> status = p_CSwift_AcquireAccContext(hac);
> + crit_sect_off(sigctx, sizeof(sigctx));
> if(status != SW_OK)
> return 0;
> return 1;
> @@ -375,7 +412,11 @@
> /* similarly to release one. */
> static void release_context(SW_CONTEXT_HANDLE hac)
> {
> + char sigctx[32];
> +
> + crit_sect_on(sigctx, sizeof(sigctx));
> p_CSwift_ReleaseAccContext(hac);
> + crit_sect_off(sigctx, sizeof(sigctx));
> }
>
> /* Destructor (complements the "ENGINE_cswift()" constructor) */
> @@ -506,6 +547,7 @@
> SW_PARAM sw_param;
> SW_CONTEXT_HANDLE hac;
> int to_return, acquired;
> + char sigctx[32];
>
> modulus = exponent = argument = result = NULL;
> to_return = 0; /* expect failure */
> @@ -541,8 +583,10 @@
> sw_param.up.exp.exponent.nbytes = BN_bn2bin(p,
> (unsigned char *)exponent->d);
> sw_param.up.exp.exponent.value = (unsigned char *)exponent->d;
> + crit_sect_on(sigctx, sizeof(sigctx));
> /* Attach the key params */
> sw_status = p_CSwift_AttachKeyParam(hac, &sw_param);
> + crit_sect_off(sigctx, sizeof(sigctx));
> switch(sw_status)
> {
> case SW_OK:
> @@ -565,9 +609,11 @@
> res.nbytes = BN_num_bytes(m);
> memset(result->d, 0, res.nbytes);
> res.value = (unsigned char *)result->d;
> + crit_sect_on(sigctx, sizeof(sigctx));
> /* Perform the operation */
> - if((sw_status = p_CSwift_SimpleRequest(hac, SW_CMD_MODEXP, &arg, 1,
> - &res, 1)) != SW_OK)
> + sw_status = p_CSwift_SimpleRequest(hac, SW_CMD_MODEXP, &arg, 1, &res, 1);
> + crit_sect_off(sigctx, sizeof(sigctx));
> + if(sw_status != SW_OK)
> {
> char tmpbuf[20];
> CSWIFTerr(CSWIFT_F_CSWIFT_MOD_EXP,CSWIFT_R_REQUEST_FAILED);
> @@ -603,6 +649,7 @@
> BIGNUM *result = NULL;
> int to_return = 0; /* expect failure */
> int acquired = 0;
> + char sigctx[32];
>
> if(!get_context(&hac))
> {
> @@ -648,8 +695,10 @@
> sw_param.up.crt.iqmp.nbytes = BN_bn2bin(iqmp,
> (unsigned char *)rsa_iqmp->d);
> sw_param.up.crt.iqmp.value = (unsigned char *)rsa_iqmp->d;
> + crit_sect_on(sigctx, sizeof(sigctx));
> /* Attach the key params */
> sw_status = p_CSwift_AttachKeyParam(hac, &sw_param);
> + crit_sect_off(sigctx, sizeof(sigctx));
> switch(sw_status)
> {
> case SW_OK:
> @@ -672,9 +721,11 @@
> res.nbytes = 2 * BN_num_bytes(p);
> memset(result->d, 0, res.nbytes);
> res.value = (unsigned char *)result->d;
> + crit_sect_on(sigctx, sizeof(sigctx));
> /* Perform the operation */
> - if((sw_status = p_CSwift_SimpleRequest(hac, SW_CMD_MODEXP_CRT, &arg, 1,
> - &res, 1)) != SW_OK)
> + sw_status = p_CSwift_SimpleRequest(hac, SW_CMD_MODEXP_CRT, &arg, 1, &res, 1);
> + crit_sect_off(sigctx, sizeof(sigctx));
> + if(sw_status != SW_OK)
> {
> char tmpbuf[20];
> CSWIFTerr(CSWIFT_F_CSWIFT_MOD_EXP_CRT,CSWIFT_R_REQUEST_FAILED);
> @@ -737,6 +788,7 @@
> BIGNUM *result = NULL;
> DSA_SIG *to_return = NULL;
> int acquired = 0;
> + char sigctx[32];
>
> if((ctx = BN_CTX_new()) == NULL)
> goto err;
> @@ -780,8 +832,10 @@
> sw_param.up.dsa.key.nbytes = BN_bn2bin(dsa->priv_key,
> (unsigned char *)dsa_key->d);
> sw_param.up.dsa.key.value = (unsigned char *)dsa_key->d;
> + crit_sect_on(sigctx, sizeof(sigctx));
> /* Attach the key params */
> sw_status = p_CSwift_AttachKeyParam(hac, &sw_param);
> + crit_sect_off(sigctx, sizeof(sigctx));
> switch(sw_status)
> {
> case SW_OK:
> @@ -804,9 +858,11 @@
> res.nbytes = BN_num_bytes(dsa->p);
> memset(result->d, 0, res.nbytes);
> res.value = (unsigned char *)result->d;
> + crit_sect_on(sigctx, sizeof(sigctx));
> /* Perform the operation */
> sw_status = p_CSwift_SimpleRequest(hac, SW_CMD_DSS_SIGN, &arg, 1,
> &res, 1);
> + crit_sect_off(sigctx, sizeof(sigctx));
> if(sw_status != SW_OK)
> {
> char tmpbuf[20];
> @@ -849,6 +905,7 @@
> BIGNUM *argument = NULL;
> int to_return = -1;
> int acquired = 0;
> + char sigctx[32];
>
> if((ctx = BN_CTX_new()) == NULL)
> goto err;
> @@ -892,8 +949,10 @@
> sw_param.up.dsa.key.nbytes = BN_bn2bin(dsa->pub_key,
> (unsigned char *)dsa_key->d);
> sw_param.up.dsa.key.value = (unsigned char *)dsa_key->d;
> + crit_sect_on(sigctx, sizeof(sigctx));
> /* Attach the key params */
> sw_status = p_CSwift_AttachKeyParam(hac, &sw_param);
> + crit_sect_off(sigctx, sizeof(sigctx));
> switch(sw_status)
> {
> case SW_OK:
> @@ -920,9 +979,11 @@
> BN_bn2bin(sig->s, arg[1].value + 40 - BN_num_bytes(sig->s));
> res.nbytes = 4; /* unsigned long */
> res.value = (unsigned char *)(&sig_result);
> + crit_sect_on(sigctx, sizeof(sigctx));
> /* Perform the operation */
> sw_status = p_CSwift_SimpleRequest(hac, SW_CMD_DSS_VERIFY, arg, 2,
> &res, 1);
> + crit_sect_off(sigctx, sizeof(sigctx));
> if(sw_status != SW_OK)
> {
> char tmpbuf[20];
--
http://www.apache-ssl.org/ben.html http://www.thebunker.net/
"There is no limit to what a man can do or how far he can go if he
doesn't mind who gets the credit." - Robert Woodruff
______________________________________________________________________
OpenSSL Project http://www.openssl.org
Development Mailing List [EMAIL PROTECTED]
Automated List Manager [EMAIL PROTECTED]