Fix for missing DSA parameters.
authorDr. Stephen Henson <steve@openssl.org>
Thu, 24 May 2001 22:33:16 +0000 (22:33 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Thu, 24 May 2001 22:33:16 +0000 (22:33 +0000)
CHANGES
crypto/asn1/x_pubkey.c
crypto/dsa/dsa.h
crypto/dsa/dsa_err.c
crypto/dsa/dsa_ossl.c

diff --git a/CHANGES b/CHANGES
index f4bbe5fbbfdda2fd1757b383bf2c6e712c4f6ee5..e1dfac5d4d19a090fabc36a3de4f7184e69069c1 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,11 @@
 
  Changes between 0.9.6a and 0.9.6b  [XX xxx XXXX]
 
+  *) Fix various bugs related to DSA S/MIME verification. Handle missing
+     parameters in DSA public key structures and return an error in the
+     DSA routines if parameters are absent.
+     [Steve Henson]
+
   *) In versions up to 0.9.6, RAND_file_name() resorted to file ".rnd"
      in the current directory if neither $RANDFILE nor $HOME was set.
      RAND_file_name() in 0.9.6a returned NULL in this case.  This has
index b2e2a514777094311ebfb93e2013e1c705b3793a..4397a404b56f812426971341ad5472d470d2b140 100644 (file)
@@ -234,7 +234,7 @@ EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key)
        a=key->algor;
        if (ret->type == EVP_PKEY_DSA)
                {
-               if (a->parameter->type == V_ASN1_SEQUENCE)
+               if (a->parameter && (a->parameter->type == V_ASN1_SEQUENCE))
                        {
                        ret->pkey.dsa->write_params=0;
                        p=a->parameter->value.sequence->data;
index 3ebcc4ae0a4011a7a4879d7d9c7cca72b101e89f..e98fa389bd50e2924db2fbd2a1a8545066d6f365 100644 (file)
@@ -236,6 +236,7 @@ DH *DSA_dup_DH(DSA *r);
 
 /* Reason codes. */
 #define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE               100
+#define DSA_R_MISSING_PARAMETERS                        101
 
 #ifdef  __cplusplus
 }
index 2b3ab3a9ad8d8027f4cdd6749978c7b143231131..736aeef7c476a2e0214a4f48a63cdafdb361cfbb 100644 (file)
@@ -85,6 +85,7 @@ static ERR_STRING_DATA DSA_str_functs[]=
 static ERR_STRING_DATA DSA_str_reasons[]=
        {
 {DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE       ,"data too large for key size"},
+{DSA_R_MISSING_PARAMETERS                ,"missing parameters"},
 {0,NULL}
        };
 
index 428357233057c45c6225067baeae3d06a2b222df..331d176d6607af0910c3bf164e647b4ba426818d 100644 (file)
@@ -105,6 +105,11 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa)
        int i,reason=ERR_R_BN_LIB;
        DSA_SIG *ret=NULL;
 
+       if (!dsa->p || !dsa->q || !dsa->g)
+               {
+               reason=DSA_R_MISSING_PARAMETERS;
+               goto err;
+               }
        BN_init(&m);
        BN_init(&xr);
        s=BN_new();
@@ -167,6 +172,11 @@ static int dsa_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp)
        BIGNUM k,*kinv=NULL,*r=NULL;
        int ret=0;
 
+       if (!dsa->p || !dsa->q || !dsa->g)
+               {
+               DSAerr(DSA_F_DSA_SIGN_SETUP,DSA_R_MISSING_PARAMETERS);
+               return 0;
+               }
        if (ctx_in == NULL)
                {
                if ((ctx=BN_CTX_new()) == NULL) goto err;