Add algorithm specific signature printing. An individual ASN1 method can
[openssl.git] / crypto / dh / dh_ameth.c
index 6d3125789d4d8c5577a166ad0e4abf19f05f3bfd..02ec2d47b4bd39998fa2278f727c085403aa9e8e 100644 (file)
@@ -1,4 +1,4 @@
-/* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL
+/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
  * project 2006.
  */
 /* ====================================================================
@@ -60,6 +60,7 @@
 #include <openssl/x509.h>
 #include <openssl/asn1.h>
 #include <openssl/dh.h>
+#include <openssl/bn.h>
 #include "asn1_locl.h"
 
 static void int_dh_free(EVP_PKEY *pkey)
@@ -117,7 +118,7 @@ static int dh_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey)
        return 1;
 
        err:
-       if (pubkey)
+       if (public_key)
                ASN1_INTEGER_free(public_key);
        if (dh)
                DH_free(dh);
@@ -287,7 +288,7 @@ err:
 
 static void update_buflen(const BIGNUM *b, size_t *pbuflen)
        {
-       int i;
+       size_t i;
        if (!b)
                return;
        if (*pbuflen < (i = (size_t)BN_num_bytes(b)))
@@ -381,7 +382,7 @@ static int do_dh_print(BIO *bp, const DH *x, int indent,
        if (0)
                {
 err:
-               DHerr(DH_F_DHPARAMS_PRINT,reason);
+               DHerr(DH_F_DO_DH_PRINT,reason);
                }
        if (m != NULL) OPENSSL_free(m);
        return(ret);
@@ -397,6 +398,15 @@ static int dh_bits(const EVP_PKEY *pkey)
        return BN_num_bits(pkey->pkey.dh->p);
        }
 
+static int dh_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b)
+       {
+       if (    BN_cmp(a->pkey.dh->p,b->pkey.dh->p) ||
+               BN_cmp(a->pkey.dh->g,b->pkey.dh->g))
+               return 0;
+       else
+               return 1;
+       }
+
 static int dh_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
        {
        BIGNUM *a;
@@ -409,20 +419,18 @@ static int dh_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
 
        if ((a=BN_dup(from->pkey.dh->g)) == NULL)
                return 0;
-       if (to->pkey.dsa->g != NULL)
+       if (to->pkey.dh->g != NULL)
                BN_free(to->pkey.dh->g);
        to->pkey.dh->g=a;
 
        return 1;
        }
 
-static int dh_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b)
+static int dh_missing_parameters(const EVP_PKEY *a)
        {
-       if (    BN_cmp(a->pkey.dh->p,b->pkey.dsa->p) ||
-               BN_cmp(a->pkey.dh->g,b->pkey.dsa->g))
-               return 0;
-       else
+       if (!a->pkey.dh->p || !a->pkey.dh->g)
                return 1;
+       return 0;
        }
 
 static int dh_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b)
@@ -481,10 +489,11 @@ const EVP_PKEY_ASN1_METHOD dh_asn1_meth =
 
        dh_param_decode,
        dh_param_encode,
-       0,
+       dh_missing_parameters,
        dh_copy_parameters,
        dh_cmp_parameters,
        dh_param_print,
+       0,
 
        int_dh_free,
        0