hide the definition of ECDSA_METHOD and ECDSA_DATA (and mutatis mutandis
[openssl.git] / crypto / asn1 / a_int.c
index 8ae9827f6eaf5464bfb11e64a0c0a3a90685423d..973f0c14479bf68949d89bf09eab23ed6599a46a 100644 (file)
 #include <stdio.h>
 #include "cryptlib.h"
 #include <openssl/asn1.h>
+#include <openssl/bn.h>
 
 ASN1_INTEGER *ASN1_INTEGER_dup(ASN1_INTEGER *x)
 { return M_ASN1_INTEGER_dup(x);}
 
 int ASN1_INTEGER_cmp(ASN1_INTEGER *x, ASN1_INTEGER *y)
-{ return M_ASN1_INTEGER_cmp(x,y);}
+       { 
+       int neg, ret;
+       /* Compare signs */
+       neg = x->type & V_ASN1_NEG;
+       if (neg != (y->type & V_ASN1_NEG))
+               {
+               if (neg)
+                       return -1;
+               else
+                       return 1;
+               }
+
+       ret = ASN1_STRING_cmp(x, y);
+
+       if (neg)
+               return -ret;
+       else
+               return ret;
+       }
+       
 
 /* 
  * This converts an ASN1 INTEGER into its content encoding.
@@ -155,11 +175,12 @@ int i2c_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp)
 
 /* Convert just ASN1 INTEGER content octets to ASN1_INTEGER structure */
 
-ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **a, unsigned char **pp,
+ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **a, const unsigned char **pp,
             long len)
        {
        ASN1_INTEGER *ret=NULL;
-       unsigned char *p,*to,*s, *pend;
+       const unsigned char *p, *pend;
+       unsigned char *to,*s;
        int i;
 
        if ((a == NULL) || ((*a) == NULL))
@@ -247,11 +268,12 @@ err:
  * with its MSB set as negative (it doesn't add a padding zero).
  */
 
-ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, unsigned char **pp,
+ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, const unsigned char **pp,
             long length)
        {
        ASN1_INTEGER *ret=NULL;
-       unsigned char *p,*to,*s;
+       const unsigned char *p;
+       unsigned char *to,*s;
        long len;
        int inf,tag,xclass;
        int i;
@@ -313,12 +335,13 @@ err:
 
 int ASN1_INTEGER_set(ASN1_INTEGER *a, long v)
        {
-       int i,j,k;
+       int j,k;
+       unsigned int i;
        unsigned char buf[sizeof(long)+1];
        long d;
 
        a->type=V_ASN1_INTEGER;
-       if (a->length < (sizeof(long)+1))
+       if (a->length < (int)(sizeof(long)+1))
                {
                if (a->data != NULL)
                        OPENSSL_free(a->data);
@@ -362,7 +385,7 @@ long ASN1_INTEGER_get(ASN1_INTEGER *a)
        else if (i != V_ASN1_INTEGER)
                return -1;
        
-       if (a->length > sizeof(long))
+       if (a->length > (int)sizeof(long))
                {
                /* hmm... a bit ugly */
                return(0xffffffffL);
@@ -393,13 +416,14 @@ ASN1_INTEGER *BN_to_ASN1_INTEGER(BIGNUM *bn, ASN1_INTEGER *ai)
                ASN1err(ASN1_F_BN_TO_ASN1_INTEGER,ERR_R_NESTED_ASN1_ERROR);
                goto err;
                }
-       if(bn->neg) ret->type = V_ASN1_NEG_INTEGER;
+       if (BN_is_negative(bn))
+               ret->type = V_ASN1_NEG_INTEGER;
        else ret->type=V_ASN1_INTEGER;
        j=BN_num_bits(bn);
        len=((j == 0)?0:((j/8)+1));
        if (ret->length < len+4)
                {
-               char *new_data=(char *)OPENSSL_realloc(ret->data, len+4);
+               unsigned char *new_data=OPENSSL_realloc(ret->data, len+4);
                if (!new_data)
                        {
                        ASN1err(ASN1_F_BN_TO_ASN1_INTEGER,ERR_R_MALLOC_FAILURE);
@@ -426,7 +450,8 @@ BIGNUM *ASN1_INTEGER_to_BN(ASN1_INTEGER *ai, BIGNUM *bn)
 
        if ((ret=BN_bin2bn(ai->data,ai->length,bn)) == NULL)
                ASN1err(ASN1_F_ASN1_INTEGER_TO_BN,ASN1_R_BN_LIB);
-       else if(ai->type == V_ASN1_NEG_INTEGER) ret->neg = 1;
+       else if(ai->type == V_ASN1_NEG_INTEGER)
+               BN_set_negative(ret, 1);
        return(ret);
        }