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]

Reply via email to