Hi all.

I was just checking the latest 1.0.1l version (running previously the 1.0.1i). some DSA signature check done with DSA_verify() are not working any more, for at least one private/public key I'm using.

The public key was generated from the private key, long time ago, as usual with command "openssl dsa -in key.priv -out key.pub -pubout"
So, it is not a forged key.

Here is the various things I tried / see.
I someone can tell me if this is an openssl issue, or simply the way I'm using openssl lib, I will appreciate.

1) I imagine first that old generated keys are no more valid one to enforce the CVE-2014-8275 warning, yet, generating a new public key with the new openssl version lead to the same issue.

2) I try the lastest openssl-1.0.1-stable-SNAP-20150116 sources, but the issue is still here

3) trying a public key in DER format (openssl dsa -in key.priv -out key.pub -pubout -outform DER), it doesn't change anything

4) if I revert CVE-2014-8275 patch https://github.com/openssl/openssl/commit/684400ce192dac51df3d3e92b61830a6ef90be3e,
it fix my issue.

5) diging  in the source code

   diff --git a/crypto/dsa/dsa_asn1.c b/crypto/dsa/dsa_asn1.c
   index 473af87..a018d52 100644
   --- a/crypto/dsa/dsa_asn1.c
   +++ b/crypto/dsa/dsa_asn1.c
   @@ -184,17 +184,24 @@ int DSA_verify(int type, const unsigned char
   *dgst, int dgst_len,
            s = DSA_SIG_new();
            if (s == NULL) return(ret);
            if (d2i_DSA_SIG(&s,&p,siglen) == NULL) goto err;
            /* Ensure signature uses DER and doesn't have trailing
   garbage */
            derlen = i2d_DSA_SIG(s, &der);
   -       if (derlen != siglen || memcmp(sigbuf, der, derlen))
   +       if (derlen != siglen || memcmp(sigbuf, der, derlen)) {
   +           printf(" derlen=%d siglen=%d\n", derlen, siglen);
                    goto err;
   +       }
            ret=DSA_do_verify(dgst,dgst_len,s,dsa);
     err:



it shows: derlen=47 siglen=48. this is the reason why it failed.

5) here is the public key

-----BEGIN PUBLIC KEY-----
MIIBtjCCASsGByqGSM44BAEwggEeAoGBAKeSlIE9Q3ijwBOsB4ObfZW8cSsvIyDO
wioNBzZOEm8AoeOVc8xROEmWqvt7TBvM6OK46qNMJTLeHOiIXaRjqosQVWEb4D4l
IVjMtjpQFDAzxPsJZv6EaW/jM2ZXe6tVBanCJW/gi1NgnXpIkA5ohRqPJ+nqPR8p
OPbrBERrG1bzAhUAjDqhLrONrdvTe2HJJrB9V4An0BMCgYAF6vZzaZ4GEF8urI7b
ChkD0+aQZIAXBal/cBJMHI94HeYtBThT25+whfiWtEPbc99NhNAHnvGyIDVECAjZ
Rx1ZhV0Wn45UExCm7S7hHZY/I/jjoQRFvtMR0e4OqJXjIykx4r1SqXgZuO4M8Tv7
VzBLz6hhMqGZ7TqdqxqLH/cd9gOBhAACgYAlJlPWDNetO1TbO5OFfbl0rvTgIlZV
yWnRtIlks35f/iPkb2a7PsRUXcosvblX7Lg5oheC2m68MaEDx16XMvPmHWmvaR16
/BnX6DZHMtNDNMW6o7sce/AMhnT0PGiB1SCuugTxSt32RdDgRFcNBKUUCr47Nyor
dHdD2r/2/GQqpQ==
-----END PUBLIC KEY-----

6) ... and the way I'm using DSA_verify()

static enum dsa_verify_result dsa_verify_helper(const char *name, const unsigned char *digest, int digest_size, const unsigned char *signature, int signature_size) {
    DSA * dsa = NULL;
    char pubkey_path[128];
    FILE *F = NULL;

    /* try to read a PEM formatted key */
snprintf(pubkey_path, sizeof(pubkey_path), "/share/pubkey/%s.pub", name );
    F = fopen( pubkey_path, "rb" );
    if (F) {
        if (PEM_read_DSA_PUBKEY( F, &dsa, PEM_def_callback, (void *)"" )) {
            dbg("  find a PEM pub key");
            goto dsa_verify_helper_get_a_key;
        }
        fclose( F );
        F = NULL;
    }

    /* try to read a DER formatted key */
snprintf(pubkey_path, sizeof(pubkey_path), "/share/pubkey/%s.pub.der", name );
    F = fopen( pubkey_path, "rb" );
    if (F) {
        if (d2i_DSA_PUBKEY_fp( F, &dsa )) {
            dbg("  find a DER pub key");
            goto dsa_verify_helper_get_a_key;
        }
    }
    /* if we are here, we failed to read a pub key */
    if (F) fclose( F );
    return DSA_VERIFY_NO_PUBKEY;


dsa_verify_helper_get_a_key:
    fclose( F );

int r = DSA_verify( 0, digest, digest_size, signature, signature_size, dsa );

    DSA_free( dsa );

    if (r == 1) {
        /* ok */
        return DSA_VERIFY_OK;
    } else {
        return DSA_VERIFY_BAD;
    }
}

_______________________________________________
openssl-users mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users

Reply via email to