Make more uses of load/store_32_be/le, which on x86 at least expands
authorKen Raeburn <raeburn@mit.edu>
Sat, 2 Aug 2008 06:36:49 +0000 (06:36 +0000)
committerKen Raeburn <raeburn@mit.edu>
Sat, 2 Aug 2008 06:36:49 +0000 (06:36 +0000)
to a single unaligned load/store instruction, instead of open-coding
the shifts and masks.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@20599 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/crypto/aes/aes_s2k.c
src/lib/crypto/arcfour/arcfour.c
src/lib/crypto/des/f_sched.c
src/lib/crypto/md4/md4.c
src/lib/crypto/md5/md5.c
src/lib/crypto/pbkdf2.c
src/lib/crypto/sha1/shs.c

index 68d3111bfd688999be55ba19efb33dd0babdb86a..30ca275014323e3c0b47db98a6051ff97162bd8d 100644 (file)
@@ -51,10 +51,7 @@ krb5int_aes_string_to_key(const struct krb5_enc_provider *enc,
        if (params->length != 4)
            return KRB5_ERR_BAD_S2K_PARAMS;
        /* The first two need casts in case 'int' is 16 bits.  */
-       iter_count = (((unsigned long)p[0] << 24)
-                     | ((unsigned long)p[1] << 16)
-                     | (p[2] <<  8)
-                     | (p[3]));
+       iter_count = load_32_be(p);
        if (iter_count == 0) {
            iter_count = (1L << 16) << 16;
            if (((iter_count >> 16) >> 16) != 1)
index 3481fadcb16239efd2ce52627bdbae3ede8aa2b7..a2df5ddf5975694ec119f3f52660ebdc23b01b83 100644 (file)
@@ -140,16 +140,10 @@ krb5_arcfour_encrypt(const struct krb5_enc_provider *enc,
   ms_usage=krb5int_arcfour_translate_usage(usage);
   if (key->enctype == ENCTYPE_ARCFOUR_HMAC_EXP) {
     strncpy(salt.data, l40, salt.length);
-    salt.data[10]=ms_usage & 0xff;
-    salt.data[11]=(ms_usage >> 8) & 0xff;
-    salt.data[12]=(ms_usage >> 16) & 0xff;
-    salt.data[13]=(ms_usage >> 24) & 0xff;
+    store_32_le(ms_usage, salt.data+10);
   } else {
     salt.length=4;
-    salt.data[0]=ms_usage & 0xff;
-    salt.data[1]=(ms_usage >> 8) & 0xff;
-    salt.data[2]=(ms_usage >> 16) & 0xff;
-    salt.data[3]=(ms_usage >> 24) & 0xff;
+    store_32_le(ms_usage, salt.data);
   }
   krb5_hmac(hash, key, 1, &salt, &d1);
 
index 99d1dc31335583d0e92a3d19ce1e31a9cbec982c..5c269252bfdba655d05d2470c2a8252859b24511 100644 (file)
@@ -242,10 +242,8 @@ mit_des_make_key_sched(mit_des_cblock key, mit_des_key_schedule schedule)
                 * the right, while D0 gets 16 from the left and 12 from the
                 * right.  The code knows which bits go where.
                 */
-               tmp = ((unsigned DES_INT32)(*(k)++)) << 24;
-               tmp |= ((unsigned DES_INT32)(*(k)++)) << 16;
-               tmp |= ((unsigned DES_INT32)(*(k)++)) << 8;
-               tmp |= (unsigned DES_INT32)(*(k)++);            /* left part of key */
+               tmp = load_32_be(k), k += 4;
+
                c =  PC1_CL[(tmp >> 29) & 0x7]
                  | (PC1_CL[(tmp >> 21) & 0x7] << 1)
                  | (PC1_CL[(tmp >> 13) & 0x7] << 2)
@@ -255,10 +253,8 @@ mit_des_make_key_sched(mit_des_cblock key, mit_des_key_schedule schedule)
                  | (PC1_DL[(tmp >>  9) & 0xf] << 2)
                  | (PC1_DL[(tmp >>  1) & 0xf] << 3);
 
-               tmp = ((unsigned DES_INT32)(*(k)++)) << 24;
-               tmp |= ((unsigned DES_INT32)(*(k)++)) << 16;
-               tmp |= ((unsigned DES_INT32)(*(k)++)) << 8;
-               tmp |= (unsigned DES_INT32)(*(k)++);            /* right part of key */
+               tmp = load_32_be(k), k += 4;
+
                c |= PC1_CR[(tmp >> 28) & 0xf]
                  | (PC1_CR[(tmp >> 20) & 0xf] << 1)
                  | (PC1_CR[(tmp >> 12) & 0xf] << 2)
index 5e95d359f2d6201a4928d7d4af5fb8c1c0d1c9a5..d1da9ef0c8adc7ecb177f011b857ac9ab8d15462 100644 (file)
@@ -110,11 +110,9 @@ krb5_MD4Update (krb5_MD4_CTX *mdContext, const unsigned char *inBuf, unsigned in
 
     /* transform if necessary */
     if (mdi == 0x40) {
-      for (i = 0, ii = 0; i < 16; i++, ii += 4)
-        in[i] = (((krb5_ui_4)mdContext->in[ii+3]) << 24) |
-                (((krb5_ui_4)mdContext->in[ii+2]) << 16) |
-                (((krb5_ui_4)mdContext->in[ii+1]) << 8) |
-                ((krb5_ui_4)mdContext->in[ii]);
+      for (i = 0, ii = 0; i < 16; i++, ii += 4) {
+         in[i] = load_32_le(mdContext->in+ii);
+      }
       Transform (mdContext->buf, in);
       mdi = 0;
     }
@@ -142,22 +140,13 @@ krb5_MD4Final (krb5_MD4_CTX *mdContext)
 
   /* append length in bits and transform */
   for (i = 0, ii = 0; i < 14; i++, ii += 4)
-    in[i] = (((krb5_ui_4)mdContext->in[ii+3]) << 24) |
-            (((krb5_ui_4)mdContext->in[ii+2]) << 16) |
-            (((krb5_ui_4)mdContext->in[ii+1]) << 8) |
-            ((krb5_ui_4)mdContext->in[ii]);
+      in[i] = load_32_le(mdContext->in+ii);
   Transform (mdContext->buf, in);
 
 
   /* store buffer in digest */
   for (i = 0, ii = 0; i < 4; i++, ii += 4) {
-    mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] & 0xFF);
-    mdContext->digest[ii+1] =
-      (unsigned char)((mdContext->buf[i] >> 8) & 0xFF);
-    mdContext->digest[ii+2] =
-      (unsigned char)((mdContext->buf[i] >> 16) & 0xFF);
-    mdContext->digest[ii+3] =
-      (unsigned char)((mdContext->buf[i] >> 24) & 0xFF);
+      store_32_le(mdContext->buf[i], mdContext->digest+ii);
   }
 }
 
index 4b56755a8404d50fb40e88ad57af9729fcd4a2f2..da8aca451c207dcca5b69c0a887030395e355fe7 100644 (file)
@@ -146,10 +146,7 @@ krb5_MD5Update (krb5_MD5_CTX *mdContext, const unsigned char *inBuf, unsigned in
     /* transform if necessary */
     if (mdi == 0x40) {
       for (i = 0, ii = 0; i < 16; i++, ii += 4)
-        in[i] = (((krb5_ui_4)mdContext->in[ii+3]) << 24) |
-                (((krb5_ui_4)mdContext->in[ii+2]) << 16) |
-                (((krb5_ui_4)mdContext->in[ii+1]) << 8) |
-                ((krb5_ui_4)mdContext->in[ii]);
+         in[i] = load_32_le(mdContext->in+ii);
       Transform (mdContext->buf, in);
       mdi = 0;
     }
@@ -180,21 +177,12 @@ krb5_MD5Final (krb5_MD5_CTX *mdContext)
 
   /* append length in bits and transform */
   for (i = 0, ii = 0; i < 14; i++, ii += 4)
-    in[i] = (((krb5_ui_4)mdContext->in[ii+3]) << 24) |
-            (((krb5_ui_4)mdContext->in[ii+2]) << 16) |
-            (((krb5_ui_4)mdContext->in[ii+1]) << 8) |
-            ((krb5_ui_4)mdContext->in[ii]);
+      in[i] = load_32_le(mdContext->in+ii);
   Transform (mdContext->buf, in);
 
   /* store buffer in digest */
   for (i = 0, ii = 0; i < 4; i++, ii += 4) {
-    mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] & 0xFF);
-    mdContext->digest[ii+1] =
-      (unsigned char)((mdContext->buf[i] >> 8) & 0xFF);
-    mdContext->digest[ii+2] =
-      (unsigned char)((mdContext->buf[i] >> 16) & 0xFF);
-    mdContext->digest[ii+3] =
-      (unsigned char)((mdContext->buf[i] >> 24) & 0xFF);
+    store_32_le(mdContext->buf[i], mdContext->digest+ii);
   }
 }
 
