Initialize pval.
[openssl.git] / crypto / dsa / dsa_ameth.c
index ed0ab2b712c8be5688e27638ea7acc2df1540aa4..b9f7a4d687189638f8038e53dd769e6de2536d04 100644 (file)
@@ -123,7 +123,7 @@ static int dsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey)
 static int dsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)
        {
        DSA *dsa;
-       void *pval;
+       void *pval = NULL;
        int ptype;
        unsigned char *penc = NULL;
        int penclen;
@@ -143,10 +143,7 @@ static int dsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)
                ptype = V_ASN1_SEQUENCE;
                }
        else
-               {
                ptype = V_ASN1_UNDEF;
-               pval = NULL;
-               }
        dsa->write_params=0;
 
        penclen = i2d_DSAPublicKey(dsa, &penc);
@@ -473,6 +470,23 @@ err:
        return(ret);
        }
 
+static int dsa_param_decode(EVP_PKEY *pkey,
+                                       const unsigned char **pder, int derlen)
+       {
+       DSA *dsa;
+       if (!(dsa = d2i_DSAparams(NULL, pder, derlen)))
+               {
+               DSAerr(DSA_F_DSA_PARAM_DECODE, ERR_R_DSA_LIB);
+               return 0;
+               }
+       EVP_PKEY_assign_DSA(pkey, dsa);
+       return 1;
+       }
+
+static int dsa_param_encode(const EVP_PKEY *pkey, unsigned char **pder)
+       {
+       return i2d_DSAparams(pkey->pkey.dsa, pder);
+       }
 
 static int dsa_param_print(BIO *bp, const EVP_PKEY *pkey, int indent,
                                                        ASN1_PCTX *ctx)
@@ -493,6 +507,24 @@ static int dsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent,
        return do_dsa_print(bp, pkey->pkey.dsa, indent, 2);
        }
 
+static int old_dsa_priv_decode(EVP_PKEY *pkey,
+                                       const unsigned char **pder, int derlen)
+       {
+       DSA *dsa;
+       if (!(dsa = d2i_DSAPrivateKey (NULL, pder, derlen)))
+               {
+               DSAerr(DSA_F_DSA_PRIV_DECODE, ERR_R_DSA_LIB);
+               return 0;
+               }
+       EVP_PKEY_assign_DSA(pkey, dsa);
+       return 1;
+       }
+
+static int old_dsa_priv_encode(const EVP_PKEY *pkey, unsigned char **pder)
+       {
+       return i2d_DSAPrivateKey(pkey->pkey.dsa, pder);
+       }
+
 /* NB these are sorted in pkey_id order, lowest first */
 
 const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[] = 
@@ -527,7 +559,7 @@ const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[] =
                EVP_PKEY_DSA,
                0,
 
-               "dsa",
+               "DSA",
                "OpenSSL DSA method",
 
                dsa_pub_decode,
@@ -542,14 +574,17 @@ const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[] =
                int_dsa_size,
                dsa_bits,
 
-               0,0,
+               dsa_param_decode,
+               dsa_param_encode,
                dsa_missing_parameters,
                dsa_copy_parameters,
                dsa_cmp_parameters,
                dsa_param_print,
 
                int_dsa_free,
-               0
+               0,
+               old_dsa_priv_decode,
+               old_dsa_priv_encode
                }
        };