sha512.c: fullfull implicit API contract in SHA512_Transform.
authorAndy Polyakov <appro@openssl.org>
Wed, 18 Dec 2013 20:27:35 +0000 (21:27 +0100)
committerAndy Polyakov <appro@openssl.org>
Wed, 18 Dec 2013 22:03:03 +0000 (23:03 +0100)
SHA512_Transform was initially added rather as tribute to tradition
than for practucal reasons. But use was recently found in ssl/s3_cbc.c
and it turned to be problematic on platforms that don't tolerate
misasligned references to memory and lack assembly subroutine.
(cherry picked from commit cdd1acd788020d2c525331da1712ada778f1373c)

crypto/sha/sha512.c

index 50dd7dc74437e815631e824b3ddd780903a56b45..50c229ddebf246d4fbeb5a5a2a80c18c2909d5c7 100644 (file)
@@ -232,7 +232,14 @@ int SHA384_Update (SHA512_CTX *c, const void *data, size_t len)
 {   return SHA512_Update (c,data,len);   }
 
 void SHA512_Transform (SHA512_CTX *c, const unsigned char *data)
-{   sha512_block_data_order (c,data,1);  }
+       {
+#ifndef SHA512_BLOCK_CAN_MANAGE_UNALIGNED_DATA
+       if ((size_t)data%sizeof(c->u.d[0]) != 0)
+               memcpy(c->u.p,data,sizeof(c->u.p)),
+               data = c->u.p;
+#endif
+       sha512_block_data_order (c,data,1);
+       }
 
 unsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md)
        {