Various fixes...
[oweals/openssl.git] / crypto / asn1 / a_utf8.c
index 6179bd09a33ac20d2e6ce20f9caa0ca0f588e00e..854278f136e75977ac888d7e392224ca9415ca6a 100644 (file)
 #include "cryptlib.h"
 #include <openssl/asn1.h>
 
+ASN1_UTF8STRING *ASN1_UTF8STRING_new(void)
+{ return M_ASN1_UTF8STRING_new();}
+
+void ASN1_UTF8STRING_free(ASN1_UTF8STRING *x)
+{ M_ASN1_UTF8STRING_free(x);}
+
 int i2d_ASN1_UTF8STRING(ASN1_UTF8STRING *a, unsigned char **pp)
        {
        return(i2d_ASN1_bytes((ASN1_STRING *)a,pp,
@@ -94,9 +100,9 @@ ASN1_UTF8STRING *d2i_ASN1_UTF8STRING(ASN1_UTF8STRING **a, unsigned char **pp,
  * -4 = character encoded incorrectly (not minimal length).
  */
 
-int UTF8_getc(unsigned char *str, int len, unsigned long *val)
+int UTF8_getc(const unsigned char *str, int len, unsigned long *val)
 {
-       unsigned char *p;
+       const unsigned char *p;
        unsigned long value;
        int ret;
        if(len <= 0) return 0;
@@ -127,7 +133,7 @@ int UTF8_getc(unsigned char *str, int len, unsigned long *val)
                if( ((p[1] & 0xc0) != 0x80)
                   || ((p[2] & 0xc0) != 0x80) 
                   || ((p[3] & 0xc0) != 0x80) ) return -3;
-               value = (*p++ & 0x7) << 18;
+               value = ((unsigned long)(*p++ & 0x7)) << 18;
                value |= (*p++ & 0x3f) << 12;
                value |= (*p++ & 0x3f) << 6;
                value |= *p++ & 0x3f;
@@ -139,9 +145,9 @@ int UTF8_getc(unsigned char *str, int len, unsigned long *val)
                   || ((p[2] & 0xc0) != 0x80) 
                   || ((p[3] & 0xc0) != 0x80) 
                   || ((p[4] & 0xc0) != 0x80) ) return -3;
-               value = (*p++ & 0x3) << 24;
-               value |= (*p++ & 0x3f) << 18;
-               value |= (*p++ & 0x3f) << 12;
+               value = ((unsigned long)(*p++ & 0x3)) << 24;
+               value |= ((unsigned long)(*p++ & 0x3f)) << 18;
+               value |= ((unsigned long)(*p++ & 0x3f)) << 12;
                value |= (*p++ & 0x3f) << 6;
                value |= *p++ & 0x3f;
                if(value < 0x200000) return -4;
@@ -153,10 +159,10 @@ int UTF8_getc(unsigned char *str, int len, unsigned long *val)
                   || ((p[3] & 0xc0) != 0x80) 
                   || ((p[4] & 0xc0) != 0x80) 
                   || ((p[5] & 0xc0) != 0x80) ) return -3;
-               value = (*p++ & 0x1) << 30;
-               value |= (*p++ & 0x3f) << 24;
-               value |= (*p++ & 0x3f) << 18;
-               value |= (*p++ & 0x3f) << 12;
+               value = ((unsigned long)(*p++ & 0x1)) << 30;
+               value |= ((unsigned long)(*p++ & 0x3f)) << 24;
+               value |= ((unsigned long)(*p++ & 0x3f)) << 18;
+               value |= ((unsigned long)(*p++ & 0x3f)) << 12;
                value |= (*p++ & 0x3f) << 6;
                value |= *p++ & 0x3f;
                if(value < 0x4000000) return -4;
@@ -178,55 +184,55 @@ int UTF8_putc(unsigned char *str, int len, unsigned long value)
        if(!str) len = 6;       /* Maximum we will need */
        else if(len <= 0) return -1;
        if(value < 0x80) {
-               if(str) *str = value;
+               if(str) *str = (unsigned char)value;
                return 1;
        }
        if(value < 0x800) {
                if(len < 2) return -1;
                if(str) {
-                       *str++ = ((value >> 6) & 0x1f) | 0xc0;
-                       *str = (value & 0x3f) | 0x80;
+                       *str++ = (unsigned char)(((value >> 6) & 0x1f) | 0xc0);
+                       *str = (unsigned char)((value & 0x3f) | 0x80);
                }
                return 2;
        }
        if(value < 0x10000) {
                if(len < 3) return -1;
                if(str) {
-                       *str++ = ((value >> 12) & 0xf) | 0xe0;
-                       *str++ = ((value >> 6) & 0x3f) | 0x80;
-                       *str = (value & 0x3f) | 0x80;
+                       *str++ = (unsigned char)(((value >> 12) & 0xf) | 0xe0);
+                       *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80);
+                       *str = (unsigned char)((value & 0x3f) | 0x80);
                }
                return 3;
        }
        if(value < 0x200000) {
                if(len < 4) return -1;
                if(str) {
-                       *str++ = ((value >> 18) & 0x7) | 0xf0;
-                       *str++ = ((value >> 12) & 0x3f) | 0x80;
-                       *str++ = ((value >> 6) & 0x3f) | 0x80;
-                       *str = (value & 0x3f) | 0x80;
+                       *str++ = (unsigned char)(((value >> 18) & 0x7) | 0xf0);
+                       *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80);
+                       *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80);
+                       *str = (unsigned char)((value & 0x3f) | 0x80);
                }
                return 4;
        }
        if(value < 0x4000000) {
                if(len < 5) return -1;
                if(str) {
-                       *str++ = ((value >> 24) & 0x3) | 0xf8;
-                       *str++ = ((value >> 18) & 0x3f) | 0x80;
-                       *str++ = ((value >> 12) & 0x3f) | 0x80;
-                       *str++ = ((value >> 6) & 0x3f) | 0x80;
-                       *str = (value & 0x3f) | 0x80;
+                       *str++ = (unsigned char)(((value >> 24) & 0x3) | 0xf8);
+                       *str++ = (unsigned char)(((value >> 18) & 0x3f) | 0x80);
+                       *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80);
+                       *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80);
+                       *str = (unsigned char)((value & 0x3f) | 0x80);
                }
                return 5;
        }
        if(len < 6) return -1;
        if(str) {
-               *str++ = ((value >> 30) & 0x1) | 0xfc;
-               *str++ = ((value >> 24) & 0x3f) | 0x80;
-               *str++ = ((value >> 18) & 0x3f) | 0x80;
-               *str++ = ((value >> 12) & 0x3f) | 0x80;
-               *str++ = ((value >> 6) & 0x3f) | 0x80;
-               *str = (value & 0x3f) | 0x80;
+               *str++ = (unsigned char)(((value >> 30) & 0x1) | 0xfc);
+               *str++ = (unsigned char)(((value >> 24) & 0x3f) | 0x80);
+               *str++ = (unsigned char)(((value >> 18) & 0x3f) | 0x80);
+               *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80);
+               *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80);
+               *str = (unsigned char)((value & 0x3f) | 0x80);
        }
        return 6;
 }