]> granicus.if.org Git - openssl/commitdiff
Move some DSA functions between files to make it possible to use the DSA
authorDr. Stephen Henson <steve@openssl.org>
Tue, 23 Jan 2007 17:43:57 +0000 (17:43 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Tue, 23 Jan 2007 17:43:57 +0000 (17:43 +0000)
crypto without ASN1 dependency.

crypto/dsa/dsa_asn1.c
crypto/dsa/dsa_lib.c
crypto/dsa/dsa_sign.c
crypto/dsa/dsa_vrf.c

index 23fce555aa40a882c228f2462dba60dd607050fa..7ccf68cc3ee5ef2b0c7c1f0233975768fb5f2961 100644 (file)
 static int sig_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it)
 {
        if(operation == ASN1_OP_NEW_PRE) {
-               DSA_SIG *sig;
-               sig = OPENSSL_malloc(sizeof(DSA_SIG));
-               sig->r = NULL;
-               sig->s = NULL;
-               *pval = (ASN1_VALUE *)sig;
-               if(sig) return 2;
-               DSAerr(DSA_F_SIG_CB, ERR_R_MALLOC_FAILURE);
+               *pval = (ASN1_VALUE *)DSA_SIG_new();
+               if(*pval) return 2;
                return 0;
+       } else if(operation == ASN1_OP_FREE_PRE) {
+               DSA_SIG_free((DSA_SIG *)*pval);
+               *pval = NULL;
+               return 2;
        }
        return 1;
 }
@@ -83,7 +82,7 @@ ASN1_SEQUENCE_cb(DSA_SIG, sig_cb) = {
        ASN1_SIMPLE(DSA_SIG, s, CBIGNUM)
 } ASN1_SEQUENCE_END_cb(DSA_SIG, DSA_SIG)
 
-IMPLEMENT_ASN1_FUNCTIONS_const(DSA_SIG)
+IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DSA_SIG,DSA_SIG,DSA_SIG)
 
 /* Override the default free and new methods */
 static int dsa_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it)
@@ -138,3 +137,61 @@ ASN1_CHOICE_cb(DSAPublicKey, dsa_cb) = {
 } ASN1_CHOICE_END_cb(DSA, DSAPublicKey, write_params)
 
 IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DSA, DSAPublicKey, DSAPublicKey)
+
+int DSA_sign(int type, const unsigned char *dgst, int dlen, unsigned char *sig,
+            unsigned int *siglen, DSA *dsa)
+       {
+       DSA_SIG *s;
+       s=DSA_do_sign(dgst,dlen,dsa);
+       if (s == NULL)
+               {
+               *siglen=0;
+               return(0);
+               }
+       *siglen=i2d_DSA_SIG(s,&sig);
+       DSA_SIG_free(s);
+       return(1);
+       }
+
+/* data has already been hashed (probably with SHA or SHA-1). */
+/* returns
+ *      1: correct signature
+ *      0: incorrect signature
+ *     -1: error
+ */
+int DSA_verify(int type, const unsigned char *dgst, int dgst_len,
+            const unsigned char *sigbuf, int siglen, DSA *dsa)
+       {
+       DSA_SIG *s;
+       int ret=-1;
+
+       s = DSA_SIG_new();
+       if (s == NULL) return(ret);
+       if (d2i_DSA_SIG(&s,&sigbuf,siglen) == NULL) goto err;
+       ret=DSA_do_verify(dgst,dgst_len,s,dsa);
+err:
+       DSA_SIG_free(s);
+       return(ret);
+       }
+
+int DSA_size(const DSA *r)
+       {
+       int ret,i;
+       ASN1_INTEGER bs;
+       unsigned char buf[4];   /* 4 bytes looks really small.
+                                  However, i2d_ASN1_INTEGER() will not look
+                                  beyond the first byte, as long as the second
+                                  parameter is NULL. */
+
+       i=BN_num_bits(r->q);
+       bs.length=(i+7)/8;
+       bs.data=buf;
+       bs.type=V_ASN1_INTEGER;
+       /* If the top bit is set the asn1 encoding is 1 larger. */
+       buf[0]=0xff;    
+
+       i=i2d_ASN1_INTEGER(&bs,NULL);
+       i+=i; /* r and s */
+       ret=ASN1_object_size(1,i,V_ASN1_SEQUENCE);
+       return(ret);
+       }
index d9700eb4d4ce16ede9c3b9aeab3cbd537394089b..e5bfa7c31feeb7db325f12febb974a48871b2db4 100644 (file)
@@ -230,28 +230,6 @@ int DSA_up_ref(DSA *r)
        return ((i > 1) ? 1 : 0);
        }
 
