Hex Artifact Content

Artifact b5658591a951d3d4f4e73a92816cadd5176259ee:


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 76 6f 69 64 20 4d 44 35 49  t.. */.void MD5I
0b40: 6e 69 74 20 28 4d 44 35 5f 43 54 58 20 2a 63 6f  nit (MD5_CTX *co
0b50: 6e 74 65 78 74 29 20 7b 0a 09 63 6f 6e 74 65 78  ntext) {..contex
0b60: 74 2d 3e 63 6f 75 6e 74 5b 30 5d 20 3d 20 63 6f  t->count[0] = co
0b70: 6e 74 65 78 74 2d 3e 63 6f 75 6e 74 5b 31 5d 20  ntext->count[1] 
0b80: 3d 20 30 3b 0a 0a 09 2f 2a 20 4c 6f 61 64 20 6d  = 0;.../* Load m
0b90: 61 67 69 63 20 69 6e 69 74 69 61 6c 69 7a 61 74  agic initializat
0ba0: 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 2e 20 2a  ion constants. *
0bb0: 2f 0a 09 63 6f 6e 74 65 78 74 2d 3e 73 74 61 74  /..context->stat
0bc0: 65 5b 30 5d 20 3d 20 30 78 36 37 34 35 32 33 30  e[0] = 0x6745230
0bd0: 31 3b 0a 09 63 6f 6e 74 65 78 74 2d 3e 73 74 61  1;..context->sta
0be0: 74 65 5b 31 5d 20 3d 20 30 78 65 66 63 64 61 62  te[1] = 0xefcdab
0bf0: 38 39 3b 0a 09 63 6f 6e 74 65 78 74 2d 3e 73 74  89;..context->st
0c00: 61 74 65 5b 32 5d 20 3d 20 30 78 39 38 62 61 64  ate[2] = 0x98bad
0c10: 63 66 65 3b 0a 09 63 6f 6e 74 65 78 74 2d 3e 73  cfe;..context->s
0c20: 74 61 74 65 5b 33 5d 20 3d 20 30 78 31 30 33 32  tate[3] = 0x1032
0c30: 35 34 37 36 3b 0a 7d 0a 0a 2f 2a 20 4d 44 35 20  5476;.}../* MD5 
0c40: 62 6c 6f 63 6b 20 75 70 64 61 74 65 20 6f 70 65  block update ope
0c50: 72 61 74 69 6f 6e 2e 20 43 6f 6e 74 69 6e 75 65  ration. Continue
0c60: 73 20 61 6e 20 4d 44 35 20 6d 65 73 73 61 67 65  s an MD5 message
0c70: 2d 64 69 67 65 73 74 0a 20 20 6f 70 65 72 61 74  -digest.  operat
0c80: 69 6f 6e 2c 20 70 72 6f 63 65 73 73 69 6e 67 20  ion, processing 
0c90: 61 6e 6f 74 68 65 72 20 6d 65 73 73 61 67 65 20  another message 
0ca0: 62 6c 6f 63 6b 2c 20 61 6e 64 20 75 70 64 61 74  block, and updat
0cb0: 69 6e 67 20 74 68 65 0a 20 20 63 6f 6e 74 65 78  ing the.  contex
0cc0: 74 2e 0a 20 2a 2f 0a 76 6f 69 64 20 4d 44 35 55  t.. */.void MD5U
0cd0: 70 64 61 74 65 20 28 4d 44 35 5f 43 54 58 20 2a  pdate (MD5_CTX *
0ce0: 63 6f 6e 74 65 78 74 2c 20 75 6e 73 69 67 6e 65  context, unsigne
0cf0: 64 20 63 68 61 72 20 2a 69 6e 70 75 74 2c 20 75  d char *input, u
0d00: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 70 75  nsigned int inpu
0d10: 74 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65  tLen) {..unsigne
0d20: 64 20 69 6e 74 20 69 2c 20 69 6e 64 65 78 2c 20  d int i, index, 
0d30: 70 61 72 74 4c 65 6e 3b 0a 0a 09 2f 2a 20 43 6f  partLen;.../* Co
0d40: 6d 70 75 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  mpute number of 
0d50: 62 79 74 65 73 20 6d 6f 64 20 36 34 20 2a 2f 0a  bytes mod 64 */.
0d60: 09 69 6e 64 65 78 20 3d 20 28 75 6e 73 69 67 6e  .index = (unsign
0d70: 65 64 20 69 6e 74 29 28 28 63 6f 6e 74 65 78 74  ed int)((context
0d80: 2d 3e 63 6f 75 6e 74 5b 30 5d 20 3e 3e 20 33 29  ->count[0] >> 3)
0d90: 20 26 20 30 78 33 46 29 3b 0a 0a 09 2f 2a 20 55   & 0x3F);.../* U
0da0: 70 64 61 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  pdate number of 
0db0: 62 69 74 73 20 2a 2f 0a 09 69 66 20 28 28 63 6f  bits */..if ((co
0dc0: 6e 74 65 78 74 2d 3e 63 6f 75 6e 74 5b 30 5d 20  ntext->count[0] 
0dd0: 2b 3d 20 28 28 75 69 6e 74 33 32 5f 74 29 69 6e  += ((uint32_t)in
0de0: 70 75 74 4c 65 6e 20 3c 3c 20 33 29 29 20 3c 20  putLen << 3)) < 
0df0: 28 28 75 69 6e 74 33 32 5f 74 29 69 6e 70 75 74  ((uint32_t)input
0e00: 4c 65 6e 20 3c 3c 20 33 29 29 20 7b 0a 09 09 63  Len << 3)) {...c
0e10: 6f 6e 74 65 78 74 2d 3e 63 6f 75 6e 74 5b 31 5d  ontext->count[1]
0e20: 2b 2b 3b 0a 09 7d 0a 0a 09 63 6f 6e 74 65 78 74  ++;..}...context
0e30: 2d 3e 63 6f 75 6e 74 5b 31 5d 20 2b 3d 20 28 28  ->count[1] += ((
0e40: 75 69 6e 74 33 32 5f 74 29 69 6e 70 75 74 4c 65  uint32_t)inputLe
0e50: 6e 20 3e 3e 20 32 39 29 3b 0a 0a 09 70 61 72 74  n >> 29);...part
0e60: 4c 65 6e 20 3d 20 36 34 20 2d 20 69 6e 64 65 78  Len = 64 - index
0e70: 3b 0a 0a 09 2f 2a 20 54 72 61 6e 73 66 6f 72 6d  ;.../* Transform
0e80: 20 61 73 20 6d 61 6e 79 20 74 69 6d 65 73 20 61   as many times a
0e90: 73 20 70 6f 73 73 69 62 6c 65 2e 20 2a 2f 0a 09  s possible. */..
0ea0: 69 66 20 28 69 6e 70 75 74 4c 65 6e 20 3e 3d 20  if (inputLen >= 
0eb0: 70 61 72 74 4c 65 6e 29 20 7b 0a 09 09 6d 65 6d  partLen) {...mem
0ec0: 63 70 79 28 26 63 6f 6e 74 65 78 74 2d 3e 62 75  cpy(&context->bu
0ed0: 66 66 65 72 5b 69 6e 64 65 78 5d 2c 20 69 6e 70  ffer[index], inp
0ee0: 75 74 2c 20 70 61 72 74 4c 65 6e 29 3b 0a 0a 09  ut, partLen);...
0ef0: 09 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 6f  .MD5Transform(co
0f00: 6e 74 65 78 74 2d 3e 73 74 61 74 65 2c 20 63 6f  ntext->state, co
0f10: 6e 74 65 78 74 2d 3e 62 75 66 66 65 72 29 3b 0a  ntext->buffer);.
0f20: 0a 09 09 66 6f 72 20 28 69 20 3d 20 70 61 72 74  ...for (i = part
0f30: 4c 65 6e 3b 20 28 69 20 2b 20 36 33 29 20 3c 20  Len; (i + 63) < 
0f40: 69 6e 70 75 74 4c 65 6e 3b 20 69 20 2b 3d 20 36  inputLen; i += 6
0f50: 34 29 20 7b 0a 09 09 09 4d 44 35 54 72 61 6e 73  4) {....MD5Trans
0f60: 66 6f 72 6d 20 28 63 6f 6e 74 65 78 74 2d 3e 73  form (context->s
0f70: 74 61 74 65 2c 20 26 69 6e 70 75 74 5b 69 5d 29  tate, &input[i])
0f80: 3b 0a 09 09 7d 0a 0a 09 09 69 6e 64 65 78 20 3d  ;...}....index =
0f90: 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09   0;..} else {...
0fa0: 69 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42  i = 0;..}.../* B
0fb0: 75 66 66 65 72 20 72 65 6d 61 69 6e 69 6e 67 20  uffer remaining 
0fc0: 69 6e 70 75 74 20 2a 2f 0a 09 6d 65 6d 63 70 79  input */..memcpy
0fd0: 28 26 63 6f 6e 74 65 78 74 2d 3e 62 75 66 66 65  (&context->buffe
0fe0: 72 5b 69 6e 64 65 78 5d 2c 20 26 69 6e 70 75 74  r[index], &input
0ff0: 5b 69 5d 2c 20 69 6e 70 75 74 4c 65 6e 20 2d 20  [i], inputLen - 
1000: 69 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  i);...return;.}.
1010: 0a 2f 2a 20 4d 44 35 20 66 69 6e 61 6c 69 7a 61  ./* MD5 finaliza
1020: 74 69 6f 6e 2e 20 45 6e 64 73 20 61 6e 20 4d 44  tion. Ends an MD
1030: 35 20 6d 65 73 73 61 67 65 2d 64 69 67 65 73 74  5 message-digest
1040: 20 6f 70 65 72 61 74 69 6f 6e 2c 20 77 72 69 74   operation, writ
1050: 69 6e 67 20 74 68 65 0a 20 20 74 68 65 20 6d 65  ing the.  the me
1060: 73 73 61 67 65 20 64 69 67 65 73 74 20 61 6e 64  ssage digest and
1070: 20 7a 65 72 6f 69 7a 69 6e 67 20 74 68 65 20 63   zeroizing the c
1080: 6f 6e 74 65 78 74 2e 0a 20 2a 2f 0a 76 6f 69 64  ontext.. */.void
1090: 20 4d 44 35 46 69 6e 61 6c 28 75 6e 73 69 67 6e   MD5Final(unsign
10a0: 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31  ed char digest[1
10b0: 36 5d 2c 20 4d 44 35 5f 43 54 58 20 2a 63 6f 6e  6], MD5_CTX *con
10c0: 74 65 78 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65  text) {..unsigne
10d0: 64 20 63 68 61 72 20 62 69 74 73 5b 38 5d 3b 0a  d char bits[8];.
10e0: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e  .unsigned int in
10f0: 64 65 78 2c 20 70 61 64 4c 65 6e 3b 0a 0a 09 2f  dex, padLen;.../
1100: 2a 20 53 61 76 65 20 6e 75 6d 62 65 72 20 6f 66  * Save number of
1110: 20 62 69 74 73 20 2a 2f 0a 09 45 6e 63 6f 64 65   bits */..Encode
1120: 28 62 69 74 73 2c 20 63 6f 6e 74 65 78 74 2d 3e  (bits, context->
1130: 63 6f 75 6e 74 2c 20 38 29 3b 0a 0a 09 2f 2a 20  count, 8);.../* 
1140: 50 61 64 20 6f 75 74 20 74 6f 20 35 36 20 6d 6f  Pad out to 56 mo
1150: 64 20 36 34 2e 20 2a 2f 0a 09 69 6e 64 65 78 20  d 64. */..index 
1160: 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  = (unsigned int)
1170: 28 28 63 6f 6e 74 65 78 74 2d 3e 63 6f 75 6e 74  ((context->count
1180: 5b 30 5d 20 3e 3e 20 33 29 20 26 20 30 78 33 66  [0] >> 3) & 0x3f
1190: 29 3b 0a 09 70 61 64 4c 65 6e 20 3d 20 28 69 6e  );..padLen = (in
11a0: 64 65 78 20 3c 20 35 36 29 20 3f 20 28 35 36 20  dex < 56) ? (56 
11b0: 2d 20 69 6e 64 65 78 29 20 3a 20 28 31 32 30 20  - index) : (120 
11c0: 2d 20 69 6e 64 65 78 29 3b 0a 09 4d 44 35 55 70  - index);..MD5Up
11d0: 64 61 74 65 28 63 6f 6e 74 65 78 74 2c 20 50 41  date(context, PA
11e0: 44 44 49 4e 47 2c 20 70 61 64 4c 65 6e 29 3b 0a  DDING, padLen);.
11f0: 0a 09 2f 2a 20 41 70 70 65 6e 64 20 6c 65 6e 67  ../* Append leng
1200: 74 68 20 28 62 65 66 6f 72 65 20 70 61 64 64 69  th (before paddi
1210: 6e 67 29 20 2a 2f 0a 09 4d 44 35 55 70 64 61 74  ng) */..MD5Updat
1220: 65 28 63 6f 6e 74 65 78 74 2c 20 62 69 74 73 2c  e(context, bits,
1230: 20 38 29 3b 0a 0a 09 2f 2a 20 53 74 6f 72 65 20   8);.../* Store 
1240: 73 74 61 74 65 20 69 6e 20 64 69 67 65 73 74 20  state in digest 
1250: 2a 2f 0a 09 45 6e 63 6f 64 65 28 64 69 67 65 73  */..Encode(diges
1260: 74 2c 20 63 6f 6e 74 65 78 74 2d 3e 73 74 61 74  t, context->stat
1270: 65 2c 20 31 36 29 3b 0a 0a 09 2f 2a 20 5a 65 72  e, 16);.../* Zer
1280: 6f 69 7a 65 20 73 65 6e 73 69 74 69 76 65 20 69  oize sensitive i
1290: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 09  nformation. */..
12a0: 6d 65 6d 73 65 74 28 63 6f 6e 74 65 78 74 2c 20  memset(context, 
12b0: 30 2c 20 73 69 7a 65 6f 66 28 2a 63 6f 6e 74 65  0, sizeof(*conte
12c0: 78 74 29 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a  xt));...return;.
12d0: 7d 0a 0a 2f 2a 20 4d 44 35 20 62 61 73 69 63 20  }../* MD5 basic 
12e0: 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2e 20  transformation. 
12f0: 54 72 61 6e 73 66 6f 72 6d 73 20 73 74 61 74 65  Transforms state
1300: 20 62 61 73 65 64 20 6f 6e 20 62 6c 6f 63 6b 2e   based on block.
1310: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
1320: 4d 44 35 54 72 61 6e 73 66 6f 72 6d 20 28 75 69  MD5Transform (ui
1330: 6e 74 33 32 5f 74 20 73 74 61 74 65 5b 34 5d 2c  nt32_t state[4],
1340: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62   unsigned char b
1350: 6c 6f 63 6b 5b 36 34 5d 29 20 7b 0a 09 75 69 6e  lock[64]) {..uin
1360: 74 33 32 5f 74 20 61 20 3d 20 73 74 61 74 65 5b  t32_t a = state[
1370: 30 5d 2c 20 62 20 3d 20 73 74 61 74 65 5b 31 5d  0], b = state[1]
1380: 2c 20 63 20 3d 20 73 74 61 74 65 5b 32 5d 2c 20  , c = state[2], 
1390: 64 20 3d 20 73 74 61 74 65 5b 33 5d 2c 20 78 5b  d = state[3], x[
13a0: 31 36 5d 3b 0a 0a 09 44 65 63 6f 64 65 28 78 2c  16];...Decode(x,
13b0: 20 62 6c 6f 63 6b 2c 20 36 34 29 3b 0a 0a 09 2f   block, 64);.../
13c0: 2a 20 52 6f 75 6e 64 20 31 20 2a 2f 0a 09 46 46  * Round 1 */..FF
13d0: 28 61 2c 20 62 2c 20 63 2c 20 64 2c 20 78 5b 20  (a, b, c, d, x[ 
13e0: 30 5d 2c 20 53 31 31 2c 20 30 78 64 37 36 61 61  0], S11, 0xd76aa
13f0: 34 37 38 29 3b 20 2f 2a 20 31 20 2a 2f 0a 09 46  478); /* 1 */..F
1400: 46 28 64 2c 20 61 2c 20 62 2c 20 63 2c 20 78 5b  F(d, a, b, c, x[
1410: 20 31 5d 2c 20 53 31 32 2c 20 30 78 65 38 63 37   1], S12, 0xe8c7
1420: 62 37 35 36 29 3b 20 2f 2a 20 32 20 2a 2f 0a 09  b756); /* 2 */..
1430: 46 46 28 63 2c 20 64 2c 20 61 2c 20 62 2c 20 78  FF(c, d, a, b, x
1440: 5b 20 32 5d 2c 20 53 31 33 2c 20 30 78 32 34 32  [ 2], S13, 0x242
1450: 30 37 30 64 62 29 3b 20 2f 2a 20 33 20 2a 2f 0a  070db); /* 3 */.
1460: 09 46 46 28 62 2c 20 63 2c 20 64 2c 20 61 2c 20  .FF(b, c, d, a, 
1470: 78 5b 20 33 5d 2c 20 53 31 34 2c 20 30 78 63 31  x[ 3], S14, 0xc1
1480: 62 64 63 65 65 65 29 3b 20 2f 2a 20 34 20 2a 2f  bdceee); /* 4 */
1490: 0a 09 46 46 28 61 2c 20 62 2c 20 63 2c 20 64 2c  ..FF(a, b, c, d,
14a0: 20 78 5b 20 34 5d 2c 20 53 31 31 2c 20 30 78 66   x[ 4], S11, 0xf
14b0: 35 37 63 30 66 61 66 29 3b 20 2f 2a 20 35 20 2a  57c0faf); /* 5 *
14c0: 2f 0a 09 46 46 28 64 2c 20 61 2c 20 62 2c 20 63  /..FF(d, a, b, c
14d0: 2c 20 78 5b 20 35 5d 2c 20 53 31 32 2c 20 30 78  , x[ 5], S12, 0x
14e0: 34 37 38 37 63 36 32 61 29 3b 20 2f 2a 20 36 20  4787c62a); /* 6 
14f0: 2a 2f 0a 09 46 46 28 63 2c 20 64 2c 20 61 2c 20  */..FF(c, d, a, 
1500: 62 2c 20 78 5b 20 36 5d 2c 20 53 31 33 2c 20 30  b, x[ 6], S13, 0
1510: 78 61 38 33 30 34 36 31 33 29 3b 20 2f 2a 20 37  xa8304613); /* 7
1520: 20 2a 2f 0a 09 46 46 28 62 2c 20 63 2c 20 64 2c   */..FF(b, c, d,
1530: 20 61 2c 20 78 5b 20 37 5d 2c 20 53 31 34 2c 20   a, x[ 7], S14, 
1540: 30 78 66 64 34 36 39 35 30 31 29 3b 20 2f 2a 20  0xfd469501); /* 
1550: 38 20 2a 2f 0a 09 46 46 28 61 2c 20 62 2c 20 63  8 */..FF(a, b, c
1560: 2c 20 64 2c 20 78 5b 20 38 5d 2c 20 53 31 31 2c  , d, x[ 8], S11,
1570: 20 30 78 36 39 38 30 39 38 64 38 29 3b 20 2f 2a   0x698098d8); /*
1580: 20 39 20 2a 2f 0a 09 46 46 28 64 2c 20 61 2c 20   9 */..FF(d, a, 
1590: 62 2c 20 63 2c 20 78 5b 20 39 5d 2c 20 53 31 32  b, c, x[ 9], S12
15a0: 2c 20 30 78 38 62 34 34 66 37 61 66 29 3b 20 2f  , 0x8b44f7af); /
15b0: 2a 20 31 30 20 2a 2f 0a 09 46 46 28 63 2c 20 64  * 10 */..FF(c, d
15c0: 2c 20 61 2c 20 62 2c 20 78 5b 31 30 5d 2c 20 53  , a, b, x[10], S
15d0: 31 33 2c 20 30 78 66 66 66 66 35 62 62 31 29 3b  13, 0xffff5bb1);
15e0: 20 2f 2a 20 31 31 20 2a 2f 0a 09 46 46 28 62 2c   /* 11 */..FF(b,
15f0: 20 63 2c 20 64 2c 20 61 2c 20 78 5b 31 31 5d 2c   c, d, a, x[11],
1600: 20 53 31 34 2c 20 30 78 38 39 35 63 64 37 62 65   S14, 0x895cd7be
1610: 29 3b 20 2f 2a 20 31 32 20 2a 2f 0a 09 46 46 28  ); /* 12 */..FF(
1620: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 78 5b 31 32  a, b, c, d, x[12
1630: 5d 2c 20 53 31 31 2c 20 30 78 36 62 39 30 31 31  ], S11, 0x6b9011
1640: 32 32 29 3b 20 2f 2a 20 31 33 20 2a 2f 0a 09 46  22); /* 13 */..F
1650: 46 28 64 2c 20 61 2c 20 62 2c 20 63 2c 20 78 5b  F(d, a, b, c, x[
1660: 31 33 5d 2c 20 53 31 32 2c 20 30 78 66 64 39 38  13], S12, 0xfd98
1670: 37 31 39 33 29 3b 20 2f 2a 20 31 34 20 2a 2f 0a  7193); /* 14 */.
1680: 09 46 46 28 63 2c 20 64 2c 20 61 2c 20 62 2c 20  .FF(c, d, a, b, 
1690: 78 5b 31 34 5d 2c 20 53 31 33 2c 20 30 78 61 36  x[14], S13, 0xa6
16a0: 37 39 34 33 38 65 29 3b 20 2f 2a 20 31 35 20 2a  79438e); /* 15 *
16b0: 2f 0a 09 46 46 28 62 2c 20 63 2c 20 64 2c 20 61  /..FF(b, c, d, a
16c0: 2c 20 78 5b 31 35 5d 2c 20 53 31 34 2c 20 30 78  , x[15], S14, 0x
16d0: 34 39 62 34 30 38 32 31 29 3b 20 2f 2a 20 31 36  49b40821); /* 16
16e0: 20 2a 2f 0a 0a 09 2f 2a 20 52 6f 75 6e 64 20 32   */.../* Round 2
16f0: 20 2a 2f 0a 09 47 47 28 61 2c 20 62 2c 20 63 2c   */..GG(a, b, c,
1700: 20 64 2c 20 78 5b 20 31 5d 2c 20 53 32 31 2c 20   d, x[ 1], S21, 
1710: 30 78 66 36 31 65 32 35 36 32 29 3b 20 2f 2a 20  0xf61e2562); /* 
1720: 31 37 20 2a 2f 0a 09 47 47 28 64 2c 20 61 2c 20  17 */..GG(d, a, 
1730: 62 2c 20 63 2c 20 78 5b 20 36 5d 2c 20 53 32 32  b, c, x[ 6], S22
1740: 2c 20 30 78 63 30 34 30 62 33 34 30 29 3b 20 2f  , 0xc040b340); /
1750: 2a 20 31 38 20 2a 2f 0a 09 47 47 28 63 2c 20 64  * 18 */..GG(c, d
1760: 2c 20 61 2c 20 62 2c 20 78 5b 31 31 5d 2c 20 53  , a, b, x[11], S
1770: 32 33 2c 20 30 78 32 36 35 65 35 61 35 31 29 3b  23, 0x265e5a51);
1780: 20 2f 2a 20 31 39 20 2a 2f 0a 09 47 47 28 62 2c   /* 19 */..GG(b,
1790: 20 63 2c 20 64 2c 20 61 2c 20 78 5b 20 30 5d 2c   c, d, a, x[ 0],
17a0: 20 53 32 34 2c 20 30 78 65 39 62 36 63 37 61 61   S24, 0xe9b6c7aa
17b0: 29 3b 20 2f 2a 20 32 30 20 2a 2f 0a 09 47 47 28  ); /* 20 */..GG(
17c0: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 78 5b 20 35  a, b, c, d, x[ 5
17d0: 5d 2c 20 53 32 31 2c 20 30 78 64 36 32 66 31 30  ], S21, 0xd62f10
17e0: 35 64 29 3b 20 2f 2a 20 32 31 20 2a 2f 0a 09 47  5d); /* 21 */..G
17f0: 47 28 64 2c 20 61 2c 20 62 2c 20 63 2c 20 78 5b  G(d, a, b, c, x[
1800: 31 30 5d 2c 20 53 32 32 2c 20 20 30 78 32 34 34  10], S22,  0x244
1810: 31 34 35 33 29 3b 20 2f 2a 20 32 32 20 2a 2f 0a  1453); /* 22 */.
1820: 09 47 47 28 63 2c 20 64 2c 20 61 2c 20 62 2c 20  .GG(c, d, a, b, 
1830: 78 5b 31 35 5d 2c 20 53 32 33 2c 20 30 78 64 38  x[15], S23, 0xd8
1840: 61 31 65 36 38 31 29 3b 20 2f 2a 20 32 33 20 2a  a1e681); /* 23 *
1850: 2f 0a 09 47 47 28 62 2c 20 63 2c 20 64 2c 20 61  /..GG(b, c, d, a
1860: 2c 20 78 5b 20 34 5d 2c 20 53 32 34 2c 20 30 78  , x[ 4], S24, 0x
1870: 65 37 64 33 66 62 63 38 29 3b 20 2f 2a 20 32 34  e7d3fbc8); /* 24
1880: 20 2a 2f 0a 09 47 47 28 61 2c 20 62 2c 20 63 2c   */..GG(a, b, c,
1890: 20 64 2c 20 78 5b 20 39 5d 2c 20 53 32 31 2c 20   d, x[ 9], S21, 
18a0: 30 78 32 31 65 31 63 64 65 36 29 3b 20 2f 2a 20  0x21e1cde6); /* 
18b0: 32 35 20 2a 2f 0a 09 47 47 28 64 2c 20 61 2c 20  25 */..GG(d, a, 
18c0: 62 2c 20 63 2c 20 78 5b 31 34 5d 2c 20 53 32 32  b, c, x[14], S22
18d0: 2c 20 30 78 63 33 33 37 30 37 64 36 29 3b 20 2f  , 0xc33707d6); /
18e0: 2a 20 32 36 20 2a 2f 0a 09 47 47 28 63 2c 20 64  * 26 */..GG(c, d
18f0: 2c 20 61 2c 20 62 2c 20 78 5b 20 33 5d 2c 20 53  , a, b, x[ 3], S
1900: 32 33 2c 20 30 78 66 34 64 35 30 64 38 37 29 3b  23, 0xf4d50d87);
1910: 20 2f 2a 20 32 37 20 2a 2f 0a 09 47 47 28 62 2c   /* 27 */..GG(b,
1920: 20 63 2c 20 64 2c 20 61 2c 20 78 5b 20 38 5d 2c   c, d, a, x[ 8],
1930: 20 53 32 34 2c 20 30 78 34 35 35 61 31 34 65 64   S24, 0x455a14ed
1940: 29 3b 20 2f 2a 20 32 38 20 2a 2f 0a 09 47 47 28  ); /* 28 */..GG(
1950: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 78 5b 31 33  a, b, c, d, x[13
1960: 5d 2c 20 53 32 31 2c 20 30 78 61 39 65 33 65 39  ], S21, 0xa9e3e9
1970: 30 35 29 3b 20 2f 2a 20 32 39 20 2a 2f 0a 09 47  05); /* 29 */..G
1980: 47 28 64 2c 20 61 2c 20 62 2c 20 63 2c 20 78 5b  G(d, a, b, c, x[
1990: 20 32 5d 2c 20 53 32 32 2c 20 30 78 66 63 65 66   2], S22, 0xfcef
19a0: 61 33 66 38 29 3b 20 2f 2a 20 33 30 20 2a 2f 0a  a3f8); /* 30 */.
19b0: 09 47 47 28 63 2c 20 64 2c 20 61 2c 20 62 2c 20  .GG(c, d, a, b, 
19c0: 78 5b 20 37 5d 2c 20 53 32 33 2c 20 30 78 36 37  x[ 7], S23, 0x67
19d0: 36 66 30 32 64 39 29 3b 20 2f 2a 20 33 31 20 2a  6f02d9); /* 31 *
19e0: 2f 0a 09 47 47 28 62 2c 20 63 2c 20 64 2c 20 61  /..GG(b, c, d, a
19f0: 2c 20 78 5b 31 32 5d 2c 20 53 32 34 2c 20 30 78  , x[12], S24, 0x
1a00: 38 64 32 61 34 63 38 61 29 3b 20 2f 2a 20 33 32  8d2a4c8a); /* 32
1a10: 20 2a 2f 0a 0a 09 2f 2a 20 52 6f 75 6e 64 20 33   */.../* Round 3
1a20: 20 2a 2f 0a 09 48 48 28 61 2c 20 62 2c 20 63 2c   */..HH(a, b, c,
1a30: 20 64 2c 20 78 5b 20 35 5d 2c 20 53 33 31 2c 20   d, x[ 5], S31, 
1a40: 30 78 66 66 66 61 33 39 34 32 29 3b 20 2f 2a 20  0xfffa3942); /* 
1a50: 33 33 20 2a 2f 0a 09 48 48 28 64 2c 20 61 2c 20  33 */..HH(d, a, 
1a60: 62 2c 20 63 2c 20 78 5b 20 38 5d 2c 20 53 33 32  b, c, x[ 8], S32
1a70: 2c 20 30 78 38 37 37 31 66 36 38 31 29 3b 20 2f  , 0x8771f681); /
1a80: 2a 20 33 34 20 2a 2f 0a 09 48 48 28 63 2c 20 64  * 34 */..HH(c, d
1a90: 2c 20 61 2c 20 62 2c 20 78 5b 31 31 5d 2c 20 53  , a, b, x[11], S
1aa0: 33 33 2c 20 30 78 36 64 39 64 36 31 32 32 29 3b  33, 0x6d9d6122);
1ab0: 20 2f 2a 20 33 35 20 2a 2f 0a 09 48 48 28 62 2c   /* 35 */..HH(b,
1ac0: 20 63 2c 20 64 2c 20 61 2c 20 78 5b 31 34 5d 2c   c, d, a, x[14],
1ad0: 20 53 33 34 2c 20 30 78 66 64 65 35 33 38 30 63   S34, 0xfde5380c
1ae0: 29 3b 20 2f 2a 20 33 36 20 2a 2f 0a 09 48 48 28  ); /* 36 */..HH(
1af0: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 78 5b 20 31  a, b, c, d, x[ 1
1b00: 5d 2c 20 53 33 31 2c 20 30 78 61 34 62 65 65 61  ], S31, 0xa4beea
1b10: 34 34 29 3b 20 2f 2a 20 33 37 20 2a 2f 0a 09 48  44); /* 37 */..H
1b20: 48 28 64 2c 20 61 2c 20 62 2c 20 63 2c 20 78 5b  H(d, a, b, c, x[
1b30: 20 34 5d 2c 20 53 33 32 2c 20 30 78 34 62 64 65   4], S32, 0x4bde
1b40: 63 66 61 39 29 3b 20 2f 2a 20 33 38 20 2a 2f 0a  cfa9); /* 38 */.
1b50: 09 48 48 28 63 2c 20 64 2c 20 61 2c 20 62 2c 20  .HH(c, d, a, b, 
1b60: 78 5b 20 37 5d 2c 20 53 33 33 2c 20 30 78 66 36  x[ 7], S33, 0xf6
1b70: 62 62 34 62 36 30 29 3b 20 2f 2a 20 33 39 20 2a  bb4b60); /* 39 *
1b80: 2f 0a 09 48 48 28 62 2c 20 63 2c 20 64 2c 20 61  /..HH(b, c, d, a
1b90: 2c 20 78 5b 31 30 5d 2c 20 53 33 34 2c 20 30 78  , x[10], S34, 0x
1ba0: 62 65 62 66 62 63 37 30 29 3b 20 2f 2a 20 34 30  bebfbc70); /* 40
1bb0: 20 2a 2f 0a 09 48 48 28 61 2c 20 62 2c 20 63 2c   */..HH(a, b, c,
1bc0: 20 64 2c 20 78 5b 31 33 5d 2c 20 53 33 31 2c 20   d, x[13], S31, 
1bd0: 30 78 32 38 39 62 37 65 63 36 29 3b 20 2f 2a 20  0x289b7ec6); /* 
1be0: 34 31 20 2a 2f 0a 09 48 48 28 64 2c 20 61 2c 20  41 */..HH(d, a, 
1bf0: 62 2c 20 63 2c 20 78 5b 20 30 5d 2c 20 53 33 32  b, c, x[ 0], S32
1c00: 2c 20 30 78 65 61 61 31 32 37 66 61 29 3b 20 2f  , 0xeaa127fa); /
1c10: 2a 20 34 32 20 2a 2f 0a 09 48 48 28 63 2c 20 64  * 42 */..HH(c, d
1c20: 2c 20 61 2c 20 62 2c 20 78 5b 20 33 5d 2c 20 53  , a, b, x[ 3], S
1c30: 33 33 2c 20 30 78 64 34 65 66 33 30 38 35 29 3b  33, 0xd4ef3085);
1c40: 20 2f 2a 20 34 33 20 2a 2f 0a 09 48 48 28 62 2c   /* 43 */..HH(b,
1c50: 20 63 2c 20 64 2c 20 61 2c 20 78 5b 20 36 5d 2c   c, d, a, x[ 6],
1c60: 20 53 33 34 2c 20 20 30 78 34 38 38 31 64 30 35   S34,  0x4881d05
1c70: 29 3b 20 2f 2a 20 34 34 20 2a 2f 0a 09 48 48 28  ); /* 44 */..HH(
1c80: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 78 5b 20 39  a, b, c, d, x[ 9
1c90: 5d 2c 20 53 33 31 2c 20 30 78 64 39 64 34 64 30  ], S31, 0xd9d4d0
1ca0: 33 39 29 3b 20 2f 2a 20 34 35 20 2a 2f 0a 09 48  39); /* 45 */..H
1cb0: 48 28 64 2c 20 61 2c 20 62 2c 20 63 2c 20 78 5b  H(d, a, b, c, x[
1cc0: 31 32 5d 2c 20 53 33 32 2c 20 30 78 65 36 64 62  12], S32, 0xe6db
1cd0: 39 39 65 35 29 3b 20 2f 2a 20 34 36 20 2a 2f 0a  99e5); /* 46 */.
1ce0: 09 48 48 28 63 2c 20 64 2c 20 61 2c 20 62 2c 20  .HH(c, d, a, b, 
1cf0: 78 5b 31 35 5d 2c 20 53 33 33 2c 20 30 78 31 66  x[15], S33, 0x1f
1d00: 61 32 37 63 66 38 29 3b 20 2f 2a 20 34 37 20 2a  a27cf8); /* 47 *
1d10: 2f 0a 09 48 48 28 62 2c 20 63 2c 20 64 2c 20 61  /..HH(b, c, d, a
1d20: 2c 20 78 5b 20 32 5d 2c 20 53 33 34 2c 20 30 78  , x[ 2], S34, 0x
1d30: 63 34 61 63 35 36 36 35 29 3b 20 2f 2a 20 34 38  c4ac5665); /* 48
1d40: 20 2a 2f 0a 0a 09 2f 2a 20 52 6f 75 6e 64 20 34   */.../* Round 4
1d50: 20 2a 2f 0a 09 49 49 28 61 2c 20 62 2c 20 63 2c   */..II(a, b, c,
1d60: 20 64 2c 20 78 5b 20 30 5d 2c 20 53 34 31 2c 20   d, x[ 0], S41, 
1d70: 30 78 66 34 32 39 32 32 34 34 29 3b 20 2f 2a 20  0xf4292244); /* 
1d80: 34 39 20 2a 2f 0a 09 49 49 28 64 2c 20 61 2c 20  49 */..II(d, a, 
1d90: 62 2c 20 63 2c 20 78 5b 20 37 5d 2c 20 53 34 32  b, c, x[ 7], S42
1da0: 2c 20 30 78 34 33 32 61 66 66 39 37 29 3b 20 2f  , 0x432aff97); /
1db0: 2a 20 35 30 20 2a 2f 0a 09 49 49 28 63 2c 20 64  * 50 */..II(c, d
1dc0: 2c 20 61 2c 20 62 2c 20 78 5b 31 34 5d 2c 20 53  , a, b, x[14], S
1dd0: 34 33 2c 20 30 78 61 62 39 34 32 33 61 37 29 3b  43, 0xab9423a7);
1de0: 20 2f 2a 20 35 31 20 2a 2f 0a 09 49 49 28 62 2c   /* 51 */..II(b,
1df0: 20 63 2c 20 64 2c 20 61 2c 20 78 5b 20 35 5d 2c   c, d, a, x[ 5],
1e00: 20 53 34 34 2c 20 30 78 66 63 39 33 61 30 33 39   S44, 0xfc93a039
1e10: 29 3b 20 2f 2a 20 35 32 20 2a 2f 0a 09 49 49 28  ); /* 52 */..II(
1e20: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 78 5b 31 32  a, b, c, d, x[12
1e30: 5d 2c 20 53 34 31 2c 20 30 78 36 35 35 62 35 39  ], S41, 0x655b59
1e40: 63 33 29 3b 20 2f 2a 20 35 33 20 2a 2f 0a 09 49  c3); /* 53 */..I
1e50: 49 28 64 2c 20 61 2c 20 62 2c 20 63 2c 20 78 5b  I(d, a, b, c, x[
1e60: 20 33 5d 2c 20 53 34 32 2c 20 30 78 38 66 30 63   3], S42, 0x8f0c
1e70: 63 63 39 32 29 3b 20 2f 2a 20 35 34 20 2a 2f 0a  cc92); /* 54 */.
1e80: 09 49 49 28 63 2c 20 64 2c 20 61 2c 20 62 2c 20  .II(c, d, a, b, 
1e90: 78 5b 31 30 5d 2c 20 53 34 33 2c 20 30 78 66 66  x[10], S43, 0xff
1ea0: 65 66 66 34 37 64 29 3b 20 2f 2a 20 35 35 20 2a  eff47d); /* 55 *
1eb0: 2f 0a 09 49 49 28 62 2c 20 63 2c 20 64 2c 20 61  /..II(b, c, d, a
1ec0: 2c 20 78 5b 20 31 5d 2c 20 53 34 34 2c 20 30 78  , x[ 1], S44, 0x
1ed0: 38 35 38 34 35 64 64 31 29 3b 20 2f 2a 20 35 36  85845dd1); /* 56
1ee0: 20 2a 2f 0a 09 49 49 28 61 2c 20 62 2c 20 63 2c   */..II(a, b, c,
1ef0: 20 64 2c 20 78 5b 20 38 5d 2c 20 53 34 31 2c 20   d, x[ 8], S41, 
1f00: 30 78 36 66 61 38 37 65 34 66 29 3b 20 2f 2a 20  0x6fa87e4f); /* 
1f10: 35 37 20 2a 2f 0a 09 49 49 28 64 2c 20 61 2c 20  57 */..II(d, a, 
1f20: 62 2c 20 63 2c 20 78 5b 31 35 5d 2c 20 53 34 32  b, c, x[15], S42
1f30: 2c 20 30 78 66 65 32 63 65 36 65 30 29 3b 20 2f  , 0xfe2ce6e0); /
1f40: 2a 20 35 38 20 2a 2f 0a 09 49 49 28 63 2c 20 64  * 58 */..II(c, d
1f50: 2c 20 61 2c 20 62 2c 20 78 5b 20 36 5d 2c 20 53  , a, b, x[ 6], S
1f60: 34 33 2c 20 30 78 61 33 30 31 34 33 31 34 29 3b  43, 0xa3014314);
1f70: 20 2f 2a 20 35 39 20 2a 2f 0a 09 49 49 28 62 2c   /* 59 */..II(b,
1f80: 20 63 2c 20 64 2c 20 61 2c 20 78 5b 31 33 5d 2c   c, d, a, x[13],
1f90: 20 53 34 34 2c 20 30 78 34 65 30 38 31 31 61 31   S44, 0x4e0811a1
1fa0: 29 3b 20 2f 2a 20 36 30 20 2a 2f 0a 09 49 49 28  ); /* 60 */..II(
1fb0: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 78 5b 20 34  a, b, c, d, x[ 4
1fc0: 5d 2c 20 53 34 31 2c 20 30 78 66 37 35 33 37 65  ], S41, 0xf7537e
1fd0: 38 32 29 3b 20 2f 2a 20 36 31 20 2a 2f 0a 09 49  82); /* 61 */..I
1fe0: 49 28 64 2c 20 61 2c 20 62 2c 20 63 2c 20 78 5b  I(d, a, b, c, x[
1ff0: 31 31 5d 2c 20 53 34 32 2c 20 30 78 62 64 33 61  11], S42, 0xbd3a
2000: 66 32 33 35 29 3b 20 2f 2a 20 36 32 20 2a 2f 0a  f235); /* 62 */.
2010: 09 49 49 28 63 2c 20 64 2c 20 61 2c 20 62 2c 20  .II(c, d, a, b, 
2020: 78 5b 20 32 5d 2c 20 53 34 33 2c 20 30 78 32 61  x[ 2], S43, 0x2a
2030: 64 37 64 32 62 62 29 3b 20 2f 2a 20 36 33 20 2a  d7d2bb); /* 63 *
2040: 2f 0a 09 49 49 28 62 2c 20 63 2c 20 64 2c 20 61  /..II(b, c, d, a
2050: 2c 20 78 5b 20 39 5d 2c 20 53 34 34 2c 20 30 78  , x[ 9], S44, 0x
2060: 65 62 38 36 64 33 39 31 29 3b 20 2f 2a 20 36 34  eb86d391); /* 64
2070: 20 2a 2f 0a 0a 09 73 74 61 74 65 5b 30 5d 20 2b   */...state[0] +
2080: 3d 20 61 3b 0a 09 73 74 61 74 65 5b 31 5d 20 2b  = a;..state[1] +
2090: 3d 20 62 3b 0a 09 73 74 61 74 65 5b 32 5d 20 2b  = b;..state[2] +
20a0: 3d 20 63 3b 0a 09 73 74 61 74 65 5b 33 5d 20 2b  = c;..state[3] +
20b0: 3d 20 64 3b 0a 0a 09 2f 2a 20 5a 65 72 6f 69 7a  = d;.../* Zeroiz
20c0: 65 20 73 65 6e 73 69 74 69 76 65 20 69 6e 66 6f  e sensitive info
20d0: 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 09 6d 65 6d  rmation. */..mem
20e0: 73 65 74 20 28 78 2c 20 30 2c 20 73 69 7a 65 6f  set (x, 0, sizeo
20f0: 66 20 28 78 29 29 3b 0a 0a 09 72 65 74 75 72 6e  f (x));...return
2100: 3b 0a 7d 0a 0a 2f 2a 20 45 6e 63 6f 64 65 73 20  ;.}../* Encodes 
2110: 69 6e 70 75 74 20 28 75 69 6e 74 33 32 5f 74 29  input (uint32_t)
2120: 20 69 6e 74 6f 20 6f 75 74 70 75 74 20 28 75 6e   into output (un
2130: 73 69 67 6e 65 64 20 63 68 61 72 29 2e 20 41 73  signed char). As
2140: 73 75 6d 65 73 20 6c 65 6e 20 69 73 0a 20 20 61  sumes len is.  a
2150: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 2e 20   multiple of 4. 
2160: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 45  */.static void E
2170: 6e 63 6f 64 65 28 75 6e 73 69 67 6e 65 64 20 63  ncode(unsigned c
2180: 68 61 72 20 2a 6f 75 74 70 75 74 2c 20 75 69 6e  har *output, uin
2190: 74 33 32 5f 74 20 2a 69 6e 70 75 74 2c 20 75 6e  t32_t *input, un
21a0: 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 29 20  signed int len) 
21b0: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  {..unsigned int 
21c0: 69 2c 20 6a 3b 0a 0a 09 66 6f 72 20 28 69 20 3d  i, j;...for (i =
21d0: 20 30 2c 20 6a 20 3d 20 30 3b 20 6a 20 3c 20 6c   0, j = 0; j < l
21e0: 65 6e 3b 20 69 2b 2b 2c 20 6a 20 2b 3d 20 34 29  en; i++, j += 4)
21f0: 20 7b 0a 09 09 6f 75 74 70 75 74 5b 6a 5d 20 3d   {...output[j] =
2200: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
2210: 28 69 6e 70 75 74 5b 69 5d 20 26 20 30 78 66 66  (input[i] & 0xff
2220: 29 3b 0a 09 09 6f 75 74 70 75 74 5b 6a 2b 31 5d  );...output[j+1]
2230: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
2240: 72 29 28 28 69 6e 70 75 74 5b 69 5d 20 3e 3e 20  r)((input[i] >> 
2250: 38 29 20 26 20 30 78 66 66 29 3b 0a 09 09 6f 75  8) & 0xff);...ou
2260: 74 70 75 74 5b 6a 2b 32 5d 20 3d 20 28 75 6e 73  tput[j+2] = (uns
2270: 69 67 6e 65 64 20 63 68 61 72 29 28 28 69 6e 70  igned char)((inp
2280: 75 74 5b 69 5d 20 3e 3e 20 31 36 29 20 26 20 30  ut[i] >> 16) & 0
2290: 78 66 66 29 3b 0a 09 09 6f 75 74 70 75 74 5b 6a  xff);...output[j
22a0: 2b 33 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  +3] = (unsigned 
22b0: 63 68 61 72 29 28 28 69 6e 70 75 74 5b 69 5d 20  char)((input[i] 
22c0: 3e 3e 20 32 34 29 20 26 20 30 78 66 66 29 3b 0a  >> 24) & 0xff);.
22d0: 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .}...return;.}..
22e0: 2f 2a 20 44 65 63 6f 64 65 73 20 69 6e 70 75 74  /* Decodes input
22f0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
2300: 20 69 6e 74 6f 20 6f 75 74 70 75 74 20 28 75 69   into output (ui
2310: 6e 74 33 32 5f 74 29 2e 20 41 73 73 75 6d 65 73  nt32_t). Assumes
2320: 20 6c 65 6e 20 69 73 0a 20 20 61 20 6d 75 6c 74   len is.  a mult
2330: 69 70 6c 65 20 6f 66 20 34 2e 0a 20 2a 2f 0a 73  iple of 4.. */.s
2340: 74 61 74 69 63 20 76 6f 69 64 20 44 65 63 6f 64  tatic void Decod
2350: 65 20 28 75 69 6e 74 33 32 5f 74 20 2a 6f 75 74  e (uint32_t *out
2360: 70 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  put, unsigned ch
2370: 61 72 20 2a 69 6e 70 75 74 2c 20 75 6e 73 69 67  ar *input, unsig
2380: 6e 65 64 20 69 6e 74 20 6c 65 6e 29 20 7b 0a 09  ned int len) {..
2390: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20  unsigned int i, 
23a0: 6a 3b 0a 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c  j;...for (i = 0,
23b0: 20 6a 20 3d 20 30 3b 20 6a 20 3c 20 6c 65 6e 3b   j = 0; j < len;
23c0: 20 69 2b 2b 2c 20 6a 20 2b 3d 20 34 29 20 7b 0a   i++, j += 4) {.
23d0: 09 09 20 6f 75 74 70 75 74 5b 69 5d 20 3d 20 28  .. output[i] = (
23e0: 28 75 69 6e 74 33 32 5f 74 29 69 6e 70 75 74 5b  (uint32_t)input[
23f0: 6a 5d 29 20 7c 20 28 28 28 75 69 6e 74 33 32 5f  j]) | (((uint32_
2400: 74 29 69 6e 70 75 74 5b 6a 2b 31 5d 29 20 3c 3c  t)input[j+1]) <<
2410: 20 38 29 20 7c 20 5c 0a 09 09 09 28 28 28 75 69   8) | \....(((ui
2420: 6e 74 33 32 5f 74 29 69 6e 70 75 74 5b 6a 2b 32  nt32_t)input[j+2
2430: 5d 29 20 3c 3c 20 31 36 29 20 7c 20 28 28 28 75  ]) << 16) | (((u
2440: 69 6e 74 33 32 5f 74 29 69 6e 70 75 74 5b 6a 2b  int32_t)input[j+
2450: 33 5d 29 20 3c 3c 20 32 34 29 3b 0a 09 7d 0a 0a  3]) << 24);..}..
2460: 09 72 65 74 75 72 6e 3b 0a 7d 0a                 .return;.}.