]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[crypto] Eliminate repetitions in MD5 round constant table
authorMichael Brown <mcb30@ipxe.org>
Sun, 12 Nov 2017 18:30:08 +0000 (18:30 +0000)
committerMichael Brown <mcb30@ipxe.org>
Sun, 12 Nov 2017 18:52:03 +0000 (18:52 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/crypto/md5.c

index 493591f3ce3597bcee855c54bcf73756407be897..185a61f35187d148ac967b5c6fec2342c001352e 100644 (file)
@@ -66,11 +66,11 @@ static const uint32_t k[64] = {
 };
 
 /** MD5 shift amounts */
-static const uint8_t r[64] = {
-       7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
-       5,  9, 14, 20, 5,  9, 14, 20, 5,  9, 14, 20, 5,  9, 14, 20,
-       4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
-       6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21
+static const uint8_t r[4][4] = {
+       {  7, 12, 17, 22 },
+       {  5,  9, 14, 20 },
+       {  4, 11, 16, 23 },
+       {  6, 10, 15, 21 },
 };
 
 /**
@@ -174,6 +174,7 @@ static void md5_digest ( struct md5_context *context ) {
        uint32_t g;
        uint32_t temp;
        struct md5_step *step;
+       unsigned int round;
        unsigned int i;
 
        /* Sanity checks */
@@ -201,13 +202,15 @@ static void md5_digest ( struct md5_context *context ) {
 
        /* Main loop */
        for ( i = 0 ; i < 64 ; i++ ) {
-               step = &md5_steps[ i / 16 ];
+               round = ( i / 16 );
+               step = &md5_steps[round];
                f = step->f ( &u.v );
                g = ( ( ( step->coefficient * i ) + step->constant ) % 16 );
                temp = *d;
                *d = *c;
                *c = *b;
-               *b = ( *b + rol32 ( ( *a + f + k[i] + w[g] ), r[i] ) );
+               *b = ( *b + rol32 ( ( *a + f + k[i] + w[g] ),
+                                   r[round][ i % 4 ] ) );
                *a = temp;
                DBGC2 ( context, "%2d : %08x %08x %08x %08x\n",
                        i, *a, *b, *c, *d );