/ Hex Artifact Content
Login

Artifact b2b1a34fce66ceca97f4e0dabc20be8be7933c92:


0000: 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  /*.** SQLite use
0010: 73 20 74 68 69 73 20 63 6f 64 65 20 66 6f 72 20  s this code for 
0020: 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 49  testing only.  I
0030: 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20  t is not a part 
0040: 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  of.** the SQLite
0050: 20 6c 69 62 72 61 72 79 2e 20 20 54 68 69 73 20   library.  This 
0060: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0070: 74 77 6f 20 6e 65 77 20 54 43 4c 20 63 6f 6d 6d  two new TCL comm
0080: 61 6e 64 73 0a 2a 2a 20 22 6d 64 35 22 20 61 6e  ands.** "md5" an
0090: 64 20 22 6d 64 35 66 69 6c 65 22 20 74 68 61 74  d "md5file" that
00a0: 20 63 6f 6d 70 75 74 65 20 6d 64 35 20 63 68 65   compute md5 che
00b0: 63 6b 73 75 6d 73 20 6f 6e 20 61 72 62 69 74 72  cksums on arbitr
00c0: 61 72 79 20 74 65 78 74 0a 2a 2a 20 61 6e 64 20  ary text.** and 
00d0: 6f 6e 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65  on complete file
00e0: 73 2e 20 20 54 68 65 73 65 20 63 6f 6d 6d 61 6e  s.  These comman
00f0: 64 73 20 61 72 65 20 75 73 65 64 20 62 79 20 74  ds are used by t
0100: 68 65 20 22 74 65 73 74 66 69 78 74 75 72 65 22  he "testfixture"
0110: 0a 2a 2a 20 70 72 6f 67 72 61 6d 20 74 6f 20 68  .** program to h
0120: 65 6c 70 20 76 65 72 69 66 79 20 74 68 65 20 63  elp verify the c
0130: 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
0140: 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c   of the SQLite l
0150: 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  ibrary..**.** Th
0160: 65 20 6f 72 69 67 69 6e 61 6c 20 75 73 65 20 6f  e original use o
0170: 66 20 74 68 65 73 65 20 54 43 4c 20 63 6f 6d 6d  f these TCL comm
0180: 61 6e 64 73 20 77 61 73 20 74 6f 20 74 65 73 74  ands was to test
0190: 20 74 68 65 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a   the ROLLBACK.**
01a0: 20 66 65 61 74 75 72 65 20 6f 66 20 53 51 4c 69   feature of SQLi
01b0: 74 65 2e 20 20 46 69 72 73 74 20 63 6f 6d 70 75  te.  First compu
01c0: 74 65 20 74 68 65 20 4d 44 35 2d 63 68 65 63 6b  te the MD5-check
01d0: 73 75 6d 20 6f 66 20 74 68 65 20 64 61 74 61 62  sum of the datab
01e0: 61 73 65 2e 0a 2a 2a 20 54 68 65 6e 20 6d 61 6b  ase..** Then mak
01f0: 65 20 73 6f 6d 65 20 63 68 61 6e 67 65 73 20 62  e some changes b
0200: 75 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ut rollback the 
0210: 63 68 61 6e 67 65 73 20 72 61 74 68 65 72 20 74  changes rather t
0220: 68 61 6e 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68  han commit.** th
0230: 65 6d 2e 20 20 43 6f 6d 70 75 74 65 20 61 20 73  em.  Compute a s
0240: 65 63 6f 6e 64 20 4d 44 35 2d 63 68 65 63 6b 73  econd MD5-checks
0250: 75 6d 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  um of the file a
0260: 6e 64 20 76 65 72 69 66 79 20 74 68 61 74 20 74  nd verify that t
0270: 68 65 0a 2a 2a 20 74 77 6f 20 63 68 65 63 6b 73  he.** two checks
0280: 75 6d 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ums are the same
0290: 2e 20 20 53 75 63 68 20 69 73 20 74 68 65 20 6f  .  Such is the o
02a0: 72 69 67 69 6e 61 6c 20 75 73 65 20 6f 66 20 74  riginal use of t
02b0: 68 69 73 20 63 6f 64 65 2e 0a 2a 2a 20 4e 65 77  his code..** New
02c0: 20 75 73 65 73 20 6d 61 79 20 68 61 76 65 20 62   uses may have b
02d0: 65 65 6e 20 61 64 64 65 64 20 73 69 6e 63 65 20  een added since 
02e0: 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73  this comment was
02f0: 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 2f 2a 0a   written..*/./*.
0300: 20 2a 20 54 68 69 73 20 63 6f 64 65 20 69 6d 70   * This code imp
0310: 6c 65 6d 65 6e 74 73 20 74 68 65 20 4d 44 35 20  lements the MD5 
0320: 6d 65 73 73 61 67 65 2d 64 69 67 65 73 74 20 61  message-digest a
0330: 6c 67 6f 72 69 74 68 6d 2e 0a 20 2a 20 54 68 65  lgorithm.. * The
0340: 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 64 75   algorithm is du
0350: 65 20 74 6f 20 52 6f 6e 20 52 69 76 65 73 74 2e  e to Ron Rivest.
0360: 20 20 54 68 69 73 20 63 6f 64 65 20 77 61 73 0a    This code was.
0370: 20 2a 20 77 72 69 74 74 65 6e 20 62 79 20 43 6f   * written by Co
0380: 6c 69 6e 20 50 6c 75 6d 62 20 69 6e 20 31 39 39  lin Plumb in 199
0390: 33 2c 20 6e 6f 20 63 6f 70 79 72 69 67 68 74 20  3, no copyright 
03a0: 69 73 20 63 6c 61 69 6d 65 64 2e 0a 20 2a 20 54  is claimed.. * T
03b0: 68 69 73 20 63 6f 64 65 20 69 73 20 69 6e 20 74  his code is in t
03c0: 68 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e  he public domain
03d0: 3b 20 64 6f 20 77 69 74 68 20 69 74 20 77 68 61  ; do with it wha
03e0: 74 20 79 6f 75 20 77 69 73 68 2e 0a 20 2a 0a 20  t you wish.. *. 
03f0: 2a 20 45 71 75 69 76 61 6c 65 6e 74 20 63 6f 64  * Equivalent cod
0400: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66  e is available f
0410: 72 6f 6d 20 52 53 41 20 44 61 74 61 20 53 65 63  rom RSA Data Sec
0420: 75 72 69 74 79 2c 20 49 6e 63 2e 0a 20 2a 20 54  urity, Inc.. * T
0430: 68 69 73 20 63 6f 64 65 20 68 61 73 20 62 65 65  his code has bee
0440: 6e 20 74 65 73 74 65 64 20 61 67 61 69 6e 73 74  n tested against
0450: 20 74 68 61 74 2c 20 61 6e 64 20 69 73 20 65 71   that, and is eq
0460: 75 69 76 61 6c 65 6e 74 2c 0a 20 2a 20 65 78 63  uivalent,. * exc
0470: 65 70 74 20 74 68 61 74 20 79 6f 75 20 64 6f 6e  ept that you don
0480: 27 74 20 6e 65 65 64 20 74 6f 20 69 6e 63 6c 75  't need to inclu
0490: 64 65 20 74 77 6f 20 70 61 67 65 73 20 6f 66 20  de two pages of 
04a0: 6c 65 67 61 6c 65 73 65 0a 20 2a 20 77 69 74 68  legalese. * with
04b0: 20 65 76 65 72 79 20 63 6f 70 79 2e 0a 20 2a 0a   every copy.. *.
04c0: 20 2a 20 54 6f 20 63 6f 6d 70 75 74 65 20 74 68   * To compute th
04d0: 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  e message digest
04e0: 20 6f 66 20 61 20 63 68 75 6e 6b 20 6f 66 20 62   of a chunk of b
04f0: 79 74 65 73 2c 20 64 65 63 6c 61 72 65 20 61 6e  ytes, declare an
0500: 0a 20 2a 20 4d 44 35 43 6f 6e 74 65 78 74 20 73  . * MD5Context s
0510: 74 72 75 63 74 75 72 65 2c 20 70 61 73 73 20 69  tructure, pass i
0520: 74 20 74 6f 20 4d 44 35 49 6e 69 74 2c 20 63 61  t to MD5Init, ca
0530: 6c 6c 20 4d 44 35 55 70 64 61 74 65 20 61 73 0a  ll MD5Update as.
0540: 20 2a 20 6e 65 65 64 65 64 20 6f 6e 20 62 75 66   * needed on buf
0550: 66 65 72 73 20 66 75 6c 6c 20 6f 66 20 62 79 74  fers full of byt
0560: 65 73 2c 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  es, and then cal
0570: 6c 20 4d 44 35 46 69 6e 61 6c 2c 20 77 68 69 63  l MD5Final, whic
0580: 68 0a 20 2a 20 77 69 6c 6c 20 66 69 6c 6c 20 61  h. * will fill a
0590: 20 73 75 70 70 6c 69 65 64 20 31 36 2d 62 79 74   supplied 16-byt
05a0: 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65  e array with the
05b0: 20 64 69 67 65 73 74 2e 0a 20 2a 2f 0a 23 69 6e   digest.. */.#in
05c0: 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69  clude <tcl.h>.#i
05d0: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
05e0: 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  >.#include "sqli
05f0: 74 65 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 49 66 20  te.h"../*. * If 
0600: 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 61 20 6d 61  compiled on a ma
0610: 63 68 69 6e 65 20 74 68 61 74 20 64 6f 65 73 6e  chine that doesn
0620: 27 74 20 68 61 76 65 20 61 20 33 32 2d 62 69 74  't have a 32-bit
0630: 20 69 6e 74 65 67 65 72 2c 0a 20 2a 20 79 6f 75   integer,. * you
0640: 20 6a 75 73 74 20 73 65 74 20 22 75 69 6e 74 33   just set "uint3
0650: 32 22 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  2" to the approp
0660: 72 69 61 74 65 20 64 61 74 61 74 79 70 65 20 66  riate datatype f
0670: 6f 72 20 61 6e 0a 20 2a 20 75 6e 73 69 67 6e 65  or an. * unsigne
0680: 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
0690: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
06a0: 20 2a 0a 20 2a 20 20 20 20 20 20 20 63 63 20 2d   *. *       cc -
06b0: 44 75 69 6e 74 33 32 3d 27 75 6e 73 69 67 6e 65  Duint32='unsigne
06c0: 64 20 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a 20 2a  d long' md5.c. *
06d0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 75 69 6e  . */.#ifndef uin
06e0: 74 33 32 0a 23 20 20 64 65 66 69 6e 65 20 75 69  t32.#  define ui
06f0: 6e 74 33 32 20 75 6e 73 69 67 6e 65 64 20 69 6e  nt32 unsigned in
0700: 74 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74  t.#endif..struct
0710: 20 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 69 6e   Context {.  uin
0720: 74 33 32 20 62 75 66 5b 34 5d 3b 0a 20 20 75 69  t32 buf[4];.  ui
0730: 6e 74 33 32 20 62 69 74 73 5b 32 5d 3b 0a 20 20  nt32 bits[2];.  
0740: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
0750: 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64 65 66  [64];.};.typedef
0760: 20 63 68 61 72 20 4d 44 35 43 6f 6e 74 65 78 74   char MD5Context
0770: 5b 38 38 5d 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74  [88];../*. * Not
0780: 65 3a 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  e: this code is 
0790: 68 61 72 6d 6c 65 73 73 20 6f 6e 20 6c 69 74 74  harmless on litt
07a0: 6c 65 2d 65 6e 64 69 61 6e 20 6d 61 63 68 69 6e  le-endian machin
07b0: 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  es.. */.static v
07c0: 6f 69 64 20 62 79 74 65 52 65 76 65 72 73 65 20  oid byteReverse 
07d0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
07e0: 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  buf, unsigned lo
07f0: 6e 67 73 29 7b 0a 09 75 69 6e 74 33 32 20 74 3b  ngs){..uint32 t;
0800: 0a 09 64 6f 20 7b 0a 09 09 74 20 3d 20 28 75 69  ..do {...t = (ui
0810: 6e 74 33 32 29 28 28 75 6e 73 69 67 6e 65 64 29  nt32)((unsigned)
0820: 62 75 66 5b 33 5d 3c 3c 38 20 7c 20 62 75 66 5b  buf[3]<<8 | buf[
0830: 32 5d 29 20 3c 3c 20 31 36 20 7c 0a 09 09 20 20  2]) << 16 |...  
0840: 20 20 20 20 20 20 20 20 20 20 28 28 75 6e 73 69            ((unsi
0850: 67 6e 65 64 29 62 75 66 5b 31 5d 3c 3c 38 20 7c  gned)buf[1]<<8 |
0860: 20 62 75 66 5b 30 5d 29 3b 0a 09 09 2a 28 75 69   buf[0]);...*(ui
0870: 6e 74 33 32 20 2a 29 62 75 66 20 3d 20 74 3b 0a  nt32 *)buf = t;.
0880: 09 09 62 75 66 20 2b 3d 20 34 3b 0a 09 7d 20 77  ..buf += 4;..} w
0890: 68 69 6c 65 20 28 2d 2d 6c 6f 6e 67 73 29 3b 0a  hile (--longs);.
08a0: 7d 0a 2f 2a 20 54 68 65 20 66 6f 75 72 20 63 6f  }./* The four co
08b0: 72 65 20 66 75 6e 63 74 69 6f 6e 73 20 2d 20 46  re functions - F
08c0: 31 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73  1 is optimized s
08d0: 6f 6d 65 77 68 61 74 20 2a 2f 0a 0a 2f 2a 20 23  omewhat */../* #
08e0: 64 65 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20  define F1(x, y, 
08f0: 7a 29 20 28 78 20 26 20 79 20 7c 20 7e 78 20 26  z) (x & y | ~x &
0900: 20 7a 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46   z) */.#define F
0910: 31 28 78 2c 20 79 2c 20 7a 29 20 28 7a 20 5e 20  1(x, y, z) (z ^ 
0920: 28 78 20 26 20 28 79 20 5e 20 7a 29 29 29 0a 23  (x & (y ^ z))).#
0930: 64 65 66 69 6e 65 20 46 32 28 78 2c 20 79 2c 20  define F2(x, y, 
0940: 7a 29 20 46 31 28 7a 2c 20 78 2c 20 79 29 0a 23  z) F1(z, x, y).#
0950: 64 65 66 69 6e 65 20 46 33 28 78 2c 20 79 2c 20  define F3(x, y, 
0960: 7a 29 20 28 78 20 5e 20 79 20 5e 20 7a 29 0a 23  z) (x ^ y ^ z).#
0970: 64 65 66 69 6e 65 20 46 34 28 78 2c 20 79 2c 20  define F4(x, y, 
0980: 7a 29 20 28 79 20 5e 20 28 78 20 7c 20 7e 7a 29  z) (y ^ (x | ~z)
0990: 29 0a 0a 2f 2a 20 54 68 69 73 20 69 73 20 74 68  )../* This is th
09a0: 65 20 63 65 6e 74 72 61 6c 20 73 74 65 70 20 69  e central step i
09b0: 6e 20 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69  n the MD5 algori
09c0: 74 68 6d 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  thm. */.#define 
09d0: 4d 44 35 53 54 45 50 28 66 2c 20 77 2c 20 78 2c  MD5STEP(f, w, x,
09e0: 20 79 2c 20 7a 2c 20 64 61 74 61 2c 20 73 29 20   y, z, data, s) 
09f0: 5c 0a 09 28 20 77 20 2b 3d 20 66 28 78 2c 20 79  \..( w += f(x, y
0a00: 2c 20 7a 29 20 2b 20 64 61 74 61 2c 20 20 77 20  , z) + data,  w 
0a10: 3d 20 77 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d  = w<<s | w>>(32-
0a20: 73 29 2c 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f  s),  w += x )../
0a30: 2a 0a 20 2a 20 54 68 65 20 63 6f 72 65 20 6f 66  *. * The core of
0a40: 20 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74   the MD5 algorit
0a50: 68 6d 2c 20 74 68 69 73 20 61 6c 74 65 72 73 20  hm, this alters 
0a60: 61 6e 20 65 78 69 73 74 69 6e 67 20 4d 44 35 20  an existing MD5 
0a70: 68 61 73 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65  hash to. * refle
0a80: 63 74 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20  ct the addition 
0a90: 6f 66 20 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20  of 16 longwords 
0aa0: 6f 66 20 6e 65 77 20 64 61 74 61 2e 20 20 4d 44  of new data.  MD
0ab0: 35 55 70 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20  5Update blocks. 
0ac0: 2a 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 63  * the data and c
0ad0: 6f 6e 76 65 72 74 73 20 62 79 74 65 73 20 69 6e  onverts bytes in
0ae0: 74 6f 20 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72  to longwords for
0af0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20   this routine.. 
0b00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d  */.static void M
0b10: 44 35 54 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74  D5Transform(uint
0b20: 33 32 20 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74  32 buf[4], const
0b30: 20 75 69 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b   uint32 in[16]){
0b40: 0a 09 72 65 67 69 73 74 65 72 20 75 69 6e 74 33  ..register uint3
0b50: 32 20 61 2c 20 62 2c 20 63 2c 20 64 3b 0a 0a 09  2 a, b, c, d;...
0b60: 61 20 3d 20 62 75 66 5b 30 5d 3b 0a 09 62 20 3d  a = buf[0];..b =
0b70: 20 62 75 66 5b 31 5d 3b 0a 09 63 20 3d 20 62 75   buf[1];..c = bu
0b80: 66 5b 32 5d 3b 0a 09 64 20 3d 20 62 75 66 5b 33  f[2];..d = buf[3
0b90: 5d 3b 0a 0a 09 4d 44 35 53 54 45 50 28 46 31 2c  ];...MD5STEP(F1,
0ba0: 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
0bb0: 20 30 5d 2b 30 78 64 37 36 61 61 34 37 38 2c 20   0]+0xd76aa478, 
0bc0: 20 37 29 3b 0a 09 4d 44 35 53 54 45 50 28 46 31   7);..MD5STEP(F1
0bd0: 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
0be0: 5b 20 31 5d 2b 30 78 65 38 63 37 62 37 35 36 2c  [ 1]+0xe8c7b756,
0bf0: 20 31 32 29 3b 0a 09 4d 44 35 53 54 45 50 28 46   12);..MD5STEP(F
0c00: 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  1, c, d, a, b, i
0c10: 6e 5b 20 32 5d 2b 30 78 32 34 32 30 37 30 64 62  n[ 2]+0x242070db
0c20: 2c 20 31 37 29 3b 0a 09 4d 44 35 53 54 45 50 28  , 17);..MD5STEP(
0c30: 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F1, b, c, d, a, 
0c40: 69 6e 5b 20 33 5d 2b 30 78 63 31 62 64 63 65 65  in[ 3]+0xc1bdcee
0c50: 65 2c 20 32 32 29 3b 0a 09 4d 44 35 53 54 45 50  e, 22);..MD5STEP
0c60: 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F1, a, b, c, d,
0c70: 20 69 6e 5b 20 34 5d 2b 30 78 66 35 37 63 30 66   in[ 4]+0xf57c0f
0c80: 61 66 2c 20 20 37 29 3b 0a 09 4d 44 35 53 54 45  af,  7);..MD5STE
0c90: 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F1, d, a, b, c
0ca0: 2c 20 69 6e 5b 20 35 5d 2b 30 78 34 37 38 37 63  , in[ 5]+0x4787c
0cb0: 36 32 61 2c 20 31 32 29 3b 0a 09 4d 44 35 53 54  62a, 12);..MD5ST
0cc0: 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F1, c, d, a, 
0cd0: 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 38 33 30  b, in[ 6]+0xa830
0ce0: 34 36 31 33 2c 20 31 37 29 3b 0a 09 4d 44 35 53  4613, 17);..MD5S
0cf0: 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
0d00: 20 61 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 64 34   a, in[ 7]+0xfd4
0d10: 36 39 35 30 31 2c 20 32 32 29 3b 0a 09 4d 44 35  69501, 22);..MD5
0d20: 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
0d30: 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 39  , d, in[ 8]+0x69
0d40: 38 30 39 38 64 38 2c 20 20 37 29 3b 0a 09 4d 44  8098d8,  7);..MD
0d50: 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20  5STEP(F1, d, a, 
0d60: 62 2c 20 63 2c 20 69 6e 5b 20 39 5d 2b 30 78 38  b, c, in[ 9]+0x8
0d70: 62 34 34 66 37 61 66 2c 20 31 32 29 3b 0a 09 4d  b44f7af, 12);..M
0d80: 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c  D5STEP(F1, c, d,
0d90: 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78   a, b, in[10]+0x
0da0: 66 66 66 66 35 62 62 31 2c 20 31 37 29 3b 0a 09  ffff5bb1, 17);..
0db0: 4d 44 35 53 54 45 50 28 46 31 2c 20 62 2c 20 63  MD5STEP(F1, b, c
0dc0: 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 31 5d 2b 30  , d, a, in[11]+0
0dd0: 78 38 39 35 63 64 37 62 65 2c 20 32 32 29 3b 0a  x895cd7be, 22);.
0de0: 09 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20  .MD5STEP(F1, a, 
0df0: 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b  b, c, d, in[12]+
0e00: 30 78 36 62 39 30 31 31 32 32 2c 20 20 37 29 3b  0x6b901122,  7);
0e10: 0a 09 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c  ..MD5STEP(F1, d,
0e20: 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 33 5d   a, b, c, in[13]
0e30: 2b 30 78 66 64 39 38 37 31 39 33 2c 20 31 32 29  +0xfd987193, 12)
0e40: 3b 0a 09 4d 44 35 53 54 45 50 28 46 31 2c 20 63  ;..MD5STEP(F1, c
0e50: 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34  , d, a, b, in[14
0e60: 5d 2b 30 78 61 36 37 39 34 33 38 65 2c 20 31 37  ]+0xa679438e, 17
0e70: 29 3b 0a 09 4d 44 35 53 54 45 50 28 46 31 2c 20  );..MD5STEP(F1, 
0e80: 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
0e90: 35 5d 2b 30 78 34 39 62 34 30 38 32 31 2c 20 32  5]+0x49b40821, 2
0ea0: 32 29 3b 0a 0a 09 4d 44 35 53 54 45 50 28 46 32  2);...MD5STEP(F2
0eb0: 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
0ec0: 5b 20 31 5d 2b 30 78 66 36 31 65 32 35 36 32 2c  [ 1]+0xf61e2562,
0ed0: 20 20 35 29 3b 0a 09 4d 44 35 53 54 45 50 28 46    5);..MD5STEP(F
0ee0: 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
0ef0: 6e 5b 20 36 5d 2b 30 78 63 30 34 30 62 33 34 30  n[ 6]+0xc040b340
0f00: 2c 20 20 39 29 3b 0a 09 4d 44 35 53 54 45 50 28  ,  9);..MD5STEP(
0f10: 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F2, c, d, a, b, 
0f20: 69 6e 5b 31 31 5d 2b 30 78 32 36 35 65 35 61 35  in[11]+0x265e5a5
0f30: 31 2c 20 31 34 29 3b 0a 09 4d 44 35 53 54 45 50  1, 14);..MD5STEP
0f40: 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F2, b, c, d, a,
0f50: 20 69 6e 5b 20 30 5d 2b 30 78 65 39 62 36 63 37   in[ 0]+0xe9b6c7
0f60: 61 61 2c 20 32 30 29 3b 0a 09 4d 44 35 53 54 45  aa, 20);..MD5STE
0f70: 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F2, a, b, c, d
0f80: 2c 20 69 6e 5b 20 35 5d 2b 30 78 64 36 32 66 31  , in[ 5]+0xd62f1
0f90: 30 35 64 2c 20 20 35 29 3b 0a 09 4d 44 35 53 54  05d,  5);..MD5ST
0fa0: 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F2, d, a, b, 
0fb0: 63 2c 20 69 6e 5b 31 30 5d 2b 30 78 30 32 34 34  c, in[10]+0x0244
0fc0: 31 34 35 33 2c 20 20 39 29 3b 0a 09 4d 44 35 53  1453,  9);..MD5S
0fd0: 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F2, c, d, a,
0fe0: 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 64 38 61   b, in[15]+0xd8a
0ff0: 31 65 36 38 31 2c 20 31 34 29 3b 0a 09 4d 44 35  1e681, 14);..MD5
1000: 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
1010: 2c 20 61 2c 20 69 6e 5b 20 34 5d 2b 30 78 65 37  , a, in[ 4]+0xe7
1020: 64 33 66 62 63 38 2c 20 32 30 29 3b 0a 09 4d 44  d3fbc8, 20);..MD
1030: 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
1040: 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 32  c, d, in[ 9]+0x2
1050: 31 65 31 63 64 65 36 2c 20 20 35 29 3b 0a 09 4d  1e1cde6,  5);..M
1060: 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c  D5STEP(F2, d, a,
1070: 20 62 2c 20 63 2c 20 69 6e 5b 31 34 5d 2b 30 78   b, c, in[14]+0x
1080: 63 33 33 37 30 37 64 36 2c 20 20 39 29 3b 0a 09  c33707d6,  9);..
1090: 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64  MD5STEP(F2, c, d
10a0: 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30  , a, b, in[ 3]+0
10b0: 78 66 34 64 35 30 64 38 37 2c 20 31 34 29 3b 0a  xf4d50d87, 14);.
10c0: 09 4d 44 35 53 54 45 50 28 46 32 2c 20 62 2c 20  .MD5STEP(F2, b, 
10d0: 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 38 5d 2b  c, d, a, in[ 8]+
10e0: 30 78 34 35 35 61 31 34 65 64 2c 20 32 30 29 3b  0x455a14ed, 20);
10f0: 0a 09 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c  ..MD5STEP(F2, a,
1100: 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d   b, c, d, in[13]
1110: 2b 30 78 61 39 65 33 65 39 30 35 2c 20 20 35 29  +0xa9e3e905,  5)
1120: 3b 0a 09 4d 44 35 53 54 45 50 28 46 32 2c 20 64  ;..MD5STEP(F2, d
1130: 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 32  , a, b, c, in[ 2
1140: 5d 2b 30 78 66 63 65 66 61 33 66 38 2c 20 20 39  ]+0xfcefa3f8,  9
1150: 29 3b 0a 09 4d 44 35 53 54 45 50 28 46 32 2c 20  );..MD5STEP(F2, 
1160: 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
1170: 37 5d 2b 30 78 36 37 36 66 30 32 64 39 2c 20 31  7]+0x676f02d9, 1
1180: 34 29 3b 0a 09 4d 44 35 53 54 45 50 28 46 32 2c  4);..MD5STEP(F2,
1190: 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
11a0: 31 32 5d 2b 30 78 38 64 32 61 34 63 38 61 2c 20  12]+0x8d2a4c8a, 
11b0: 32 30 29 3b 0a 0a 09 4d 44 35 53 54 45 50 28 46  20);...MD5STEP(F
11c0: 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  3, a, b, c, d, i
11d0: 6e 5b 20 35 5d 2b 30 78 66 66 66 61 33 39 34 32  n[ 5]+0xfffa3942
11e0: 2c 20 20 34 29 3b 0a 09 4d 44 35 53 54 45 50 28  ,  4);..MD5STEP(
11f0: 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
1200: 69 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66 36 38  in[ 8]+0x8771f68
1210: 31 2c 20 31 31 29 3b 0a 09 4d 44 35 53 54 45 50  1, 11);..MD5STEP
1220: 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c  (F3, c, d, a, b,
1230: 20 69 6e 5b 31 31 5d 2b 30 78 36 64 39 64 36 31   in[11]+0x6d9d61
1240: 32 32 2c 20 31 36 29 3b 0a 09 4d 44 35 53 54 45  22, 16);..MD5STE
1250: 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F3, b, c, d, a
1260: 2c 20 69 6e 5b 31 34 5d 2b 30 78 66 64 65 35 33  , in[14]+0xfde53
1270: 38 30 63 2c 20 32 33 29 3b 0a 09 4d 44 35 53 54  80c, 23);..MD5ST
1280: 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F3, a, b, c, 
1290: 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 61 34 62 65  d, in[ 1]+0xa4be
12a0: 65 61 34 34 2c 20 20 34 29 3b 0a 09 4d 44 35 53  ea44,  4);..MD5S
12b0: 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F3, d, a, b,
12c0: 20 63 2c 20 69 6e 5b 20 34 5d 2b 30 78 34 62 64   c, in[ 4]+0x4bd
12d0: 65 63 66 61 39 2c 20 31 31 29 3b 0a 09 4d 44 35  ecfa9, 11);..MD5
12e0: 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61  STEP(F3, c, d, a
12f0: 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 36  , b, in[ 7]+0xf6
1300: 62 62 34 62 36 30 2c 20 31 36 29 3b 0a 09 4d 44  bb4b60, 16);..MD
1310: 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
1320: 64 2c 20 61 2c 20 69 6e 5b 31 30 5d 2b 30 78 62  d, a, in[10]+0xb
1330: 65 62 66 62 63 37 30 2c 20 32 33 29 3b 0a 09 4d  ebfbc70, 23);..M
1340: 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
1350: 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78   c, d, in[13]+0x
1360: 32 38 39 62 37 65 63 36 2c 20 20 34 29 3b 0a 09  289b7ec6,  4);..
1370: 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61  MD5STEP(F3, d, a
1380: 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 30 5d 2b 30  , b, c, in[ 0]+0
1390: 78 65 61 61 31 32 37 66 61 2c 20 31 31 29 3b 0a  xeaa127fa, 11);.
13a0: 09 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20  .MD5STEP(F3, c, 
13b0: 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b  d, a, b, in[ 3]+
13c0: 30 78 64 34 65 66 33 30 38 35 2c 20 31 36 29 3b  0xd4ef3085, 16);
13d0: 0a 09 4d 44 35 53 54 45 50 28 46 33 2c 20 62 2c  ..MD5STEP(F3, b,
13e0: 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 36 5d   c, d, a, in[ 6]
13f0: 2b 30 78 30 34 38 38 31 64 30 35 2c 20 32 33 29  +0x04881d05, 23)
1400: 3b 0a 09 4d 44 35 53 54 45 50 28 46 33 2c 20 61  ;..MD5STEP(F3, a
1410: 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39  , b, c, d, in[ 9
1420: 5d 2b 30 78 64 39 64 34 64 30 33 39 2c 20 20 34  ]+0xd9d4d039,  4
1430: 29 3b 0a 09 4d 44 35 53 54 45 50 28 46 33 2c 20  );..MD5STEP(F3, 
1440: 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31  d, a, b, c, in[1
1450: 32 5d 2b 30 78 65 36 64 62 39 39 65 35 2c 20 31  2]+0xe6db99e5, 1
1460: 31 29 3b 0a 09 4d 44 35 53 54 45 50 28 46 33 2c  1);..MD5STEP(F3,
1470: 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1480: 31 35 5d 2b 30 78 31 66 61 32 37 63 66 38 2c 20  15]+0x1fa27cf8, 
1490: 31 36 29 3b 0a 09 4d 44 35 53 54 45 50 28 46 33  16);..MD5STEP(F3
14a0: 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
14b0: 5b 20 32 5d 2b 30 78 63 34 61 63 35 36 36 35 2c  [ 2]+0xc4ac5665,
14c0: 20 32 33 29 3b 0a 0a 09 4d 44 35 53 54 45 50 28   23);...MD5STEP(
14d0: 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F4, a, b, c, d, 
14e0: 69 6e 5b 20 30 5d 2b 30 78 66 34 32 39 32 32 34  in[ 0]+0xf429224
14f0: 34 2c 20 20 36 29 3b 0a 09 4d 44 35 53 54 45 50  4,  6);..MD5STEP
1500: 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
1510: 20 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61 66 66   in[ 7]+0x432aff
1520: 39 37 2c 20 31 30 29 3b 0a 09 4d 44 35 53 54 45  97, 10);..MD5STE
1530: 50 28 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F4, c, d, a, b
1540: 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 62 39 34 32  , in[14]+0xab942
1550: 33 61 37 2c 20 31 35 29 3b 0a 09 4d 44 35 53 54  3a7, 15);..MD5ST
1560: 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F4, b, c, d, 
1570: 61 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 63 39 33  a, in[ 5]+0xfc93
1580: 61 30 33 39 2c 20 32 31 29 3b 0a 09 4d 44 35 53  a039, 21);..MD5S
1590: 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F4, a, b, c,
15a0: 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 35 35   d, in[12]+0x655
15b0: 62 35 39 63 33 2c 20 20 36 29 3b 0a 09 4d 44 35  b59c3,  6);..MD5
15c0: 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62  STEP(F4, d, a, b
15d0: 2c 20 63 2c 20 69 6e 5b 20 33 5d 2b 30 78 38 66  , c, in[ 3]+0x8f
15e0: 30 63 63 63 39 32 2c 20 31 30 29 3b 0a 09 4d 44  0ccc92, 10);..MD
15f0: 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20  5STEP(F4, c, d, 
1600: 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66  a, b, in[10]+0xf
1610: 66 65 66 66 34 37 64 2c 20 31 35 29 3b 0a 09 4d  feff47d, 15);..M
1620: 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
1630: 20 64 2c 20 61 2c 20 69 6e 5b 20 31 5d 2b 30 78   d, a, in[ 1]+0x
1640: 38 35 38 34 35 64 64 31 2c 20 32 31 29 3b 0a 09  85845dd1, 21);..
1650: 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
1660: 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30  , c, d, in[ 8]+0
1670: 78 36 66 61 38 37 65 34 66 2c 20 20 36 29 3b 0a  x6fa87e4f,  6);.
1680: 09 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20  .MD5STEP(F4, d, 
1690: 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 35 5d 2b  a, b, c, in[15]+
16a0: 30 78 66 65 32 63 65 36 65 30 2c 20 31 30 29 3b  0xfe2ce6e0, 10);
16b0: 0a 09 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c  ..MD5STEP(F4, c,
16c0: 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d   d, a, b, in[ 6]
16d0: 2b 30 78 61 33 30 31 34 33 31 34 2c 20 31 35 29  +0xa3014314, 15)
16e0: 3b 0a 09 4d 44 35 53 54 45 50 28 46 34 2c 20 62  ;..MD5STEP(F4, b
16f0: 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 33  , c, d, a, in[13
1700: 5d 2b 30 78 34 65 30 38 31 31 61 31 2c 20 32 31  ]+0x4e0811a1, 21
1710: 29 3b 0a 09 4d 44 35 53 54 45 50 28 46 34 2c 20  );..MD5STEP(F4, 
1720: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
1730: 34 5d 2b 30 78 66 37 35 33 37 65 38 32 2c 20 20  4]+0xf7537e82,  
1740: 36 29 3b 0a 09 4d 44 35 53 54 45 50 28 46 34 2c  6);..MD5STEP(F4,
1750: 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
1760: 31 31 5d 2b 30 78 62 64 33 61 66 32 33 35 2c 20  11]+0xbd3af235, 
1770: 31 30 29 3b 0a 09 4d 44 35 53 54 45 50 28 46 34  10);..MD5STEP(F4
1780: 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
1790: 5b 20 32 5d 2b 30 78 32 61 64 37 64 32 62 62 2c  [ 2]+0x2ad7d2bb,
17a0: 20 31 35 29 3b 0a 09 4d 44 35 53 54 45 50 28 46   15);..MD5STEP(F
17b0: 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
17c0: 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64 33 39 31  n[ 9]+0xeb86d391
17d0: 2c 20 32 31 29 3b 0a 0a 09 62 75 66 5b 30 5d 20  , 21);...buf[0] 
17e0: 2b 3d 20 61 3b 0a 09 62 75 66 5b 31 5d 20 2b 3d  += a;..buf[1] +=
17f0: 20 62 3b 0a 09 62 75 66 5b 32 5d 20 2b 3d 20 63   b;..buf[2] += c
1800: 3b 0a 09 62 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a  ;..buf[3] += d;.
1810: 7d 0a 0a 2f 2a 0a 20 2a 20 53 74 61 72 74 20 4d  }../*. * Start M
1820: 44 35 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e 2e  D5 accumulation.
1830: 20 20 53 65 74 20 62 69 74 20 63 6f 75 6e 74 20    Set bit count 
1840: 74 6f 20 30 20 61 6e 64 20 62 75 66 66 65 72 20  to 0 and buffer 
1850: 74 6f 20 6d 79 73 74 65 72 69 6f 75 73 0a 20 2a  to mysterious. *
1860: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1870: 63 6f 6e 73 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73  constants.. */.s
1880: 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 49 6e  tatic void MD5In
1890: 69 74 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70  it(MD5Context *p
18a0: 43 74 78 29 7b 0a 20 20 20 20 20 20 20 20 73 74  Ctx){.        st
18b0: 72 75 63 74 20 43 6f 6e 74 65 78 74 20 2a 63 74  ruct Context *ct
18c0: 78 20 3d 20 28 73 74 72 75 63 74 20 43 6f 6e 74  x = (struct Cont
18d0: 65 78 74 20 2a 29 70 43 74 78 3b 0a 09 63 74 78  ext *)pCtx;..ctx
18e0: 2d 3e 62 75 66 5b 30 5d 20 3d 20 30 78 36 37 34  ->buf[0] = 0x674
18f0: 35 32 33 30 31 3b 0a 09 63 74 78 2d 3e 62 75 66  52301;..ctx->buf
1900: 5b 31 5d 20 3d 20 30 78 65 66 63 64 61 62 38 39  [1] = 0xefcdab89
1910: 3b 0a 09 63 74 78 2d 3e 62 75 66 5b 32 5d 20 3d  ;..ctx->buf[2] =
1920: 20 30 78 39 38 62 61 64 63 66 65 3b 0a 09 63 74   0x98badcfe;..ct
1930: 78 2d 3e 62 75 66 5b 33 5d 20 3d 20 30 78 31 30  x->buf[3] = 0x10
1940: 33 32 35 34 37 36 3b 0a 09 63 74 78 2d 3e 62 69  325476;..ctx->bi
1950: 74 73 5b 30 5d 20 3d 20 30 3b 0a 09 63 74 78 2d  ts[0] = 0;..ctx-
1960: 3e 62 69 74 73 5b 31 5d 20 3d 20 30 3b 0a 7d 0a  >bits[1] = 0;.}.
1970: 0a 2f 2a 0a 20 2a 20 55 70 64 61 74 65 20 63 6f  ./*. * Update co
1980: 6e 74 65 78 74 20 74 6f 20 72 65 66 6c 65 63 74  ntext to reflect
1990: 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69   the concatenati
19a0: 6f 6e 20 6f 66 20 61 6e 6f 74 68 65 72 20 62 75  on of another bu
19b0: 66 66 65 72 20 66 75 6c 6c 0a 20 2a 20 6f 66 20  ffer full. * of 
19c0: 62 79 74 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69  bytes.. */.stati
19d0: 63 20 0a 76 6f 69 64 20 4d 44 35 55 70 64 61 74  c .void MD5Updat
19e0: 65 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 43  e(MD5Context *pC
19f0: 74 78 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tx, const unsign
1a00: 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e  ed char *buf, un
1a10: 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 29 7b  signed int len){
1a20: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
1a30: 43 6f 6e 74 65 78 74 20 2a 63 74 78 20 3d 20 28  Context *ctx = (
1a40: 73 74 72 75 63 74 20 43 6f 6e 74 65 78 74 20 2a  struct Context *
1a50: 29 70 43 74 78 3b 0a 09 75 69 6e 74 33 32 20 74  )pCtx;..uint32 t
1a60: 3b 0a 0a 09 2f 2a 20 55 70 64 61 74 65 20 62 69  ;.../* Update bi
1a70: 74 63 6f 75 6e 74 20 2a 2f 0a 0a 09 74 20 3d 20  tcount */...t = 
1a80: 63 74 78 2d 3e 62 69 74 73 5b 30 5d 3b 0a 09 69  ctx->bits[0];..i
1a90: 66 20 28 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d  f ((ctx->bits[0]
1aa0: 20 3d 20 74 20 2b 20 28 28 75 69 6e 74 33 32 29   = t + ((uint32)
1ab0: 6c 65 6e 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a  len << 3)) < t).
1ac0: 09 09 63 74 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b  ..ctx->bits[1]++
1ad0: 3b 09 2f 2a 20 43 61 72 72 79 20 66 72 6f 6d 20  ;./* Carry from 
1ae0: 6c 6f 77 20 74 6f 20 68 69 67 68 20 2a 2f 0a 09  low to high */..
1af0: 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20 2b 3d 20  ctx->bits[1] += 
1b00: 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a 09 74 20 3d  len >> 29;...t =
1b10: 20 28 74 20 3e 3e 20 33 29 20 26 20 30 78 33 66   (t >> 3) & 0x3f
1b20: 3b 09 2f 2a 20 42 79 74 65 73 20 61 6c 72 65 61  ;./* Bytes alrea
1b30: 64 79 20 69 6e 20 73 68 73 49 6e 66 6f 2d 3e 64  dy in shsInfo->d
1b40: 61 74 61 20 2a 2f 0a 0a 09 2f 2a 20 48 61 6e 64  ata */.../* Hand
1b50: 6c 65 20 61 6e 79 20 6c 65 61 64 69 6e 67 20 6f  le any leading o
1b60: 64 64 2d 73 69 7a 65 64 20 63 68 75 6e 6b 73 20  dd-sized chunks 
1b70: 2a 2f 0a 0a 09 69 66 20 28 20 74 20 29 20 7b 0a  */...if ( t ) {.
1b80: 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
1b90: 2a 70 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  *p = (unsigned c
1ba0: 68 61 72 20 2a 29 63 74 78 2d 3e 69 6e 20 2b 20  har *)ctx->in + 
1bb0: 74 3b 0a 0a 09 09 74 20 3d 20 36 34 2d 74 3b 0a  t;....t = 64-t;.
1bc0: 09 09 69 66 20 28 6c 65 6e 20 3c 20 74 29 20 7b  ..if (len < t) {
1bd0: 0a 09 09 09 6d 65 6d 63 70 79 28 70 2c 20 62 75  ....memcpy(p, bu
1be0: 66 2c 20 6c 65 6e 29 3b 0a 09 09 09 72 65 74 75  f, len);....retu
1bf0: 72 6e 3b 0a 09 09 7d 0a 09 09 6d 65 6d 63 70 79  rn;...}...memcpy
1c00: 28 70 2c 20 62 75 66 2c 20 74 29 3b 0a 09 09 62  (p, buf, t);...b
1c10: 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e  yteReverse(ctx->
1c20: 69 6e 2c 20 31 36 29 3b 0a 09 09 4d 44 35 54 72  in, 16);...MD5Tr
1c30: 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66  ansform(ctx->buf
1c40: 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d  , (uint32 *)ctx-
1c50: 3e 69 6e 29 3b 0a 09 09 62 75 66 20 2b 3d 20 74  >in);...buf += t
1c60: 3b 0a 09 09 6c 65 6e 20 2d 3d 20 74 3b 0a 09 7d  ;...len -= t;..}
1c70: 0a 0a 09 2f 2a 20 50 72 6f 63 65 73 73 20 64 61  .../* Process da
1c80: 74 61 20 69 6e 20 36 34 2d 62 79 74 65 20 63 68  ta in 64-byte ch
1c90: 75 6e 6b 73 20 2a 2f 0a 0a 09 77 68 69 6c 65 20  unks */...while 
1ca0: 28 6c 65 6e 20 3e 3d 20 36 34 29 20 7b 0a 09 09  (len >= 64) {...
1cb0: 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20  memcpy(ctx->in, 
1cc0: 62 75 66 2c 20 36 34 29 3b 0a 09 09 62 79 74 65  buf, 64);...byte
1cd0: 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c  Reverse(ctx->in,
1ce0: 20 31 36 29 3b 0a 09 09 4d 44 35 54 72 61 6e 73   16);...MD5Trans
1cf0: 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28  form(ctx->buf, (
1d00: 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e  uint32 *)ctx->in
1d10: 29 3b 0a 09 09 62 75 66 20 2b 3d 20 36 34 3b 0a  );...buf += 64;.
1d20: 09 09 6c 65 6e 20 2d 3d 20 36 34 3b 0a 09 7d 0a  ..len -= 64;..}.
1d30: 0a 09 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20  ../* Handle any 
1d40: 72 65 6d 61 69 6e 69 6e 67 20 62 79 74 65 73 20  remaining bytes 
1d50: 6f 66 20 64 61 74 61 2e 20 2a 2f 0a 0a 09 6d 65  of data. */...me
1d60: 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20 62 75  mcpy(ctx->in, bu
1d70: 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 20  f, len);.}../*. 
1d80: 2a 20 46 69 6e 61 6c 20 77 72 61 70 75 70 20 2d  * Final wrapup -
1d90: 20 70 61 64 20 74 6f 20 36 34 2d 62 79 74 65 20   pad to 64-byte 
1da0: 62 6f 75 6e 64 61 72 79 20 77 69 74 68 20 74 68  boundary with th
1db0: 65 20 62 69 74 20 70 61 74 74 65 72 6e 20 0a 20  e bit pattern . 
1dc0: 2a 20 31 20 30 2a 20 28 36 34 2d 62 69 74 20 63  * 1 0* (64-bit c
1dd0: 6f 75 6e 74 20 6f 66 20 62 69 74 73 20 70 72 6f  ount of bits pro
1de0: 63 65 73 73 65 64 2c 20 4d 53 42 2d 66 69 72 73  cessed, MSB-firs
1df0: 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t). */.static vo
1e00: 69 64 20 4d 44 35 46 69 6e 61 6c 28 75 6e 73 69  id MD5Final(unsi
1e10: 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74  gned char digest
1e20: 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74 65 78 74  [16], MD5Context
1e30: 20 2a 70 43 74 78 29 7b 0a 20 20 20 20 20 20 20   *pCtx){.       
1e40: 20 73 74 72 75 63 74 20 43 6f 6e 74 65 78 74 20   struct Context 
1e50: 2a 63 74 78 20 3d 20 28 73 74 72 75 63 74 20 43  *ctx = (struct C
1e60: 6f 6e 74 65 78 74 20 2a 29 70 43 74 78 3b 0a 09  ontext *)pCtx;..
1e70: 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e 74 3b 0a  unsigned count;.
1e80: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
1e90: 70 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 75 74 65 20  p;.../* Compute 
1ea0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1eb0: 6d 6f 64 20 36 34 20 2a 2f 0a 09 63 6f 75 6e 74  mod 64 */..count
1ec0: 20 3d 20 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d   = (ctx->bits[0]
1ed0: 20 3e 3e 20 33 29 20 26 20 30 78 33 46 3b 0a 0a   >> 3) & 0x3F;..
1ee0: 09 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73  ./* Set the firs
1ef0: 74 20 63 68 61 72 20 6f 66 20 70 61 64 64 69 6e  t char of paddin
1f00: 67 20 74 6f 20 30 78 38 30 2e 20 20 54 68 69 73  g to 0x80.  This
1f10: 20 69 73 20 73 61 66 65 20 73 69 6e 63 65 20 74   is safe since t
1f20: 68 65 72 65 20 69 73 0a 09 20 20 20 61 6c 77 61  here is..   alwa
1f30: 79 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ys at least one 
1f40: 62 79 74 65 20 66 72 65 65 20 2a 2f 0a 09 70 20  byte free */..p 
1f50: 3d 20 63 74 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e  = ctx->in + coun
1f60: 74 3b 0a 09 2a 70 2b 2b 20 3d 20 30 78 38 30 3b  t;..*p++ = 0x80;
1f70: 0a 0a 09 2f 2a 20 42 79 74 65 73 20 6f 66 20 70  .../* Bytes of p
1f80: 61 64 64 69 6e 67 20 6e 65 65 64 65 64 20 74 6f  adding needed to
1f90: 20 6d 61 6b 65 20 36 34 20 62 79 74 65 73 20 2a   make 64 bytes *
1fa0: 2f 0a 09 63 6f 75 6e 74 20 3d 20 36 34 20 2d 20  /..count = 64 - 
1fb0: 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 09 2f 2a 20  1 - count;.../* 
1fc0: 50 61 64 20 6f 75 74 20 74 6f 20 35 36 20 6d 6f  Pad out to 56 mo
1fd0: 64 20 36 34 20 2a 2f 0a 09 69 66 20 28 63 6f 75  d 64 */..if (cou
1fe0: 6e 74 20 3c 20 38 29 20 7b 0a 09 09 2f 2a 20 54  nt < 8) {.../* T
1ff0: 77 6f 20 6c 6f 74 73 20 6f 66 20 70 61 64 64 69  wo lots of paddi
2000: 6e 67 3a 20 20 50 61 64 20 74 68 65 20 66 69 72  ng:  Pad the fir
2010: 73 74 20 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62  st block to 64 b
2020: 79 74 65 73 20 2a 2f 0a 09 09 6d 65 6d 73 65 74  ytes */...memset
2030: 28 70 2c 20 30 2c 20 63 6f 75 6e 74 29 3b 0a 09  (p, 0, count);..
2040: 09 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78  .byteReverse(ctx
2050: 2d 3e 69 6e 2c 20 31 36 29 3b 0a 09 09 4d 44 35  ->in, 16);...MD5
2060: 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62  Transform(ctx->b
2070: 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74  uf, (uint32 *)ct
2080: 78 2d 3e 69 6e 29 3b 0a 0a 09 09 2f 2a 20 4e 6f  x->in);..../* No
2090: 77 20 66 69 6c 6c 20 74 68 65 20 6e 65 78 74 20  w fill the next 
20a0: 62 6c 6f 63 6b 20 77 69 74 68 20 35 36 20 62 79  block with 56 by
20b0: 74 65 73 20 2a 2f 0a 09 09 6d 65 6d 73 65 74 28  tes */...memset(
20c0: 63 74 78 2d 3e 69 6e 2c 20 30 2c 20 35 36 29 3b  ctx->in, 0, 56);
20d0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20  ..} else {.../* 
20e0: 50 61 64 20 62 6c 6f 63 6b 20 74 6f 20 35 36 20  Pad block to 56 
20f0: 62 79 74 65 73 20 2a 2f 0a 09 09 6d 65 6d 73 65  bytes */...memse
2100: 74 28 70 2c 20 30 2c 20 63 6f 75 6e 74 2d 38 29  t(p, 0, count-8)
2110: 3b 0a 09 7d 0a 09 62 79 74 65 52 65 76 65 72 73  ;..}..byteRevers
2120: 65 28 63 74 78 2d 3e 69 6e 2c 20 31 34 29 3b 0a  e(ctx->in, 14);.
2130: 0a 09 2f 2a 20 41 70 70 65 6e 64 20 6c 65 6e 67  ../* Append leng
2140: 74 68 20 69 6e 20 62 69 74 73 20 61 6e 64 20 74  th in bits and t
2150: 72 61 6e 73 66 6f 72 6d 20 2a 2f 0a 09 28 28 75  ransform */..((u
2160: 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29  int32 *)ctx->in)
2170: 5b 20 31 34 20 5d 20 3d 20 63 74 78 2d 3e 62 69  [ 14 ] = ctx->bi
2180: 74 73 5b 30 5d 3b 0a 09 28 28 75 69 6e 74 33 32  ts[0];..((uint32
2190: 20 2a 29 63 74 78 2d 3e 69 6e 29 5b 20 31 35 20   *)ctx->in)[ 15 
21a0: 5d 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d  ] = ctx->bits[1]
21b0: 3b 0a 0a 09 4d 44 35 54 72 61 6e 73 66 6f 72 6d  ;...MD5Transform
21c0: 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
21d0: 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 09  32 *)ctx->in);..
21e0: 62 79 74 65 52 65 76 65 72 73 65 28 28 75 6e 73  byteReverse((uns
21f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74 78  igned char *)ctx
2200: 2d 3e 62 75 66 2c 20 34 29 3b 0a 09 6d 65 6d 63  ->buf, 4);..memc
2210: 70 79 28 64 69 67 65 73 74 2c 20 63 74 78 2d 3e  py(digest, ctx->
2220: 62 75 66 2c 20 31 36 29 3b 0a 09 6d 65 6d 73 65  buf, 16);..memse
2230: 74 28 63 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66  t(ctx, 0, sizeof
2240: 28 63 74 78 29 29 3b 09 2f 2a 20 49 6e 20 63 61  (ctx));./* In ca
2250: 73 65 20 69 74 27 73 20 73 65 6e 73 69 74 69 76  se it's sensitiv
2260: 65 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  e */.}../*.** Co
2270: 6e 76 65 72 74 20 61 20 64 69 67 65 73 74 20 69  nvert a digest i
2280: 6e 74 6f 20 62 61 73 65 2d 31 36 2e 20 20 64 69  nto base-16.  di
2290: 67 65 73 74 20 73 68 6f 75 6c 64 20 62 65 20 64  gest should be d
22a0: 65 63 6c 61 72 65 64 20 61 73 0a 2a 2a 20 22 75  eclared as.** "u
22b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67  nsigned char dig
22c0: 65 73 74 5b 31 36 5d 22 20 69 6e 20 74 68 65 20  est[16]" in the 
22d0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
22e0: 2e 20 20 54 68 65 20 4d 44 35 0a 2a 2a 20 64 69  .  The MD5.** di
22f0: 67 65 73 74 20 69 73 20 73 74 6f 72 65 64 20 69  gest is stored i
2300: 6e 20 74 68 65 20 66 69 72 73 74 20 31 36 20 62  n the first 16 b
2310: 79 74 65 73 2e 20 20 7a 42 75 66 20 73 68 6f 75  ytes.  zBuf shou
2320: 6c 64 0a 2a 2a 20 62 65 20 22 63 68 61 72 20 7a  ld.** be "char z
2330: 42 75 66 5b 33 33 5d 22 2e 0a 2a 2f 0a 73 74 61  Buf[33]"..*/.sta
2340: 74 69 63 20 76 6f 69 64 20 44 69 67 65 73 74 54  tic void DigestT
2350: 6f 42 61 73 65 31 36 28 75 6e 73 69 67 6e 65 64  oBase16(unsigned
2360: 20 63 68 61 72 20 2a 64 69 67 65 73 74 2c 20 63   char *digest, c
2370: 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
2380: 61 74 69 63 20 63 68 61 72 20 63 6f 6e 73 74 20  atic char const 
2390: 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20 22 30 31 32  zEncode[] = "012
23a0: 33 34 35 36 37 38 39 61 62 63 64 65 66 22 3b 0a  3456789abcdef";.
23b0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 66    int i, j;..  f
23c0: 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b 20  or(j=i=0; i<16; 
23d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  i++){.    int a 
23e0: 3d 20 64 69 67 65 73 74 5b 69 5d 3b 0a 20 20 20  = digest[i];.   
23f0: 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e   zBuf[j++] = zEn
2400: 63 6f 64 65 5b 28 61 3e 3e 34 29 26 30 78 66 5d  code[(a>>4)&0xf]
2410: 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20  ;.    zBuf[j++] 
2420: 3d 20 7a 45 6e 63 6f 64 65 5b 61 20 26 20 30 78  = zEncode[a & 0x
2430: 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a  f];.  }.  zBuf[j
2440: 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
2450: 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 66 6f  A TCL command fo
2460: 72 20 6d 64 35 2e 20 20 54 68 65 20 61 72 67 75  r md5.  The argu
2470: 6d 65 6e 74 20 69 73 20 74 68 65 20 74 65 78 74  ment is the text
2480: 20 74 6f 20 62 65 20 68 61 73 68 65 64 2e 20 20   to be hashed.  
2490: 54 68 65 0a 2a 2a 20 52 65 73 75 6c 74 20 69 73  The.** Result is
24a0: 20 74 68 65 20 68 61 73 68 20 69 6e 20 62 61 73   the hash in bas
24b0: 65 36 34 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  e64.  .*/.static
24c0: 20 69 6e 74 20 6d 64 35 5f 63 6d 64 28 43 6c 69   int md5_cmd(Cli
24d0: 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c 5f  entData cd, Tcl_
24e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
24f0: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
2500: 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e  *argv){.  MD5Con
2510: 74 65 78 74 20 63 74 78 3b 0a 20 20 75 6e 73 69  text ctx;.  unsi
2520: 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74  gned char digest
2530: 5b 31 36 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67  [16];..  if( arg
2540: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
2550: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2560: 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67  erp,"wrong # arg
2570: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
2580: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
2590: 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c 20 30      " TEXT\"", 0
25a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
25b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d  L_ERROR;.  }.  M
25c0: 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20  D5Init(&ctx);.  
25d0: 4d 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20  MD5Update(&ctx, 
25e0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
25f0: 61 72 67 76 5b 31 5d 2c 20 28 75 6e 73 69 67 6e  argv[1], (unsign
2600: 65 64 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 31  ed)strlen(argv[1
2610: 5d 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28  ]));.  MD5Final(
2620: 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20  digest, &ctx);. 
2630: 20 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 28   DigestToBase16(
2640: 64 69 67 65 73 74 2c 20 69 6e 74 65 72 70 2d 3e  digest, interp->
2650: 72 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72  result);.  retur
2660: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2670: 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  ** A TCL command
2680: 20 74 6f 20 74 61 6b 65 20 74 68 65 20 6d 64 35   to take the md5
2690: 20 68 61 73 68 20 6f 66 20 61 20 66 69 6c 65 2e   hash of a file.
26a0: 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69    The argument i
26b0: 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66  s the.** name of
26c0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
26d0: 61 74 69 63 20 69 6e 74 20 6d 64 35 66 69 6c 65  atic int md5file
26e0: 5f 63 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  _cmd(ClientData 
26f0: 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 2a 69  cd, Tcl_Interp*i
2700: 6e 74 65 72 70 2c 20 69 6e 74 20 61 72 67 63 2c  nterp, int argc,
2710: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
2720: 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 4d 44 35   FILE *in;.  MD5
2730: 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 75  Context ctx;.  u
2740: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67  nsigned char dig
2750: 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20  est[16];.  char 
2760: 7a 42 75 66 5b 31 30 32 34 30 5d 3b 0a 0a 20 20  zBuf[10240];..  
2770: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
2780: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2790: 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e  ult(interp,"wron
27a0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
27b0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
27c0: 2c 20 0a 20 20 20 20 20 20 20 20 22 20 46 49 4c  , .        " FIL
27d0: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
27e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
27f0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66  OR;.  }.  in = f
2800: 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c 22 72 62  open(argv[1],"rb
2810: 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  ");.  if( in==0 
2820: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2830: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
2840: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 66  unable to open f
2850: 69 6c 65 20 5c 22 22 2c 20 61 72 67 76 5b 31 5d  ile \"", argv[1]
2860: 2c 20 0a 20 20 20 20 20 20 20 20 20 22 5c 22 20  , .         "\" 
2870: 66 6f 72 20 72 65 61 64 69 6e 67 22 2c 20 30 29  for reading", 0)
2880: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2890: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44  _ERROR;.  }.  MD
28a0: 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 66  5Init(&ctx);.  f
28b0: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
28c0: 6e 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64  n;.    n = fread
28d0: 28 7a 42 75 66 2c 20 31 2c 20 73 69 7a 65 6f 66  (zBuf, 1, sizeof
28e0: 28 7a 42 75 66 29 2c 20 69 6e 29 3b 0a 20 20 20  (zBuf), in);.   
28f0: 20 69 66 28 20 6e 3c 3d 30 20 29 20 62 72 65 61   if( n<=0 ) brea
2900: 6b 3b 0a 20 20 20 20 4d 44 35 55 70 64 61 74 65  k;.    MD5Update
2910: 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e 65 64  (&ctx, (unsigned
2920: 20 63 68 61 72 2a 29 7a 42 75 66 2c 20 28 75 6e   char*)zBuf, (un
2930: 73 69 67 6e 65 64 29 6e 29 3b 0a 20 20 7d 0a 20  signed)n);.  }. 
2940: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 4d   fclose(in);.  M
2950: 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 20  D5Final(digest, 
2960: 26 63 74 78 29 3b 0a 20 20 44 69 67 65 73 74 54  &ctx);.  DigestT
2970: 6f 42 61 73 65 31 36 28 64 69 67 65 73 74 2c 20  oBase16(digest, 
2980: 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74 29 3b  interp->result);
2990: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
29a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
29b0: 74 65 72 20 74 68 65 20 74 77 6f 20 54 43 4c 20  ter the two TCL 
29c0: 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65 20 77  commands above w
29d0: 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65  ith the TCL inte
29e0: 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  rpreter..*/.int 
29f0: 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  Md5_Init(Tcl_Int
2a00: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
2a10: 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e  Tcl_CreateComman
2a20: 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 22 2c  d(interp, "md5",
2a30: 20 6d 64 35 5f 63 6d 64 2c 20 30 2c 20 30 29 3b   md5_cmd, 0, 0);
2a40: 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d  .  Tcl_CreateCom
2a50: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64  mand(interp, "md
2a60: 35 66 69 6c 65 22 2c 20 6d 64 35 66 69 6c 65 5f  5file", md5file_
2a70: 63 6d 64 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  cmd, 0, 0);.  re
2a80: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2a90: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 74 65 73  /*.** During tes
2aa0: 74 69 6e 67 2c 20 74 68 65 20 73 70 65 63 69 61  ting, the specia
2ab0: 6c 20 6d 64 35 73 75 6d 28 29 20 61 67 67 72 65  l md5sum() aggre
2ac0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  gate function is
2ad0: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69   available..** i
2ae0: 6e 73 69 64 65 20 53 51 4c 69 74 65 2e 20 20 54  nside SQLite.  T
2af0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
2b00: 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20  tines implement 
2b10: 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  that function..*
2b20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64  /.static void md
2b30: 35 73 74 65 70 28 73 71 6c 69 74 65 5f 66 75 6e  5step(sqlite_fun
2b40: 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  c *context, int 
2b50: 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
2b60: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35 43   **argv){.  MD5C
2b70: 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 69 6e 74  ontext *p;.  int
2b80: 20 69 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 31   i;.  if( argc<1
2b90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d   ) return;.  p =
2ba0: 20 73 71 6c 69 74 65 5f 61 67 67 72 65 67 61 74   sqlite_aggregat
2bb0: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
2bc0: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
2bd0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
2be0: 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
2bf0: 65 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e  e_aggregate_coun
2c00: 74 28 63 6f 6e 74 65 78 74 29 3d 3d 31 20 29 7b  t(context)==1 ){
2c10: 0a 20 20 20 20 4d 44 35 49 6e 69 74 28 70 29 3b  .    MD5Init(p);
2c20: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
2c30: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
2c40: 20 20 69 66 28 20 61 72 67 76 5b 69 5d 20 29 7b    if( argv[i] ){
2c50: 0a 20 20 20 20 20 20 4d 44 35 55 70 64 61 74 65  .      MD5Update
2c60: 28 70 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  (p, (unsigned ch
2c70: 61 72 2a 29 61 72 67 76 5b 69 5d 2c 20 73 74 72  ar*)argv[i], str
2c80: 6c 65 6e 28 61 72 67 76 5b 69 5d 29 29 3b 0a 20  len(argv[i]));. 
2c90: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
2ca0: 63 20 76 6f 69 64 20 6d 64 35 66 69 6e 61 6c 69  c void md5finali
2cb0: 7a 65 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a  ze(sqlite_func *
2cc0: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 4d 44 35 43  context){.  MD5C
2cd0: 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 75 6e 73  ontext *p;.  uns
2ce0: 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73  igned char diges
2cf0: 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42  t[16];.  char zB
2d00: 75 66 5b 33 33 5d 3b 0a 20 20 70 20 3d 20 73 71  uf[33];.  p = sq
2d10: 6c 69 74 65 5f 61 67 67 72 65 67 61 74 65 5f 63  lite_aggregate_c
2d20: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
2d30: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 4d  sizeof(*p));.  M
2d40: 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 70  D5Final(digest,p
2d50: 29 3b 0a 20 20 44 69 67 65 73 74 54 6f 42 61 73  );.  DigestToBas
2d60: 65 31 36 28 64 69 67 65 73 74 2c 20 7a 42 75 66  e16(digest, zBuf
2d70: 29 3b 0a 20 20 73 71 6c 69 74 65 5f 73 65 74 5f  );.  sqlite_set_
2d80: 72 65 73 75 6c 74 5f 73 74 72 69 6e 67 28 63 6f  result_string(co
2d90: 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 73 74 72  ntext, zBuf, str
2da0: 6c 65 6e 28 7a 42 75 66 29 29 3b 0a 7d 0a 76 6f  len(zBuf));.}.vo
2db0: 69 64 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28  id Md5_Register(
2dc0: 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 73  sqlite *db){.  s
2dd0: 71 6c 69 74 65 5f 63 72 65 61 74 65 5f 61 67 67  qlite_create_agg
2de0: 72 65 67 61 74 65 28 64 62 2c 20 22 6d 64 35 73  regate(db, "md5s
2df0: 75 6d 22 2c 20 2d 31 2c 20 6d 64 35 73 74 65 70  um", -1, md5step
2e00: 2c 20 6d 64 35 66 69 6e 61 6c 69 7a 65 2c 20 30  , md5finalize, 0
2e10: 29 3b 0a 7d 0a                                   );.}.