index a6cce1cd0f37da301bb2e07ada27ac52694030be..5b3286ef25574ced086f498b75e7c557f7471fd5 100644 (file)
@@ -93,10 +93,7 @@ F(char *output, char *u_tmp1, char *u_tmp2,
 #endif
 
     /* Compute U_1.  */
-    ibytes[3] = i & 0xff;
-    ibytes[2] = (i >> 8) & 0xff;
-    ibytes[1] = (i >> 16) & 0xff;
-    ibytes[0] = (i >> 24) & 0xff;
+    store_32_be(i, ibytes);
 
     tlen = salt->length;
     memcpy(u_tmp2, salt->data, tlen);
index a027fd76d14f3aea42e9d39e811ed92b5d5600fb..0089055d75eba3c56e648aa82458cdbf475d2042 100644 (file)
@@ -286,10 +286,8 @@ void shsUpdate(SHS_INFO *shsInfo, const SHS_BYTE *buffer, unsigned int count)
                count = 0;
                break;          /* out of while loop */
            }
-           *lp = (SHS_LONG) *buffer++ << 24;
-           *lp |= (SHS_LONG) *buffer++ << 16;
-           *lp |= (SHS_LONG) *buffer++ << 8;
-           *lp++ |= (SHS_LONG) *buffer++;
+           *lp++ = load_32_be(buffer);
+           buffer += 4;
            count -= 4;
        }
        if (canfill) {
@@ -301,10 +299,8 @@ void shsUpdate(SHS_INFO *shsInfo, const SHS_BYTE *buffer, unsigned int count)
     while (count >= SHS_DATASIZE) {
        lp = shsInfo->data;
        while (lp < shsInfo->data + 16) {
-           *lp = ((SHS_LONG) *buffer++) << 24;
-           *lp |= ((SHS_LONG) *buffer++) << 16;
-           *lp |= ((SHS_LONG) *buffer++) << 8;
-           *lp++ |= (SHS_LONG) *buffer++;
+           *lp++ = load_32_be(buffer);
+           buffer += 4;
        }
        SHSTransform(shsInfo->digest, shsInfo->data);
        count -= SHS_DATASIZE;
@@ -313,10 +309,8 @@ void shsUpdate(SHS_INFO *shsInfo, const SHS_BYTE *buffer, unsigned int count)
     if (count > 0) {
        lp = shsInfo->data;
        while (count > 4) {
-           *lp = ((SHS_LONG) *buffer++) << 24;
-           *lp |= ((SHS_LONG) *buffer++) << 16;
-           *lp |= ((SHS_LONG) *buffer++) << 8;
-           *lp++ |= (SHS_LONG) *buffer++;
+           *lp++ = load_32_be(buffer);
+           buffer += 4;
            count -= 4;
        }
        *lp = 0;