Print this page
5007142 Add ntohll and htonll to sys/byteorder.h
6717509 Need to use bswap/bswapq for byte swap of 64-bit integer on x32/x64
PSARC 2008/474

@@ -21,12 +21,10 @@
 /*
  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident   "%Z%%M% %I%     %E% SMI"
-
 #include <sys/types.h>
 #include <sys/systm.h>
 #include <sys/ddi.h>
 #include <sys/sysmacros.h>
 #include <sys/strsun.h>

@@ -1488,14 +1486,11 @@
                 bcopy(cipherKey, keyarr.ka32, keysize);
         }
 
 #else   /* byte swap */
         for (i = 0, j = 0; j < keysize; i++, j += 4) {
-                keyarr.ka32[i] = (((uint32_t)cipherKey[j] << 24) |
-                    ((uint32_t)cipherKey[j + 1] << 16) |
-                    ((uint32_t)cipherKey[j + 2] << 8) |
-                    (uint32_t)cipherKey[j + 3]);
+                keyarr.ka32[i] = htonl(*(uint32_t *)&cipherKey[j]);
         }
 #endif
 
         aes_setupkeys(newbie, keyarr.ka32, keyBits);
 /* EXPORT DELETE END */

@@ -1528,19 +1523,14 @@
                 /* Copy input block into buffer */
 #ifndef AES_BYTE_SWAP
                 bcopy(pt, &buffer, AES_BLOCK_LEN);
 
 #else   /* byte swap */
-                buffer[0] = (((uint32_t)pt[0] << 24) | ((uint32_t)pt[1] << 16) |
-                    ((uint32_t)pt[2] << 8) | (uint32_t)pt[3]);
-                buffer[1] = (((uint32_t)pt[4] << 24) | ((uint32_t)pt[5] << 16) |
-                    ((uint32_t)pt[6] << 8) | (uint32_t)pt[7]);
-                buffer[2] = (((uint32_t)pt[8] << 24) | ((uint32_t)pt[9] << 16) |
-                    ((uint32_t)pt[10] << 8) | (uint32_t)pt[11]);
-                buffer[3] = (((uint32_t)pt[12] << 24) |
-                    ((uint32_t)pt[13] << 16) | ((uint32_t)pt[14] << 8) |
-                    (uint32_t)pt[15]);
+                buffer[0] = htonl(*(uint32_t *)&pt[0]);
+                buffer[1] = htonl(*(uint32_t *)&pt[4]);
+                buffer[2] = htonl(*(uint32_t *)&pt[8]);
+                buffer[3] = htonl(*(uint32_t *)&pt[12]);
 #endif
 
                 AES_ENCRYPT_IMPL(&ksch->encr_ks.ks32[0], ksch->nr,
                     buffer, buffer);
 

@@ -1548,26 +1538,14 @@
 #ifndef AES_BYTE_SWAP
                 bcopy(&buffer, ct, AES_BLOCK_LEN);
         }
 
 #else   /* byte swap */
-                ct[0] = buffer[0] >> 24;
-                ct[1] = buffer[0] >> 16;
-                ct[2] = buffer[0] >> 8;
-                ct[3] = (uint8_t)buffer[0];
-                ct[4] = buffer[1] >> 24;
-                ct[5] = buffer[1] >> 16;
-                ct[6] = buffer[1] >> 8;
-                ct[7] = (uint8_t)buffer[1];
-                ct[8] = buffer[2] >> 24;
-                ct[9] = buffer[2] >> 16;
-                ct[10] = buffer[2] >> 8;
-                ct[11] = (uint8_t)buffer[2];
-                ct[12] = buffer[3] >> 24;
-                ct[13] = buffer[3] >> 16;
-                ct[14] = buffer[3] >> 8;
-                ct[15] = (uint8_t)buffer[3];
+                *(uint32_t *)&ct[0] = htonl(buffer[0]);
+                *(uint32_t *)&ct[4] = htonl(buffer[1]);
+                *(uint32_t *)&ct[8] = htonl(buffer[2]);
+                *(uint32_t *)&ct[12] = htonl(buffer[3]);
 #endif
 /* EXPORT DELETE END */
         return (CRYPTO_SUCCESS);
 }
 

@@ -1598,22 +1576,14 @@
                 /* Copy input block into buffer */
 #ifndef AES_BYTE_SWAP
                 bcopy(ct, &buffer, AES_BLOCK_LEN);
 
 #else   /* byte swap */
-                buffer[0] = (((uint32_t)ct[0] << 24) | ((uint32_t)ct[1] << 16) |
-                    ((uint32_t)ct[2] << 8) | (uint32_t)ct[3]);
-
-                buffer[1] = (((uint32_t)ct[4] << 24) | ((uint32_t)ct[5] << 16) |
-                    ((uint32_t)ct[6] << 8) | (uint32_t)ct[7]);
-
-                buffer[2] = (((uint32_t)ct[8] << 24) | ((uint32_t)ct[9] << 16) |
-                    ((uint32_t)ct[10] << 8) | (uint32_t)ct[11]);
-
-                buffer[3] = (((uint32_t)ct[12] << 24) |
-                    ((uint32_t)ct[13] << 16) | ((uint32_t)ct[14] << 8) |
-                    (uint32_t)ct[15]);
+                buffer[0] = htonl(*(uint32_t *)&ct[0]);
+                buffer[1] = htonl(*(uint32_t *)&ct[4]);
+                buffer[2] = htonl(*(uint32_t *)&ct[8]);
+                buffer[3] = htonl(*(uint32_t *)&ct[12]);
 #endif
 
                 AES_DECRYPT_IMPL(&ksch->decr_ks.ks32[0], ksch->nr,
                     buffer, buffer);
 

@@ -1621,26 +1591,14 @@
 #ifndef AES_BYTE_SWAP
                 bcopy(&buffer, pt, AES_BLOCK_LEN);
         }
 
 #else   /* byte swap */
-                pt[0] = buffer[0] >> 24;
-                pt[1] = buffer[0] >> 16;
-                pt[2] = buffer[0] >> 8;
-                pt[3] = (uint8_t)buffer[0];
-                pt[4] = buffer[1] >> 24;
-                pt[5] = buffer[1] >> 16;
-                pt[6] = buffer[1] >> 8;
-                pt[7] = (uint8_t)buffer[1];
-                pt[8] = buffer[2] >> 24;
-                pt[9] = buffer[2] >> 16;
-                pt[10] = buffer[2] >> 8;
-                pt[11] = (uint8_t)buffer[2];
-                pt[12] = buffer[3] >> 24;
-                pt[13] = buffer[3] >> 16;
-                pt[14] = buffer[3] >> 8;
-                pt[15] = (uint8_t)buffer[3];
+        *(uint32_t *)&pt[0] = htonl(buffer[0]);
+        *(uint32_t *)&pt[4] = htonl(buffer[1]);
+        *(uint32_t *)&pt[8] = htonl(buffer[2]);
+        *(uint32_t *)&pt[12] = htonl(buffer[3]);
 #endif
 
 /* EXPORT DELETE END */
         return (CRYPTO_SUCCESS);
 }