optimize make_kn (from HEAD, by Andy)
authorDr. Stephen Henson <steve@openssl.org>
Sun, 14 Oct 2012 12:26:02 +0000 (12:26 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Sun, 14 Oct 2012 12:26:02 +0000 (12:26 +0000)
crypto/cmac/cmac.c

index ccc7e7a3bd61cee07146c3f0e3558fdab535eace..5ff0fa7028a9ab97d77cbe92534665226eaae953 100644 (file)
@@ -77,19 +77,17 @@ struct CMAC_CTX_st
 
 /* Make temporary keys K1 and K2 */
 
-static void make_kn(unsigned char *k1, unsigned char *l, int bl)
+static void make_kn(unsigned char *k1, const unsigned char *l, int bl)
        {
        int i;
+       unsigned char c = l[0], carry = c>>7, cnext;
+
        /* Shift block to left, including carry */
-       for (i = 0; i < bl; i++)
-               {
-               k1[i] = l[i] << 1;
-               if (i < bl - 1 && l[i + 1] & 0x80)
-                       k1[i] |= 1;
-               }
+       for (i = 0; i < bl-1; i++, c = cnext)
+               k1[i] = (c << 1) | ((cnext=l[i+1]) >> 7);
+
        /* If MSB set fixup with R */
-       if (l[0] & 0x80)
-               k1[bl - 1] ^= bl == 16 ? 0x87 : 0x1b;
+       k1[i] = (c << 1) ^ ((0-carry)&(bl==16?0x87:0x1b));
        }
 
 CMAC_CTX *CMAC_CTX_new(void)