Blame crypt/md5-block.c

Packit Service 82fcde
/* These are the four functions used in the four steps of the MD5 algorithm
Packit Service 82fcde
   and defined in the RFC 1321.  The first function is a little bit optimized
Packit Service 82fcde
   (as found in Colin Plumbs public domain implementation).  */
Packit Service 82fcde
/* #define FF(b, c, d) ((b & c) | (~b & d)) */
Packit Service 82fcde
#define FF(b, c, d) (d ^ (b & (c ^ d)))
Packit Service 82fcde
#define FG(b, c, d) FF (d, b, c)
Packit Service 82fcde
#define FH(b, c, d) (b ^ c ^ d)
Packit Service 82fcde
#define FI(b, c, d) (c ^ (b | ~d))
Packit Service 82fcde
Packit Service 82fcde
/* Process LEN bytes of BUFFER, accumulating context into CTX.
Packit Service 82fcde
   It is assumed that LEN % 64 == 0.  */
Packit Service 82fcde
Packit Service 82fcde
void
Packit Service 82fcde
__md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx)
Packit Service 82fcde
{
Packit Service 82fcde
  md5_uint32 correct_words[16];
Packit Service 82fcde
  const md5_uint32 *words = buffer;
Packit Service 82fcde
  size_t nwords = len / sizeof (md5_uint32);
Packit Service 82fcde
  const md5_uint32 *endp = words + nwords;
Packit Service 82fcde
  md5_uint32 A = ctx->A;
Packit Service 82fcde
  md5_uint32 B = ctx->B;
Packit Service 82fcde
  md5_uint32 C = ctx->C;
Packit Service 82fcde
  md5_uint32 D = ctx->D;
Packit Service 82fcde
  md5_uint32 lolen = len;
Packit Service 82fcde
Packit Service 82fcde
  /* First increment the byte count.  RFC 1321 specifies the possible
Packit Service 82fcde
     length of the file up to 2^64 bits.  Here we only compute the
Packit Service 82fcde
     number of bytes.  Do a double word increment.  */
Packit Service 82fcde
  ctx->total[0] += lolen;
Packit Service 82fcde
  ctx->total[1] += (len >> 31 >> 1) + (ctx->total[0] < lolen);
Packit Service 82fcde
Packit Service 82fcde
  /* Process all bytes in the buffer with 64 bytes in each round of
Packit Service 82fcde
     the loop.  */
Packit Service 82fcde
  while (words < endp)
Packit Service 82fcde
    {
Packit Service 82fcde
      md5_uint32 *cwp = correct_words;
Packit Service 82fcde
      md5_uint32 A_save = A;
Packit Service 82fcde
      md5_uint32 B_save = B;
Packit Service 82fcde
      md5_uint32 C_save = C;
Packit Service 82fcde
      md5_uint32 D_save = D;
Packit Service 82fcde
Packit Service 82fcde
      /* First round: using the given function, the context and a constant
Packit Service 82fcde
	 the next context is computed.  Because the algorithms processing
Packit Service 82fcde
	 unit is a 32-bit word and it is determined to work on words in
Packit Service 82fcde
	 little endian byte order we perhaps have to change the byte order
Packit Service 82fcde
	 before the computation.  To reduce the work for the next steps
Packit Service 82fcde
	 we store the swapped words in the array CORRECT_WORDS.  */
Packit Service 82fcde
Packit Service 82fcde
#define OP(a, b, c, d, s, T)						\
Packit Service 82fcde
      do								\
Packit Service 82fcde
	{								\
Packit Service 82fcde
	  a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T;		\
Packit Service 82fcde
	  ++words;							\
Packit Service 82fcde
	  CYCLIC (a, s);						\
Packit Service 82fcde
	  a += b;							\
Packit Service 82fcde
	}								\
Packit Service 82fcde
      while (0)
Packit Service 82fcde
Packit Service 82fcde
      /* It is unfortunate that C does not provide an operator for
Packit Service 82fcde
	 cyclic rotation.  Hope the C compiler is smart enough.  */
Packit Service 82fcde
#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
Packit Service 82fcde
Packit Service 82fcde
      /* Before we start, one word to the strange constants.
Packit Service 82fcde
	 They are defined in RFC 1321 as
Packit Service 82fcde
Packit Service 82fcde
	 T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
Packit Service 82fcde
       */
Packit Service 82fcde
Packit Service 82fcde
      /* Round 1.  */
Packit Service 82fcde
      OP (A, B, C, D,  7, 0xd76aa478);
Packit Service 82fcde
      OP (D, A, B, C, 12, 0xe8c7b756);
Packit Service 82fcde
      OP (C, D, A, B, 17, 0x242070db);
Packit Service 82fcde
      OP (B, C, D, A, 22, 0xc1bdceee);
Packit Service 82fcde
      OP (A, B, C, D,  7, 0xf57c0faf);
Packit Service 82fcde
      OP (D, A, B, C, 12, 0x4787c62a);
Packit Service 82fcde
      OP (C, D, A, B, 17, 0xa8304613);
Packit Service 82fcde
      OP (B, C, D, A, 22, 0xfd469501);
Packit Service 82fcde
      OP (A, B, C, D,  7, 0x698098d8);
Packit Service 82fcde
      OP (D, A, B, C, 12, 0x8b44f7af);
Packit Service 82fcde
      OP (C, D, A, B, 17, 0xffff5bb1);
Packit Service 82fcde
      OP (B, C, D, A, 22, 0x895cd7be);
Packit Service 82fcde
      OP (A, B, C, D,  7, 0x6b901122);
Packit Service 82fcde
      OP (D, A, B, C, 12, 0xfd987193);
Packit Service 82fcde
      OP (C, D, A, B, 17, 0xa679438e);
Packit Service 82fcde
      OP (B, C, D, A, 22, 0x49b40821);
Packit Service 82fcde
Packit Service 82fcde
      /* For the second to fourth round we have the possibly swapped words
Packit Service 82fcde
	 in CORRECT_WORDS.  Redefine the macro to take an additional first
Packit Service 82fcde
	 argument specifying the function to use.  */
Packit Service 82fcde
#undef OP
Packit Service 82fcde
#define OP(f, a, b, c, d, k, s, T)					\
Packit Service 82fcde
      do 								\
Packit Service 82fcde
	{								\
Packit Service 82fcde
	  a += f (b, c, d) + correct_words[k] + T;			\
Packit Service 82fcde
	  CYCLIC (a, s);						\
Packit Service 82fcde
	  a += b;							\
Packit Service 82fcde
	}								\
Packit Service 82fcde
      while (0)
Packit Service 82fcde
Packit Service 82fcde
      /* Round 2.  */
Packit Service 82fcde
      OP (FG, A, B, C, D,  1,  5, 0xf61e2562);
Packit Service 82fcde
      OP (FG, D, A, B, C,  6,  9, 0xc040b340);
Packit Service 82fcde
      OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
Packit Service 82fcde
      OP (FG, B, C, D, A,  0, 20, 0xe9b6c7aa);
Packit Service 82fcde
      OP (FG, A, B, C, D,  5,  5, 0xd62f105d);
Packit Service 82fcde
      OP (FG, D, A, B, C, 10,  9, 0x02441453);
Packit Service 82fcde
      OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
Packit Service 82fcde
      OP (FG, B, C, D, A,  4, 20, 0xe7d3fbc8);
Packit Service 82fcde
      OP (FG, A, B, C, D,  9,  5, 0x21e1cde6);
Packit Service 82fcde
      OP (FG, D, A, B, C, 14,  9, 0xc33707d6);
Packit Service 82fcde
      OP (FG, C, D, A, B,  3, 14, 0xf4d50d87);
Packit Service 82fcde
      OP (FG, B, C, D, A,  8, 20, 0x455a14ed);
Packit Service 82fcde
      OP (FG, A, B, C, D, 13,  5, 0xa9e3e905);
Packit Service 82fcde
      OP (FG, D, A, B, C,  2,  9, 0xfcefa3f8);
Packit Service 82fcde
      OP (FG, C, D, A, B,  7, 14, 0x676f02d9);
Packit Service 82fcde
      OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
Packit Service 82fcde
Packit Service 82fcde
      /* Round 3.  */
Packit Service 82fcde
      OP (FH, A, B, C, D,  5,  4, 0xfffa3942);
Packit Service 82fcde
      OP (FH, D, A, B, C,  8, 11, 0x8771f681);
Packit Service 82fcde
      OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
Packit Service 82fcde
      OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
Packit Service 82fcde
      OP (FH, A, B, C, D,  1,  4, 0xa4beea44);
Packit Service 82fcde
      OP (FH, D, A, B, C,  4, 11, 0x4bdecfa9);
Packit Service 82fcde
      OP (FH, C, D, A, B,  7, 16, 0xf6bb4b60);
Packit Service 82fcde
      OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
Packit Service 82fcde
      OP (FH, A, B, C, D, 13,  4, 0x289b7ec6);
Packit Service 82fcde
      OP (FH, D, A, B, C,  0, 11, 0xeaa127fa);
Packit Service 82fcde
      OP (FH, C, D, A, B,  3, 16, 0xd4ef3085);
Packit Service 82fcde
      OP (FH, B, C, D, A,  6, 23, 0x04881d05);
Packit Service 82fcde
      OP (FH, A, B, C, D,  9,  4, 0xd9d4d039);
Packit Service 82fcde
      OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
Packit Service 82fcde
      OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
Packit Service 82fcde
      OP (FH, B, C, D, A,  2, 23, 0xc4ac5665);
Packit Service 82fcde
Packit Service 82fcde
      /* Round 4.  */
Packit Service 82fcde
      OP (FI, A, B, C, D,  0,  6, 0xf4292244);
Packit Service 82fcde
      OP (FI, D, A, B, C,  7, 10, 0x432aff97);
Packit Service 82fcde
      OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
Packit Service 82fcde
      OP (FI, B, C, D, A,  5, 21, 0xfc93a039);
Packit Service 82fcde
      OP (FI, A, B, C, D, 12,  6, 0x655b59c3);
Packit Service 82fcde
      OP (FI, D, A, B, C,  3, 10, 0x8f0ccc92);
Packit Service 82fcde
      OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
Packit Service 82fcde
      OP (FI, B, C, D, A,  1, 21, 0x85845dd1);
Packit Service 82fcde
      OP (FI, A, B, C, D,  8,  6, 0x6fa87e4f);
Packit Service 82fcde
      OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
Packit Service 82fcde
      OP (FI, C, D, A, B,  6, 15, 0xa3014314);
Packit Service 82fcde
      OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
Packit Service 82fcde
      OP (FI, A, B, C, D,  4,  6, 0xf7537e82);
Packit Service 82fcde
      OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
Packit Service 82fcde
      OP (FI, C, D, A, B,  2, 15, 0x2ad7d2bb);
Packit Service 82fcde
      OP (FI, B, C, D, A,  9, 21, 0xeb86d391);
Packit Service 82fcde
Packit Service 82fcde
      /* Add the starting values of the context.  */
Packit Service 82fcde
      A += A_save;
Packit Service 82fcde
      B += B_save;
Packit Service 82fcde
      C += C_save;
Packit Service 82fcde
      D += D_save;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* Put checksum in context given as argument.  */
Packit Service 82fcde
  ctx->A = A;
Packit Service 82fcde
  ctx->B = B;
Packit Service 82fcde
  ctx->C = C;
Packit Service 82fcde
  ctx->D = D;
Packit Service 82fcde
}