/ Hex Artifact Content
Login

Artifact 7268e1e8c399d4a5e181b64ac20e1e6f3bc4dd9fc87abac02db145a3d951fa8c:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 2d 31 30 2d 31 33  /*.** 2017-10-13
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0180: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 6f  contains code to
0190: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 4d 44   implement an MD
01a0: 35 20 65 78 74 65 6e 73 69 6f 6e 20 74 6f 20 54  5 extension to T
01b0: 43 4c 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  CL..*/.#include 
01c0: 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63  "sqlite3.h".#inc
01d0: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
01e0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
01f0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .h>.#include "sq
0200: 6c 69 74 65 33 2e 68 22 0a 23 69 66 20 64 65 66  lite3.h".#if def
0210: 69 6e 65 64 28 49 4e 43 4c 55 44 45 5f 53 51 4c  ined(INCLUDE_SQL
0220: 49 54 45 5f 54 43 4c 5f 48 29 0a 23 20 69 6e 63  ITE_TCL_H).# inc
0230: 6c 75 64 65 20 22 73 71 6c 69 74 65 5f 74 63 6c  lude "sqlite_tcl
0240: 2e 68 22 0a 23 65 6c 73 65 0a 23 20 69 6e 63 6c  .h".#else.# incl
0250: 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 20 69 66  ude "tcl.h".# if
0260: 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 43 4c 41  ndef SQLITE_TCLA
0270: 50 49 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  PI.#  define SQL
0280: 49 54 45 5f 54 43 4c 41 50 49 0a 23 20 65 6e 64  ITE_TCLAPI.# end
0290: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  if.#endif../*. *
02a0: 20 54 68 69 73 20 63 6f 64 65 20 69 6d 70 6c 65   This code imple
02b0: 6d 65 6e 74 73 20 74 68 65 20 4d 44 35 20 6d 65  ments the MD5 me
02c0: 73 73 61 67 65 2d 64 69 67 65 73 74 20 61 6c 67  ssage-digest alg
02d0: 6f 72 69 74 68 6d 2e 0a 20 2a 20 54 68 65 20 61  orithm.. * The a
02e0: 6c 67 6f 72 69 74 68 6d 20 69 73 20 64 75 65 20  lgorithm is due 
02f0: 74 6f 20 52 6f 6e 20 52 69 76 65 73 74 2e 20 20  to Ron Rivest.  
0300: 54 68 69 73 20 63 6f 64 65 20 77 61 73 0a 20 2a  This code was. *
0310: 20 77 72 69 74 74 65 6e 20 62 79 20 43 6f 6c 69   written by Coli
0320: 6e 20 50 6c 75 6d 62 20 69 6e 20 31 39 39 33 2c  n Plumb in 1993,
0330: 20 6e 6f 20 63 6f 70 79 72 69 67 68 74 20 69 73   no copyright is
0340: 20 63 6c 61 69 6d 65 64 2e 0a 20 2a 20 54 68 69   claimed.. * Thi
0350: 73 20 63 6f 64 65 20 69 73 20 69 6e 20 74 68 65  s code is in the
0360: 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e 3b 20   public domain; 
0370: 64 6f 20 77 69 74 68 20 69 74 20 77 68 61 74 20  do with it what 
0380: 79 6f 75 20 77 69 73 68 2e 0a 20 2a 0a 20 2a 20  you wish.. *. * 
0390: 45 71 75 69 76 61 6c 65 6e 74 20 63 6f 64 65 20  Equivalent code 
03a0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  is available fro
03b0: 6d 20 52 53 41 20 44 61 74 61 20 53 65 63 75 72  m RSA Data Secur
03c0: 69 74 79 2c 20 49 6e 63 2e 0a 20 2a 20 54 68 69  ity, Inc.. * Thi
03d0: 73 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20  s code has been 
03e0: 74 65 73 74 65 64 20 61 67 61 69 6e 73 74 20 74  tested against t
03f0: 68 61 74 2c 20 61 6e 64 20 69 73 20 65 71 75 69  hat, and is equi
0400: 76 61 6c 65 6e 74 2c 0a 20 2a 20 65 78 63 65 70  valent,. * excep
0410: 74 20 74 68 61 74 20 79 6f 75 20 64 6f 6e 27 74  t that you don't
0420: 20 6e 65 65 64 20 74 6f 20 69 6e 63 6c 75 64 65   need to include
0430: 20 74 77 6f 20 70 61 67 65 73 20 6f 66 20 6c 65   two pages of le
0440: 67 61 6c 65 73 65 0a 20 2a 20 77 69 74 68 20 65  galese. * with e
0450: 76 65 72 79 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a  very copy.. *. *
0460: 20 54 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   To compute the 
0470: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f  message digest o
0480: 66 20 61 20 63 68 75 6e 6b 20 6f 66 20 62 79 74  f a chunk of byt
0490: 65 73 2c 20 64 65 63 6c 61 72 65 20 61 6e 0a 20  es, declare an. 
04a0: 2a 20 4d 44 35 43 6f 6e 74 65 78 74 20 73 74 72  * MD5Context str
04b0: 75 63 74 75 72 65 2c 20 70 61 73 73 20 69 74 20  ucture, pass it 
04c0: 74 6f 20 4d 44 35 49 6e 69 74 2c 20 63 61 6c 6c  to MD5Init, call
04d0: 20 4d 44 35 55 70 64 61 74 65 20 61 73 0a 20 2a   MD5Update as. *
04e0: 20 6e 65 65 64 65 64 20 6f 6e 20 62 75 66 66 65   needed on buffe
04f0: 72 73 20 66 75 6c 6c 20 6f 66 20 62 79 74 65 73  rs full of bytes
0500: 2c 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  , and then call 
0510: 4d 44 35 46 69 6e 61 6c 2c 20 77 68 69 63 68 0a  MD5Final, which.
0520: 20 2a 20 77 69 6c 6c 20 66 69 6c 6c 20 61 20 73   * will fill a s
0530: 75 70 70 6c 69 65 64 20 31 36 2d 62 79 74 65 20  upplied 16-byte 
0540: 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20 64  array with the d
0550: 69 67 65 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20  igest.. */../*. 
0560: 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 6f 6e  * If compiled on
0570: 20 61 20 6d 61 63 68 69 6e 65 20 74 68 61 74 20   a machine that 
0580: 64 6f 65 73 6e 27 74 20 68 61 76 65 20 61 20 33  doesn't have a 3
0590: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 0a 20  2-bit integer,. 
05a0: 2a 20 79 6f 75 20 6a 75 73 74 20 73 65 74 20 22  * you just set "
05b0: 75 69 6e 74 33 32 22 20 74 6f 20 74 68 65 20 61  uint32" to the a
05c0: 70 70 72 6f 70 72 69 61 74 65 20 64 61 74 61 74  ppropriate datat
05d0: 79 70 65 20 66 6f 72 20 61 6e 0a 20 2a 20 75 6e  ype for an. * un
05e0: 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
05f0: 74 65 67 65 72 2e 20 20 46 6f 72 20 65 78 61 6d  teger.  For exam
0600: 70 6c 65 3a 0a 20 2a 0a 20 2a 20 20 20 20 20 20  ple:. *. *      
0610: 20 63 63 20 2d 44 75 69 6e 74 33 32 3d 27 75 6e   cc -Duint32='un
0620: 73 69 67 6e 65 64 20 6c 6f 6e 67 27 20 6d 64 35  signed long' md5
0630: 2e 63 0a 20 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65  .c. *. */.#ifnde
0640: 66 20 75 69 6e 74 33 32 0a 23 20 20 64 65 66 69  f uint32.#  defi
0650: 6e 65 20 75 69 6e 74 33 32 20 75 6e 73 69 67 6e  ne uint32 unsign
0660: 65 64 20 69 6e 74 0a 23 65 6e 64 69 66 0a 0a 73  ed int.#endif..s
0670: 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65 78 74  truct MD5Context
0680: 20 7b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 3b   {.  int isInit;
0690: 0a 20 20 75 69 6e 74 33 32 20 62 75 66 5b 34 5d  .  uint32 buf[4]
06a0: 3b 0a 20 20 75 69 6e 74 33 32 20 62 69 74 73 5b  ;.  uint32 bits[
06b0: 32 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  2];.  unsigned c
06c0: 68 61 72 20 69 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74  har in[64];.};.t
06d0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 44  ypedef struct MD
06e0: 35 43 6f 6e 74 65 78 74 20 4d 44 35 43 6f 6e 74  5Context MD5Cont
06f0: 65 78 74 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74 65  ext;../*. * Note
0700: 3a 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 68  : this code is h
0710: 61 72 6d 6c 65 73 73 20 6f 6e 20 6c 69 74 74 6c  armless on littl
0720: 65 2d 65 6e 64 69 61 6e 20 6d 61 63 68 69 6e 65  e-endian machine
0730: 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s.. */.static vo
0740: 69 64 20 62 79 74 65 52 65 76 65 72 73 65 20 28  id byteReverse (
0750: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
0760: 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  uf, unsigned lon
0770: 67 73 29 7b 0a 20 20 20 20 20 20 20 20 75 69 6e  gs){.        uin
0780: 74 33 32 20 74 3b 0a 20 20 20 20 20 20 20 20 64  t32 t;.        d
0790: 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o {.            
07a0: 20 20 20 20 74 20 3d 20 28 75 69 6e 74 33 32 29      t = (uint32)
07b0: 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 33  ((unsigned)buf[3
07c0: 5d 3c 3c 38 20 7c 20 62 75 66 5b 32 5d 29 20 3c  ]<<8 | buf[2]) <
07d0: 3c 20 31 36 20 7c 0a 20 20 20 20 20 20 20 20 20  < 16 |.         
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 28 28 75 6e 73 69 67 6e 65 64 29 62 75     ((unsigned)bu
0800: 66 5b 31 5d 3c 3c 38 20 7c 20 62 75 66 5b 30 5d  f[1]<<8 | buf[0]
0810: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
0820: 20 20 20 2a 28 75 69 6e 74 33 32 20 2a 29 62 75     *(uint32 *)bu
0830: 66 20 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20  f = t;.         
0840: 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20 34 3b         buf += 4;
0850: 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
0860: 20 28 2d 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a   (--longs);.}./*
0870: 20 54 68 65 20 66 6f 75 72 20 63 6f 72 65 20 66   The four core f
0880: 75 6e 63 74 69 6f 6e 73 20 2d 20 46 31 20 69 73  unctions - F1 is
0890: 20 6f 70 74 69 6d 69 7a 65 64 20 73 6f 6d 65 77   optimized somew
08a0: 68 61 74 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69  hat */../* #defi
08b0: 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29 20 28  ne F1(x, y, z) (
08c0: 78 20 26 20 79 20 7c 20 7e 78 20 26 20 7a 29 20  x & y | ~x & z) 
08d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 31 28 78 2c  */.#define F1(x,
08e0: 20 79 2c 20 7a 29 20 28 7a 20 5e 20 28 78 20 26   y, z) (z ^ (x &
08f0: 20 28 79 20 5e 20 7a 29 29 29 0a 23 64 65 66 69   (y ^ z))).#defi
0900: 6e 65 20 46 32 28 78 2c 20 79 2c 20 7a 29 20 46  ne F2(x, y, z) F
0910: 31 28 7a 2c 20 78 2c 20 79 29 0a 23 64 65 66 69  1(z, x, y).#defi
0920: 6e 65 20 46 33 28 78 2c 20 79 2c 20 7a 29 20 28  ne F3(x, y, z) (
0930: 78 20 5e 20 79 20 5e 20 7a 29 0a 23 64 65 66 69  x ^ y ^ z).#defi
0940: 6e 65 20 46 34 28 78 2c 20 79 2c 20 7a 29 20 28  ne F4(x, y, z) (
0950: 79 20 5e 20 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f  y ^ (x | ~z))../
0960: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 65  * This is the ce
0970: 6e 74 72 61 6c 20 73 74 65 70 20 69 6e 20 74 68  ntral step in th
0980: 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2e  e MD5 algorithm.
0990: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 44 35 53   */.#define MD5S
09a0: 54 45 50 28 66 2c 20 77 2c 20 78 2c 20 79 2c 20  TEP(f, w, x, y, 
09b0: 7a 2c 20 64 61 74 61 2c 20 73 29 20 5c 0a 20 20  z, data, s) \.  
09c0: 20 20 20 20 20 20 28 20 77 20 2b 3d 20 66 28 78        ( w += f(x
09d0: 2c 20 79 2c 20 7a 29 20 2b 20 64 61 74 61 2c 20  , y, z) + data, 
09e0: 20 77 20 3d 20 77 3c 3c 73 20 7c 20 77 3e 3e 28   w = w<<s | w>>(
09f0: 33 32 2d 73 29 2c 20 20 77 20 2b 3d 20 78 20 29  32-s),  w += x )
0a00: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 63 6f 72 65  ../*. * The core
0a10: 20 6f 66 20 74 68 65 20 4d 44 35 20 61 6c 67 6f   of the MD5 algo
0a20: 72 69 74 68 6d 2c 20 74 68 69 73 20 61 6c 74 65  rithm, this alte
0a30: 72 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 4d  rs an existing M
0a40: 44 35 20 68 61 73 68 20 74 6f 0a 20 2a 20 72 65  D5 hash to. * re
0a50: 66 6c 65 63 74 20 74 68 65 20 61 64 64 69 74 69  flect the additi
0a60: 6f 6e 20 6f 66 20 31 36 20 6c 6f 6e 67 77 6f 72  on of 16 longwor
0a70: 64 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2e 20  ds of new data. 
0a80: 20 4d 44 35 55 70 64 61 74 65 20 62 6c 6f 63 6b   MD5Update block
0a90: 73 0a 20 2a 20 74 68 65 20 64 61 74 61 20 61 6e  s. * the data an
0aa0: 64 20 63 6f 6e 76 65 72 74 73 20 62 79 74 65 73  d converts bytes
0ab0: 20 69 6e 74 6f 20 6c 6f 6e 67 77 6f 72 64 73 20   into longwords 
0ac0: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
0ad0: 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  .. */.static voi
0ae0: 64 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 75  d MD5Transform(u
0af0: 69 6e 74 33 32 20 62 75 66 5b 34 5d 2c 20 63 6f  int32 buf[4], co
0b00: 6e 73 74 20 75 69 6e 74 33 32 20 69 6e 5b 31 36  nst uint32 in[16
0b10: 5d 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67 69  ]){.        regi
0b20: 73 74 65 72 20 75 69 6e 74 33 32 20 61 2c 20 62  ster uint32 a, b
0b30: 2c 20 63 2c 20 64 3b 0a 0a 20 20 20 20 20 20 20  , c, d;..       
0b40: 20 61 20 3d 20 62 75 66 5b 30 5d 3b 0a 20 20 20   a = buf[0];.   
0b50: 20 20 20 20 20 62 20 3d 20 62 75 66 5b 31 5d 3b       b = buf[1];
0b60: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 62 75 66  .        c = buf
0b70: 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 64 20 3d  [2];.        d =
0b80: 20 62 75 66 5b 33 5d 3b 0a 0a 20 20 20 20 20 20   buf[3];..      
0b90: 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c    MD5STEP(F1, a,
0ba0: 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d   b, c, d, in[ 0]
0bb0: 2b 30 78 64 37 36 61 61 34 37 38 2c 20 20 37 29  +0xd76aa478,  7)
0bc0: 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
0bd0: 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F1, d, a, b, c
0be0: 2c 20 69 6e 5b 20 31 5d 2b 30 78 65 38 63 37 62  , in[ 1]+0xe8c7b
0bf0: 37 35 36 2c 20 31 32 29 3b 0a 20 20 20 20 20 20  756, 12);.      
0c00: 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c    MD5STEP(F1, c,
0c10: 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d   d, a, b, in[ 2]
0c20: 2b 30 78 32 34 32 30 37 30 64 62 2c 20 31 37 29  +0x242070db, 17)
0c30: 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
0c40: 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F1, b, c, d, a
0c50: 2c 20 69 6e 5b 20 33 5d 2b 30 78 63 31 62 64 63  , in[ 3]+0xc1bdc
0c60: 65 65 65 2c 20 32 32 29 3b 0a 20 20 20 20 20 20  eee, 22);.      
0c70: 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c    MD5STEP(F1, a,
0c80: 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d   b, c, d, in[ 4]
0c90: 2b 30 78 66 35 37 63 30 66 61 66 2c 20 20 37 29  +0xf57c0faf,  7)
0ca0: 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
0cb0: 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F1, d, a, b, c
0cc0: 2c 20 69 6e 5b 20 35 5d 2b 30 78 34 37 38 37 63  , in[ 5]+0x4787c
0cd0: 36 32 61 2c 20 31 32 29 3b 0a 20 20 20 20 20 20  62a, 12);.      
0ce0: 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c    MD5STEP(F1, c,
0cf0: 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d   d, a, b, in[ 6]
0d00: 2b 30 78 61 38 33 30 34 36 31 33 2c 20 31 37 29  +0xa8304613, 17)
0d10: 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
0d20: 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F1, b, c, d, a
0d30: 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 64 34 36 39  , in[ 7]+0xfd469
0d40: 35 30 31 2c 20 32 32 29 3b 0a 20 20 20 20 20 20  501, 22);.      
0d50: 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c    MD5STEP(F1, a,
0d60: 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d   b, c, d, in[ 8]
0d70: 2b 30 78 36 39 38 30 39 38 64 38 2c 20 20 37 29  +0x698098d8,  7)
0d80: 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
0d90: 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F1, d, a, b, c
0da0: 2c 20 69 6e 5b 20 39 5d 2b 30 78 38 62 34 34 66  , in[ 9]+0x8b44f
0db0: 37 61 66 2c 20 31 32 29 3b 0a 20 20 20 20 20 20  7af, 12);.      
0dc0: 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c    MD5STEP(F1, c,
0dd0: 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d   d, a, b, in[10]
0de0: 2b 30 78 66 66 66 66 35 62 62 31 2c 20 31 37 29  +0xffff5bb1, 17)
0df0: 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
0e00: 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F1, b, c, d, a
0e10: 2c 20 69 6e 5b 31 31 5d 2b 30 78 38 39 35 63 64  , in[11]+0x895cd
0e20: 37 62 65 2c 20 32 32 29 3b 0a 20 20 20 20 20 20  7be, 22);.      
0e30: 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c    MD5STEP(F1, a,
0e40: 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d   b, c, d, in[12]
0e50: 2b 30 78 36 62 39 30 31 31 32 32 2c 20 20 37 29  +0x6b901122,  7)
0e60: 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
0e70: 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F1, d, a, b, c
0e80: 2c 20 69 6e 5b 31 33 5d 2b 30 78 66 64 39 38 37  , in[13]+0xfd987
0e90: 31 39 33 2c 20 31 32 29 3b 0a 20 20 20 20 20 20  193, 12);.      
0ea0: 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c    MD5STEP(F1, c,
0eb0: 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d   d, a, b, in[14]
0ec0: 2b 30 78 61 36 37 39 34 33 38 65 2c 20 31 37 29  +0xa679438e, 17)
0ed0: 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
0ee0: 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F1, b, c, d, a
0ef0: 2c 20 69 6e 5b 31 35 5d 2b 30 78 34 39 62 34 30  , in[15]+0x49b40
0f00: 38 32 31 2c 20 32 32 29 3b 0a 0a 20 20 20 20 20  821, 22);..     
0f10: 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61     MD5STEP(F2, a
0f20: 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31  , b, c, d, in[ 1
0f30: 5d 2b 30 78 66 36 31 65 32 35 36 32 2c 20 20 35  ]+0xf61e2562,  5
0f40: 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
0f50: 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F2, d, a, b, 
0f60: 63 2c 20 69 6e 5b 20 36 5d 2b 30 78 63 30 34 30  c, in[ 6]+0xc040
0f70: 62 33 34 30 2c 20 20 39 29 3b 0a 20 20 20 20 20  b340,  9);.     
0f80: 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63     MD5STEP(F2, c
0f90: 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31  , d, a, b, in[11
0fa0: 5d 2b 30 78 32 36 35 65 35 61 35 31 2c 20 31 34  ]+0x265e5a51, 14
0fb0: 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
0fc0: 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F2, b, c, d, 
0fd0: 61 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 39 62 36  a, in[ 0]+0xe9b6
0fe0: 63 37 61 61 2c 20 32 30 29 3b 0a 20 20 20 20 20  c7aa, 20);.     
0ff0: 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61     MD5STEP(F2, a
1000: 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35  , b, c, d, in[ 5
1010: 5d 2b 30 78 64 36 32 66 31 30 35 64 2c 20 20 35  ]+0xd62f105d,  5
1020: 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1030: 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F2, d, a, b, 
1040: 63 2c 20 69 6e 5b 31 30 5d 2b 30 78 30 32 34 34  c, in[10]+0x0244
1050: 31 34 35 33 2c 20 20 39 29 3b 0a 20 20 20 20 20  1453,  9);.     
1060: 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63     MD5STEP(F2, c
1070: 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35  , d, a, b, in[15
1080: 5d 2b 30 78 64 38 61 31 65 36 38 31 2c 20 31 34  ]+0xd8a1e681, 14
1090: 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
10a0: 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F2, b, c, d, 
10b0: 61 2c 20 69 6e 5b 20 34 5d 2b 30 78 65 37 64 33  a, in[ 4]+0xe7d3
10c0: 66 62 63 38 2c 20 32 30 29 3b 0a 20 20 20 20 20  fbc8, 20);.     
10d0: 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61     MD5STEP(F2, a
10e0: 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39  , b, c, d, in[ 9
10f0: 5d 2b 30 78 32 31 65 31 63 64 65 36 2c 20 20 35  ]+0x21e1cde6,  5
1100: 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1110: 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F2, d, a, b, 
1120: 63 2c 20 69 6e 5b 31 34 5d 2b 30 78 63 33 33 37  c, in[14]+0xc337
1130: 30 37 64 36 2c 20 20 39 29 3b 0a 20 20 20 20 20  07d6,  9);.     
1140: 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63     MD5STEP(F2, c
1150: 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33  , d, a, b, in[ 3
1160: 5d 2b 30 78 66 34 64 35 30 64 38 37 2c 20 31 34  ]+0xf4d50d87, 14
1170: 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1180: 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F2, b, c, d, 
1190: 61 2c 20 69 6e 5b 20 38 5d 2b 30 78 34 35 35 61  a, in[ 8]+0x455a
11a0: 31 34 65 64 2c 20 32 30 29 3b 0a 20 20 20 20 20  14ed, 20);.     
11b0: 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61     MD5STEP(F2, a
11c0: 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33  , b, c, d, in[13
11d0: 5d 2b 30 78 61 39 65 33 65 39 30 35 2c 20 20 35  ]+0xa9e3e905,  5
11e0: 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
11f0: 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F2, d, a, b, 
1200: 63 2c 20 69 6e 5b 20 32 5d 2b 30 78 66 63 65 66  c, in[ 2]+0xfcef
1210: 61 33 66 38 2c 20 20 39 29 3b 0a 20 20 20 20 20  a3f8,  9);.     
1220: 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63     MD5STEP(F2, c
1230: 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37  , d, a, b, in[ 7
1240: 5d 2b 30 78 36 37 36 66 30 32 64 39 2c 20 31 34  ]+0x676f02d9, 14
1250: 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1260: 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F2, b, c, d, 
1270: 61 2c 20 69 6e 5b 31 32 5d 2b 30 78 38 64 32 61  a, in[12]+0x8d2a
1280: 34 63 38 61 2c 20 32 30 29 3b 0a 0a 20 20 20 20  4c8a, 20);..    
1290: 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
12a0: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
12b0: 35 5d 2b 30 78 66 66 66 61 33 39 34 32 2c 20 20  5]+0xfffa3942,  
12c0: 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
12d0: 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F3, d, a, b,
12e0: 20 63 2c 20 69 6e 5b 20 38 5d 2b 30 78 38 37 37   c, in[ 8]+0x877
12f0: 31 66 36 38 31 2c 20 31 31 29 3b 0a 20 20 20 20  1f681, 11);.    
1300: 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
1310: 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
1320: 31 5d 2b 30 78 36 64 39 64 36 31 32 32 2c 20 31  1]+0x6d9d6122, 1
1330: 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  6);.        MD5S
1340: 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F3, b, c, d,
1350: 20 61 2c 20 69 6e 5b 31 34 5d 2b 30 78 66 64 65   a, in[14]+0xfde
1360: 35 33 38 30 63 2c 20 32 33 29 3b 0a 20 20 20 20  5380c, 23);.    
1370: 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
1380: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
1390: 31 5d 2b 30 78 61 34 62 65 65 61 34 34 2c 20 20  1]+0xa4beea44,  
13a0: 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
13b0: 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F3, d, a, b,
13c0: 20 63 2c 20 69 6e 5b 20 34 5d 2b 30 78 34 62 64   c, in[ 4]+0x4bd
13d0: 65 63 66 61 39 2c 20 31 31 29 3b 0a 20 20 20 20  ecfa9, 11);.    
13e0: 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
13f0: 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
1400: 37 5d 2b 30 78 66 36 62 62 34 62 36 30 2c 20 31  7]+0xf6bb4b60, 1
1410: 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  6);.        MD5S
1420: 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F3, b, c, d,
1430: 20 61 2c 20 69 6e 5b 31 30 5d 2b 30 78 62 65 62   a, in[10]+0xbeb
1440: 66 62 63 37 30 2c 20 32 33 29 3b 0a 20 20 20 20  fbc70, 23);.    
1450: 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
1460: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31  a, b, c, d, in[1
1470: 33 5d 2b 30 78 32 38 39 62 37 65 63 36 2c 20 20  3]+0x289b7ec6,  
1480: 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
1490: 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F3, d, a, b,
14a0: 20 63 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 61 61   c, in[ 0]+0xeaa
14b0: 31 32 37 66 61 2c 20 31 31 29 3b 0a 20 20 20 20  127fa, 11);.    
14c0: 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
14d0: 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
14e0: 33 5d 2b 30 78 64 34 65 66 33 30 38 35 2c 20 31  3]+0xd4ef3085, 1
14f0: 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  6);.        MD5S
1500: 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F3, b, c, d,
1510: 20 61 2c 20 69 6e 5b 20 36 5d 2b 30 78 30 34 38   a, in[ 6]+0x048
1520: 38 31 64 30 35 2c 20 32 33 29 3b 0a 20 20 20 20  81d05, 23);.    
1530: 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
1540: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
1550: 39 5d 2b 30 78 64 39 64 34 64 30 33 39 2c 20 20  9]+0xd9d4d039,  
1560: 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
1570: 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F3, d, a, b,
1580: 20 63 2c 20 69 6e 5b 31 32 5d 2b 30 78 65 36 64   c, in[12]+0xe6d
1590: 62 39 39 65 35 2c 20 31 31 29 3b 0a 20 20 20 20  b99e5, 11);.    
15a0: 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
15b0: 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
15c0: 35 5d 2b 30 78 31 66 61 32 37 63 66 38 2c 20 31  5]+0x1fa27cf8, 1
15d0: 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  6);.        MD5S
15e0: 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F3, b, c, d,
15f0: 20 61 2c 20 69 6e 5b 20 32 5d 2b 30 78 63 34 61   a, in[ 2]+0xc4a
1600: 63 35 36 36 35 2c 20 32 33 29 3b 0a 0a 20 20 20  c5665, 23);..   
1610: 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1620: 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
1630: 20 30 5d 2b 30 78 66 34 32 39 32 32 34 34 2c 20   0]+0xf4292244, 
1640: 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   6);.        MD5
1650: 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62  STEP(F4, d, a, b
1660: 2c 20 63 2c 20 69 6e 5b 20 37 5d 2b 30 78 34 33  , c, in[ 7]+0x43
1670: 32 61 66 66 39 37 2c 20 31 30 29 3b 0a 20 20 20  2aff97, 10);.   
1680: 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1690: 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
16a0: 31 34 5d 2b 30 78 61 62 39 34 32 33 61 37 2c 20  14]+0xab9423a7, 
16b0: 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  15);.        MD5
16c0: 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64  STEP(F4, b, c, d
16d0: 2c 20 61 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 63  , a, in[ 5]+0xfc
16e0: 39 33 61 30 33 39 2c 20 32 31 29 3b 0a 20 20 20  93a039, 21);.   
16f0: 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1700: 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
1710: 31 32 5d 2b 30 78 36 35 35 62 35 39 63 33 2c 20  12]+0x655b59c3, 
1720: 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   6);.        MD5
1730: 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62  STEP(F4, d, a, b
1740: 2c 20 63 2c 20 69 6e 5b 20 33 5d 2b 30 78 38 66  , c, in[ 3]+0x8f
1750: 30 63 63 63 39 32 2c 20 31 30 29 3b 0a 20 20 20  0ccc92, 10);.   
1760: 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1770: 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1780: 31 30 5d 2b 30 78 66 66 65 66 66 34 37 64 2c 20  10]+0xffeff47d, 
1790: 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  15);.        MD5
17a0: 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64  STEP(F4, b, c, d
17b0: 2c 20 61 2c 20 69 6e 5b 20 31 5d 2b 30 78 38 35  , a, in[ 1]+0x85
17c0: 38 34 35 64 64 31 2c 20 32 31 29 3b 0a 20 20 20  845dd1, 21);.   
17d0: 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
17e0: 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
17f0: 20 38 5d 2b 30 78 36 66 61 38 37 65 34 66 2c 20   8]+0x6fa87e4f, 
1800: 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   6);.        MD5
1810: 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62  STEP(F4, d, a, b
1820: 2c 20 63 2c 20 69 6e 5b 31 35 5d 2b 30 78 66 65  , c, in[15]+0xfe
1830: 32 63 65 36 65 30 2c 20 31 30 29 3b 0a 20 20 20  2ce6e0, 10);.   
1840: 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1850: 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1860: 20 36 5d 2b 30 78 61 33 30 31 34 33 31 34 2c 20   6]+0xa3014314, 
1870: 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  15);.        MD5
1880: 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64  STEP(F4, b, c, d
1890: 2c 20 61 2c 20 69 6e 5b 31 33 5d 2b 30 78 34 65  , a, in[13]+0x4e
18a0: 30 38 31 31 61 31 2c 20 32 31 29 3b 0a 20 20 20  0811a1, 21);.   
18b0: 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
18c0: 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
18d0: 20 34 5d 2b 30 78 66 37 35 33 37 65 38 32 2c 20   4]+0xf7537e82, 
18e0: 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   6);.        MD5
18f0: 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62  STEP(F4, d, a, b
1900: 2c 20 63 2c 20 69 6e 5b 31 31 5d 2b 30 78 62 64  , c, in[11]+0xbd
1910: 33 61 66 32 33 35 2c 20 31 30 29 3b 0a 20 20 20  3af235, 10);.   
1920: 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1930: 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1940: 20 32 5d 2b 30 78 32 61 64 37 64 32 62 62 2c 20   2]+0x2ad7d2bb, 
1950: 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  15);.        MD5
1960: 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64  STEP(F4, b, c, d
1970: 2c 20 61 2c 20 69 6e 5b 20 39 5d 2b 30 78 65 62  , a, in[ 9]+0xeb
1980: 38 36 64 33 39 31 2c 20 32 31 29 3b 0a 0a 20 20  86d391, 21);..  
1990: 20 20 20 20 20 20 62 75 66 5b 30 5d 20 2b 3d 20        buf[0] += 
19a0: 61 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 31  a;.        buf[1
19b0: 5d 20 2b 3d 20 62 3b 0a 20 20 20 20 20 20 20 20  ] += b;.        
19c0: 62 75 66 5b 32 5d 20 2b 3d 20 63 3b 0a 20 20 20  buf[2] += c;.   
19d0: 20 20 20 20 20 62 75 66 5b 33 5d 20 2b 3d 20 64       buf[3] += d
19e0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 74 61 72 74  ;.}../*. * Start
19f0: 20 4d 44 35 20 61 63 63 75 6d 75 6c 61 74 69 6f   MD5 accumulatio
1a00: 6e 2e 20 20 53 65 74 20 62 69 74 20 63 6f 75 6e  n.  Set bit coun
1a10: 74 20 74 6f 20 30 20 61 6e 64 20 62 75 66 66 65  t to 0 and buffe
1a20: 72 20 74 6f 20 6d 79 73 74 65 72 69 6f 75 73 0a  r to mysterious.
1a30: 20 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f   * initializatio
1a40: 6e 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 20 2a 2f  n constants.. */
1a50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35  .static void MD5
1a60: 49 6e 69 74 28 4d 44 35 43 6f 6e 74 65 78 74 20  Init(MD5Context 
1a70: 2a 63 74 78 29 7b 0a 20 20 20 20 20 20 20 20 63  *ctx){.        c
1a80: 74 78 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  tx->isInit = 1;.
1a90: 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66          ctx->buf
1aa0: 5b 30 5d 20 3d 20 30 78 36 37 34 35 32 33 30 31  [0] = 0x67452301
1ab0: 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
1ac0: 75 66 5b 31 5d 20 3d 20 30 78 65 66 63 64 61 62  uf[1] = 0xefcdab
1ad0: 38 39 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d  89;.        ctx-
1ae0: 3e 62 75 66 5b 32 5d 20 3d 20 30 78 39 38 62 61  >buf[2] = 0x98ba
1af0: 64 63 66 65 3b 0a 20 20 20 20 20 20 20 20 63 74  dcfe;.        ct
1b00: 78 2d 3e 62 75 66 5b 33 5d 20 3d 20 30 78 31 30  x->buf[3] = 0x10
1b10: 33 32 35 34 37 36 3b 0a 20 20 20 20 20 20 20 20  325476;.        
1b20: 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 30  ctx->bits[0] = 0
1b30: 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
1b40: 69 74 73 5b 31 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  its[1] = 0;.}../
1b50: 2a 0a 20 2a 20 55 70 64 61 74 65 20 63 6f 6e 74  *. * Update cont
1b60: 65 78 74 20 74 6f 20 72 65 66 6c 65 63 74 20 74  ext to reflect t
1b70: 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e  he concatenation
1b80: 20 6f 66 20 61 6e 6f 74 68 65 72 20 62 75 66 66   of another buff
1b90: 65 72 20 66 75 6c 6c 0a 20 2a 20 6f 66 20 62 79  er full. * of by
1ba0: 74 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 0a  tes.. */.static.
1bb0: 76 6f 69 64 20 4d 44 35 55 70 64 61 74 65 28 4d  void MD5Update(M
1bc0: 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  D5Context *ctx, 
1bd0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1be0: 68 61 72 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e  har *buf, unsign
1bf0: 65 64 20 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 20  ed int len){.   
1c00: 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b 0a 0a       uint32 t;..
1c10: 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74          /* Updat
1c20: 65 20 62 69 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20  e bitcount */.. 
1c30: 20 20 20 20 20 20 20 74 20 3d 20 63 74 78 2d 3e         t = ctx->
1c40: 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20 20  bits[0];.       
1c50: 20 69 66 20 28 28 63 74 78 2d 3e 62 69 74 73 5b   if ((ctx->bits[
1c60: 30 5d 20 3d 20 74 20 2b 20 28 28 75 69 6e 74 33  0] = t + ((uint3
1c70: 32 29 6c 65 6e 20 3c 3c 20 33 29 29 20 3c 20 74  2)len << 3)) < t
1c80: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1c90: 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b    ctx->bits[1]++
1ca0: 3b 20 2f 2a 20 43 61 72 72 79 20 66 72 6f 6d 20  ; /* Carry from 
1cb0: 6c 6f 77 20 74 6f 20 68 69 67 68 20 2a 2f 0a 20  low to high */. 
1cc0: 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73         ctx->bits
1cd0: 5b 31 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39  [1] += len >> 29
1ce0: 3b 0a 0a 20 20 20 20 20 20 20 20 74 20 3d 20 28  ;..        t = (
1cf0: 74 20 3e 3e 20 33 29 20 26 20 30 78 33 66 3b 20  t >> 3) & 0x3f; 
1d00: 20 20 20 2f 2a 20 42 79 74 65 73 20 61 6c 72 65     /* Bytes alre
1d10: 61 64 79 20 69 6e 20 73 68 73 49 6e 66 6f 2d 3e  ady in shsInfo->
1d20: 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20 20 20 20  data */..       
1d30: 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 6c   /* Handle any l
1d40: 65 61 64 69 6e 67 20 6f 64 64 2d 73 69 7a 65 64  eading odd-sized
1d50: 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20   chunks */..    
1d60: 20 20 20 20 69 66 20 28 20 74 20 29 20 7b 0a 20      if ( t ) {. 
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
1d80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 20  nsigned char *p 
1d90: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
1da0: 20 2a 29 63 74 78 2d 3e 69 6e 20 2b 20 74 3b 0a   *)ctx->in + t;.
1db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dc0: 20 74 20 3d 20 36 34 2d 74 3b 0a 20 20 20 20 20   t = 64-t;.     
1dd0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6c             if (l
1de0: 65 6e 20 3c 20 74 29 20 7b 0a 20 20 20 20 20 20  en < t) {.      
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 6d 65 6d 63 70 79 28 70 2c 20 62 75 66 2c    memcpy(p, buf,
1e10: 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20   len);.         
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1e30: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20  eturn;.         
1e40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e50: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1e60: 70 2c 20 62 75 66 2c 20 74 29 3b 0a 20 20 20 20  p, buf, t);.    
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74 65              byte
1e80: 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c  Reverse(ctx->in,
1e90: 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20   16);.          
1ea0: 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f        MD5Transfo
1eb0: 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69  rm(ctx->buf, (ui
1ec0: 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b  nt32 *)ctx->in);
1ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ee0: 20 62 75 66 20 2b 3d 20 74 3b 0a 20 20 20 20 20   buf += t;.     
1ef0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20 2d             len -
1f00: 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = t;.        }..
1f10: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65          /* Proce
1f20: 73 73 20 64 61 74 61 20 69 6e 20 36 34 2d 62 79  ss data in 64-by
1f30: 74 65 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20  te chunks */..  
1f40: 20 20 20 20 20 20 77 68 69 6c 65 20 28 6c 65 6e        while (len
1f50: 20 3e 3d 20 36 34 29 20 7b 0a 20 20 20 20 20 20   >= 64) {.      
1f60: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1f70: 28 63 74 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 36  (ctx->in, buf, 6
1f80: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  4);.            
1f90: 20 20 20 20 62 79 74 65 52 65 76 65 72 73 65 28      byteReverse(
1fa0: 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20  ctx->in, 16);.  
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44                MD
1fc0: 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e  5Transform(ctx->
1fd0: 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63  buf, (uint32 *)c
1fe0: 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20  tx->in);.       
1ff0: 20 20 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20           buf += 
2000: 36 34 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  64;.            
2010: 20 20 20 20 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20      len -= 64;. 
2020: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2030: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20    /* Handle any 
2040: 72 65 6d 61 69 6e 69 6e 67 20 62 79 74 65 73 20  remaining bytes 
2050: 6f 66 20 64 61 74 61 2e 20 2a 2f 0a 0a 20 20 20  of data. */..   
2060: 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d       memcpy(ctx-
2070: 3e 69 6e 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a  >in, buf, len);.
2080: 7d 0a 0a 2f 2a 0a 20 2a 20 46 69 6e 61 6c 20 77  }../*. * Final w
2090: 72 61 70 75 70 20 2d 20 70 61 64 20 74 6f 20 36  rapup - pad to 6
20a0: 34 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20  4-byte boundary 
20b0: 77 69 74 68 20 74 68 65 20 62 69 74 20 70 61 74  with the bit pat
20c0: 74 65 72 6e 0a 20 2a 20 31 20 30 2a 20 28 36 34  tern. * 1 0* (64
20d0: 2d 62 69 74 20 63 6f 75 6e 74 20 6f 66 20 62 69  -bit count of bi
20e0: 74 73 20 70 72 6f 63 65 73 73 65 64 2c 20 4d 53  ts processed, MS
20f0: 42 2d 66 69 72 73 74 29 0a 20 2a 2f 0a 73 74 61  B-first). */.sta
2100: 74 69 63 20 76 6f 69 64 20 4d 44 35 46 69 6e 61  tic void MD5Fina
2110: 6c 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  l(unsigned char 
2120: 64 69 67 65 73 74 5b 31 36 5d 2c 20 4d 44 35 43  digest[16], MD5C
2130: 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20  ontext *ctx){.  
2140: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
2150: 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 75 6e  ount;.        un
2160: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a  signed char *p;.
2170: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  .        /* Comp
2180: 75 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  ute number of by
2190: 74 65 73 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20  tes mod 64 */.  
21a0: 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 28 63        count = (c
21b0: 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3e 3e 20 33  tx->bits[0] >> 3
21c0: 29 20 26 20 30 78 33 46 3b 0a 0a 20 20 20 20 20  ) & 0x3F;..     
21d0: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69     /* Set the fi
21e0: 72 73 74 20 63 68 61 72 20 6f 66 20 70 61 64 64  rst char of padd
21f0: 69 6e 67 20 74 6f 20 30 78 38 30 2e 20 20 54 68  ing to 0x80.  Th
2200: 69 73 20 69 73 20 73 61 66 65 20 73 69 6e 63 65  is is safe since
2210: 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
2220: 20 20 20 20 20 61 6c 77 61 79 73 20 61 74 20 6c       always at l
2230: 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20 66 72  east one byte fr
2240: 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 20  ee */.        p 
2250: 3d 20 63 74 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e  = ctx->in + coun
2260: 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 2b 2b 20  t;.        *p++ 
2270: 3d 20 30 78 38 30 3b 0a 0a 20 20 20 20 20 20 20  = 0x80;..       
2280: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 61 64   /* Bytes of pad
2290: 64 69 6e 67 20 6e 65 65 64 65 64 20 74 6f 20 6d  ding needed to m
22a0: 61 6b 65 20 36 34 20 62 79 74 65 73 20 2a 2f 0a  ake 64 bytes */.
22b0: 20 20 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20          count = 
22c0: 36 34 20 2d 20 31 20 2d 20 63 6f 75 6e 74 3b 0a  64 - 1 - count;.
22d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20  .        /* Pad 
22e0: 6f 75 74 20 74 6f 20 35 36 20 6d 6f 64 20 36 34  out to 56 mod 64
22f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28   */.        if (
2300: 63 6f 75 6e 74 20 3c 20 38 29 20 7b 0a 20 20 20  count < 8) {.   
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2320: 54 77 6f 20 6c 6f 74 73 20 6f 66 20 70 61 64 64  Two lots of padd
2330: 69 6e 67 3a 20 20 50 61 64 20 74 68 65 20 66 69  ing:  Pad the fi
2340: 72 73 74 20 62 6c 6f 63 6b 20 74 6f 20 36 34 20  rst block to 64 
2350: 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bytes */.       
2360: 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
2370: 70 2c 20 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20  p, 0, count);.  
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79                by
2390: 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69  teReverse(ctx->i
23a0: 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20  n, 16);.        
23b0: 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73          MD5Trans
23c0: 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28  form(ctx->buf, (
23d0: 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e  uint32 *)ctx->in
23e0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
23f0: 20 20 20 20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20      /* Now fill 
2400: 74 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 77  the next block w
2410: 69 74 68 20 35 36 20 62 79 74 65 73 20 2a 2f 0a  ith 56 bytes */.
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 6d 65 6d 73 65 74 28 63 74 78 2d 3e 69 6e 2c 20  memset(ctx->in, 
2440: 30 2c 20 35 36 29 3b 0a 20 20 20 20 20 20 20 20  0, 56);.        
2450: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
2460: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20           /* Pad 
2470: 62 6c 6f 63 6b 20 74 6f 20 35 36 20 62 79 74 65  block to 56 byte
2480: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
2490: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
24a0: 2c 20 63 6f 75 6e 74 2d 38 29 3b 0a 20 20 20 20  , count-8);.    
24b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 79      }.        by
24c0: 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69  teReverse(ctx->i
24d0: 6e 2c 20 31 34 29 3b 0a 0a 20 20 20 20 20 20 20  n, 14);..       
24e0: 20 2f 2a 20 41 70 70 65 6e 64 20 6c 65 6e 67 74   /* Append lengt
24f0: 68 20 69 6e 20 62 69 74 73 20 61 6e 64 20 74 72  h in bits and tr
2500: 61 6e 73 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 20  ansform */.     
2510: 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69     memcpy(ctx->i
2520: 6e 20 2b 20 31 34 2a 34 2c 20 63 74 78 2d 3e 62  n + 14*4, ctx->b
2530: 69 74 73 2c 20 38 29 3b 0a 0a 20 20 20 20 20 20  its, 8);..      
2540: 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63    MD5Transform(c
2550: 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32  tx->buf, (uint32
2560: 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20   *)ctx->in);.   
2570: 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73 65       byteReverse
2580: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ((unsigned char 
2590: 2a 29 63 74 78 2d 3e 62 75 66 2c 20 34 29 3b 0a  *)ctx->buf, 4);.
25a0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 64          memcpy(d
25b0: 69 67 65 73 74 2c 20 63 74 78 2d 3e 62 75 66 2c  igest, ctx->buf,
25c0: 20 31 36 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   16);.}../*.** C
25d0: 6f 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69 74  onvert a 128-bit
25e0: 20 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f   MD5 digest into
25f0: 20 61 20 33 32 2d 64 69 67 69 74 20 62 61 73 65   a 32-digit base
2600: 2d 31 36 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  -16 number..*/.s
2610: 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69  tatic void MD5Di
2620: 67 65 73 74 54 6f 42 61 73 65 31 36 28 75 6e 73  gestToBase16(uns
2630: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 69 67 65  igned char *dige
2640: 73 74 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  st, char *zBuf){
2650: 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 63  .  static char c
2660: 6f 6e 73 74 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d  onst zEncode[] =
2670: 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64   "0123456789abcd
2680: 65 66 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ef";.  int i, j;
2690: 0a 0a 20 20 66 6f 72 28 6a 3d 69 3d 30 3b 20 69  ..  for(j=i=0; i
26a0: 3c 31 36 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  <16; i++){.    i
26b0: 6e 74 20 61 20 3d 20 64 69 67 65 73 74 5b 69 5d  nt a = digest[i]
26c0: 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20  ;.    zBuf[j++] 
26d0: 3d 20 7a 45 6e 63 6f 64 65 5b 28 61 3e 3e 34 29  = zEncode[(a>>4)
26e0: 26 30 78 66 5d 3b 0a 20 20 20 20 7a 42 75 66 5b  &0xf];.    zBuf[
26f0: 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 61  j++] = zEncode[a
2700: 20 26 20 30 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a   & 0xf];.  }.  z
2710: 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a  Buf[j] = 0;.}...
2720: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
2730: 31 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65  128-bit MD5 dige
2740: 73 74 20 69 6e 74 6f 20 73 65 71 75 65 6e 63 79  st into sequency
2750: 20 6f 66 20 65 69 67 68 74 20 35 2d 64 69 67 69   of eight 5-digi
2760: 74 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 65 61  t integers.** ea
2770: 63 68 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ch representing 
2780: 31 36 20 62 69 74 73 20 6f 66 20 74 68 65 20 64  16 bits of the d
2790: 69 67 65 73 74 20 61 6e 64 20 73 65 70 61 72 61  igest and separa
27a0: 74 65 64 20 66 72 6f 6d 20 65 61 63 68 0a 2a 2a  ted from each.**
27b0: 20 6f 74 68 65 72 20 62 79 20 61 20 22 2d 22 20   other by a "-" 
27c0: 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74  character..*/.st
27d0: 61 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67  atic void MD5Dig
27e0: 65 73 74 54 6f 42 61 73 65 31 30 78 38 28 75 6e  estToBase10x8(un
27f0: 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65  signed char dige
2800: 73 74 5b 31 36 5d 2c 20 63 68 61 72 20 7a 44 69  st[16], char zDi
2810: 67 65 73 74 5b 35 30 5d 29 7b 0a 20 20 69 6e 74  gest[50]){.  int
2820: 20 69 2c 20 6a 3b 0a 20 20 75 6e 73 69 67 6e 65   i, j;.  unsigne
2830: 64 20 69 6e 74 20 78 3b 0a 20 20 66 6f 72 28 69  d int x;.  for(i
2840: 3d 6a 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 3d 32  =j=0; i<16; i+=2
2850: 29 7b 0a 20 20 20 20 78 20 3d 20 64 69 67 65 73  ){.    x = diges
2860: 74 5b 69 5d 2a 32 35 36 20 2b 20 64 69 67 65 73  t[i]*256 + diges
2870: 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20  t[i+1];.    if( 
2880: 69 3e 30 20 29 20 7a 44 69 67 65 73 74 5b 6a 2b  i>0 ) zDigest[j+
2890: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 73 71  +] = '-';.    sq
28a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35  lite3_snprintf(5
28b0: 30 2d 6a 2c 20 26 7a 44 69 67 65 73 74 5b 6a 5d  0-j, &zDigest[j]
28c0: 2c 20 22 25 30 35 75 22 2c 20 78 29 3b 0a 20 20  , "%05u", x);.  
28d0: 20 20 6a 20 2b 3d 20 35 3b 0a 20 20 7d 0a 20 20    j += 5;.  }.  
28e0: 7a 44 69 67 65 73 74 5b 6a 5d 20 3d 20 30 3b 0a  zDigest[j] = 0;.
28f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63  }../*.** A TCL c
2900: 6f 6d 6d 61 6e 64 20 66 6f 72 20 6d 64 35 2e 20  ommand for md5. 
2910: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
2920: 20 74 68 65 20 74 65 78 74 20 74 6f 20 62 65 20   the text to be 
2930: 68 61 73 68 65 64 2e 20 20 54 68 65 0a 2a 2a 20  hashed.  The.** 
2940: 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 68 61  Result is the ha
2950: 73 68 20 69 6e 20 62 61 73 65 36 34 2e 0a 2a 2f  sh in base64..*/
2960: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
2970: 54 45 5f 54 43 4c 41 50 49 20 6d 64 35 5f 63 6d  TE_TCLAPI md5_cm
2980: 64 28 0a 20 20 76 6f 69 64 2a 63 64 2c 0a 20 20  d(.  void*cd,.  
2990: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
29a0: 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
29b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
29c0: 72 67 76 0a 29 7b 0a 20 20 4d 44 35 43 6f 6e 74  rgv.){.  MD5Cont
29d0: 65 78 74 20 63 74 78 3b 0a 20 20 75 6e 73 69 67  ext ctx;.  unsig
29e0: 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b  ned char digest[
29f0: 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  16];.  char zBuf
2a00: 5b 35 30 5d 3b 0a 20 20 76 6f 69 64 20 28 2a 63  [50];.  void (*c
2a10: 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69 67 6e  onverter)(unsign
2a20: 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72 2a 29  ed char*, char*)
2a30: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
2a40: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2a50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2a60: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
2a70: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
2a80: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 22  gv[0],.        "
2a90: 20 54 45 58 54 5c 22 22 2c 20 28 63 68 61 72 2a   TEXT\"", (char*
2aa0: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
2ab0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ac0: 20 4d 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a   MD5Init(&ctx);.
2ad0: 20 20 4d 44 35 55 70 64 61 74 65 28 26 63 74 78    MD5Update(&ctx
2ae0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
2af0: 2a 29 61 72 67 76 5b 31 5d 2c 20 28 75 6e 73 69  *)argv[1], (unsi
2b00: 67 6e 65 64 29 73 74 72 6c 65 6e 28 61 72 67 76  gned)strlen(argv
2b10: 5b 31 5d 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61  [1]));.  MD5Fina
2b20: 6c 28 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b  l(digest, &ctx);
2b30: 0a 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28  .  converter = (
2b40: 76 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64  void(*)(unsigned
2b50: 20 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64   char*,char*))cd
2b60: 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69  ;.  converter(di
2b70: 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54  gest, zBuf);.  T
2b80: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2b90: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63  interp, zBuf, (c
2ba0: 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72  har*)0);.  retur
2bb0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2bc0: 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  ** A TCL command
2bd0: 20 74 6f 20 74 61 6b 65 20 74 68 65 20 6d 64 35   to take the md5
2be0: 20 68 61 73 68 20 6f 66 20 61 20 66 69 6c 65 2e   hash of a file.
2bf0: 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69    The argument i
2c00: 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66  s the.** name of
2c10: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
2c20: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2c30: 54 43 4c 41 50 49 20 6d 64 35 66 69 6c 65 5f 63  TCLAPI md5file_c
2c40: 6d 64 28 0a 20 20 76 6f 69 64 2a 63 64 2c 0a 20  md(.  void*cd,. 
2c50: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2c60: 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
2c70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
2c80: 61 72 67 76 0a 29 7b 0a 20 20 46 49 4c 45 20 2a  argv.){.  FILE *
2c90: 69 6e 3b 0a 20 20 69 6e 74 20 6f 66 73 74 3b 0a  in;.  int ofst;.
2ca0: 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 4d 44 35    int amt;.  MD5
2cb0: 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 76  Context ctx;.  v
2cc0: 6f 69 64 20 28 2a 63 6f 6e 76 65 72 74 65 72 29  oid (*converter)
2cd0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c  (unsigned char*,
2ce0: 20 63 68 61 72 2a 29 3b 0a 20 20 75 6e 73 69 67   char*);.  unsig
2cf0: 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b  ned char digest[
2d00: 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  16];.  char zBuf
2d10: 5b 31 30 32 34 30 5d 3b 0a 0a 20 20 69 66 28 20  [10240];..  if( 
2d20: 61 72 67 63 21 3d 32 20 26 26 20 61 72 67 63 21  argc!=2 && argc!
2d30: 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
2d40: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2d50: 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  p,"wrong # args:
2d60: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
2d70: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
2d80: 20 22 20 46 49 4c 45 4e 41 4d 45 20 5b 4f 46 46   " FILENAME [OFF
2d90: 53 45 54 20 41 4d 54 5d 5c 22 22 2c 20 28 63 68  SET AMT]\"", (ch
2da0: 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
2db0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2dc0: 7d 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 34 20  }.  if( argc==4 
2dd0: 29 7b 0a 20 20 20 20 6f 66 73 74 20 3d 20 61 74  ){.    ofst = at
2de0: 6f 69 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  oi(argv[2]);.   
2df0: 20 61 6d 74 20 3d 20 61 74 6f 69 28 61 72 67 76   amt = atoi(argv
2e00: 5b 33 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  [3]);.  }else{. 
2e10: 20 20 20 6f 66 73 74 20 3d 20 30 3b 0a 20 20 20     ofst = 0;.   
2e20: 20 61 6d 74 20 3d 20 32 31 34 37 34 38 33 36 34   amt = 214748364
2e30: 37 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f  7;.  }.  in = fo
2e40: 70 65 6e 28 61 72 67 76 5b 31 5d 2c 22 72 62 22  pen(argv[1],"rb"
2e50: 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  );.  if( in==0 )
2e60: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2e70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 75  Result(interp,"u
2e80: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 66 69  nable to open fi
2e90: 6c 65 20 5c 22 22 2c 20 61 72 67 76 5b 31 5d 2c  le \"", argv[1],
2ea0: 0a 20 20 20 20 20 20 20 20 20 22 5c 22 20 66 6f  .         "\" fo
2eb0: 72 20 72 65 61 64 69 6e 67 22 2c 20 28 63 68 61  r reading", (cha
2ec0: 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
2ed0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2ee0: 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 6f 66 73  .  fseek(in, ofs
2ef0: 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
2f00: 4d 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20  MD5Init(&ctx);. 
2f10: 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 29 7b   while( amt>0 ){
2f20: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
2f30: 6e 20 3d 20 28 69 6e 74 29 66 72 65 61 64 28 7a  n = (int)fread(z
2f40: 42 75 66 2c 20 31 2c 20 73 69 7a 65 6f 66 28 7a  Buf, 1, sizeof(z
2f50: 42 75 66 29 3c 3d 61 6d 74 20 3f 20 73 69 7a 65  Buf)<=amt ? size
2f60: 6f 66 28 7a 42 75 66 29 20 3a 20 61 6d 74 2c 20  of(zBuf) : amt, 
2f70: 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d  in);.    if( n<=
2f80: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 4d  0 ) break;.    M
2f90: 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20 28  D5Update(&ctx, (
2fa0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
2fb0: 42 75 66 2c 20 28 75 6e 73 69 67 6e 65 64 29 6e  Buf, (unsigned)n
2fc0: 29 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 6e 3b  );.    amt -= n;
2fd0: 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e  .  }.  fclose(in
2fe0: 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69  );.  MD5Final(di
2ff0: 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63  gest, &ctx);.  c
3000: 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64  onverter = (void
3010: 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61  (*)(unsigned cha
3020: 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20  r*,char*))cd;.  
3030: 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73 74  converter(digest
3040: 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
3050: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3060: 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a  rp, zBuf, (char*
3070: 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )0);.  return TC
3080: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  L_OK;.}../*.** R
3090: 65 67 69 73 74 65 72 20 74 68 65 20 66 6f 75 72  egister the four
30a0: 20 6e 65 77 20 54 43 4c 20 63 6f 6d 6d 61 6e 64   new TCL command
30b0: 73 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  s for generating
30c0: 20 4d 44 35 20 63 68 65 63 6b 73 75 6d 73 0a 2a   MD5 checksums.*
30d0: 2a 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69  * with the TCL i
30e0: 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69  nterpreter..*/.i
30f0: 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f  nt Md5_Init(Tcl_
3100: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
3110: 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d  .  Tcl_CreateCom
3120: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64  mand(interp, "md
3130: 35 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  5", (Tcl_CmdProc
3140: 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20  *)md5_cmd,.     
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
3160: 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 36  D5DigestToBase16
3170: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61  , 0);.  Tcl_Crea
3180: 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
3190: 2c 20 22 6d 64 35 2d 31 30 78 38 22 2c 20 28 54  , "md5-10x8", (T
31a0: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 5f  cl_CmdProc*)md5_
31b0: 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cmd,.           
31c0: 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65           MD5Dige
31d0: 73 74 54 6f 42 61 73 65 31 30 78 38 2c 20 30 29  stToBase10x8, 0)
31e0: 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f  ;.  Tcl_CreateCo
31f0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d  mmand(interp, "m
3200: 64 35 66 69 6c 65 22 2c 20 28 54 63 6c 5f 43 6d  d5file", (Tcl_Cm
3210: 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f 63  dProc*)md5file_c
3220: 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  md,.            
3230: 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65 73          MD5Diges
3240: 74 54 6f 42 61 73 65 31 36 2c 20 30 29 3b 0a 20  tToBase16, 0);. 
3250: 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61   Tcl_CreateComma
3260: 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 66  nd(interp, "md5f
3270: 69 6c 65 2d 31 30 78 38 22 2c 20 28 54 63 6c 5f  ile-10x8", (Tcl_
3280: 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65  CmdProc*)md5file
3290: 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20  _cmd,.          
32a0: 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67            MD5Dig
32b0: 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c 20 30  estToBase10x8, 0
32c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
32d0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72  OK;.}../*.** Dur
32e0: 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 74 68 65  ing testing, the
32f0: 20 73 70 65 63 69 61 6c 20 6d 64 35 73 75 6d 28   special md5sum(
3300: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
3310: 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  tion is availabl
3320: 65 2e 0a 2a 2a 20 69 6e 73 69 64 65 20 53 51 4c  e..** inside SQL
3330: 69 74 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ite.  The follow
3340: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 69 6d 70  ing routines imp
3350: 6c 65 6d 65 6e 74 20 74 68 61 74 20 66 75 6e 63  lement that func
3360: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
3370: 76 6f 69 64 20 6d 64 35 73 74 65 70 28 73 71 6c  void md5step(sql
3380: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
3390: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
33a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
33b0: 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e  *argv){.  MD5Con
33c0: 74 65 78 74 20 2a 70 3b 0a 20 20 69 6e 74 20 69  text *p;.  int i
33d0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 29  ;.  if( argc<1 )
33e0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 73   return;.  p = s
33f0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
3400: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
3410: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
3420: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3430: 72 6e 3b 0a 20 20 69 66 28 20 21 70 2d 3e 69 73  rn;.  if( !p->is
3440: 49 6e 69 74 20 29 7b 0a 20 20 20 20 4d 44 35 49  Init ){.    MD5I
3450: 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 66 6f  nit(p);.  }.  fo
3460: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
3470: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
3480: 68 61 72 20 2a 7a 44 61 74 61 20 3d 20 28 63 68  har *zData = (ch
3490: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
34a0: 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b  e_text(argv[i]);
34b0: 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 20 29  .    if( zData )
34c0: 7b 0a 20 20 20 20 20 20 4d 44 35 55 70 64 61 74  {.      MD5Updat
34d0: 65 28 70 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  e(p, (unsigned c
34e0: 68 61 72 2a 29 7a 44 61 74 61 2c 20 28 69 6e 74  har*)zData, (int
34f0: 29 73 74 72 6c 65 6e 28 7a 44 61 74 61 29 29 3b  )strlen(zData));
3500: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
3510: 74 69 63 20 76 6f 69 64 20 6d 64 35 66 69 6e 61  tic void md5fina
3520: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
3530: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
3540: 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b    MD5Context *p;
3550: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
3560: 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63   digest[16];.  c
3570: 68 61 72 20 7a 42 75 66 5b 33 33 5d 3b 0a 20 20  har zBuf[33];.  
3580: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
3590: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
35a0: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
35b0: 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64  ));.  MD5Final(d
35c0: 69 67 65 73 74 2c 70 29 3b 0a 20 20 4d 44 35 44  igest,p);.  MD5D
35d0: 69 67 65 73 74 54 6f 42 61 73 65 31 36 28 64 69  igestToBase16(di
35e0: 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 73  gest, zBuf);.  s
35f0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
3600: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66  xt(context, zBuf
3610: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
3620: 4e 53 49 45 4e 54 29 3b 0a 7d 0a 69 6e 74 20 4d  NSIENT);.}.int M
3630: 64 35 5f 52 65 67 69 73 74 65 72 28 0a 20 20 73  d5_Register(.  s
3640: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 68  qlite3 *db,.  ch
3650: 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 0a 20  ar **pzErrMsg,. 
3660: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61   const sqlite3_a
3670: 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 54 68  pi_routines *pTh
3680: 75 6e 6b 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  unk.){.  int rc 
3690: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
36a0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d  _function(db, "m
36b0: 64 35 73 75 6d 22 2c 20 2d 31 2c 20 53 51 4c 49  d5sum", -1, SQLI
36c0: 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20  TE_UTF8, 0, 0,. 
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f0: 6d 64 35 73 74 65 70 2c 20 6d 64 35 66 69 6e 61  md5step, md5fina
3700: 6c 69 7a 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  lize);.  sqlite3
3710: 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
3720: 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c  on(db, "md5sum",
3730: 20 2d 31 29 3b 20 20 2f 2a 20 54 6f 20 65 78 65   -1);  /* To exe
3740: 72 63 69 73 65 20 74 68 69 73 20 41 50 49 20 2a  rcise this API *
3750: 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
3760: 0a                                               .