Deprecate the recursive includes of bn.h from various API headers (asn1.h,
[openssl.git] / crypto / asn1 / x_long.c
index 954d1839751cc96b364953ecd0c83c050eee2bb8..0db233cb95f6596f415b184bbf6cff48e566c0da 100644 (file)
@@ -59,6 +59,7 @@
 #include <stdio.h>
 #include "cryptlib.h"
 #include <openssl/asn1t.h>
+#include <openssl/bn.h>
 
 /* Custom primitive type for long handling. This converts between an ASN1_INTEGER
  * and a long directly.
@@ -69,7 +70,7 @@ static int long_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
 static void long_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
 
 static int long_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it);
-static int long_c2i(ASN1_VALUE **pval, unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it);
+static int long_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it);
 
 static ASN1_PRIMITIVE_FUNCS long_pf = {
        NULL, 0,
@@ -104,7 +105,12 @@ static int long_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const A
        long ltmp;
        unsigned long utmp;
        int clen, pad, i;
-       ltmp = *(long *)pval;
+       /* this exists to bypass broken gcc optimization */
+       char *cp = (char *)pval;
+
+       /* use memcpy, because we may not be long aligned */
+       memcpy(&ltmp, cp, sizeof(long));
+
        if(ltmp == it->size) return -1;
        /* Convert the long to positive: we subtract one if negative so
         * we can cleanly handle the padding if only the MSB of the leading
@@ -131,11 +137,13 @@ static int long_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const A
        return clen + pad;
 }
 
-static int long_c2i(ASN1_VALUE **pval, unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it)
+static int long_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len,
+                   int utype, char *free_cont, const ASN1_ITEM *it)
 {
        int neg, i;
        long ltmp;
        unsigned long utmp = 0;
+       char *cp = (char *)pval;
        if(len > (int)sizeof(long)) {
                ASN1err(ASN1_F_LONG_C2I, ASN1_R_INTEGER_TOO_LARGE_FOR_LONG);
                return 0;
@@ -158,6 +166,6 @@ static int long_c2i(ASN1_VALUE **pval, unsigned char *cont, int len, int utype,
                ASN1err(ASN1_F_LONG_C2I, ASN1_R_INTEGER_TOO_LARGE_FOR_LONG);
                return 0;
        }
-       *(long *)pval = ltmp;
+       memcpy(cp, &ltmp, sizeof(long));
        return 1;
 }