This is from an email sent to openssl-users:

I'm signing and verifying documents using DSA and have run into a couple of
problems.

I'm working with OpenSSL 0.9.7 on Linux with a Broadcom crypto card based on
the 5821 (so OpenSSL engine type is "ubsec").  I have version 1.81 of the
Broadcom driver.

(1) While testing I found that verification of certain signed documents
crashed
OpenSSL.  The problem appears to be that hw_ubsec.c:ubsec_dsa_verify() calls
p_UBSEC_dsa_verify_ioctl() and if this call fails then the code tries using
software crypto, indirectly calling dsa_ossl.c:dsa_do_verify().  However,
dsa_do_verify() tries to do:

   if (!ENGINE_get_DSA(dsa->engine)->dsa_mod_exp(dsa, &t1,dsa->g,&u1,
                                                 dsa->pub_key,&u2,
                                                 dsa->p,ctx,mont))
      goto err;

and this dies because dsa_mod_exp is NULL.  The current workaround is to
set up
pointers in ubsec_dsa for dsa_mod_exp and dsa_bn_mod_exp (just in case):

#ifndef OPENSSL_NO_DSA
static int dsa_mod_exp(DSA *dsa, BIGNUM *rr, BIGNUM *a1, BIGNUM *p1,
                BIGNUM *a2, BIGNUM *p2, BIGNUM *m, BN_CTX *ctx,
                BN_MONT_CTX *in_mont)
{
        return BN_mod_exp2_mont(rr, a1, p1, a2, p2, m, ctx, in_mont);
}

static int dsa_bn_mod_exp(DSA *dsa, BIGNUM *r, BIGNUM *a, const BIGNUM *p,
                                const BIGNUM *m, BN_CTX *ctx,
                                BN_MONT_CTX *m_ctx)
{
        return BN_mod_exp_mont(r, a, p, m, ctx, m_ctx);
}
/* Our internal DSA_METHOD that we provide pointers to */
static DSA_METHOD ubsec_dsa =
        {
        "UBSEC DSA method",
        ubsec_dsa_do_sign,  /* dsa_do_sign */
        NULL,               /* dsa_sign_setup */
        ubsec_dsa_verify,   /* dsa_do_verify */
        dsa_mod_exp,        /* ubsec_dsa_mod_exp */ /* dsa_mod_exp */
        dsa_bn_mod_exp,     /* ubsec_mod_exp_dsa */ /* bn_mod_exp */
        NULL,               /* init */
        NULL,               /* finish */
        0,                  /* flags */
        NULL                /* app_data */
        };
#endif

Not sure if this is entirely kosher, but I don't know why they were NULL to
begin with?

______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to