Submitted by: Lidong Zhou <ldzhou@cs.cornell.edu>
[openssl.git] / crypto / md32_common.h
index 4270862d68be7e713d2decab1aef5b380de6465d..2b91f9eef2a59dd8b31f87d52f75601d3df71749 100644 (file)
 #ifndef PEDANTIC
 # if defined(_MSC_VER)
 #  define ROTATE(a,n)     _lrotl(a,n)
-# elif defined(__GNUC__) && __GNUC__>=2
+# elif defined(__GNUC__) && __GNUC__>=2 && !defined(NO_ASM)
   /*
    * Some GNU C inline assembler templates. Note that these are
    * rotates by *constant* number of bits! But that's exactly
  * Engage compiler specific "fetch in reverse byte order"
  * intrinsic function if available.
  */
-# if defined(__GNUC__) && __GNUC__>=2
+# if defined(__GNUC__) && __GNUC__>=2 && !defined(NO_ASM)
   /* some GNU C inline assembler templates by <appro@fy.chalmers.se> */
 #  if defined(__i386) && !defined(I386_ONLY)
 #   define BE_FETCH32(a)       ({ register unsigned int l=(a);\
 #  endif
 #endif
 
-#if !defined(HASH_BLOCK_DATA_ORDER_ALIGNED) && HASH_BLOCK_DATA_ORDER_ALIGNED!=1
+#if !defined(HASH_BLOCK_DATA_ORDER_ALIGNED)
 #ifndef HASH_BLOCK_DATA_ORDER
 #error "HASH_BLOCK_DATA_ORDER must be defined!"
 #endif
@@ -461,13 +461,14 @@ void HASH_UPDATE (HASH_CTX *c, const unsigned char *data, unsigned long len)
        sw=len/HASH_CBLOCK;
        if (sw > 0)
                {
-#if defined(HASH_BLOCK_DATA_ORDER_ALIGNED) && HASH_BLOCK_DATA_ORDER_ALIGNED!=1
+#if defined(HASH_BLOCK_DATA_ORDER_ALIGNED)
                /*
                 * Note that HASH_BLOCK_DATA_ORDER_ALIGNED gets defined
                 * only if sizeof(HASH_LONG)==4.
                 */
                if ((((unsigned long)data)%4) == 0)
                        {
+                       /* data is properly aligned so that we can cast it: */
                        HASH_BLOCK_DATA_ORDER_ALIGNED (c,(HASH_LONG *)data,sw);
                        sw*=HASH_CBLOCK;
                        data+=sw;
@@ -486,7 +487,7 @@ void HASH_UPDATE (HASH_CTX *c, const unsigned char *data, unsigned long len)
 #endif
 #if defined(HASH_BLOCK_DATA_ORDER)
                        {
-                       HASH_BLOCK_DATA_ORDER(c,(const unsigned char *)data,sw);
+                       HASH_BLOCK_DATA_ORDER(c,data,sw);
                        sw*=HASH_CBLOCK;
                        data+=sw;
                        len-=sw;
@@ -510,10 +511,11 @@ void HASH_UPDATE (HASH_CTX *c, const unsigned char *data, unsigned long len)
        }
 
 
-void HASH_TRANSFORM (HASH_CTX *c, unsigned char *data)
+void HASH_TRANSFORM (HASH_CTX *c, const unsigned char *data)
        {
-#if defined(HASH_BLOCK_DATA_ORDER_ALIGNED) && HASH_BLOCK_DATA_ORDER_ALIGNED!=1
+#if defined(HASH_BLOCK_DATA_ORDER_ALIGNED)
        if ((((unsigned long)data)%4) == 0)
+               /* data is properly aligned so that we can cast it: */
                HASH_BLOCK_DATA_ORDER_ALIGNED (c,(HASH_LONG *)data,1);
        else
 #if !defined(HASH_BLOCK_DATA_ORDER)
@@ -524,7 +526,7 @@ void HASH_TRANSFORM (HASH_CTX *c, unsigned char *data)
 #endif
 #endif
 #if defined(HASH_BLOCK_DATA_ORDER)
-       HASH_BLOCK_DATA_ORDER (c,(const unsigned char *)data,1);
+       HASH_BLOCK_DATA_ORDER (c,data,1);
 #endif
        }