Index: nss/lib/freebl/des.c |
diff --git a/nss/lib/freebl/des.c b/nss/lib/freebl/des.c |
index 63a56acba433ca2cc3e58edc6070bb14bd7ca7b8..bcfcaba6069b7cde3080665649be4a9fa89701a5 100644 |
--- a/nss/lib/freebl/des.c |
+++ b/nss/lib/freebl/des.c |
@@ -13,6 +13,13 @@ |
#include <stddef.h> /* for ptrdiff_t */ |
/* #define USE_INDEXING 1 */ |
+/* Some processors automatically fix up unaligned memory access, so they can |
+ * read or write a HALF (4 bytes) at a time whether the address is 4-byte |
+ * aligned or not. */ |
+#if defined(NSS_X86_OR_X64) |
+#define HAVE_UNALIGNED_ACCESS 1 |
+#endif |
+ |
/* |
* The tables below are the 8 sbox functions, with the 6-bit input permutation |
* and the 32-bit output permutation pre-computed. |
@@ -421,11 +428,13 @@ DES_MakeSchedule( HALF * ks, const BYTE * key, DESDirection direction) |
int delta; |
unsigned int ls; |
-#if defined(NSS_X86_OR_X64) |
+#if defined(HAVE_UNALIGNED_ACCESS) |
left = HALFPTR(key)[0]; |
right = HALFPTR(key)[1]; |
+#if defined(IS_LITTLE_ENDIAN) |
BYTESWAP(left, temp); |
BYTESWAP(right, temp); |
+#endif |
#else |
if (((ptrdiff_t)key & 0x03) == 0) { |
left = HALFPTR(key)[0]; |
@@ -572,11 +581,13 @@ DES_Do1Block(HALF * ks, const BYTE * inbuf, BYTE * outbuf) |
register HALF left, right; |
register HALF temp; |
-#if defined(NSS_X86_OR_X64) |
+#if defined(HAVE_UNALIGNED_ACCESS) |
left = HALFPTR(inbuf)[0]; |
right = HALFPTR(inbuf)[1]; |
+#if defined(IS_LITTLE_ENDIAN) |
BYTESWAP(left, temp); |
BYTESWAP(right, temp); |
+#endif |
#else |
if (((ptrdiff_t)inbuf & 0x03) == 0) { |
left = HALFPTR(inbuf)[0]; |
@@ -643,9 +654,11 @@ DES_Do1Block(HALF * ks, const BYTE * inbuf, BYTE * outbuf) |
FP(left, right, temp); |
-#if defined(NSS_X86_OR_X64) |
+#if defined(HAVE_UNALIGNED_ACCESS) |
+#if defined(IS_LITTLE_ENDIAN) |
BYTESWAP(left, temp); |
BYTESWAP(right, temp); |
+#endif |
HALFPTR(outbuf)[0] = left; |
HALFPTR(outbuf)[1] = right; |
#else |