Hex Artifact Content

Artifact d7e67f33c564a35858c0e7536f2a1be2c51f66fc:


0000: 2f 2a 20 4d 44 35 43 2e 43 20 2d 20 52 53 41 20  /* MD5C.C - RSA 
0010: 44 61 74 61 20 53 65 63 75 72 69 74 79 2c 20 49  Data Security, I
0020: 6e 63 2e 2c 20 4d 44 35 20 6d 65 73 73 61 67 65  nc., MD5 message
0030: 2d 64 69 67 65 73 74 20 61 6c 67 6f 72 69 74 68  -digest algorith
0040: 6d 0a 20 2a 2f 0a 0a 2f 2a 20 43 6f 70 79 72 69  m. */../* Copyri
0050: 67 68 74 20 28 43 29 20 31 39 39 31 2d 32 2c 20  ght (C) 1991-2, 
0060: 52 53 41 20 44 61 74 61 20 53 65 63 75 72 69 74  RSA Data Securit
0070: 79 2c 20 49 6e 63 2e 20 43 72 65 61 74 65 64 20  y, Inc. Created 
0080: 31 39 39 31 2e 20 41 6c 6c 0a 72 69 67 68 74 73  1991. All.rights
0090: 20 72 65 73 65 72 76 65 64 2e 0a 0a 4c 69 63 65   reserved...Lice
00a0: 6e 73 65 20 74 6f 20 63 6f 70 79 20 61 6e 64 20  nse to copy and 
00b0: 75 73 65 20 74 68 69 73 20 73 6f 66 74 77 61 72  use this softwar
00c0: 65 20 69 73 20 67 72 61 6e 74 65 64 20 70 72 6f  e is granted pro
00d0: 76 69 64 65 64 20 74 68 61 74 20 69 74 0a 69 73  vided that it.is
00e0: 20 69 64 65 6e 74 69 66 69 65 64 20 61 73 20 74   identified as t
00f0: 68 65 20 22 52 53 41 20 44 61 74 61 20 53 65 63  he "RSA Data Sec
0100: 75 72 69 74 79 2c 20 49 6e 63 2e 20 4d 44 35 20  urity, Inc. MD5 
0110: 4d 65 73 73 61 67 65 2d 44 69 67 65 73 74 0a 41  Message-Digest.A
0120: 6c 67 6f 72 69 74 68 6d 22 20 69 6e 20 61 6c 6c  lgorithm" in all
0130: 20 6d 61 74 65 72 69 61 6c 20 6d 65 6e 74 69 6f   material mentio
0140: 6e 69 6e 67 20 6f 72 20 72 65 66 65 72 65 6e 63  ning or referenc
0150: 69 6e 67 20 74 68 69 73 20 73 6f 66 74 77 61 72  ing this softwar
0160: 65 0a 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69  e.or this functi
0170: 6f 6e 2e 0a 0a 4c 69 63 65 6e 73 65 20 69 73 20  on...License is 
0180: 61 6c 73 6f 20 67 72 61 6e 74 65 64 20 74 6f 20  also granted to 
0190: 6d 61 6b 65 20 61 6e 64 20 75 73 65 20 64 65 72  make and use der
01a0: 69 76 61 74 69 76 65 20 77 6f 72 6b 73 20 70 72  ivative works pr
01b0: 6f 76 69 64 65 64 0a 74 68 61 74 20 73 75 63 68  ovided.that such
01c0: 20 77 6f 72 6b 73 20 61 72 65 20 69 64 65 6e 74   works are ident
01d0: 69 66 69 65 64 20 61 73 20 22 64 65 72 69 76 65  ified as "derive
01e0: 64 20 66 72 6f 6d 20 74 68 65 20 52 53 41 20 44  d from the RSA D
01f0: 61 74 61 0a 53 65 63 75 72 69 74 79 2c 20 49 6e  ata.Security, In
0200: 63 2e 20 4d 44 35 20 4d 65 73 73 61 67 65 2d 44  c. MD5 Message-D
0210: 69 67 65 73 74 20 41 6c 67 6f 72 69 74 68 6d 22  igest Algorithm"
0220: 20 69 6e 20 61 6c 6c 20 6d 61 74 65 72 69 61 6c   in all material
0230: 0a 6d 65 6e 74 69 6f 6e 69 6e 67 20 6f 72 20 72  .mentioning or r
0240: 65 66 65 72 65 6e 63 69 6e 67 20 74 68 65 20 64  eferencing the d
0250: 65 72 69 76 65 64 20 77 6f 72 6b 2e 0a 0a 52 53  erived work...RS
0260: 41 20 44 61 74 61 20 53 65 63 75 72 69 74 79 2c  A Data Security,
0270: 20 49 6e 63 2e 20 6d 61 6b 65 73 20 6e 6f 20 72   Inc. makes no r
0280: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 73 20 63  epresentations c
0290: 6f 6e 63 65 72 6e 69 6e 67 20 65 69 74 68 65 72  oncerning either
02a0: 0a 74 68 65 20 6d 65 72 63 68 61 6e 74 61 62 69  .the merchantabi
02b0: 6c 69 74 79 20 6f 66 20 74 68 69 73 20 73 6f 66  lity of this sof
02c0: 74 77 61 72 65 20 6f 72 20 74 68 65 20 73 75 69  tware or the sui
02d0: 74 61 62 69 6c 69 74 79 20 6f 66 20 74 68 69 73  tability of this
02e0: 0a 73 6f 66 74 77 61 72 65 20 66 6f 72 20 61 6e  .software for an
02f0: 79 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 72  y particular pur
0300: 70 6f 73 65 2e 20 49 74 20 69 73 20 70 72 6f 76  pose. It is prov
0310: 69 64 65 64 20 22 61 73 20 69 73 22 0a 77 69 74  ided "as is".wit
0320: 68 6f 75 74 20 65 78 70 72 65 73 73 20 6f 72 20  hout express or 
0330: 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79  implied warranty
0340: 20 6f 66 20 61 6e 79 20 6b 69 6e 64 2e 0a 0a 54   of any kind...T
0350: 68 65 73 65 20 6e 6f 74 69 63 65 73 20 6d 75 73  hese notices mus
0360: 74 20 62 65 20 72 65 74 61 69 6e 65 64 20 69 6e  t be retained in
0370: 20 61 6e 79 20 63 6f 70 69 65 73 20 6f 66 20 61   any copies of a
0380: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 69 73 0a  ny part of this.
0390: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 61 6e  documentation an
03a0: 64 2f 6f 72 20 73 6f 66 74 77 61 72 65 2e 0a 20  d/or software.. 
03b0: 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 6d 64  */..#include "md
03c0: 35 2e 68 22 0a 0a 23 69 66 64 65 66 20 48 41 56  5.h"..#ifdef HAV
03d0: 45 5f 53 54 52 49 4e 47 5f 48 0a 23 20 20 69 6e  E_STRING_H.#  in
03e0: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
03f0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48  .#endif.#ifdef H
0400: 41 56 45 5f 53 54 52 49 4e 47 53 5f 48 0a 23 20  AVE_STRINGS_H.# 
0410: 20 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67   include <string
0420: 73 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  s.h>.#endif../* 
0430: 43 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20 4d 44  Constants for MD
0440: 35 54 72 61 6e 73 66 6f 72 6d 20 72 6f 75 74 69  5Transform routi
0450: 6e 65 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ne.. */.#define 
0460: 53 31 31 20 37 0a 23 64 65 66 69 6e 65 20 53 31  S11 7.#define S1
0470: 32 20 31 32 0a 23 64 65 66 69 6e 65 20 53 31 33  2 12.#define S13
0480: 20 31 37 0a 23 64 65 66 69 6e 65 20 53 31 34 20   17.#define S14 
0490: 32 32 0a 23 64 65 66 69 6e 65 20 53 32 31 20 35  22.#define S21 5
04a0: 0a 23 64 65 66 69 6e 65 20 53 32 32 20 39 0a 23  .#define S22 9.#
04b0: 64 65 66 69 6e 65 20 53 32 33 20 31 34 0a 23 64  define S23 14.#d
04c0: 65 66 69 6e 65 20 53 32 34 20 32 30 0a 23 64 65  efine S24 20.#de
04d0: 66 69 6e 65 20 53 33 31 20 34 0a 23 64 65 66 69  fine S31 4.#defi
04e0: 6e 65 20 53 33 32 20 31 31 0a 23 64 65 66 69 6e  ne S32 11.#defin
04f0: 65 20 53 33 33 20 31 36 0a 23 64 65 66 69 6e 65  e S33 16.#define
0500: 20 53 33 34 20 32 33 0a 23 64 65 66 69 6e 65 20   S34 23.#define 
0510: 53 34 31 20 36 0a 23 64 65 66 69 6e 65 20 53 34  S41 6.#define S4
0520: 32 20 31 30 0a 23 64 65 66 69 6e 65 20 53 34 33  2 10.#define S43
0530: 20 31 35 0a 23 64 65 66 69 6e 65 20 53 34 34 20   15.#define S44 
0540: 32 31 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  21..static void 
0550: 4d 44 35 54 72 61 6e 73 66 6f 72 6d 20 28 75 69  MD5Transform (ui
0560: 6e 74 33 32 5f 74 20 5b 34 5d 2c 20 75 6e 73 69  nt32_t [4], unsi
0570: 67 6e 65 64 20 63 68 61 72 20 5b 36 34 5d 29 3b  gned char [64]);
0580: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 45 6e 63  .static void Enc
0590: 6f 64 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ode(unsigned cha
05a0: 72 20 2a 2c 20 75 69 6e 74 33 32 5f 74 20 2a 2c  r *, uint32_t *,
05b0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a   unsigned int);.
05c0: 73 74 61 74 69 63 20 76 6f 69 64 20 44 65 63 6f  static void Deco
05d0: 64 65 28 75 69 6e 74 33 32 5f 74 20 2a 2c 20 75  de(uint32_t *, u
05e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2c 20  nsigned char *, 
05f0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 0a  unsigned int);..
0600: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
0610: 63 68 61 72 20 50 41 44 44 49 4e 47 5b 36 34 5d  char PADDING[64]
0620: 20 3d 20 7b 0a 20 20 30 78 38 30 2c 20 30 2c 20   = {.  0x80, 0, 
0630: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0640: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0650: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0660: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
0670: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0680: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0690: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
06a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
06b0: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
06c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
06d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
06e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a 7d 3b 0a  , 0, 0, 0, 0.};.
06f0: 0a 2f 2a 20 46 2c 20 47 2c 20 48 20 61 6e 64 20  ./* F, G, H and 
0700: 49 20 61 72 65 20 62 61 73 69 63 20 4d 44 35 20  I are basic MD5 
0710: 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 2a 2f 0a 23  functions.. */.#
0720: 64 65 66 69 6e 65 20 46 28 78 2c 20 79 2c 20 7a  define F(x, y, z
0730: 29 20 28 28 28 78 29 20 26 20 28 79 29 29 20 7c  ) (((x) & (y)) |
0740: 20 28 28 7e 78 29 20 26 20 28 7a 29 29 29 0a 23   ((~x) & (z))).#
0750: 64 65 66 69 6e 65 20 47 28 78 2c 20 79 2c 20 7a  define G(x, y, z
0760: 29 20 28 28 28 78 29 20 26 20 28 7a 29 29 20 7c  ) (((x) & (z)) |
0770: 20 28 28 79 29 20 26 20 28 7e 7a 29 29 29 0a 23   ((y) & (~z))).#
0780: 64 65 66 69 6e 65 20 48 28 78 2c 20 79 2c 20 7a  define H(x, y, z
0790: 29 20 28 28 78 29 20 5e 20 28 79 29 20 5e 20 28  ) ((x) ^ (y) ^ (
07a0: 7a 29 29 0a 23 64 65 66 69 6e 65 20 49 28 78 2c  z)).#define I(x,
07b0: 20 79 2c 20 7a 29 20 28 28 79 29 20 5e 20 28 28   y, z) ((y) ^ ((
07c0: 78 29 20 7c 20 28 7e 7a 29 29 29 0a 0a 2f 2a 20  x) | (~z)))../* 
07d0: 52 4f 54 41 54 45 5f 4c 45 46 54 20 72 6f 74 61  ROTATE_LEFT rota
07e0: 74 65 73 20 78 20 6c 65 66 74 20 6e 20 62 69 74  tes x left n bit
07f0: 73 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52  s.. */.#define R
0800: 4f 54 41 54 45 5f 4c 45 46 54 28 78 2c 20 6e 29  OTATE_LEFT(x, n)
0810: 20 28 28 28 78 29 20 3c 3c 20 28 6e 29 29 20 7c   (((x) << (n)) |
0820: 20 28 28 78 29 20 3e 3e 20 28 33 32 2d 28 6e 29   ((x) >> (32-(n)
0830: 29 29 29 0a 0a 2f 2a 20 46 46 2c 20 47 47 2c 20  )))../* FF, GG, 
0840: 48 48 2c 20 61 6e 64 20 49 49 20 74 72 61 6e 73  HH, and II trans
0850: 66 6f 72 6d 61 74 69 6f 6e 73 20 66 6f 72 20 72  formations for r
0860: 6f 75 6e 64 73 20 31 2c 20 32 2c 20 33 2c 20 61  ounds 1, 2, 3, a
0870: 6e 64 20 34 2e 0a 52 6f 74 61 74 69 6f 6e 20 69  nd 4..Rotation i
0880: 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
0890: 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 72 65 76  addition to prev
08a0: 65 6e 74 20 72 65 63 6f 6d 70 75 74 61 74 69 6f  ent recomputatio
08b0: 6e 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46  n.. */.#define F
08c0: 46 28 61 2c 20 62 2c 20 63 2c 20 64 2c 20 78 2c  F(a, b, c, d, x,
08d0: 20 73 2c 20 61 63 29 20 7b 20 5c 0a 20 28 61 29   s, ac) { \. (a)
08e0: 20 2b 3d 20 46 20 28 28 62 29 2c 20 28 63 29 2c   += F ((b), (c),
08f0: 20 28 64 29 29 20 2b 20 28 78 29 20 2b 20 28 75   (d)) + (x) + (u
0900: 69 6e 74 33 32 5f 74 29 28 61 63 29 3b 20 5c 0a  int32_t)(ac); \.
0910: 20 28 61 29 20 3d 20 52 4f 54 41 54 45 5f 4c 45   (a) = ROTATE_LE
0920: 46 54 20 28 28 61 29 2c 20 28 73 29 29 3b 20 5c  FT ((a), (s)); \
0930: 0a 20 28 61 29 20 2b 3d 20 28 62 29 3b 20 5c 0a  . (a) += (b); \.
0940: 20 20 7d 0a 23 64 65 66 69 6e 65 20 47 47 28 61    }.#define GG(a
0950: 2c 20 62 2c 20 63 2c 20 64 2c 20 78 2c 20 73 2c  , b, c, d, x, s,
0960: 20 61 63 29 20 7b 20 5c 0a 20 28 61 29 20 2b 3d   ac) { \. (a) +=
0970: 20 47 20 28 28 62 29 2c 20 28 63 29 2c 20 28 64   G ((b), (c), (d
0980: 29 29 20 2b 20 28 78 29 20 2b 20 28 75 69 6e 74  )) + (x) + (uint
0990: 33 32 5f 74 29 28 61 63 29 3b 20 5c 0a 20 28 61  32_t)(ac); \. (a
09a0: 29 20 3d 20 52 4f 54 41 54 45 5f 4c 45 46 54 20  ) = ROTATE_LEFT 
09b0: 28 28 61 29 2c 20 28 73 29 29 3b 20 5c 0a 20 28  ((a), (s)); \. (
09c0: 61 29 20 2b 3d 20 28 62 29 3b 20 5c 0a 20 20 7d  a) += (b); \.  }
09d0: 0a 23 64 65 66 69 6e 65 20 48 48 28 61 2c 20 62  .#define HH(a, b
09e0: 2c 20 63 2c 20 64 2c 20 78 2c 20 73 2c 20 61 63  , c, d, x, s, ac
09f0: 29 20 7b 20 5c 0a 20 28 61 29 20 2b 3d 20 48 20  ) { \. (a) += H 
0a00: 28 28 62 29 2c 20 28 63 29 2c 20 28 64 29 29 20  ((b), (c), (d)) 
0a10: 2b 20 28 78 29 20 2b 20 28 75 69 6e 74 33 32 5f  + (x) + (uint32_
0a20: 74 29 28 61 63 29 3b 20 5c 0a 20 28 61 29 20 3d  t)(ac); \. (a) =
0a30: 20 52 4f 54 41 54 45 5f 4c 45 46 54 20 28 28 61   ROTATE_LEFT ((a
0a40: 29 2c 20 28 73 29 29 3b 20 5c 0a 20 28 61 29 20  ), (s)); \. (a) 
0a50: 2b 3d 20 28 62 29 3b 20 5c 0a 20 20 7d 0a 23 64  += (b); \.  }.#d
0a60: 65 66 69 6e 65 20 49 49 28 61 2c 20 62 2c 20 63  efine II(a, b, c
0a70: 2c 20 64 2c 20 78 2c 20 73 2c 20 61 63 29 20 7b  , d, x, s, ac) {
0a80: 20 5c 0a 20 28 61 29 20 2b 3d 20 49 20 28 28 62   \. (a) += I ((b
0a90: 29 2c 20 28 63 29 2c 20 28 64 29 29 20 2b 20 28  ), (c), (d)) + (
0aa0: 78 29 20 2b 20 28 75 69 6e 74 33 32 5f 74 29 28  x) + (uint32_t)(
0ab0: 61 63 29 3b 20 5c 0a 20 28 61 29 20 3d 20 52 4f  ac); \. (a) = RO
0ac0: 54 41 54 45 5f 4c 45 46 54 20 28 28 61 29 2c 20  TATE_LEFT ((a), 
0ad0: 28 73 29 29 3b 20 5c 0a 20 28 61 29 20 2b 3d 20  (s)); \. (a) += 
0ae0: 28 62 29 3b 20 5c 0a 20 20 7d 0a 0a 2f 2a 20 4d  (b); \.  }../* M
0af0: 44 35 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  D5 initializatio
0b00: 6e 2e 20 42 65 67 69 6e 73 20 61 6e 20 4d 44 35  n. Begins an MD5
0b10: 20 6f 70 65 72 61 74 69 6f 6e 2c 20 77 72 69 74   operation, writ
0b20: 69 6e 67 20 61 20 6e 65 77 20 63 6f 6e 74 65 78  ing a new contex
0b30: 74 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t.. */.static vo
0b40: 69 64 20 4d 44 35 49 6e 69 74 20 28 4d 44 35 5f  id MD5Init (MD5_
0b50: 43 54 58 20 2a 63 6f 6e 74 65 78 74 29 20 7b 0a  CTX *context) {.
0b60: 09 63 6f 6e 74 65 78 74 2d 3e 63 6f 75 6e 74 5b  .context->count[
0b70: 30 5d 20 3d 20 63 6f 6e 74 65 78 74 2d 3e 63 6f  0] = context->co
0b80: 75 6e 74 5b 31 5d 20 3d 20 30 3b 0a 0a 09 2f 2a  unt[1] = 0;.../*
0b90: 20 4c 6f 61 64 20 6d 61 67 69 63 20 69 6e 69 74   Load magic init
0ba0: 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e 73 74  ialization const
0bb0: 61 6e 74 73 2e 20 2a 2f 0a 09 63 6f 6e 74 65 78  ants. */..contex
0bc0: 74 2d 3e 73 74 61 74 65 5b 30 5d 20 3d 20 30 78  t->state[0] = 0x
0bd0: 36 37 34 35 32 33 30 31 3b 0a 09 63 6f 6e 74 65  67452301;..conte
0be0: 78 74 2d 3e 73 74 61 74 65 5b 31 5d 20 3d 20 30  xt->state[1] = 0
0bf0: 78 65 66 63 64 61 62 38 39 3b 0a 09 63 6f 6e 74  xefcdab89;..cont
0c00: 65 78 74 2d 3e 73 74 61 74 65 5b 32 5d 20 3d 20  ext->state[2] = 
0c10: 30 78 39 38 62 61 64 63 66 65 3b 0a 09 63 6f 6e  0x98badcfe;..con
0c20: 74 65 78 74 2d 3e 73 74 61 74 65 5b 33 5d 20 3d  text->state[3] =
0c30: 20 30 78 31 30 33 32 35 34 37 36 3b 0a 7d 0a 0a   0x10325476;.}..
0c40: 2f 2a 20 4d 44 35 20 62 6c 6f 63 6b 20 75 70 64  /* MD5 block upd
0c50: 61 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 43  ate operation. C
0c60: 6f 6e 74 69 6e 75 65 73 20 61 6e 20 4d 44 35 20  ontinues an MD5 
0c70: 6d 65 73 73 61 67 65 2d 64 69 67 65 73 74 0a 20  message-digest. 
0c80: 20 6f 70 65 72 61 74 69 6f 6e 2c 20 70 72 6f 63   operation, proc
0c90: 65 73 73 69 6e 67 20 61 6e 6f 74 68 65 72 20 6d  essing another m
0ca0: 65 73 73 61 67 65 20 62 6c 6f 63 6b 2c 20 61 6e  essage block, an
0cb0: 64 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 20  d updating the. 
0cc0: 20 63 6f 6e 74 65 78 74 2e 0a 20 2a 2f 0a 73 74   context.. */.st
0cd0: 61 74 69 63 20 76 6f 69 64 20 4d 44 35 55 70 64  atic void MD5Upd
0ce0: 61 74 65 20 28 4d 44 35 5f 43 54 58 20 2a 63 6f  ate (MD5_CTX *co
0cf0: 6e 74 65 78 74 2c 20 75 6e 73 69 67 6e 65 64 20  ntext, unsigned 
0d00: 63 68 61 72 20 2a 69 6e 70 75 74 2c 20 75 6e 73  char *input, uns
0d10: 69 67 6e 65 64 20 69 6e 74 20 69 6e 70 75 74 4c  igned int inputL
0d20: 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  en) {..unsigned 
0d30: 69 6e 74 20 69 2c 20 69 6e 64 65 78 2c 20 70 61  int i, index, pa
0d40: 72 74 4c 65 6e 3b 0a 0a 09 2f 2a 20 43 6f 6d 70  rtLen;.../* Comp
0d50: 75 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  ute number of by
0d60: 74 65 73 20 6d 6f 64 20 36 34 20 2a 2f 0a 09 69  tes mod 64 */..i
0d70: 6e 64 65 78 20 3d 20 28 75 6e 73 69 67 6e 65 64  ndex = (unsigned
0d80: 20 69 6e 74 29 28 28 63 6f 6e 74 65 78 74 2d 3e   int)((context->
0d90: 63 6f 75 6e 74 5b 30 5d 20 3e 3e 20 33 29 20 26  count[0] >> 3) &
0da0: 20 30 78 33 46 29 3b 0a 0a 09 2f 2a 20 55 70 64   0x3F);.../* Upd
0db0: 61 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  ate number of bi
0dc0: 74 73 20 2a 2f 0a 09 69 66 20 28 28 63 6f 6e 74  ts */..if ((cont
0dd0: 65 78 74 2d 3e 63 6f 75 6e 74 5b 30 5d 20 2b 3d  ext->count[0] +=
0de0: 20 28 28 75 69 6e 74 33 32 5f 74 29 69 6e 70 75   ((uint32_t)inpu
0df0: 74 4c 65 6e 20 3c 3c 20 33 29 29 20 3c 20 28 28  tLen << 3)) < ((
0e00: 75 69 6e 74 33 32 5f 74 29 69 6e 70 75 74 4c 65  uint32_t)inputLe
0e10: 6e 20 3c 3c 20 33 29 29 20 7b 0a 09 09 63 6f 6e  n << 3)) {...con
0e20: 74 65 78 74 2d 3e 63 6f 75 6e 74 5b 31 5d 2b 2b  text->count[1]++
0e30: 3b 0a 09 7d 0a 0a 09 63 6f 6e 74 65 78 74 2d 3e  ;..}...context->
0e40: 63 6f 75 6e 74 5b 31 5d 20 2b 3d 20 28 28 75 69  count[1] += ((ui
0e50: 6e 74 33 32 5f 74 29 69 6e 70 75 74 4c 65 6e 20  nt32_t)inputLen 
0e60: 3e 3e 20 32 39 29 3b 0a 0a 09 70 61 72 74 4c 65  >> 29);...partLe
0e70: 6e 20 3d 20 36 34 20 2d 20 69 6e 64 65 78 3b 0a  n = 64 - index;.
0e80: 0a 09 2f 2a 20 54 72 61 6e 73 66 6f 72 6d 20 61  ../* Transform a
0e90: 73 20 6d 61 6e 79 20 74 69 6d 65 73 20 61 73 20  s many times as 
0ea0: 70 6f 73 73 69 62 6c 65 2e 20 2a 2f 0a 09 69 66  possible. */..if
0eb0: 20 28 69 6e 70 75 74 4c 65 6e 20 3e 3d 20 70 61   (inputLen >= pa
0ec0: 72 74 4c 65 6e 29 20 7b 0a 09 09 6d 65 6d 63 70  rtLen) {...memcp
0ed0: 79 28 26 63 6f 6e 74 65 78 74 2d 3e 62 75 66 66  y(&context->buff
0ee0: 65 72 5b 69 6e 64 65 78 5d 2c 20 69 6e 70 75 74  er[index], input
0ef0: 2c 20 70 61 72 74 4c 65 6e 29 3b 0a 0a 09 09 4d  , partLen);....M
0f00: 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 6f 6e 74  D5Transform(cont
0f10: 65 78 74 2d 3e 73 74 61 74 65 2c 20 63 6f 6e 74  ext->state, cont
0f20: 65 78 74 2d 3e 62 75 66 66 65 72 29 3b 0a 0a 09  ext->buffer);...
0f30: 09 66 6f 72 20 28 69 20 3d 20 70 61 72 74 4c 65  .for (i = partLe
0f40: 6e 3b 20 28 69 20 2b 20 36 33 29 20 3c 20 69 6e  n; (i + 63) < in
0f50: 70 75 74 4c 65 6e 3b 20 69 20 2b 3d 20 36 34 29  putLen; i += 64)
0f60: 20 7b 0a 09 09 09 4d 44 35 54 72 61 6e 73 66 6f   {....MD5Transfo
0f70: 72 6d 20 28 63 6f 6e 74 65 78 74 2d 3e 73 74 61  rm (context->sta
0f80: 74 65 2c 20 26 69 6e 70 75 74 5b 69 5d 29 3b 0a  te, &input[i]);.
0f90: 09 09 7d 0a 0a 09 09 69 6e 64 65 78 20 3d 20 30  ..}....index = 0
0fa0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 20  ;..} else {...i 
0fb0: 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 66  = 0;..}.../* Buf
0fc0: 66 65 72 20 72 65 6d 61 69 6e 69 6e 67 20 69 6e  fer remaining in
0fd0: 70 75 74 20 2a 2f 0a 09 6d 65 6d 63 70 79 28 26  put */..memcpy(&
0fe0: 63 6f 6e 74 65 78 74 2d 3e 62 75 66 66 65 72 5b  context->buffer[
0ff0: 69 6e 64 65 78 5d 2c 20 26 69 6e 70 75 74 5b 69  index], &input[i
1000: 5d 2c 20 69 6e 70 75 74 4c 65 6e 20 2d 20 69 29  ], inputLen - i)
1010: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;...return;.}../
1020: 2a 20 4d 44 35 20 66 69 6e 61 6c 69 7a 61 74 69  * MD5 finalizati
1030: 6f 6e 2e 20 45 6e 64 73 20 61 6e 20 4d 44 35 20  on. Ends an MD5 
1040: 6d 65 73 73 61 67 65 2d 64 69 67 65 73 74 20 6f  message-digest o
1050: 70 65 72 61 74 69 6f 6e 2c 20 77 72 69 74 69 6e  peration, writin
1060: 67 20 74 68 65 0a 20 20 74 68 65 20 6d 65 73 73  g the.  the mess
1070: 61 67 65 20 64 69 67 65 73 74 20 61 6e 64 20 7a  age digest and z
1080: 65 72 6f 69 7a 69 6e 67 20 74 68 65 20 63 6f 6e  eroizing the con
1090: 74 65 78 74 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  text.. */.static
10a0: 20 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28 75   void MD5Final(u
10b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67  nsigned char dig
10c0: 65 73 74 5b 31 36 5d 2c 20 4d 44 35 5f 43 54 58  est[16], MD5_CTX
10d0: 20 2a 63 6f 6e 74 65 78 74 29 20 7b 0a 09 75 6e   *context) {..un
10e0: 73 69 67 6e 65 64 20 63 68 61 72 20 62 69 74 73  signed char bits
10f0: 5b 38 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69  [8];..unsigned i
1100: 6e 74 20 69 6e 64 65 78 2c 20 70 61 64 4c 65 6e  nt index, padLen
1110: 3b 0a 0a 09 2f 2a 20 53 61 76 65 20 6e 75 6d 62  ;.../* Save numb
1120: 65 72 20 6f 66 20 62 69 74 73 20 2a 2f 0a 09 45  er of bits */..E
1130: 6e 63 6f 64 65 28 62 69 74 73 2c 20 63 6f 6e 74  ncode(bits, cont
1140: 65 78 74 2d 3e 63 6f 75 6e 74 2c 20 38 29 3b 0a  ext->count, 8);.
1150: 0a 09 2f 2a 20 50 61 64 20 6f 75 74 20 74 6f 20  ../* Pad out to 
1160: 35 36 20 6d 6f 64 20 36 34 2e 20 2a 2f 0a 09 69  56 mod 64. */..i
1170: 6e 64 65 78 20 3d 20 28 75 6e 73 69 67 6e 65 64  ndex = (unsigned
1180: 20 69 6e 74 29 28 28 63 6f 6e 74 65 78 74 2d 3e   int)((context->
1190: 63 6f 75 6e 74 5b 30 5d 20 3e 3e 20 33 29 20 26  count[0] >> 3) &
11a0: 20 30 78 33 66 29 3b 0a 09 70 61 64 4c 65 6e 20   0x3f);..padLen 
11b0: 3d 20 28 69 6e 64 65 78 20 3c 20 35 36 29 20 3f  = (index < 56) ?
11c0: 20 28 35 36 20 2d 20 69 6e 64 65 78 29 20 3a 20   (56 - index) : 
11d0: 28 31 32 30 20 2d 20 69 6e 64 65 78 29 3b 0a 09  (120 - index);..
11e0: 4d 44 35 55 70 64 61 74 65 28 63 6f 6e 74 65 78  MD5Update(contex
11f0: 74 2c 20 50 41 44 44 49 4e 47 2c 20 70 61 64 4c  t, PADDING, padL
1200: 65 6e 29 3b 0a 0a 09 2f 2a 20 41 70 70 65 6e 64  en);.../* Append
1210: 20 6c 65 6e 67 74 68 20 28 62 65 66 6f 72 65 20   length (before 
1220: 70 61 64 64 69 6e 67 29 20 2a 2f 0a 09 4d 44 35  padding) */..MD5
1230: 55 70 64 61 74 65 28 63 6f 6e 74 65 78 74 2c 20  Update(context, 
1240: 62 69 74 73 2c 20 38 29 3b 0a 0a 09 2f 2a 20 53  bits, 8);.../* S
1250: 74 6f 72 65 20 73 74 61 74 65 20 69 6e 20 64 69  tore state in di
1260: 67 65 73 74 20 2a 2f 0a 09 45 6e 63 6f 64 65 28  gest */..Encode(
1270: 64 69 67 65 73 74 2c 20 63 6f 6e 74 65 78 74 2d  digest, context-
1280: 3e 73 74 61 74 65 2c 20 31 36 29 3b 0a 0a 09 2f  >state, 16);.../
1290: 2a 20 5a 65 72 6f 69 7a 65 20 73 65 6e 73 69 74  * Zeroize sensit
12a0: 69 76 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ive information.
12b0: 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 63 6f 6e 74   */..memset(cont
12c0: 65 78 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ext, 0, sizeof(*
12d0: 63 6f 6e 74 65 78 74 29 29 3b 0a 0a 09 72 65 74  context));...ret
12e0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4d 44 35 20 62  urn;.}../* MD5 b
12f0: 61 73 69 63 20 74 72 61 6e 73 66 6f 72 6d 61 74  asic transformat
1300: 69 6f 6e 2e 20 54 72 61 6e 73 66 6f 72 6d 73 20  ion. Transforms 
1310: 73 74 61 74 65 20 62 61 73 65 64 20 6f 6e 20 62  state based on b
1320: 6c 6f 63 6b 2e 20 2a 2f 0a 73 74 61 74 69 63 20  lock. */.static 
1330: 76 6f 69 64 20 4d 44 35 54 72 61 6e 73 66 6f 72  void MD5Transfor
1340: 6d 20 28 75 69 6e 74 33 32 5f 74 20 73 74 61 74  m (uint32_t stat
1350: 65 5b 34 5d 2c 20 75 6e 73 69 67 6e 65 64 20 63  e[4], unsigned c
1360: 68 61 72 20 62 6c 6f 63 6b 5b 36 34 5d 29 20 7b  har block[64]) {
1370: 0a 09 75 69 6e 74 33 32 5f 74 20 61 20 3d 20 73  ..uint32_t a = s
1380: 74 61 74 65 5b 30 5d 2c 20 62 20 3d 20 73 74 61  tate[0], b = sta
1390: 74 65 5b 31 5d 2c 20 63 20 3d 20 73 74 61 74 65  te[1], c = state
13a0: 5b 32 5d 2c 20 64 20 3d 20 73 74 61 74 65 5b 33  [2], d = state[3
13b0: 5d 2c 20 78 5b 31 36 5d 3b 0a 0a 09 44 65 63 6f  ], x[16];...Deco
13c0: 64 65 28 78 2c 20 62 6c 6f 63 6b 2c 20 36 34 29  de(x, block, 64)
13d0: 3b 0a 0a 09 2f 2a 20 52 6f 75 6e 64 20 31 20 2a  ;.../* Round 1 *
13e0: 2f 0a 09 46 46 28 61 2c 20 62 2c 20 63 2c 20 64  /..FF(a, b, c, d
13f0: 2c 20 78 5b 20 30 5d 2c 20 53 31 31 2c 20 30 78  , x[ 0], S11, 0x
1400: 64 37 36 61 61 34 37 38 29 3b 20 2f 2a 20 31 20  d76aa478); /* 1 
1410: 2a 2f 0a 09 46 46 28 64 2c 20 61 2c 20 62 2c 20  */..FF(d, a, b, 
1420: 63 2c 20 78 5b 20 31 5d 2c 20 53 31 32 2c 20 30  c, x[ 1], S12, 0
1430: 78 65 38 63 37 62 37 35 36 29 3b 20 2f 2a 20 32  xe8c7b756); /* 2
1440: 20 2a 2f 0a 09 46 46 28 63 2c 20 64 2c 20 61 2c   */..FF(c, d, a,
1450: 20 62 2c 20 78 5b 20 32 5d 2c 20 53 31 33 2c 20   b, x[ 2], S13, 
1460: 30 78 32 34 32 30 37 30 64 62 29 3b 20 2f 2a 20  0x242070db); /* 
1470: 33 20 2a 2f 0a 09 46 46 28 62 2c 20 63 2c 20 64  3 */..FF(b, c, d
1480: 2c 20 61 2c 20 78 5b 20 33 5d 2c 20 53 31 34 2c  , a, x[ 3], S14,
1490: 20 30 78 63 31 62 64 63 65 65 65 29 3b 20 2f 2a   0xc1bdceee); /*
14a0: 20 34 20 2a 2f 0a 09 46 46 28 61 2c 20 62 2c 20   4 */..FF(a, b, 
14b0: 63 2c 20 64 2c 20 78 5b 20 34 5d 2c 20 53 31 31  c, d, x[ 4], S11
14c0: 2c 20 30 78 66 35 37 63 30 66 61 66 29 3b 20 2f  , 0xf57c0faf); /
14d0: 2a 20 35 20 2a 2f 0a 09 46 46 28 64 2c 20 61 2c  * 5 */..FF(d, a,
14e0: 20 62 2c 20 63 2c 20 78 5b 20 35 5d 2c 20 53 31   b, c, x[ 5], S1
14f0: 32 2c 20 30 78 34 37 38 37 63 36 32 61 29 3b 20  2, 0x4787c62a); 
1500: 2f 2a 20 36 20 2a 2f 0a 09 46 46 28 63 2c 20 64  /* 6 */..FF(c, d
1510: 2c 20 61 2c 20 62 2c 20 78 5b 20 36 5d 2c 20 53  , a, b, x[ 6], S
1520: 31 33 2c 20 30 78 61 38 33 30 34 36 31 33 29 3b  13, 0xa8304613);
1530: 20 2f 2a 20 37 20 2a 2f 0a 09 46 46 28 62 2c 20   /* 7 */..FF(b, 
1540: 63 2c 20 64 2c 20 61 2c 20 78 5b 20 37 5d 2c 20  c, d, a, x[ 7], 
1550: 53 31 34 2c 20 30 78 66 64 34 36 39 35 30 31 29  S14, 0xfd469501)
1560: 3b 20 2f 2a 20 38 20 2a 2f 0a 09 46 46 28 61 2c  ; /* 8 */..FF(a,
1570: 20 62 2c 20 63 2c 20 64 2c 20 78 5b 20 38 5d 2c   b, c, d, x[ 8],
1580: 20 53 31 31 2c 20 30 78 36 39 38 30 39 38 64 38   S11, 0x698098d8
1590: 29 3b 20 2f 2a 20 39 20 2a 2f 0a 09 46 46 28 64  ); /* 9 */..FF(d
15a0: 2c 20 61 2c 20 62 2c 20 63 2c 20 78 5b 20 39 5d  , a, b, c, x[ 9]
15b0: 2c 20 53 31 32 2c 20 30 78 38 62 34 34 66 37 61  , S12, 0x8b44f7a
15c0: 66 29 3b 20 2f 2a 20 31 30 20 2a 2f 0a 09 46 46  f); /* 10 */..FF
15d0: 28 63 2c 20 64 2c 20 61 2c 20 62 2c 20 78 5b 31  (c, d, a, b, x[1
15e0: 30 5d 2c 20 53 31 33 2c 20 30 78 66 66 66 66 35  0], S13, 0xffff5
15f0: 62 62 31 29 3b 20 2f 2a 20 31 31 20 2a 2f 0a 09  bb1); /* 11 */..
1600: 46 46 28 62 2c 20 63 2c 20 64 2c 20 61 2c 20 78  FF(b, c, d, a, x
1610: 5b 31 31 5d 2c 20 53 31 34 2c 20 30 78 38 39 35  [11], S14, 0x895
1620: 63 64 37 62 65 29 3b 20 2f 2a 20 31 32 20 2a 2f  cd7be); /* 12 */
1630: 0a 09 46 46 28 61 2c 20 62 2c 20 63 2c 20 64 2c  ..FF(a, b, c, d,
1640: 20 78 5b 31 32 5d 2c 20 53 31 31 2c 20 30 78 36   x[12], S11, 0x6
1650: 62 39 30 31 31 32 32 29 3b 20 2f 2a 20 31 33 20  b901122); /* 13 
1660: 2a 2f 0a 09 46 46 28 64 2c 20 61 2c 20 62 2c 20  */..FF(d, a, b, 
1670: 63 2c 20 78 5b 31 33 5d 2c 20 53 31 32 2c 20 30  c, x[13], S12, 0
1680: 78 66 64 39 38 37 31 39 33 29 3b 20 2f 2a 20 31  xfd987193); /* 1
1690: 34 20 2a 2f 0a 09 46 46 28 63 2c 20 64 2c 20 61  4 */..FF(c, d, a
16a0: 2c 20 62 2c 20 78 5b 31 34 5d 2c 20 53 31 33 2c  , b, x[14], S13,
16b0: 20 30 78 61 36 37 39 34 33 38 65 29 3b 20 2f 2a   0xa679438e); /*
16c0: 20 31 35 20 2a 2f 0a 09 46 46 28 62 2c 20 63 2c   15 */..FF(b, c,
16d0: 20 64 2c 20 61 2c 20 78 5b 31 35 5d 2c 20 53 31   d, a, x[15], S1
16e0: 34 2c 20 30 78 34 39 62 34 30 38 32 31 29 3b 20  4, 0x49b40821); 
16f0: 2f 2a 20 31 36 20 2a 2f 0a 0a 09 2f 2a 20 52 6f  /* 16 */.../* Ro
1700: 75 6e 64 20 32 20 2a 2f 0a 09 47 47 28 61 2c 20  und 2 */..GG(a, 
1710: 62 2c 20 63 2c 20 64 2c 20 78 5b 20 31 5d 2c 20  b, c, d, x[ 1], 
1720: 53 32 31 2c 20 30 78 66 36 31 65 32 35 36 32 29  S21, 0xf61e2562)
1730: 3b 20 2f 2a 20 31 37 20 2a 2f 0a 09 47 47 28 64  ; /* 17 */..GG(d
1740: 2c 20 61 2c 20 62 2c 20 63 2c 20 78 5b 20 36 5d  , a, b, c, x[ 6]
1750: 2c 20 53 32 32 2c 20 30 78 63 30 34 30 62 33 34  , S22, 0xc040b34
1760: 30 29 3b 20 2f 2a 20 31 38 20 2a 2f 0a 09 47 47  0); /* 18 */..GG
1770: 28 63 2c 20 64 2c 20 61 2c 20 62 2c 20 78 5b 31  (c, d, a, b, x[1
1780: 31 5d 2c 20 53 32 33 2c 20 30 78 32 36 35 65 35  1], S23, 0x265e5
1790: 61 35 31 29 3b 20 2f 2a 20 31 39 20 2a 2f 0a 09  a51); /* 19 */..
17a0: 47 47 28 62 2c 20 63 2c 20 64 2c 20 61 2c 20 78  GG(b, c, d, a, x
17b0: 5b 20 30 5d 2c 20 53 32 34 2c 20 30 78 65 39 62  [ 0], S24, 0xe9b
17c0: 36 63 37 61 61 29 3b 20 2f 2a 20 32 30 20 2a 2f  6c7aa); /* 20 */
17d0: 0a 09 47 47 28 61 2c 20 62 2c 20 63 2c 20 64 2c  ..GG(a, b, c, d,
17e0: 20 78 5b 20 35 5d 2c 20 53 32 31 2c 20 30 78 64   x[ 5], S21, 0xd
17f0: 36 32 66 31 30 35 64 29 3b 20 2f 2a 20 32 31 20  62f105d); /* 21 
1800: 2a 2f 0a 09 47 47 28 64 2c 20 61 2c 20 62 2c 20  */..GG(d, a, b, 
1810: 63 2c 20 78 5b 31 30 5d 2c 20 53 32 32 2c 20 20  c, x[10], S22,  
1820: 30 78 32 34 34 31 34 35 33 29 3b 20 2f 2a 20 32  0x2441453); /* 2
1830: 32 20 2a 2f 0a 09 47 47 28 63 2c 20 64 2c 20 61  2 */..GG(c, d, a
1840: 2c 20 62 2c 20 78 5b 31 35 5d 2c 20 53 32 33 2c  , b, x[15], S23,
1850: 20 30 78 64 38 61 31 65 36 38 31 29 3b 20 2f 2a   0xd8a1e681); /*
1860: 20 32 33 20 2a 2f 0a 09 47 47 28 62 2c 20 63 2c   23 */..GG(b, c,
1870: 20 64 2c 20 61 2c 20 78 5b 20 34 5d 2c 20 53 32   d, a, x[ 4], S2
1880: 34 2c 20 30 78 65 37 64 33 66 62 63 38 29 3b 20  4, 0xe7d3fbc8); 
1890: 2f 2a 20 32 34 20 2a 2f 0a 09 47 47 28 61 2c 20  /* 24 */..GG(a, 
18a0: 62 2c 20 63 2c 20 64 2c 20 78 5b 20 39 5d 2c 20  b, c, d, x[ 9], 
18b0: 53 32 31 2c 20 30 78 32 31 65 31 63 64 65 36 29  S21, 0x21e1cde6)
18c0: 3b 20 2f 2a 20 32 35 20 2a 2f 0a 09 47 47 28 64  ; /* 25 */..GG(d
18d0: 2c 20 61 2c 20 62 2c 20 63 2c 20 78 5b 31 34 5d  , a, b, c, x[14]
18e0: 2c 20 53 32 32 2c 20 30 78 63 33 33 37 30 37 64  , S22, 0xc33707d
18f0: 36 29 3b 20 2f 2a 20 32 36 20 2a 2f 0a 09 47 47  6); /* 26 */..GG
1900: 28 63 2c 20 64 2c 20 61 2c 20 62 2c 20 78 5b 20  (c, d, a, b, x[ 
1910: 33 5d 2c 20 53 32 33 2c 20 30 78 66 34 64 35 30  3], S23, 0xf4d50
1920: 64 38 37 29 3b 20 2f 2a 20 32 37 20 2a 2f 0a 09  d87); /* 27 */..
1930: 47 47 28 62 2c 20 63 2c 20 64 2c 20 61 2c 20 78  GG(b, c, d, a, x
1940: 5b 20 38 5d 2c 20 53 32 34 2c 20 30 78 34 35 35  [ 8], S24, 0x455
1950: 61 31 34 65 64 29 3b 20 2f 2a 20 32 38 20 2a 2f  a14ed); /* 28 */
1960: 0a 09 47 47 28 61 2c 20 62 2c 20 63 2c 20 64 2c  ..GG(a, b, c, d,
1970: 20 78 5b 31 33 5d 2c 20 53 32 31 2c 20 30 78 61   x[13], S21, 0xa
1980: 39 65 33 65 39 30 35 29 3b 20 2f 2a 20 32 39 20  9e3e905); /* 29 
1990: 2a 2f 0a 09 47 47 28 64 2c 20 61 2c 20 62 2c 20  */..GG(d, a, b, 
19a0: 63 2c 20 78 5b 20 32 5d 2c 20 53 32 32 2c 20 30  c, x[ 2], S22, 0
19b0: 78 66 63 65 66 61 33 66 38 29 3b 20 2f 2a 20 33  xfcefa3f8); /* 3
19c0: 30 20 2a 2f 0a 09 47 47 28 63 2c 20 64 2c 20 61  0 */..GG(c, d, a
19d0: 2c 20 62 2c 20 78 5b 20 37 5d 2c 20 53 32 33 2c  , b, x[ 7], S23,
19e0: 20 30 78 36 37 36 66 30 32 64 39 29 3b 20 2f 2a   0x676f02d9); /*
19f0: 20 33 31 20 2a 2f 0a 09 47 47 28 62 2c 20 63 2c   31 */..GG(b, c,
1a00: 20 64 2c 20 61 2c 20 78 5b 31 32 5d 2c 20 53 32   d, a, x[12], S2
1a10: 34 2c 20 30 78 38 64 32 61 34 63 38 61 29 3b 20  4, 0x8d2a4c8a); 
1a20: 2f 2a 20 33 32 20 2a 2f 0a 0a 09 2f 2a 20 52 6f  /* 32 */.../* Ro
1a30: 75 6e 64 20 33 20 2a 2f 0a 09 48 48 28 61 2c 20  und 3 */..HH(a, 
1a40: 62 2c 20 63 2c 20 64 2c 20 78 5b 20 35 5d 2c 20  b, c, d, x[ 5], 
1a50: 53 33 31 2c 20 30 78 66 66 66 61 33 39 34 32 29  S31, 0xfffa3942)
1a60: 3b 20 2f 2a 20 33 33 20 2a 2f 0a 09 48 48 28 64  ; /* 33 */..HH(d
1a70: 2c 20 61 2c 20 62 2c 20 63 2c 20 78 5b 20 38 5d  , a, b, c, x[ 8]
1a80: 2c 20 53 33 32 2c 20 30 78 38 37 37 31 66 36 38  , S32, 0x8771f68
1a90: 31 29 3b 20 2f 2a 20 33 34 20 2a 2f 0a 09 48 48  1); /* 34 */..HH
1aa0: 28 63 2c 20 64 2c 20 61 2c 20 62 2c 20 78 5b 31  (c, d, a, b, x[1
1ab0: 31 5d 2c 20 53 33 33 2c 20 30 78 36 64 39 64 36  1], S33, 0x6d9d6
1ac0: 31 32 32 29 3b 20 2f 2a 20 33 35 20 2a 2f 0a 09  122); /* 35 */..
1ad0: 48 48 28 62 2c 20 63 2c 20 64 2c 20 61 2c 20 78  HH(b, c, d, a, x
1ae0: 5b 31 34 5d 2c 20 53 33 34 2c 20 30 78 66 64 65  [14], S34, 0xfde
1af0: 35 33 38 30 63 29 3b 20 2f 2a 20 33 36 20 2a 2f  5380c); /* 36 */
1b00: 0a 09 48 48 28 61 2c 20 62 2c 20 63 2c 20 64 2c  ..HH(a, b, c, d,
1b10: 20 78 5b 20 31 5d 2c 20 53 33 31 2c 20 30 78 61   x[ 1], S31, 0xa
1b20: 34 62 65 65 61 34 34 29 3b 20 2f 2a 20 33 37 20  4beea44); /* 37 
1b30: 2a 2f 0a 09 48 48 28 64 2c 20 61 2c 20 62 2c 20  */..HH(d, a, b, 
1b40: 63 2c 20 78 5b 20 34 5d 2c 20 53 33 32 2c 20 30  c, x[ 4], S32, 0
1b50: 78 34 62 64 65 63 66 61 39 29 3b 20 2f 2a 20 33  x4bdecfa9); /* 3
1b60: 38 20 2a 2f 0a 09 48 48 28 63 2c 20 64 2c 20 61  8 */..HH(c, d, a
1b70: 2c 20 62 2c 20 78 5b 20 37 5d 2c 20 53 33 33 2c  , b, x[ 7], S33,
1b80: 20 30 78 66 36 62 62 34 62 36 30 29 3b 20 2f 2a   0xf6bb4b60); /*
1b90: 20 33 39 20 2a 2f 0a 09 48 48 28 62 2c 20 63 2c   39 */..HH(b, c,
1ba0: 20 64 2c 20 61 2c 20 78 5b 31 30 5d 2c 20 53 33   d, a, x[10], S3
1bb0: 34 2c 20 30 78 62 65 62 66 62 63 37 30 29 3b 20  4, 0xbebfbc70); 
1bc0: 2f 2a 20 34 30 20 2a 2f 0a 09 48 48 28 61 2c 20  /* 40 */..HH(a, 
1bd0: 62 2c 20 63 2c 20 64 2c 20 78 5b 31 33 5d 2c 20  b, c, d, x[13], 
1be0: 53 33 31 2c 20 30 78 32 38 39 62 37 65 63 36 29  S31, 0x289b7ec6)
1bf0: 3b 20 2f 2a 20 34 31 20 2a 2f 0a 09 48 48 28 64  ; /* 41 */..HH(d
1c00: 2c 20 61 2c 20 62 2c 20 63 2c 20 78 5b 20 30 5d  , a, b, c, x[ 0]
1c10: 2c 20 53 33 32 2c 20 30 78 65 61 61 31 32 37 66  , S32, 0xeaa127f
1c20: 61 29 3b 20 2f 2a 20 34 32 20 2a 2f 0a 09 48 48  a); /* 42 */..HH
1c30: 28 63 2c 20 64 2c 20 61 2c 20 62 2c 20 78 5b 20  (c, d, a, b, x[ 
1c40: 33 5d 2c 20 53 33 33 2c 20 30 78 64 34 65 66 33  3], S33, 0xd4ef3
1c50: 30 38 35 29 3b 20 2f 2a 20 34 33 20 2a 2f 0a 09  085); /* 43 */..
1c60: 48 48 28 62 2c 20 63 2c 20 64 2c 20 61 2c 20 78  HH(b, c, d, a, x
1c70: 5b 20 36 5d 2c 20 53 33 34 2c 20 20 30 78 34 38  [ 6], S34,  0x48
1c80: 38 31 64 30 35 29 3b 20 2f 2a 20 34 34 20 2a 2f  81d05); /* 44 */
1c90: 0a 09 48 48 28 61 2c 20 62 2c 20 63 2c 20 64 2c  ..HH(a, b, c, d,
1ca0: 20 78 5b 20 39 5d 2c 20 53 33 31 2c 20 30 78 64   x[ 9], S31, 0xd
1cb0: 39 64 34 64 30 33 39 29 3b 20 2f 2a 20 34 35 20  9d4d039); /* 45 
1cc0: 2a 2f 0a 09 48 48 28 64 2c 20 61 2c 20 62 2c 20  */..HH(d, a, b, 
1cd0: 63 2c 20 78 5b 31 32 5d 2c 20 53 33 32 2c 20 30  c, x[12], S32, 0
1ce0: 78 65 36 64 62 39 39 65 35 29 3b 20 2f 2a 20 34  xe6db99e5); /* 4
1cf0: 36 20 2a 2f 0a 09 48 48 28 63 2c 20 64 2c 20 61  6 */..HH(c, d, a
1d00: 2c 20 62 2c 20 78 5b 31 35 5d 2c 20 53 33 33 2c  , b, x[15], S33,
1d10: 20 30 78 31 66 61 32 37 63 66 38 29 3b 20 2f 2a   0x1fa27cf8); /*
1d20: 20 34 37 20 2a 2f 0a 09 48 48 28 62 2c 20 63 2c   47 */..HH(b, c,
1d30: 20 64 2c 20 61 2c 20 78 5b 20 32 5d 2c 20 53 33   d, a, x[ 2], S3
1d40: 34 2c 20 30 78 63 34 61 63 35 36 36 35 29 3b 20  4, 0xc4ac5665); 
1d50: 2f 2a 20 34 38 20 2a 2f 0a 0a 09 2f 2a 20 52 6f  /* 48 */.../* Ro
1d60: 75 6e 64 20 34 20 2a 2f 0a 09 49 49 28 61 2c 20  und 4 */..II(a, 
1d70: 62 2c 20 63 2c 20 64 2c 20 78 5b 20 30 5d 2c 20  b, c, d, x[ 0], 
1d80: 53 34 31 2c 20 30 78 66 34 32 39 32 32 34 34 29  S41, 0xf4292244)
1d90: 3b 20 2f 2a 20 34 39 20 2a 2f 0a 09 49 49 28 64  ; /* 49 */..II(d
1da0: 2c 20 61 2c 20 62 2c 20 63 2c 20 78 5b 20 37 5d  , a, b, c, x[ 7]
1db0: 2c 20 53 34 32 2c 20 30 78 34 33 32 61 66 66 39  , S42, 0x432aff9
1dc0: 37 29 3b 20 2f 2a 20 35 30 20 2a 2f 0a 09 49 49  7); /* 50 */..II
1dd0: 28 63 2c 20 64 2c 20 61 2c 20 62 2c 20 78 5b 31  (c, d, a, b, x[1
1de0: 34 5d 2c 20 53 34 33 2c 20 30 78 61 62 39 34 32  4], S43, 0xab942
1df0: 33 61 37 29 3b 20 2f 2a 20 35 31 20 2a 2f 0a 09  3a7); /* 51 */..
1e00: 49 49 28 62 2c 20 63 2c 20 64 2c 20 61 2c 20 78  II(b, c, d, a, x
1e10: 5b 20 35 5d 2c 20 53 34 34 2c 20 30 78 66 63 39  [ 5], S44, 0xfc9
1e20: 33 61 30 33 39 29 3b 20 2f 2a 20 35 32 20 2a 2f  3a039); /* 52 */
1e30: 0a 09 49 49 28 61 2c 20 62 2c 20 63 2c 20 64 2c  ..II(a, b, c, d,
1e40: 20 78 5b 31 32 5d 2c 20 53 34 31 2c 20 30 78 36   x[12], S41, 0x6
1e50: 35 35 62 35 39 63 33 29 3b 20 2f 2a 20 35 33 20  55b59c3); /* 53 
1e60: 2a 2f 0a 09 49 49 28 64 2c 20 61 2c 20 62 2c 20  */..II(d, a, b, 
1e70: 63 2c 20 78 5b 20 33 5d 2c 20 53 34 32 2c 20 30  c, x[ 3], S42, 0
1e80: 78 38 66 30 63 63 63 39 32 29 3b 20 2f 2a 20 35  x8f0ccc92); /* 5
1e90: 34 20 2a 2f 0a 09 49 49 28 63 2c 20 64 2c 20 61  4 */..II(c, d, a
1ea0: 2c 20 62 2c 20 78 5b 31 30 5d 2c 20 53 34 33 2c  , b, x[10], S43,
1eb0: 20 30 78 66 66 65 66 66 34 37 64 29 3b 20 2f 2a   0xffeff47d); /*
1ec0: 20 35 35 20 2a 2f 0a 09 49 49 28 62 2c 20 63 2c   55 */..II(b, c,
1ed0: 20 64 2c 20 61 2c 20 78 5b 20 31 5d 2c 20 53 34   d, a, x[ 1], S4
1ee0: 34 2c 20 30 78 38 35 38 34 35 64 64 31 29 3b 20  4, 0x85845dd1); 
1ef0: 2f 2a 20 35 36 20 2a 2f 0a 09 49 49 28 61 2c 20  /* 56 */..II(a, 
1f00: 62 2c 20 63 2c 20 64 2c 20 78 5b 20 38 5d 2c 20  b, c, d, x[ 8], 
1f10: 53 34 31 2c 20 30 78 36 66 61 38 37 65 34 66 29  S41, 0x6fa87e4f)
1f20: 3b 20 2f 2a 20 35 37 20 2a 2f 0a 09 49 49 28 64  ; /* 57 */..II(d
1f30: 2c 20 61 2c 20 62 2c 20 63 2c 20 78 5b 31 35 5d  , a, b, c, x[15]
1f40: 2c 20 53 34 32 2c 20 30 78 66 65 32 63 65 36 65  , S42, 0xfe2ce6e
1f50: 30 29 3b 20 2f 2a 20 35 38 20 2a 2f 0a 09 49 49  0); /* 58 */..II
1f60: 28 63 2c 20 64 2c 20 61 2c 20 62 2c 20 78 5b 20  (c, d, a, b, x[ 
1f70: 36 5d 2c 20 53 34 33 2c 20 30 78 61 33 30 31 34  6], S43, 0xa3014
1f80: 33 31 34 29 3b 20 2f 2a 20 35 39 20 2a 2f 0a 09  314); /* 59 */..
1f90: 49 49 28 62 2c 20 63 2c 20 64 2c 20 61 2c 20 78  II(b, c, d, a, x
1fa0: 5b 31 33 5d 2c 20 53 34 34 2c 20 30 78 34 65 30  [13], S44, 0x4e0
1fb0: 38 31 31 61 31 29 3b 20 2f 2a 20 36 30 20 2a 2f  811a1); /* 60 */
1fc0: 0a 09 49 49 28 61 2c 20 62 2c 20 63 2c 20 64 2c  ..II(a, b, c, d,
1fd0: 20 78 5b 20 34 5d 2c 20 53 34 31 2c 20 30 78 66   x[ 4], S41, 0xf
1fe0: 37 35 33 37 65 38 32 29 3b 20 2f 2a 20 36 31 20  7537e82); /* 61 
1ff0: 2a 2f 0a 09 49 49 28 64 2c 20 61 2c 20 62 2c 20  */..II(d, a, b, 
2000: 63 2c 20 78 5b 31 31 5d 2c 20 53 34 32 2c 20 30  c, x[11], S42, 0
2010: 78 62 64 33 61 66 32 33 35 29 3b 20 2f 2a 20 36  xbd3af235); /* 6
2020: 32 20 2a 2f 0a 09 49 49 28 63 2c 20 64 2c 20 61  2 */..II(c, d, a
2030: 2c 20 62 2c 20 78 5b 20 32 5d 2c 20 53 34 33 2c  , b, x[ 2], S43,
2040: 20 30 78 32 61 64 37 64 32 62 62 29 3b 20 2f 2a   0x2ad7d2bb); /*
2050: 20 36 33 20 2a 2f 0a 09 49 49 28 62 2c 20 63 2c   63 */..II(b, c,
2060: 20 64 2c 20 61 2c 20 78 5b 20 39 5d 2c 20 53 34   d, a, x[ 9], S4
2070: 34 2c 20 30 78 65 62 38 36 64 33 39 31 29 3b 20  4, 0xeb86d391); 
2080: 2f 2a 20 36 34 20 2a 2f 0a 0a 09 73 74 61 74 65  /* 64 */...state
2090: 5b 30 5d 20 2b 3d 20 61 3b 0a 09 73 74 61 74 65  [0] += a;..state
20a0: 5b 31 5d 20 2b 3d 20 62 3b 0a 09 73 74 61 74 65  [1] += b;..state
20b0: 5b 32 5d 20 2b 3d 20 63 3b 0a 09 73 74 61 74 65  [2] += c;..state
20c0: 5b 33 5d 20 2b 3d 20 64 3b 0a 0a 09 2f 2a 20 5a  [3] += d;.../* Z
20d0: 65 72 6f 69 7a 65 20 73 65 6e 73 69 74 69 76 65  eroize sensitive
20e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f   information. */
20f0: 0a 09 6d 65 6d 73 65 74 20 28 78 2c 20 30 2c 20  ..memset (x, 0, 
2100: 73 69 7a 65 6f 66 20 28 78 29 29 3b 0a 0a 09 72  sizeof (x));...r
2110: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 45 6e 63  eturn;.}../* Enc
2120: 6f 64 65 73 20 69 6e 70 75 74 20 28 75 69 6e 74  odes input (uint
2130: 33 32 5f 74 29 20 69 6e 74 6f 20 6f 75 74 70 75  32_t) into outpu
2140: 74 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t (unsigned char
2150: 29 2e 20 41 73 73 75 6d 65 73 20 6c 65 6e 20 69  ). Assumes len i
2160: 73 0a 20 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  s.  a multiple o
2170: 66 20 34 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76  f 4. */.static v
2180: 6f 69 64 20 45 6e 63 6f 64 65 28 75 6e 73 69 67  oid Encode(unsig
2190: 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 70 75 74  ned char *output
21a0: 2c 20 75 69 6e 74 33 32 5f 74 20 2a 69 6e 70 75  , uint32_t *inpu
21b0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  t, unsigned int 
21c0: 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  len) {..unsigned
21d0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 09 66 6f 72   int i, j;...for
21e0: 20 28 69 20 3d 20 30 2c 20 6a 20 3d 20 30 3b 20   (i = 0, j = 0; 
21f0: 6a 20 3c 20 6c 65 6e 3b 20 69 2b 2b 2c 20 6a 20  j < len; i++, j 
2200: 2b 3d 20 34 29 20 7b 0a 09 09 6f 75 74 70 75 74  += 4) {...output
2210: 5b 6a 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  [j] = (unsigned 
2220: 63 68 61 72 29 28 69 6e 70 75 74 5b 69 5d 20 26  char)(input[i] &
2230: 20 30 78 66 66 29 3b 0a 09 09 6f 75 74 70 75 74   0xff);...output
2240: 5b 6a 2b 31 5d 20 3d 20 28 75 6e 73 69 67 6e 65  [j+1] = (unsigne
2250: 64 20 63 68 61 72 29 28 28 69 6e 70 75 74 5b 69  d char)((input[i
2260: 5d 20 3e 3e 20 38 29 20 26 20 30 78 66 66 29 3b  ] >> 8) & 0xff);
2270: 0a 09 09 6f 75 74 70 75 74 5b 6a 2b 32 5d 20 3d  ...output[j+2] =
2280: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
2290: 28 28 69 6e 70 75 74 5b 69 5d 20 3e 3e 20 31 36  ((input[i] >> 16
22a0: 29 20 26 20 30 78 66 66 29 3b 0a 09 09 6f 75 74  ) & 0xff);...out
22b0: 70 75 74 5b 6a 2b 33 5d 20 3d 20 28 75 6e 73 69  put[j+3] = (unsi
22c0: 67 6e 65 64 20 63 68 61 72 29 28 28 69 6e 70 75  gned char)((inpu
22d0: 74 5b 69 5d 20 3e 3e 20 32 34 29 20 26 20 30 78  t[i] >> 24) & 0x
22e0: 66 66 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ff);..}...return
22f0: 3b 0a 7d 0a 0a 2f 2a 20 44 65 63 6f 64 65 73 20  ;.}../* Decodes 
2300: 69 6e 70 75 74 20 28 75 6e 73 69 67 6e 65 64 20  input (unsigned 
2310: 63 68 61 72 29 20 69 6e 74 6f 20 6f 75 74 70 75  char) into outpu
2320: 74 20 28 75 69 6e 74 33 32 5f 74 29 2e 20 41 73  t (uint32_t). As
2330: 73 75 6d 65 73 20 6c 65 6e 20 69 73 0a 20 20 61  sumes len is.  a
2340: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 2e 0a   multiple of 4..
2350: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
2360: 44 65 63 6f 64 65 20 28 75 69 6e 74 33 32 5f 74  Decode (uint32_t
2370: 20 2a 6f 75 74 70 75 74 2c 20 75 6e 73 69 67 6e   *output, unsign
2380: 65 64 20 63 68 61 72 20 2a 69 6e 70 75 74 2c 20  ed char *input, 
2390: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e  unsigned int len
23a0: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  ) {..unsigned in
23b0: 74 20 69 2c 20 6a 3b 0a 0a 09 66 6f 72 20 28 69  t i, j;...for (i
23c0: 20 3d 20 30 2c 20 6a 20 3d 20 30 3b 20 6a 20 3c   = 0, j = 0; j <
23d0: 20 6c 65 6e 3b 20 69 2b 2b 2c 20 6a 20 2b 3d 20   len; i++, j += 
23e0: 34 29 20 7b 0a 09 09 20 6f 75 74 70 75 74 5b 69  4) {... output[i
23f0: 5d 20 3d 20 28 28 75 69 6e 74 33 32 5f 74 29 69  ] = ((uint32_t)i
2400: 6e 70 75 74 5b 6a 5d 29 20 7c 20 28 28 28 75 69  nput[j]) | (((ui
2410: 6e 74 33 32 5f 74 29 69 6e 70 75 74 5b 6a 2b 31  nt32_t)input[j+1
2420: 5d 29 20 3c 3c 20 38 29 20 7c 20 5c 0a 09 09 09  ]) << 8) | \....
2430: 28 28 28 75 69 6e 74 33 32 5f 74 29 69 6e 70 75  (((uint32_t)inpu
2440: 74 5b 6a 2b 32 5d 29 20 3c 3c 20 31 36 29 20 7c  t[j+2]) << 16) |
2450: 20 28 28 28 75 69 6e 74 33 32 5f 74 29 69 6e 70   (((uint32_t)inp
2460: 75 74 5b 6a 2b 33 5d 29 20 3c 3c 20 32 34 29 3b  ut[j+3]) << 24);
2470: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  ..}...return;.}.