-int DSA_size(const DSA *r)
-       {
-       int ret,i;
-       ASN1_INTEGER bs;
-       unsigned char buf[4];   /* 4 bytes looks really small.
-                                  However, i2d_ASN1_INTEGER() will not look
-                                  beyond the first byte, as long as the second
-                                  parameter is NULL. */
-
-       i=BN_num_bits(r->q);
-       bs.length=(i+7)/8;
-       bs.data=buf;
-       bs.type=V_ASN1_INTEGER;
-       /* If the top bit is set the asn1 encoding is 1 larger. */
-       buf[0]=0xff;    
-
-       i=i2d_ASN1_INTEGER(&bs,NULL);
-       i+=i; /* r and s */
-       ret=ASN1_object_size(1,i,V_ASN1_SEQUENCE);
-       return(ret);
-       }
-
 int DSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
             CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
         {
@@ -269,6 +247,29 @@ void *DSA_get_ex_data(DSA *d, int idx)
        return(CRYPTO_get_ex_data(&d->ex_data,idx));
        }
 
+DSA_SIG *DSA_SIG_new(void)
+       {
+       DSA_SIG *sig;
+       sig = OPENSSL_malloc(sizeof(DSA_SIG));
+       if (!sig)
+               return NULL;
+       sig->r = NULL;
+       sig->s = NULL;
+       return NULL;
+       }
+
+void DSA_SIG_free(DSA_SIG *sig)
+       {
+       if (sig)
+               {
+               if (sig->r)
+                       BN_free(sig->r);
+               if (sig->s)
+                       BN_free(sig->s);
+               OPENSSL_free(sig);
+               }
+       }
+
 #ifndef OPENSSL_NO_DH
 DH *DSA_dup_DH(const DSA *r)
        {
index 37c65efb20e6e30b9d8ecfe6e7c6c3ec10bf66eb..8c21b7f2b566d197977ca9f795fcad218c4f6d88 100644 (file)
@@ -79,21 +79,6 @@ DSA_SIG * DSA_do_sign(const unsigned char *dgst, int dlen, DSA *dsa)
        return dsa->meth->dsa_do_sign(dgst, dlen, dsa);
        }
 
-int DSA_sign(int type, const unsigned char *dgst, int dlen, unsigned char *sig,
-            unsigned int *siglen, DSA *dsa)
-       {
-       DSA_SIG *s;
-       s=DSA_do_sign(dgst,dlen,dsa);
-       if (s == NULL)
-               {
-               *siglen=0;
-               return(0);
-               }
-       *siglen=i2d_DSA_SIG(s,&sig);
-       DSA_SIG_free(s);
-       return(1);
-       }
-
 int DSA_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp)
        {
 #ifdef OPENSSL_FIPS
index c9784bed48e74728ed168bbbd1de00d82287f67b..6f1226ffd11b78b1694691b105e9ce5855314e04 100644 (file)
@@ -80,24 +80,3 @@ int DSA_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig,
 #endif
        return dsa->meth->dsa_do_verify(dgst, dgst_len, sig, dsa);
        }
-
-/* data has already been hashed (probably with SHA or SHA-1). */
-/* returns
- *      1: correct signature
- *      0: incorrect signature
- *     -1: error
- */
-int DSA_verify(int type, const unsigned char *dgst, int dgst_len,
-            const unsigned char *sigbuf, int siglen, DSA *dsa)
-       {
-       DSA_SIG *s;
-       int ret=-1;
-
-       s = DSA_SIG_new();
-       if (s == NULL) return(ret);
-       if (d2i_DSA_SIG(&s,&sigbuf,siglen) == NULL) goto err;
-       ret=DSA_do_verify(dgst,dgst_len,s,dsa);
-err:
-       DSA_SIG_free(s);
-       return(ret);
-       }