Hex Artifact Content
Not logged in

Artifact 7f2336da5a35db54553d39d532b8d44017c47820:

File src/sha1.c part of check-in [8fb641e071] - Get rid of the (silly?) int_least16_t type in sha1.c and just use good old "int" instead. Makes things easier to compile on older systems. by drh on 2007-10-23 16:35:04. Also file src/sha1.c part of check-in [d0305b305a] - Merged mainline into my branch to get the newest application. by aku on 2007-12-05 08:07:46.

0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 6d 70 6c 65  /*.** This imple
0010: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 53 48 41  mentation of SHA
0020: 31 20 69 73 20 61 64 61 70 74 65 64 20 66 72 6f  1 is adapted fro
0030: 6d 20 74 68 65 20 65 78 61 6d 70 6c 65 20 69 6d  m the example im
0040: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  plementation.** 
0050: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 52 46 43  contained in RFC
0060: 2d 33 31 37 34 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  -3174..*/.#inclu
0070: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 69  de <stdint.h>.#i
0080: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65  nclude <sys/type
0090: 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 63  s.h>.#include "c
00a0: 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64  onfig.h".#includ
00b0: 65 20 22 73 68 61 31 2e 68 22 0a 0a 2f 2a 0a 20  e "sha1.h"../*. 
00c0: 2a 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20  * If you do not 
00d0: 68 61 76 65 20 74 68 65 20 49 53 4f 20 73 74 61  have the ISO sta
00e0: 6e 64 61 72 64 20 73 74 64 69 6e 74 2e 68 20 68  ndard stdint.h h
00f0: 65 61 64 65 72 20 66 69 6c 65 2c 20 74 68 65 6e  eader file, then
0100: 20 79 6f 75 0a 20 2a 20 6d 75 73 74 20 74 79 70   you. * must typ
0110: 64 65 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  def the followin
0120: 67 3a 0a 20 2a 20 20 20 20 6e 61 6d 65 20 20 20  g:. *    name   
0130: 20 20 20 20 20 20 20 20 20 20 20 6d 65 61 6e 69             meani
0140: 6e 67 0a 20 2a 20 20 75 69 6e 74 33 32 5f 74 20  ng. *  uint32_t 
0150: 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
0160: 20 33 32 20 62 69 74 20 69 6e 74 65 67 65 72 0a   32 bit integer.
0170: 20 2a 20 20 75 69 6e 74 38 5f 74 20 20 20 20 20   *  uint8_t     
0180: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 38 20       unsigned 8 
0190: 62 69 74 20 69 6e 74 65 67 65 72 20 28 69 2e 65  bit integer (i.e
01a0: 2e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ., unsigned char
01b0: 29 0a 20 2a 0a 20 2a 2f 0a 23 64 65 66 69 6e 65  ). *. */.#define
01c0: 20 53 48 41 31 48 61 73 68 53 69 7a 65 20 32 30   SHA1HashSize 20
01d0: 0a 23 64 65 66 69 6e 65 20 73 68 61 53 75 63 63  .#define shaSucc
01e0: 65 73 73 20 30 0a 23 64 65 66 69 6e 65 20 73 68  ess 0.#define sh
01f0: 61 49 6e 70 75 74 54 6f 6f 4c 6f 6e 67 20 31 0a  aInputTooLong 1.
0200: 23 64 65 66 69 6e 65 20 73 68 61 53 74 61 74 65  #define shaState
0210: 45 72 72 6f 72 20 32 0a 0a 2f 2a 0a 20 2a 20 20  Error 2../*. *  
0220: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 77  This structure w
0230: 69 6c 6c 20 68 6f 6c 64 20 63 6f 6e 74 65 78 74  ill hold context
0240: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
0250: 20 74 68 65 20 53 48 41 2d 31 0a 20 2a 20 20 68   the SHA-1. *  h
0260: 61 73 68 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ashing operation
0270: 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  . */.typedef str
0280: 75 63 74 20 53 48 41 31 43 6f 6e 74 65 78 74 20  uct SHA1Context 
0290: 53 48 41 31 43 6f 6e 74 65 78 74 3b 0a 73 74 72  SHA1Context;.str
02a0: 75 63 74 20 53 48 41 31 43 6f 6e 74 65 78 74 20  uct SHA1Context 
02b0: 7b 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 49  {.    uint32_t I
02c0: 6e 74 65 72 6d 65 64 69 61 74 65 5f 48 61 73 68  ntermediate_Hash
02d0: 5b 53 48 41 31 48 61 73 68 53 69 7a 65 2f 34 5d  [SHA1HashSize/4]
02e0: 3b 20 2f 2a 20 4d 65 73 73 61 67 65 20 44 69 67  ; /* Message Dig
02f0: 65 73 74 20 20 2a 2f 0a 0a 20 20 20 20 75 69 6e  est  */..    uin
0300: 74 33 32 5f 74 20 4c 65 6e 67 74 68 5f 4c 6f 77  t32_t Length_Low
0310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0320: 4d 65 73 73 61 67 65 20 6c 65 6e 67 74 68 20 69  Message length i
0330: 6e 20 62 69 74 73 20 20 20 20 20 20 2a 2f 0a 20  n bits      */. 
0340: 20 20 20 75 69 6e 74 33 32 5f 74 20 4c 65 6e 67     uint32_t Leng
0350: 74 68 5f 48 69 67 68 3b 20 20 20 20 20 20 20 20  th_High;        
0360: 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 6c 65     /* Message le
0370: 6e 67 74 68 20 69 6e 20 62 69 74 73 20 20 20 20  ngth in bits    
0380: 20 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 4d 65    */..    int Me
0390: 73 73 61 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65  ssage_Block_Inde
03a0: 78 3b 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e  x;   /* Index in
03b0: 74 6f 20 6d 65 73 73 61 67 65 20 62 6c 6f 63 6b  to message block
03c0: 20 61 72 72 61 79 20 20 20 2a 2f 0a 20 20 20 20   array   */.    
03d0: 75 69 6e 74 38 5f 74 20 4d 65 73 73 61 67 65 5f  uint8_t Message_
03e0: 42 6c 6f 63 6b 5b 36 34 5d 3b 20 20 20 20 20 20  Block[64];      
03f0: 2f 2a 20 35 31 32 2d 62 69 74 20 6d 65 73 73 61  /* 512-bit messa
0400: 67 65 20 62 6c 6f 63 6b 73 20 20 20 20 20 20 2a  ge blocks      *
0410: 2f 0a 0a 20 20 20 20 69 6e 74 20 43 6f 6d 70 75  /..    int Compu
0420: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ted;            
0430: 20 20 20 2f 2a 20 49 73 20 74 68 65 20 64 69 67     /* Is the dig
0440: 65 73 74 20 63 6f 6d 70 75 74 65 64 3f 20 20 20  est computed?   
0450: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74        */.    int
0460: 20 43 6f 72 72 75 70 74 65 64 3b 20 20 20 20 20   Corrupted;     
0470: 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 74 68          /* Is th
0480: 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  e message digest
0490: 20 63 6f 72 72 75 70 74 65 64 3f 20 2a 2f 0a 7d   corrupted? */.}
04a0: 3b 0a 0a 2f 2a 0a 20 2a 20 20 73 68 61 31 2e 63  ;../*. *  sha1.c
04b0: 0a 20 2a 0a 20 2a 20 20 44 65 73 63 72 69 70 74  . *. *  Descript
04c0: 69 6f 6e 3a 0a 20 2a 20 20 20 20 20 20 54 68 69  ion:. *      Thi
04d0: 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  s file implement
04e0: 73 20 74 68 65 20 53 65 63 75 72 65 20 48 61 73  s the Secure Has
04f0: 68 69 6e 67 20 41 6c 67 6f 72 69 74 68 6d 20 31  hing Algorithm 1
0500: 20 61 73 0a 20 2a 20 20 20 20 20 20 64 65 66 69   as. *      defi
0510: 6e 65 64 20 69 6e 20 46 49 50 53 20 50 55 42 20  ned in FIPS PUB 
0520: 31 38 30 2d 31 20 70 75 62 6c 69 73 68 65 64 20  180-1 published 
0530: 41 70 72 69 6c 20 31 37 2c 20 31 39 39 35 2e 0a  April 17, 1995..
0540: 20 2a 0a 20 2a 20 20 20 20 20 20 54 68 65 20 53   *. *      The S
0550: 48 41 2d 31 2c 20 70 72 6f 64 75 63 65 73 20 61  HA-1, produces a
0560: 20 31 36 30 2d 62 69 74 20 6d 65 73 73 61 67 65   160-bit message
0570: 20 64 69 67 65 73 74 20 66 6f 72 20 61 20 67 69   digest for a gi
0580: 76 65 6e 0a 20 2a 20 20 20 20 20 20 64 61 74 61  ven. *      data
0590: 20 73 74 72 65 61 6d 2e 20 20 49 74 20 73 68 6f   stream.  It sho
05a0: 75 6c 64 20 74 61 6b 65 20 61 62 6f 75 74 20 32  uld take about 2
05b0: 2a 2a 6e 20 73 74 65 70 73 20 74 6f 20 66 69 6e  **n steps to fin
05c0: 64 20 61 0a 20 2a 20 20 20 20 20 20 6d 65 73 73  d a. *      mess
05d0: 61 67 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  age with the sam
05e0: 65 20 64 69 67 65 73 74 20 61 73 20 61 20 67 69  e digest as a gi
05f0: 76 65 6e 20 6d 65 73 73 61 67 65 20 61 6e 64 0a  ven message and.
0600: 20 2a 20 20 20 20 20 20 32 2a 2a 28 6e 2f 32 29   *      2**(n/2)
0610: 20 74 6f 20 66 69 6e 64 20 61 6e 79 20 74 77 6f   to find any two
0620: 20 6d 65 73 73 61 67 65 73 20 77 69 74 68 20 74   messages with t
0630: 68 65 20 73 61 6d 65 20 64 69 67 65 73 74 2c 0a  he same digest,.
0640: 20 2a 20 20 20 20 20 20 77 68 65 6e 20 6e 20 69   *      when n i
0650: 73 20 74 68 65 20 64 69 67 65 73 74 20 73 69 7a  s the digest siz
0660: 65 20 69 6e 20 62 69 74 73 2e 20 20 54 68 65 72  e in bits.  Ther
0670: 65 66 6f 72 65 2c 20 74 68 69 73 0a 20 2a 20 20  efore, this. *  
0680: 20 20 20 20 61 6c 67 6f 72 69 74 68 6d 20 63 61      algorithm ca
0690: 6e 20 73 65 72 76 65 20 61 73 20 61 20 6d 65 61  n serve as a mea
06a0: 6e 73 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 20  ns of providing 
06b0: 61 0a 20 2a 20 20 20 20 20 20 22 66 69 6e 67 65  a. *      "finge
06c0: 72 70 72 69 6e 74 22 20 66 6f 72 20 61 20 6d 65  rprint" for a me
06d0: 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 20 50 6f  ssage.. *. *  Po
06e0: 72 74 61 62 69 6c 69 74 79 20 49 73 73 75 65 73  rtability Issues
06f0: 3a 0a 20 2a 20 20 20 20 20 20 53 48 41 2d 31 20  :. *      SHA-1 
0700: 69 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65  is defined in te
0710: 72 6d 73 20 6f 66 20 33 32 2d 62 69 74 20 22 77  rms of 32-bit "w
0720: 6f 72 64 73 22 2e 20 20 54 68 69 73 20 63 6f 64  ords".  This cod
0730: 65 0a 20 2a 20 20 20 20 20 20 75 73 65 73 20 3c  e. *      uses <
0740: 73 74 64 69 6e 74 2e 68 3e 20 28 69 6e 63 6c 75  stdint.h> (inclu
0750: 64 65 64 20 76 69 61 20 22 73 68 61 31 2e 68 22  ded via "sha1.h"
0760: 20 74 6f 20 64 65 66 69 6e 65 20 33 32 20 61 6e   to define 32 an
0770: 64 20 38 0a 20 2a 20 20 20 20 20 20 62 69 74 20  d 8. *      bit 
0780: 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
0790: 20 74 79 70 65 73 2e 20 20 49 66 20 79 6f 75 72   types.  If your
07a0: 20 43 20 63 6f 6d 70 69 6c 65 72 20 64 6f 65 73   C compiler does
07b0: 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20 73 75 70   not. *      sup
07c0: 70 6f 72 74 20 33 32 20 62 69 74 20 75 6e 73 69  port 32 bit unsi
07d0: 67 6e 65 64 20 69 6e 74 65 67 65 72 73 2c 20 74  gned integers, t
07e0: 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 74 0a  his code is not.
07f0: 20 2a 20 20 20 20 20 20 61 70 70 72 6f 70 72 69   *      appropri
0800: 61 74 65 2e 0a 20 2a 0a 20 2a 20 20 43 61 76 65  ate.. *. *  Cave
0810: 61 74 73 3a 0a 20 2a 20 20 20 20 20 20 53 48 41  ats:. *      SHA
0820: 2d 31 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  -1 is designed t
0830: 6f 20 77 6f 72 6b 20 77 69 74 68 20 6d 65 73 73  o work with mess
0840: 61 67 65 73 20 6c 65 73 73 20 74 68 61 6e 20 32  ages less than 2
0850: 5e 36 34 20 62 69 74 73 0a 20 2a 20 20 20 20 20  ^64 bits. *     
0860: 20 6c 6f 6e 67 2e 20 20 41 6c 74 68 6f 75 67 68   long.  Although
0870: 20 53 48 41 2d 31 20 61 6c 6c 6f 77 73 20 61 20   SHA-1 allows a 
0880: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 74  message digest t
0890: 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20  o be generated. 
08a0: 2a 20 20 20 20 20 20 66 6f 72 20 6d 65 73 73 61  *      for messa
08b0: 67 65 73 20 6f 66 20 61 6e 79 20 6e 75 6d 62 65  ges of any numbe
08c0: 72 20 6f 66 20 62 69 74 73 20 6c 65 73 73 20 74  r of bits less t
08d0: 68 61 6e 20 32 5e 36 34 2c 20 74 68 69 73 0a 20  han 2^64, this. 
08e0: 2a 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74  *      implement
08f0: 61 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73  ation only works
0900: 20 77 69 74 68 20 6d 65 73 73 61 67 65 73 20 77   with messages w
0910: 69 74 68 20 61 20 6c 65 6e 67 74 68 20 74 68 61  ith a length tha
0920: 74 20 69 73 0a 20 2a 20 20 20 20 20 20 61 20 6d  t is. *      a m
0930: 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 73  ultiple of the s
0940: 69 7a 65 20 6f 66 20 61 6e 20 38 2d 62 69 74 20  ize of an 8-bit 
0950: 63 68 61 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a  character.. *. *
0960: 2f 0a 0a 2f 2a 0a 20 2a 20 20 44 65 66 69 6e 65  /../*. *  Define
0970: 20 74 68 65 20 53 48 41 31 20 63 69 72 63 75 6c   the SHA1 circul
0980: 61 72 20 6c 65 66 74 20 73 68 69 66 74 20 6d 61  ar left shift ma
0990: 63 72 6f 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cro. */.#define 
09a0: 53 48 41 31 43 69 72 63 75 6c 61 72 53 68 69 66  SHA1CircularShif
09b0: 74 28 62 69 74 73 2c 77 6f 72 64 29 20 5c 0a 20  t(bits,word) \. 
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
09d0: 28 28 77 6f 72 64 29 20 3c 3c 20 28 62 69 74 73  ((word) << (bits
09e0: 29 29 20 7c 20 28 28 77 6f 72 64 29 20 3e 3e 20  )) | ((word) >> 
09f0: 28 33 32 2d 28 62 69 74 73 29 29 29 29 0a 0a 2f  (32-(bits))))../
0a00: 2a 20 4c 6f 63 61 6c 20 46 75 6e 63 74 69 6f 6e  * Local Function
0a10: 20 50 72 6f 74 6f 74 79 70 74 65 73 20 2a 2f 0a   Prototyptes */.
0a20: 73 74 61 74 69 63 20 76 6f 69 64 20 53 48 41 31  static void SHA1
0a30: 50 61 64 4d 65 73 73 61 67 65 28 53 48 41 31 43  PadMessage(SHA1C
0a40: 6f 6e 74 65 78 74 20 2a 29 3b 0a 73 74 61 74 69  ontext *);.stati
0a50: 63 20 76 6f 69 64 20 53 48 41 31 50 72 6f 63 65  c void SHA1Proce
0a60: 73 73 4d 65 73 73 61 67 65 42 6c 6f 63 6b 28 53  ssMessageBlock(S
0a70: 48 41 31 43 6f 6e 74 65 78 74 20 2a 29 3b 0a 0a  HA1Context *);..
0a80: 2f 2a 0a 20 2a 20 20 53 48 41 31 52 65 73 65 74  /*. *  SHA1Reset
0a90: 0a 20 2a 0a 20 2a 20 20 44 65 73 63 72 69 70 74  . *. *  Descript
0aa0: 69 6f 6e 3a 0a 20 2a 20 20 20 20 20 20 54 68 69  ion:. *      Thi
0ab0: 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
0ac0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 53  initialize the S
0ad0: 48 41 31 43 6f 6e 74 65 78 74 20 69 6e 20 70 72  HA1Context in pr
0ae0: 65 70 61 72 61 74 69 6f 6e 0a 20 2a 20 20 20 20  eparation. *    
0af0: 20 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20    for computing 
0b00: 61 20 6e 65 77 20 53 48 41 31 20 6d 65 73 73 61  a new SHA1 messa
0b10: 67 65 20 64 69 67 65 73 74 2e 0a 20 2a 0a 20 2a  ge digest.. *. *
0b20: 20 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 20 2a    Parameters:. *
0b30: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 3a 20 5b        context: [
0b40: 69 6e 2f 6f 75 74 5d 0a 20 2a 20 20 20 20 20 20  in/out]. *      
0b50: 20 20 20 20 54 68 65 20 63 6f 6e 74 65 78 74 20      The context 
0b60: 74 6f 20 72 65 73 65 74 2e 0a 20 2a 0a 20 2a 20  to reset.. *. * 
0b70: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 20 20 20 20   Returns:. *    
0b80: 20 20 73 68 61 20 45 72 72 6f 72 20 43 6f 64 65    sha Error Code
0b90: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
0ba0: 69 6e 74 20 53 48 41 31 52 65 73 65 74 28 53 48  int SHA1Reset(SH
0bb0: 41 31 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  A1Context *conte
0bc0: 78 74 29 0a 7b 0a 20 20 20 20 63 6f 6e 74 65 78  xt).{.    contex
0bd0: 74 2d 3e 4c 65 6e 67 74 68 5f 4c 6f 77 20 20 20  t->Length_Low   
0be0: 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20            = 0;. 
0bf0: 20 20 20 63 6f 6e 74 65 78 74 2d 3e 4c 65 6e 67     context->Leng
0c00: 74 68 5f 48 69 67 68 20 20 20 20 20 20 20 20 20  th_High         
0c10: 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 74     = 0;.    cont
0c20: 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f  ext->Message_Blo
0c30: 63 6b 5f 49 6e 64 65 78 20 20 20 20 3d 20 30 3b  ck_Index    = 0;
0c40: 0a 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 49  ..    context->I
0c50: 6e 74 65 72 6d 65 64 69 61 74 65 5f 48 61 73 68  ntermediate_Hash
0c60: 5b 30 5d 20 20 20 3d 20 30 78 36 37 34 35 32 33  [0]   = 0x674523
0c70: 30 31 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d  01;.    context-
0c80: 3e 49 6e 74 65 72 6d 65 64 69 61 74 65 5f 48 61  >Intermediate_Ha
0c90: 73 68 5b 31 5d 20 20 20 3d 20 30 78 45 46 43 44  sh[1]   = 0xEFCD
0ca0: 41 42 38 39 3b 0a 20 20 20 20 63 6f 6e 74 65 78  AB89;.    contex
0cb0: 74 2d 3e 49 6e 74 65 72 6d 65 64 69 61 74 65 5f  t->Intermediate_
0cc0: 48 61 73 68 5b 32 5d 20 20 20 3d 20 30 78 39 38  Hash[2]   = 0x98
0cd0: 42 41 44 43 46 45 3b 0a 20 20 20 20 63 6f 6e 74  BADCFE;.    cont
0ce0: 65 78 74 2d 3e 49 6e 74 65 72 6d 65 64 69 61 74  ext->Intermediat
0cf0: 65 5f 48 61 73 68 5b 33 5d 20 20 20 3d 20 30 78  e_Hash[3]   = 0x
0d00: 31 30 33 32 35 34 37 36 3b 0a 20 20 20 20 63 6f  10325476;.    co
0d10: 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d 65 64 69  ntext->Intermedi
0d20: 61 74 65 5f 48 61 73 68 5b 34 5d 20 20 20 3d 20  ate_Hash[4]   = 
0d30: 30 78 43 33 44 32 45 31 46 30 3b 0a 0a 20 20 20  0xC3D2E1F0;..   
0d40: 20 63 6f 6e 74 65 78 74 2d 3e 43 6f 6d 70 75 74   context->Comput
0d50: 65 64 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 6f  ed   = 0;.    co
0d60: 6e 74 65 78 74 2d 3e 43 6f 72 72 75 70 74 65 64  ntext->Corrupted
0d70: 20 20 3d 20 30 3b 0a 0a 20 20 20 20 72 65 74 75    = 0;..    retu
0d80: 72 6e 20 73 68 61 53 75 63 63 65 73 73 3b 0a 7d  rn shaSuccess;.}
0d90: 0a 0a 2f 2a 0a 20 2a 20 20 53 48 41 31 52 65 73  ../*. *  SHA1Res
0da0: 75 6c 74 0a 20 2a 0a 20 2a 20 20 44 65 73 63 72  ult. *. *  Descr
0db0: 69 70 74 69 6f 6e 3a 0a 20 2a 20 20 20 20 20 20  iption:. *      
0dc0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  This function wi
0dd0: 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20 31 36  ll return the 16
0de0: 30 2d 62 69 74 20 6d 65 73 73 61 67 65 20 64 69  0-bit message di
0df0: 67 65 73 74 20 69 6e 74 6f 20 74 68 65 0a 20 2a  gest into the. *
0e00: 20 20 20 20 20 20 4d 65 73 73 61 67 65 5f 44 69        Message_Di
0e10: 67 65 73 74 20 61 72 72 61 79 20 20 70 72 6f 76  gest array  prov
0e20: 69 64 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ided by the call
0e30: 65 72 2e 0a 20 2a 20 20 20 20 20 20 4e 4f 54 45  er.. *      NOTE
0e40: 3a 20 54 68 65 20 66 69 72 73 74 20 6f 63 74 65  : The first octe
0e50: 74 20 6f 66 20 68 61 73 68 20 69 73 20 73 74 6f  t of hash is sto
0e60: 72 65 64 20 69 6e 20 74 68 65 20 30 74 68 20 65  red in the 0th e
0e70: 6c 65 6d 65 6e 74 2c 0a 20 2a 20 20 20 20 20 20  lement,. *      
0e80: 20 20 20 20 20 20 74 68 65 20 6c 61 73 74 20 6f        the last o
0e90: 63 74 65 74 20 6f 66 20 68 61 73 68 20 69 6e 20  ctet of hash in 
0ea0: 74 68 65 20 31 39 74 68 20 65 6c 65 6d 65 6e 74  the 19th element
0eb0: 2e 0a 20 2a 0a 20 2a 20 20 50 61 72 61 6d 65 74  .. *. *  Paramet
0ec0: 65 72 73 3a 0a 20 2a 20 20 20 20 20 20 63 6f 6e  ers:. *      con
0ed0: 74 65 78 74 3a 20 5b 69 6e 2f 6f 75 74 5d 0a 20  text: [in/out]. 
0ee0: 2a 20 20 20 20 20 20 20 20 20 20 54 68 65 20 63  *          The c
0ef0: 6f 6e 74 65 78 74 20 74 6f 20 75 73 65 20 74 6f  ontext to use to
0f00: 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 53   calculate the S
0f10: 48 41 2d 31 20 68 61 73 68 2e 0a 20 2a 20 20 20  HA-1 hash.. *   
0f20: 20 20 20 4d 65 73 73 61 67 65 5f 44 69 67 65 73     Message_Diges
0f30: 74 3a 20 5b 6f 75 74 5d 0a 20 2a 20 20 20 20 20  t: [out]. *     
0f40: 20 20 20 20 20 57 68 65 72 65 20 74 68 65 20 64       Where the d
0f50: 69 67 65 73 74 20 69 73 20 72 65 74 75 72 6e 65  igest is returne
0f60: 64 2e 0a 20 2a 0a 20 2a 20 20 52 65 74 75 72 6e  d.. *. *  Return
0f70: 73 3a 0a 20 2a 20 20 20 20 20 20 73 68 61 20 45  s:. *      sha E
0f80: 72 72 6f 72 20 43 6f 64 65 2e 0a 20 2a 0a 20 2a  rror Code.. *. *
0f90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 48 41  /.static int SHA
0fa0: 31 52 65 73 75 6c 74 28 20 53 48 41 31 43 6f 6e  1Result( SHA1Con
0fb0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
0fd0: 69 6e 74 38 5f 74 20 4d 65 73 73 61 67 65 5f 44  int8_t Message_D
0fe0: 69 67 65 73 74 5b 53 48 41 31 48 61 73 68 53 69  igest[SHA1HashSi
0ff0: 7a 65 5d 29 0a 7b 0a 20 20 20 20 69 6e 74 20 69  ze]).{.    int i
1000: 3b 0a 0a 20 20 20 20 69 66 20 28 63 6f 6e 74 65  ;..    if (conte
1010: 78 74 2d 3e 43 6f 72 72 75 70 74 65 64 29 0a 20  xt->Corrupted). 
1020: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74     {.        ret
1030: 75 72 6e 20 63 6f 6e 74 65 78 74 2d 3e 43 6f 72  urn context->Cor
1040: 72 75 70 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  rupted;.    }.. 
1050: 20 20 20 69 66 20 28 21 63 6f 6e 74 65 78 74 2d     if (!context-
1060: 3e 43 6f 6d 70 75 74 65 64 29 0a 20 20 20 20 7b  >Computed).    {
1070: 0a 20 20 20 20 20 20 20 20 53 48 41 31 50 61 64  .        SHA1Pad
1080: 4d 65 73 73 61 67 65 28 63 6f 6e 74 65 78 74 29  Message(context)
1090: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
10a0: 30 3b 20 69 3c 36 34 3b 20 2b 2b 69 29 0a 20 20  0; i<64; ++i).  
10b0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
10c0: 20 20 20 20 2f 2a 20 6d 65 73 73 61 67 65 20 6d      /* message m
10d0: 61 79 20 62 65 20 73 65 6e 73 69 74 69 76 65 2c  ay be sensitive,
10e0: 20 63 6c 65 61 72 20 69 74 20 6f 75 74 20 2a 2f   clear it out */
10f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
1100: 74 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c  text->Message_Bl
1110: 6f 63 6b 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  ock[i] = 0;.    
1120: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6f      }.        co
1130: 6e 74 65 78 74 2d 3e 4c 65 6e 67 74 68 5f 4c 6f  ntext->Length_Lo
1140: 77 20 3d 20 30 3b 20 20 20 20 2f 2a 20 61 6e 64  w = 0;    /* and
1150: 20 63 6c 65 61 72 20 6c 65 6e 67 74 68 20 2a 2f   clear length */
1160: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
1170: 2d 3e 4c 65 6e 67 74 68 5f 48 69 67 68 20 3d 20  ->Length_High = 
1180: 30 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65  0;.        conte
1190: 78 74 2d 3e 43 6f 6d 70 75 74 65 64 20 3d 20 31  xt->Computed = 1
11a0: 3b 0a 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f  ;..    }..    fo
11b0: 72 28 69 20 3d 20 30 3b 20 69 20 3c 20 53 48 41  r(i = 0; i < SHA
11c0: 31 48 61 73 68 53 69 7a 65 3b 20 2b 2b 69 29 0a  1HashSize; ++i).
11d0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 4d 65      {.        Me
11e0: 73 73 61 67 65 5f 44 69 67 65 73 74 5b 69 5d 20  ssage_Digest[i] 
11f0: 3d 20 63 6f 6e 74 65 78 74 2d 3e 49 6e 74 65 72  = context->Inter
1200: 6d 65 64 69 61 74 65 5f 48 61 73 68 5b 69 3e 3e  mediate_Hash[i>>
1210: 32 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2].             
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3e                 >
1230: 3e 20 38 20 2a 20 28 20 33 20 2d 20 28 20 69 20  > 8 * ( 3 - ( i 
1240: 26 20 30 78 30 33 20 29 20 29 3b 0a 20 20 20 20  & 0x03 ) );.    
1250: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 73 68  }..    return sh
1260: 61 53 75 63 63 65 73 73 3b 0a 7d 0a 0a 2f 2a 0a  aSuccess;.}../*.
1270: 20 2a 20 20 53 48 41 31 49 6e 70 75 74 0a 20 2a   *  SHA1Input. *
1280: 0a 20 2a 20 20 44 65 73 63 72 69 70 74 69 6f 6e  . *  Description
1290: 3a 0a 20 2a 20 20 20 20 20 20 54 68 69 73 20 66  :. *      This f
12a0: 75 6e 63 74 69 6f 6e 20 61 63 63 65 70 74 73 20  unction accepts 
12b0: 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 63 74 65  an array of octe
12c0: 74 73 20 61 73 20 74 68 65 20 6e 65 78 74 20 70  ts as the next p
12d0: 6f 72 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 6f  ortion. *      o
12e0: 66 20 74 68 65 20 6d 65 73 73 61 67 65 2e 0a 20  f the message.. 
12f0: 2a 0a 20 2a 20 20 50 61 72 61 6d 65 74 65 72 73  *. *  Parameters
1300: 3a 0a 20 2a 20 20 20 20 20 20 63 6f 6e 74 65 78  :. *      contex
1310: 74 3a 20 5b 69 6e 2f 6f 75 74 5d 0a 20 2a 20 20  t: [in/out]. *  
1320: 20 20 20 20 20 20 20 20 54 68 65 20 53 48 41 20          The SHA 
1330: 63 6f 6e 74 65 78 74 20 74 6f 20 75 70 64 61 74  context to updat
1340: 65 0a 20 2a 20 20 20 20 20 20 6d 65 73 73 61 67  e. *      messag
1350: 65 5f 61 72 72 61 79 3a 20 5b 69 6e 5d 0a 20 2a  e_array: [in]. *
1360: 20 20 20 20 20 20 20 20 20 20 41 6e 20 61 72 72            An arr
1370: 61 79 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  ay of characters
1380: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
1390: 65 20 6e 65 78 74 20 70 6f 72 74 69 6f 6e 20 6f  e next portion o
13a0: 66 0a 20 2a 20 20 20 20 20 20 20 20 20 20 74 68  f. *          th
13b0: 65 20 6d 65 73 73 61 67 65 2e 0a 20 2a 20 20 20  e message.. *   
13c0: 20 20 20 6c 65 6e 67 74 68 3a 20 5b 69 6e 5d 0a     length: [in].
13d0: 20 2a 20 20 20 20 20 20 20 20 20 20 54 68 65 20   *          The 
13e0: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6d 65  length of the me
13f0: 73 73 61 67 65 20 69 6e 20 6d 65 73 73 61 67 65  ssage in message
1400: 5f 61 72 72 61 79 0a 20 2a 0a 20 2a 20 20 52 65  _array. *. *  Re
1410: 74 75 72 6e 73 3a 0a 20 2a 20 20 20 20 20 20 73  turns:. *      s
1420: 68 61 20 45 72 72 6f 72 20 43 6f 64 65 2e 0a 20  ha Error Code.. 
1430: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 0a 69 6e 74  *. */.static.int
1440: 20 53 48 41 31 49 6e 70 75 74 28 20 20 20 20 53   SHA1Input(    S
1450: 48 41 31 43 6f 6e 74 65 78 74 20 20 20 20 2a 63  HA1Context    *c
1460: 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ontext,.        
1470: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
1480: 75 69 6e 74 38 5f 74 20 20 2a 6d 65 73 73 61 67  uint8_t  *messag
1490: 65 5f 61 72 72 61 79 2c 0a 20 20 20 20 20 20 20  e_array,.       
14a0: 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67             unsig
14b0: 6e 65 64 20 20 20 20 20 20 20 6c 65 6e 67 74 68  ned       length
14c0: 29 0a 7b 0a 20 20 20 20 69 66 20 28 21 6c 65 6e  ).{.    if (!len
14d0: 67 74 68 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  gth).    {.     
14e0: 20 20 20 72 65 74 75 72 6e 20 73 68 61 53 75 63     return shaSuc
14f0: 63 65 73 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  cess;.    }..   
1500: 20 69 66 20 28 63 6f 6e 74 65 78 74 2d 3e 43 6f   if (context->Co
1510: 6d 70 75 74 65 64 29 0a 20 20 20 20 7b 0a 20 20  mputed).    {.  
1520: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 43        context->C
1530: 6f 72 72 75 70 74 65 64 20 3d 20 73 68 61 53 74  orrupted = shaSt
1540: 61 74 65 45 72 72 6f 72 3b 0a 0a 20 20 20 20 20  ateError;..     
1550: 20 20 20 72 65 74 75 72 6e 20 73 68 61 53 74 61     return shaSta
1560: 74 65 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a  teError;.    }..
1570: 20 20 20 20 69 66 20 28 63 6f 6e 74 65 78 74 2d      if (context-
1580: 3e 43 6f 72 72 75 70 74 65 64 29 0a 20 20 20 20  >Corrupted).    
1590: 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  {.         retur
15a0: 6e 20 63 6f 6e 74 65 78 74 2d 3e 43 6f 72 72 75  n context->Corru
15b0: 70 74 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pted;.    }.    
15c0: 77 68 69 6c 65 28 6c 65 6e 67 74 68 2d 2d 20 26  while(length-- &
15d0: 26 20 21 63 6f 6e 74 65 78 74 2d 3e 43 6f 72 72  & !context->Corr
15e0: 75 70 74 65 64 29 0a 20 20 20 20 7b 0a 20 20 20  upted).    {.   
15f0: 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67   context->Messag
1600: 65 5f 42 6c 6f 63 6b 5b 63 6f 6e 74 65 78 74 2d  e_Block[context-
1610: 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63 6b 5f 49  >Message_Block_I
1620: 6e 64 65 78 2b 2b 5d 20 3d 0a 20 20 20 20 20 20  ndex++] =.      
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 2a                (*
1640: 6d 65 73 73 61 67 65 5f 61 72 72 61 79 20 26 20  message_array & 
1650: 30 78 46 46 29 3b 0a 0a 20 20 20 20 63 6f 6e 74  0xFF);..    cont
1660: 65 78 74 2d 3e 4c 65 6e 67 74 68 5f 4c 6f 77 20  ext->Length_Low 
1670: 2b 3d 20 38 3b 0a 20 20 20 20 69 66 20 28 63 6f  += 8;.    if (co
1680: 6e 74 65 78 74 2d 3e 4c 65 6e 67 74 68 5f 4c 6f  ntext->Length_Lo
1690: 77 20 3d 3d 20 30 29 0a 20 20 20 20 7b 0a 20 20  w == 0).    {.  
16a0: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 4c        context->L
16b0: 65 6e 67 74 68 5f 48 69 67 68 2b 2b 3b 0a 20 20  ength_High++;.  
16c0: 20 20 20 20 20 20 69 66 20 28 63 6f 6e 74 65 78        if (contex
16d0: 74 2d 3e 4c 65 6e 67 74 68 5f 48 69 67 68 20 3d  t->Length_High =
16e0: 3d 20 30 29 0a 20 20 20 20 20 20 20 20 7b 0a 20  = 0).        {. 
16f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
1700: 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 6f 6e  ssage is too lon
1710: 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  g */.           
1720: 20 63 6f 6e 74 65 78 74 2d 3e 43 6f 72 72 75 70   context->Corrup
1730: 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ted = 1;.       
1740: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
1750: 20 28 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61   (context->Messa
1760: 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78 20 3d  ge_Block_Index =
1770: 3d 20 36 34 29 0a 20 20 20 20 7b 0a 20 20 20 20  = 64).    {.    
1780: 20 20 20 20 53 48 41 31 50 72 6f 63 65 73 73 4d      SHA1ProcessM
1790: 65 73 73 61 67 65 42 6c 6f 63 6b 28 63 6f 6e 74  essageBlock(cont
17a0: 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ext);.    }..   
17b0: 20 6d 65 73 73 61 67 65 5f 61 72 72 61 79 2b 2b   message_array++
17c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
17d0: 75 72 6e 20 73 68 61 53 75 63 63 65 73 73 3b 0a  urn shaSuccess;.
17e0: 7d 0a 0a 2f 2a 0a 20 2a 20 20 53 48 41 31 50 72  }../*. *  SHA1Pr
17f0: 6f 63 65 73 73 4d 65 73 73 61 67 65 42 6c 6f 63  ocessMessageBloc
1800: 6b 0a 20 2a 0a 20 2a 20 20 44 65 73 63 72 69 70  k. *. *  Descrip
1810: 74 69 6f 6e 3a 0a 20 2a 20 20 20 20 20 20 54 68  tion:. *      Th
1820: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
1830: 20 70 72 6f 63 65 73 73 20 74 68 65 20 6e 65 78   process the nex
1840: 74 20 35 31 32 20 62 69 74 73 20 6f 66 20 74 68  t 512 bits of th
1850: 65 20 6d 65 73 73 61 67 65 0a 20 2a 20 20 20 20  e message. *    
1860: 20 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20    stored in the 
1870: 4d 65 73 73 61 67 65 5f 42 6c 6f 63 6b 20 61 72  Message_Block ar
1880: 72 61 79 2e 0a 20 2a 0a 20 2a 20 20 50 61 72 61  ray.. *. *  Para
1890: 6d 65 74 65 72 73 3a 0a 20 2a 20 20 20 20 20 20  meters:. *      
18a0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 20 52 65 74  None.. *. *  Ret
18b0: 75 72 6e 73 3a 0a 20 2a 20 20 20 20 20 20 4e 6f  urns:. *      No
18c0: 74 68 69 6e 67 2e 0a 20 2a 0a 20 2a 20 20 43 6f  thing.. *. *  Co
18d0: 6d 6d 65 6e 74 73 3a 0a 20 2a 20 20 20 20 20 20  mments:. *      
18e0: 4d 61 6e 79 20 6f 66 20 74 68 65 20 76 61 72 69  Many of the vari
18f0: 61 62 6c 65 20 6e 61 6d 65 73 20 69 6e 20 74 68  able names in th
1900: 69 73 20 63 6f 64 65 2c 20 65 73 70 65 63 69 61  is code, especia
1910: 6c 6c 79 20 74 68 65 0a 20 2a 20 20 20 20 20 20  lly the. *      
1920: 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72  single character
1930: 20 6e 61 6d 65 73 2c 20 77 65 72 65 20 75 73 65   names, were use
1940: 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  d because those 
1950: 77 65 72 65 20 74 68 65 0a 20 2a 20 20 20 20 20  were the. *     
1960: 20 6e 61 6d 65 73 20 75 73 65 64 20 69 6e 20 74   names used in t
1970: 68 65 20 70 75 62 6c 69 63 61 74 69 6f 6e 2e 0a  he publication..
1980: 20 2a 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63   *. *. */.static
1990: 20 76 6f 69 64 20 53 48 41 31 50 72 6f 63 65 73   void SHA1Proces
19a0: 73 4d 65 73 73 61 67 65 42 6c 6f 63 6b 28 53 48  sMessageBlock(SH
19b0: 41 31 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  A1Context *conte
19c0: 78 74 29 0a 7b 0a 20 20 20 20 63 6f 6e 73 74 20  xt).{.    const 
19d0: 75 69 6e 74 33 32 5f 74 20 4b 5b 5d 20 3d 20 20  uint32_t K[] =  
19e0: 20 20 7b 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e    {       /* Con
19f0: 73 74 61 6e 74 73 20 64 65 66 69 6e 65 64 20 69  stants defined i
1a00: 6e 20 53 48 41 2d 31 20 20 20 2a 2f 0a 20 20 20  n SHA-1   */.   
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a20: 20 20 20 20 20 20 20 20 20 30 78 35 41 38 32 37           0x5A827
1a30: 39 39 39 2c 0a 20 20 20 20 20 20 20 20 20 20 20  999,.           
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 30 78 36 45 44 39 45 42 41 31 2c 0a 20 20 20   0x6ED9EBA1,.   
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 20 20 20 30 78 38 46 31 42 42           0x8F1BB
1a80: 43 44 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20  CDC,.           
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 30 78 43 41 36 32 43 31 44 36 0a 20 20 20 20   0xCA62C1D6.    
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 69          };.    i
1ad0: 6e 74 20 20 20 20 20 20 20 20 20 20 20 74 3b 20  nt           t; 
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1b10: 2f 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 20  /.    uint32_t  
1b20: 20 20 20 20 74 65 6d 70 3b 20 20 20 20 20 20 20      temp;       
1b30: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
1b40: 61 72 79 20 77 6f 72 64 20 76 61 6c 75 65 20 20  ary word value  
1b50: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 75 69 6e        */.    uin
1b60: 74 33 32 5f 74 20 20 20 20 20 20 57 5b 38 30 5d  t32_t      W[80]
1b70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b80: 20 57 6f 72 64 20 73 65 71 75 65 6e 63 65 20 20   Word sequence  
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
1ba0: 20 20 20 20 75 69 6e 74 33 32 5f 74 20 20 20 20      uint32_t    
1bb0: 20 20 41 2c 20 42 2c 20 43 2c 20 44 2c 20 45 3b    A, B, C, D, E;
1bc0: 20 20 20 20 20 2f 2a 20 57 6f 72 64 20 62 75 66       /* Word buf
1bd0: 66 65 72 73 20 20 20 20 20 20 20 20 20 20 20 20  fers            
1be0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20      */..    /*. 
1bf0: 20 20 20 20 2a 20 20 49 6e 69 74 69 61 6c 69 7a      *  Initializ
1c00: 65 20 74 68 65 20 66 69 72 73 74 20 31 36 20 77  e the first 16 w
1c10: 6f 72 64 73 20 69 6e 20 74 68 65 20 61 72 72 61  ords in the arra
1c20: 79 20 57 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  y W.     */.    
1c30: 66 6f 72 28 74 20 3d 20 30 3b 20 74 20 3c 20 31  for(t = 0; t < 1
1c40: 36 3b 20 74 2b 2b 29 0a 20 20 20 20 7b 0a 20 20  6; t++).    {.  
1c50: 20 20 20 20 20 20 57 5b 74 5d 20 3d 20 63 6f 6e        W[t] = con
1c60: 74 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c  text->Message_Bl
1c70: 6f 63 6b 5b 74 20 2a 20 34 5d 20 3c 3c 20 32 34  ock[t * 4] << 24
1c80: 3b 0a 20 20 20 20 20 20 20 20 57 5b 74 5d 20 7c  ;.        W[t] |
1c90: 3d 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61  = context->Messa
1ca0: 67 65 5f 42 6c 6f 63 6b 5b 74 20 2a 20 34 20 2b  ge_Block[t * 4 +
1cb0: 20 31 5d 20 3c 3c 20 31 36 3b 0a 20 20 20 20 20   1] << 16;.     
1cc0: 20 20 20 57 5b 74 5d 20 7c 3d 20 63 6f 6e 74 65     W[t] |= conte
1cd0: 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63  xt->Message_Bloc
1ce0: 6b 5b 74 20 2a 20 34 20 2b 20 32 5d 20 3c 3c 20  k[t * 4 + 2] << 
1cf0: 38 3b 0a 20 20 20 20 20 20 20 20 57 5b 74 5d 20  8;.        W[t] 
1d00: 7c 3d 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73  |= context->Mess
1d10: 61 67 65 5f 42 6c 6f 63 6b 5b 74 20 2a 20 34 20  age_Block[t * 4 
1d20: 2b 20 33 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  + 3];.    }..   
1d30: 20 66 6f 72 28 74 20 3d 20 31 36 3b 20 74 20 3c   for(t = 16; t <
1d40: 20 38 30 3b 20 74 2b 2b 29 0a 20 20 20 20 7b 0a   80; t++).    {.
1d50: 20 20 20 20 20 20 20 57 5b 74 5d 20 3d 20 53 48         W[t] = SH
1d60: 41 31 43 69 72 63 75 6c 61 72 53 68 69 66 74 28  A1CircularShift(
1d70: 31 2c 57 5b 74 2d 33 5d 20 5e 20 57 5b 74 2d 38  1,W[t-3] ^ W[t-8
1d80: 5d 20 5e 20 57 5b 74 2d 31 34 5d 20 5e 20 57 5b  ] ^ W[t-14] ^ W[
1d90: 74 2d 31 36 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20  t-16]);.    }.. 
1da0: 20 20 20 41 20 3d 20 63 6f 6e 74 65 78 74 2d 3e     A = context->
1db0: 49 6e 74 65 72 6d 65 64 69 61 74 65 5f 48 61 73  Intermediate_Has
1dc0: 68 5b 30 5d 3b 0a 20 20 20 20 42 20 3d 20 63 6f  h[0];.    B = co
1dd0: 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d 65 64 69  ntext->Intermedi
1de0: 61 74 65 5f 48 61 73 68 5b 31 5d 3b 0a 20 20 20  ate_Hash[1];.   
1df0: 20 43 20 3d 20 63 6f 6e 74 65 78 74 2d 3e 49 6e   C = context->In
1e00: 74 65 72 6d 65 64 69 61 74 65 5f 48 61 73 68 5b  termediate_Hash[
1e10: 32 5d 3b 0a 20 20 20 20 44 20 3d 20 63 6f 6e 74  2];.    D = cont
1e20: 65 78 74 2d 3e 49 6e 74 65 72 6d 65 64 69 61 74  ext->Intermediat
1e30: 65 5f 48 61 73 68 5b 33 5d 3b 0a 20 20 20 20 45  e_Hash[3];.    E
1e40: 20 3d 20 63 6f 6e 74 65 78 74 2d 3e 49 6e 74 65   = context->Inte
1e50: 72 6d 65 64 69 61 74 65 5f 48 61 73 68 5b 34 5d  rmediate_Hash[4]
1e60: 3b 0a 0a 20 20 20 20 66 6f 72 28 74 20 3d 20 30  ;..    for(t = 0
1e70: 3b 20 74 20 3c 20 32 30 3b 20 74 2b 2b 29 0a 20  ; t < 20; t++). 
1e80: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 74 65 6d     {.        tem
1e90: 70 20 3d 20 20 53 48 41 31 43 69 72 63 75 6c 61  p =  SHA1Circula
1ea0: 72 53 68 69 66 74 28 35 2c 41 29 20 2b 0a 20 20  rShift(5,A) +.  
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
1ec0: 42 20 26 20 43 29 20 7c 20 28 28 7e 42 29 20 26  B & C) | ((~B) &
1ed0: 20 44 29 29 20 2b 20 45 20 2b 20 57 5b 74 5d 20   D)) + E + W[t] 
1ee0: 2b 20 4b 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  + K[0];.        
1ef0: 45 20 3d 20 44 3b 0a 20 20 20 20 20 20 20 20 44  E = D;.        D
1f00: 20 3d 20 43 3b 0a 20 20 20 20 20 20 20 20 43 20   = C;.        C 
1f10: 3d 20 53 48 41 31 43 69 72 63 75 6c 61 72 53 68  = SHA1CircularSh
1f20: 69 66 74 28 33 30 2c 42 29 3b 0a 0a 20 20 20 20  ift(30,B);..    
1f30: 20 20 20 20 42 20 3d 20 41 3b 0a 20 20 20 20 20      B = A;.     
1f40: 20 20 20 41 20 3d 20 74 65 6d 70 3b 0a 20 20 20     A = temp;.   
1f50: 20 7d 0a 0a 20 20 20 20 66 6f 72 28 74 20 3d 20   }..    for(t = 
1f60: 32 30 3b 20 74 20 3c 20 34 30 3b 20 74 2b 2b 29  20; t < 40; t++)
1f70: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 74  .    {.        t
1f80: 65 6d 70 20 3d 20 53 48 41 31 43 69 72 63 75 6c  emp = SHA1Circul
1f90: 61 72 53 68 69 66 74 28 35 2c 41 29 20 2b 20 28  arShift(5,A) + (
1fa0: 42 20 5e 20 43 20 5e 20 44 29 20 2b 20 45 20 2b  B ^ C ^ D) + E +
1fb0: 20 57 5b 74 5d 20 2b 20 4b 5b 31 5d 3b 0a 20 20   W[t] + K[1];.  
1fc0: 20 20 20 20 20 20 45 20 3d 20 44 3b 0a 20 20 20        E = D;.   
1fd0: 20 20 20 20 20 44 20 3d 20 43 3b 0a 20 20 20 20       D = C;.    
1fe0: 20 20 20 20 43 20 3d 20 53 48 41 31 43 69 72 63      C = SHA1Circ
1ff0: 75 6c 61 72 53 68 69 66 74 28 33 30 2c 42 29 3b  ularShift(30,B);
2000: 0a 20 20 20 20 20 20 20 20 42 20 3d 20 41 3b 0a  .        B = A;.
2010: 20 20 20 20 20 20 20 20 41 20 3d 20 74 65 6d 70          A = temp
2020: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
2030: 28 74 20 3d 20 34 30 3b 20 74 20 3c 20 36 30 3b  (t = 40; t < 60;
2040: 20 74 2b 2b 29 0a 20 20 20 20 7b 0a 20 20 20 20   t++).    {.    
2050: 20 20 20 20 74 65 6d 70 20 3d 20 53 48 41 31 43      temp = SHA1C
2060: 69 72 63 75 6c 61 72 53 68 69 66 74 28 35 2c 41  ircularShift(5,A
2070: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) +.            
2080: 20 20 20 28 28 42 20 26 20 43 29 20 7c 20 28 42     ((B & C) | (B
2090: 20 26 20 44 29 20 7c 20 28 43 20 26 20 44 29 29   & D) | (C & D))
20a0: 20 2b 20 45 20 2b 20 57 5b 74 5d 20 2b 20 4b 5b   + E + W[t] + K[
20b0: 32 5d 3b 0a 20 20 20 20 20 20 20 20 45 20 3d 20  2];.        E = 
20c0: 44 3b 0a 20 20 20 20 20 20 20 20 44 20 3d 20 43  D;.        D = C
20d0: 3b 0a 20 20 20 20 20 20 20 20 43 20 3d 20 53 48  ;.        C = SH
20e0: 41 31 43 69 72 63 75 6c 61 72 53 68 69 66 74 28  A1CircularShift(
20f0: 33 30 2c 42 29 3b 0a 20 20 20 20 20 20 20 20 42  30,B);.        B
2100: 20 3d 20 41 3b 0a 20 20 20 20 20 20 20 20 41 20   = A;.        A 
2110: 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 0a 20  = temp;.    }.. 
2120: 20 20 20 66 6f 72 28 74 20 3d 20 36 30 3b 20 74     for(t = 60; t
2130: 20 3c 20 38 30 3b 20 74 2b 2b 29 0a 20 20 20 20   < 80; t++).    
2140: 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 20 3d  {.        temp =
2150: 20 53 48 41 31 43 69 72 63 75 6c 61 72 53 68 69   SHA1CircularShi
2160: 66 74 28 35 2c 41 29 20 2b 20 28 42 20 5e 20 43  ft(5,A) + (B ^ C
2170: 20 5e 20 44 29 20 2b 20 45 20 2b 20 57 5b 74 5d   ^ D) + E + W[t]
2180: 20 2b 20 4b 5b 33 5d 3b 0a 20 20 20 20 20 20 20   + K[3];.       
2190: 20 45 20 3d 20 44 3b 0a 20 20 20 20 20 20 20 20   E = D;.        
21a0: 44 20 3d 20 43 3b 0a 20 20 20 20 20 20 20 20 43  D = C;.        C
21b0: 20 3d 20 53 48 41 31 43 69 72 63 75 6c 61 72 53   = SHA1CircularS
21c0: 68 69 66 74 28 33 30 2c 42 29 3b 0a 20 20 20 20  hift(30,B);.    
21d0: 20 20 20 20 42 20 3d 20 41 3b 0a 20 20 20 20 20      B = A;.     
21e0: 20 20 20 41 20 3d 20 74 65 6d 70 3b 0a 20 20 20     A = temp;.   
21f0: 20 7d 0a 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d   }..    context-
2200: 3e 49 6e 74 65 72 6d 65 64 69 61 74 65 5f 48 61  >Intermediate_Ha
2210: 73 68 5b 30 5d 20 2b 3d 20 41 3b 0a 20 20 20 20  sh[0] += A;.    
2220: 63 6f 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d 65  context->Interme
2230: 64 69 61 74 65 5f 48 61 73 68 5b 31 5d 20 2b 3d  diate_Hash[1] +=
2240: 20 42 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d   B;.    context-
2250: 3e 49 6e 74 65 72 6d 65 64 69 61 74 65 5f 48 61  >Intermediate_Ha
2260: 73 68 5b 32 5d 20 2b 3d 20 43 3b 0a 20 20 20 20  sh[2] += C;.    
2270: 63 6f 6e 74 65 78 74 2d 3e 49 6e 74 65 72 6d 65  context->Interme
2280: 64 69 61 74 65 5f 48 61 73 68 5b 33 5d 20 2b 3d  diate_Hash[3] +=
2290: 20 44 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d   D;.    context-
22a0: 3e 49 6e 74 65 72 6d 65 64 69 61 74 65 5f 48 61  >Intermediate_Ha
22b0: 73 68 5b 34 5d 20 2b 3d 20 45 3b 0a 0a 20 20 20  sh[4] += E;..   
22c0: 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67   context->Messag
22d0: 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78 20 3d 20  e_Block_Index = 
22e0: 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 20 53 48 41  0;.}../*. *  SHA
22f0: 31 50 61 64 4d 65 73 73 61 67 65 0a 20 2a 0a 0a  1PadMessage. *..
2300: 20 2a 20 20 44 65 73 63 72 69 70 74 69 6f 6e 3a   *  Description:
2310: 0a 20 2a 20 20 20 20 20 20 41 63 63 6f 72 64 69  . *      Accordi
2320: 6e 67 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61  ng to the standa
2330: 72 64 2c 20 74 68 65 20 6d 65 73 73 61 67 65 20  rd, the message 
2340: 6d 75 73 74 20 62 65 20 70 61 64 64 65 64 20 74  must be padded t
2350: 6f 20 61 6e 20 65 76 65 6e 0a 20 2a 20 20 20 20  o an even. *    
2360: 20 20 35 31 32 20 62 69 74 73 2e 20 20 54 68 65    512 bits.  The
2370: 20 66 69 72 73 74 20 70 61 64 64 69 6e 67 20 62   first padding b
2380: 69 74 20 6d 75 73 74 20 62 65 20 61 20 27 31 27  it must be a '1'
2390: 2e 20 20 54 68 65 20 6c 61 73 74 20 36 34 0a 20  .  The last 64. 
23a0: 2a 20 20 20 20 20 20 62 69 74 73 20 72 65 70 72  *      bits repr
23b0: 65 73 65 6e 74 20 74 68 65 20 6c 65 6e 67 74 68  esent the length
23c0: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
23d0: 20 6d 65 73 73 61 67 65 2e 20 20 41 6c 6c 20 62   message.  All b
23e0: 69 74 73 20 69 6e 0a 20 2a 20 20 20 20 20 20 62  its in. *      b
23f0: 65 74 77 65 65 6e 20 73 68 6f 75 6c 64 20 62 65  etween should be
2400: 20 30 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69   0.  This functi
2410: 6f 6e 20 77 69 6c 6c 20 70 61 64 20 74 68 65 20  on will pad the 
2420: 6d 65 73 73 61 67 65 0a 20 2a 20 20 20 20 20 20  message. *      
2430: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 6f  according to tho
2440: 73 65 20 72 75 6c 65 73 20 62 79 20 66 69 6c 6c  se rules by fill
2450: 69 6e 67 20 74 68 65 20 4d 65 73 73 61 67 65 5f  ing the Message_
2460: 42 6c 6f 63 6b 20 61 72 72 61 79 0a 20 2a 20 20  Block array. *  
2470: 20 20 20 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e      accordingly.
2480: 20 20 49 74 20 77 69 6c 6c 20 61 6c 73 6f 20 63    It will also c
2490: 61 6c 6c 20 74 68 65 20 50 72 6f 63 65 73 73 4d  all the ProcessM
24a0: 65 73 73 61 67 65 42 6c 6f 63 6b 20 66 75 6e 63  essageBlock func
24b0: 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 70 72 6f  tion. *      pro
24c0: 76 69 64 65 64 20 61 70 70 72 6f 70 72 69 61 74  vided appropriat
24d0: 65 6c 79 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ely.  When it re
24e0: 74 75 72 6e 73 2c 20 69 74 20 63 61 6e 20 62 65  turns, it can be
24f0: 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 20 2a   assumed that. *
2500: 20 20 20 20 20 20 74 68 65 20 6d 65 73 73 61 67        the messag
2510: 65 20 64 69 67 65 73 74 20 68 61 73 20 62 65 65  e digest has bee
2520: 6e 20 63 6f 6d 70 75 74 65 64 2e 0a 20 2a 0a 20  n computed.. *. 
2530: 2a 20 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 20  *  Parameters:. 
2540: 2a 20 20 20 20 20 20 63 6f 6e 74 65 78 74 3a 20  *      context: 
2550: 5b 69 6e 2f 6f 75 74 5d 0a 20 2a 20 20 20 20 20  [in/out]. *     
2560: 20 20 20 20 20 54 68 65 20 63 6f 6e 74 65 78 74       The context
2570: 20 74 6f 20 70 61 64 0a 20 2a 20 20 20 20 20 20   to pad. *      
2580: 50 72 6f 63 65 73 73 4d 65 73 73 61 67 65 42 6c  ProcessMessageBl
2590: 6f 63 6b 3a 20 5b 69 6e 5d 0a 20 2a 20 20 20 20  ock: [in]. *    
25a0: 20 20 20 20 20 20 54 68 65 20 61 70 70 72 6f 70        The approp
25b0: 72 69 61 74 65 20 53 48 41 2a 50 72 6f 63 65 73  riate SHA*Proces
25c0: 73 4d 65 73 73 61 67 65 42 6c 6f 63 6b 20 66 75  sMessageBlock fu
25d0: 6e 63 74 69 6f 6e 0a 20 2a 20 20 52 65 74 75 72  nction. *  Retur
25e0: 6e 73 3a 0a 20 2a 20 20 20 20 20 20 4e 6f 74 68  ns:. *      Noth
25f0: 69 6e 67 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  ing.. *. */.stat
2600: 69 63 20 76 6f 69 64 20 53 48 41 31 50 61 64 4d  ic void SHA1PadM
2610: 65 73 73 61 67 65 28 53 48 41 31 43 6f 6e 74 65  essage(SHA1Conte
2620: 78 74 20 2a 63 6f 6e 74 65 78 74 29 0a 7b 0a 20  xt *context).{. 
2630: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 20 43 68     /*.     *  Ch
2640: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
2650: 65 20 63 75 72 72 65 6e 74 20 6d 65 73 73 61 67  e current messag
2660: 65 20 62 6c 6f 63 6b 20 69 73 20 74 6f 6f 20 73  e block is too s
2670: 6d 61 6c 6c 20 74 6f 20 68 6f 6c 64 0a 20 20 20  mall to hold.   
2680: 20 20 2a 20 20 74 68 65 20 69 6e 69 74 69 61 6c    *  the initial
2690: 20 70 61 64 64 69 6e 67 20 62 69 74 73 20 61 6e   padding bits an
26a0: 64 20 6c 65 6e 67 74 68 2e 20 20 49 66 20 73 6f  d length.  If so
26b0: 2c 20 77 65 20 77 69 6c 6c 20 70 61 64 20 74 68  , we will pad th
26c0: 65 0a 20 20 20 20 20 2a 20 20 62 6c 6f 63 6b 2c  e.     *  block,
26d0: 20 70 72 6f 63 65 73 73 20 69 74 2c 20 61 6e 64   process it, and
26e0: 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 70   then continue p
26f0: 61 64 64 69 6e 67 20 69 6e 74 6f 20 61 20 73 65  adding into a se
2700: 63 6f 6e 64 0a 20 20 20 20 20 2a 20 20 62 6c 6f  cond.     *  blo
2710: 63 6b 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ck..     */.    
2720: 69 66 20 28 63 6f 6e 74 65 78 74 2d 3e 4d 65 73  if (context->Mes
2730: 73 61 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78  sage_Block_Index
2740: 20 3e 20 35 35 29 0a 20 20 20 20 7b 0a 20 20 20   > 55).    {.   
2750: 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 4d 65       context->Me
2760: 73 73 61 67 65 5f 42 6c 6f 63 6b 5b 63 6f 6e 74  ssage_Block[cont
2770: 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f  ext->Message_Blo
2780: 63 6b 5f 49 6e 64 65 78 2b 2b 5d 20 3d 20 30 78  ck_Index++] = 0x
2790: 38 30 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  80;.        whil
27a0: 65 28 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61  e(context->Messa
27b0: 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78 20 3c  ge_Block_Index <
27c0: 20 36 34 29 0a 20 20 20 20 20 20 20 20 7b 0a 20   64).        {. 
27d0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65             conte
27e0: 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63  xt->Message_Bloc
27f0: 6b 5b 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61  k[context->Messa
2800: 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78 2b 2b  ge_Block_Index++
2810: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  ] = 0;.        }
2820: 0a 0a 20 20 20 20 20 20 20 20 53 48 41 31 50 72  ..        SHA1Pr
2830: 6f 63 65 73 73 4d 65 73 73 61 67 65 42 6c 6f 63  ocessMessageBloc
2840: 6b 28 63 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 20  k(context);..   
2850: 20 20 20 20 20 77 68 69 6c 65 28 63 6f 6e 74 65       while(conte
2860: 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63  xt->Message_Bloc
2870: 6b 5f 49 6e 64 65 78 20 3c 20 35 36 29 0a 20 20  k_Index < 56).  
2880: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2890: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73      context->Mes
28a0: 73 61 67 65 5f 42 6c 6f 63 6b 5b 63 6f 6e 74 65  sage_Block[conte
28b0: 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63  xt->Message_Bloc
28c0: 6b 5f 49 6e 64 65 78 2b 2b 5d 20 3d 20 30 3b 0a  k_Index++] = 0;.
28d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
28e0: 20 20 20 20 65 6c 73 65 0a 20 20 20 20 7b 0a 20      else.    {. 
28f0: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
2900: 4d 65 73 73 61 67 65 5f 42 6c 6f 63 6b 5b 63 6f  Message_Block[co
2910: 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42  ntext->Message_B
2920: 6c 6f 63 6b 5f 49 6e 64 65 78 2b 2b 5d 20 3d 20  lock_Index++] = 
2930: 30 78 38 30 3b 0a 20 20 20 20 20 20 20 20 77 68  0x80;.        wh
2940: 69 6c 65 28 63 6f 6e 74 65 78 74 2d 3e 4d 65 73  ile(context->Mes
2950: 73 61 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65 78  sage_Block_Index
2960: 20 3c 20 35 36 29 0a 20 20 20 20 20 20 20 20 7b   < 56).        {
2970: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  ..            co
2980: 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42  ntext->Message_B
2990: 6c 6f 63 6b 5b 63 6f 6e 74 65 78 74 2d 3e 4d 65  lock[context->Me
29a0: 73 73 61 67 65 5f 42 6c 6f 63 6b 5f 49 6e 64 65  ssage_Block_Inde
29b0: 78 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  x++] = 0;.      
29c0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
29d0: 2a 0a 20 20 20 20 20 2a 20 20 53 74 6f 72 65 20  *.     *  Store 
29e0: 74 68 65 20 6d 65 73 73 61 67 65 20 6c 65 6e 67  the message leng
29f0: 74 68 20 61 73 20 74 68 65 20 6c 61 73 74 20 38  th as the last 8
2a00: 20 6f 63 74 65 74 73 0a 20 20 20 20 20 2a 2f 0a   octets.     */.
2a10: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73      context->Mes
2a20: 73 61 67 65 5f 42 6c 6f 63 6b 5b 35 36 5d 20 3d  sage_Block[56] =
2a30: 20 63 6f 6e 74 65 78 74 2d 3e 4c 65 6e 67 74 68   context->Length
2a40: 5f 48 69 67 68 20 3e 3e 20 32 34 3b 0a 20 20 20  _High >> 24;.   
2a50: 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67   context->Messag
2a60: 65 5f 42 6c 6f 63 6b 5b 35 37 5d 20 3d 20 63 6f  e_Block[57] = co
2a70: 6e 74 65 78 74 2d 3e 4c 65 6e 67 74 68 5f 48 69  ntext->Length_Hi
2a80: 67 68 20 3e 3e 20 31 36 3b 0a 20 20 20 20 63 6f  gh >> 16;.    co
2a90: 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42  ntext->Message_B
2aa0: 6c 6f 63 6b 5b 35 38 5d 20 3d 20 63 6f 6e 74 65  lock[58] = conte
2ab0: 78 74 2d 3e 4c 65 6e 67 74 68 5f 48 69 67 68 20  xt->Length_High 
2ac0: 3e 3e 20 38 3b 0a 20 20 20 20 63 6f 6e 74 65 78  >> 8;.    contex
2ad0: 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63 6b  t->Message_Block
2ae0: 5b 35 39 5d 20 3d 20 63 6f 6e 74 65 78 74 2d 3e  [59] = context->
2af0: 4c 65 6e 67 74 68 5f 48 69 67 68 3b 0a 20 20 20  Length_High;.   
2b00: 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73 73 61 67   context->Messag
2b10: 65 5f 42 6c 6f 63 6b 5b 36 30 5d 20 3d 20 63 6f  e_Block[60] = co
2b20: 6e 74 65 78 74 2d 3e 4c 65 6e 67 74 68 5f 4c 6f  ntext->Length_Lo
2b30: 77 20 3e 3e 20 32 34 3b 0a 20 20 20 20 63 6f 6e  w >> 24;.    con
2b40: 74 65 78 74 2d 3e 4d 65 73 73 61 67 65 5f 42 6c  text->Message_Bl
2b50: 6f 63 6b 5b 36 31 5d 20 3d 20 63 6f 6e 74 65 78  ock[61] = contex
2b60: 74 2d 3e 4c 65 6e 67 74 68 5f 4c 6f 77 20 3e 3e  t->Length_Low >>
2b70: 20 31 36 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74   16;.    context
2b80: 2d 3e 4d 65 73 73 61 67 65 5f 42 6c 6f 63 6b 5b  ->Message_Block[
2b90: 36 32 5d 20 3d 20 63 6f 6e 74 65 78 74 2d 3e 4c  62] = context->L
2ba0: 65 6e 67 74 68 5f 4c 6f 77 20 3e 3e 20 38 3b 0a  ength_Low >> 8;.
2bb0: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 4d 65 73      context->Mes
2bc0: 73 61 67 65 5f 42 6c 6f 63 6b 5b 36 33 5d 20 3d  sage_Block[63] =
2bd0: 20 63 6f 6e 74 65 78 74 2d 3e 4c 65 6e 67 74 68   context->Length
2be0: 5f 4c 6f 77 3b 0a 0a 20 20 20 20 53 48 41 31 50  _Low;..    SHA1P
2bf0: 72 6f 63 65 73 73 4d 65 73 73 61 67 65 42 6c 6f  rocessMessageBlo
2c00: 63 6b 28 63 6f 6e 74 65 78 74 29 3b 0a 7d 0a 0a  ck(context);.}..
2c10: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
2c20: 20 64 69 67 65 73 74 20 69 6e 74 6f 20 62 61 73   digest into bas
2c30: 65 2d 31 36 2e 20 20 64 69 67 65 73 74 20 73 68  e-16.  digest sh
2c40: 6f 75 6c 64 20 62 65 20 64 65 63 6c 61 72 65 64  ould be declared
2c50: 20 61 73 0a 2a 2a 20 22 75 6e 73 69 67 6e 65 64   as.** "unsigned
2c60: 20 63 68 61 72 20 64 69 67 65 73 74 5b 32 30 5d   char digest[20]
2c70: 22 20 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67  " in the calling
2c80: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
2c90: 53 48 41 31 0a 2a 2a 20 64 69 67 65 73 74 20 69  SHA1.** digest i
2ca0: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
2cb0: 66 69 72 73 74 20 32 30 20 62 79 74 65 73 2e 20  first 20 bytes. 
2cc0: 20 7a 42 75 66 20 73 68 6f 75 6c 64 0a 2a 2a 20   zBuf should.** 
2cd0: 62 65 20 22 63 68 61 72 20 7a 42 75 66 5b 34 31  be "char zBuf[41
2ce0: 5d 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ]"..*/.static vo
2cf0: 69 64 20 44 69 67 65 73 74 54 6f 42 61 73 65 31  id DigestToBase1
2d00: 36 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  6(unsigned char 
2d10: 2a 64 69 67 65 73 74 2c 20 63 68 61 72 20 2a 7a  *digest, char *z
2d20: 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Buf){.  static c
2d30: 68 61 72 20 63 6f 6e 73 74 20 7a 45 6e 63 6f 64  har const zEncod
2d40: 65 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38  e[] = "012345678
2d50: 39 61 62 63 64 65 66 22 3b 0a 20 20 69 6e 74 20  9abcdef";.  int 
2d60: 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72 28 6a 3d 69  i, j;..  for(j=i
2d70: 3d 30 3b 20 69 3c 32 30 3b 20 69 2b 2b 29 7b 0a  =0; i<20; i++){.
2d80: 20 20 20 20 69 6e 74 20 61 20 3d 20 64 69 67 65      int a = dige
2d90: 73 74 5b 69 5d 3b 0a 20 20 20 20 7a 42 75 66 5b  st[i];.    zBuf[
2da0: 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 28  j++] = zEncode[(
2db0: 61 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20 20  a>>4)&0xf];.    
2dc0: 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63  zBuf[j++] = zEnc
2dd0: 6f 64 65 5b 61 20 26 20 30 78 66 5d 3b 0a 20 20  ode[a & 0xf];.  
2de0: 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b  }.  zBuf[j] = 0;
2df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74  .}../*.** The st
2e00: 61 74 65 20 6f 66 20 61 20 69 6e 63 72 65 6d 65  ate of a increme
2e10: 6e 74 61 6c 20 53 48 41 31 20 63 68 65 63 6b 73  ntal SHA1 checks
2e20: 75 6d 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 20  um computation. 
2e30: 20 4f 6e 6c 79 20 6f 6e 65 0a 2a 2a 20 73 75 63   Only one.** suc
2e40: 68 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 63 61  h computation ca
2e50: 6e 20 62 65 20 75 6e 64 65 72 77 61 79 20 61 74  n be underway at
2e60: 20 61 20 74 69 6d 65 2c 20 6f 66 20 63 6f 75 72   a time, of cour
2e70: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 48  se..*/.static SH
2e80: 41 31 43 6f 6e 74 65 78 74 20 69 6e 63 72 43 74  A1Context incrCt
2e90: 78 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  x;.static int in
2ea0: 63 72 49 6e 69 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  crInit = 0;../*.
2eb0: 2a 2a 20 41 64 64 20 6d 6f 72 65 20 74 65 78 74  ** Add more text
2ec0: 20 74 6f 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   to the incremen
2ed0: 74 61 6c 20 53 48 41 31 20 63 68 65 63 6b 73 75  tal SHA1 checksu
2ee0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 68 61 31 73  m..*/.void sha1s
2ef0: 75 6d 5f 73 74 65 70 5f 74 65 78 74 28 63 6f 6e  um_step_text(con
2f00: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20  st char *zText, 
2f10: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 69  int nBytes){.  i
2f20: 66 28 20 21 69 6e 63 72 49 6e 69 74 20 29 7b 0a  f( !incrInit ){.
2f30: 20 20 20 20 53 48 41 31 52 65 73 65 74 28 26 69      SHA1Reset(&i
2f40: 6e 63 72 43 74 78 29 3b 0a 20 20 20 20 69 6e 63  ncrCtx);.    inc
2f50: 72 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  rInit = 1;.  }. 
2f60: 20 69 66 28 20 6e 42 79 74 65 73 3c 3d 30 20 29   if( nBytes<=0 )
2f70: 7b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 73  {.    if( nBytes
2f80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
2f90: 20 20 6e 42 79 74 65 73 20 3d 20 73 74 72 6c 65    nBytes = strle
2fa0: 6e 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20  n(zText);.  }.  
2fb0: 53 48 41 31 49 6e 70 75 74 28 26 69 6e 63 72 43  SHA1Input(&incrC
2fc0: 74 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  tx, (unsigned ch
2fd0: 61 72 2a 29 7a 54 65 78 74 2c 20 6e 42 79 74 65  ar*)zText, nByte
2fe0: 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  s);.}../*.** Add
2ff0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
3000: 61 20 62 6c 6f 62 20 74 6f 20 74 68 65 20 69 6e  a blob to the in
3010: 63 72 65 6d 65 6e 74 61 6c 20 53 48 41 31 20 63  cremental SHA1 c
3020: 68 65 63 6b 73 75 6d 2e 0a 2a 2f 0a 76 6f 69 64  hecksum..*/.void
3030: 20 73 68 61 31 73 75 6d 5f 73 74 65 70 5f 62 6c   sha1sum_step_bl
3040: 6f 62 28 42 6c 6f 62 20 2a 70 29 7b 0a 20 20 73  ob(Blob *p){.  s
3050: 68 61 31 73 75 6d 5f 73 74 65 70 5f 74 65 78 74  ha1sum_step_text
3060: 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 29 2c  (blob_buffer(p),
3070: 20 62 6c 6f 62 5f 73 69 7a 65 28 70 29 29 3b 0a   blob_size(p));.
3080: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 69 73 68 20  }../*.** Finish 
3090: 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
30a0: 53 48 41 31 20 63 68 65 63 6b 73 75 6d 2e 20 20  SHA1 checksum.  
30b0: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
30c0: 20 69 6e 20 62 6c 6f 62 20 70 4f 75 74 0a 2a 2a   in blob pOut.**
30d0: 20 69 66 20 70 4f 75 74 21 3d 30 2e 20 20 41 6c   if pOut!=0.  Al
30e0: 73 6f 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  so return a poin
30f0: 74 65 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c  ter to the resul
3100: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t.  .**.** This 
3110: 72 65 73 65 74 73 20 74 68 65 20 69 6e 63 72 65  resets the incre
3120: 6d 65 6e 74 61 6c 20 63 68 65 63 6b 73 75 6d 20  mental checksum 
3130: 70 72 65 70 61 72 69 6e 67 20 66 6f 72 20 74 68  preparing for th
3140: 65 20 6e 65 78 74 20 72 6f 75 6e 64 0a 2a 2a 20  e next round.** 
3150: 6f 66 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 20  of computation. 
3160: 20 54 68 65 20 72 65 74 75 72 6e 20 70 6f 69 6e   The return poin
3170: 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ter points to a 
3180: 73 74 61 74 69 63 20 62 75 66 66 65 72 20 74 68  static buffer th
3190: 61 74 0a 2a 2a 20 69 73 20 6f 76 65 72 77 72 69  at.** is overwri
31a0: 74 74 65 6e 20 62 79 20 73 75 62 73 65 71 75 65  tten by subseque
31b0: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73  nt calls to this
31c0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68   function..*/.ch
31d0: 61 72 20 2a 73 68 61 31 73 75 6d 5f 66 69 6e 69  ar *sha1sum_fini
31e0: 73 68 28 42 6c 6f 62 20 2a 70 4f 75 74 29 7b 0a  sh(Blob *pOut){.
31f0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3200: 7a 52 65 73 75 6c 74 5b 32 30 5d 3b 0a 20 20 73  zResult[20];.  s
3210: 74 61 74 69 63 20 63 68 61 72 20 7a 4f 75 74 5b  tatic char zOut[
3220: 34 31 5d 3b 0a 20 20 73 68 61 31 73 75 6d 5f 73  41];.  sha1sum_s
3230: 74 65 70 5f 74 65 78 74 28 30 2c 30 29 3b 0a 20  tep_text(0,0);. 
3240: 20 53 48 41 31 52 65 73 75 6c 74 28 26 69 6e 63   SHA1Result(&inc
3250: 72 43 74 78 2c 20 7a 52 65 73 75 6c 74 29 3b 0a  rCtx, zResult);.
3260: 20 20 69 6e 63 72 49 6e 69 74 20 3d 20 30 3b 0a    incrInit = 0;.
3270: 20 20 44 69 67 65 73 74 54 6f 42 61 73 65 31 36    DigestToBase16
3280: 28 7a 52 65 73 75 6c 74 2c 20 7a 4f 75 74 29 3b  (zResult, zOut);
3290: 0a 20 20 69 66 28 20 70 4f 75 74 20 29 7b 0a 20  .  if( pOut ){. 
32a0: 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 4f 75     blob_zero(pOu
32b0: 74 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70  t);.    blob_app
32c0: 65 6e 64 28 70 4f 75 74 2c 20 7a 4f 75 74 2c 20  end(pOut, zOut, 
32d0: 34 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  40);.  }.  retur
32e0: 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n zOut;.}.../*.*
32f0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 53 48  * Compute the SH
3300: 41 31 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 61  A1 checksum of a
3310: 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 20   file on disk.  
3320: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
3330: 69 6e 67 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20  ing.** checksum 
3340: 69 6e 20 74 68 65 20 62 6c 6f 62 20 70 43 6b 73  in the blob pCks
3350: 75 6d 2e 20 20 70 43 6b 73 75 6d 20 69 73 20 61  um.  pCksum is a
3360: 73 73 75 6d 65 64 20 74 6f 20 62 65 20 69 6e 69  ssumed to be ini
3370: 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 0a 2a  nitialized..**.*
3380: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
3390: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
33a0: 2f 0a 69 6e 74 20 73 68 61 31 73 75 6d 5f 66 69  /.int sha1sum_fi
33b0: 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  le(const char *z
33c0: 46 69 6c 65 6e 61 6d 65 2c 20 42 6c 6f 62 20 2a  Filename, Blob *
33d0: 70 43 6b 73 75 6d 29 7b 0a 20 20 46 49 4c 45 20  pCksum){.  FILE 
33e0: 2a 69 6e 3b 0a 20 20 53 48 41 31 43 6f 6e 74 65  *in;.  SHA1Conte
33f0: 78 74 20 63 74 78 3b 0a 20 20 75 6e 73 69 67 6e  xt ctx;.  unsign
3400: 65 64 20 63 68 61 72 20 7a 52 65 73 75 6c 74 5b  ed char zResult[
3410: 32 30 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  20];.  char zBuf
3420: 5b 31 30 32 34 30 5d 3b 0a 0a 20 20 69 6e 20 3d  [10240];..  in =
3430: 20 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65   fopen(zFilename
3440: 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e  ,"rb");.  if( in
3450: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
3460: 6e 20 31 3b 0a 20 20 7d 0a 20 20 53 48 41 31 52  n 1;.  }.  SHA1R
3470: 65 73 65 74 28 26 63 74 78 29 3b 0a 20 20 66 6f  eset(&ctx);.  fo
3480: 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  r(;;){.    int n
3490: 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28  ;.    n = fread(
34a0: 7a 42 75 66 2c 20 31 2c 20 73 69 7a 65 6f 66 28  zBuf, 1, sizeof(
34b0: 7a 42 75 66 29 2c 20 69 6e 29 3b 0a 20 20 20 20  zBuf), in);.    
34c0: 69 66 28 20 6e 3c 3d 30 20 29 20 62 72 65 61 6b  if( n<=0 ) break
34d0: 3b 0a 20 20 20 20 53 48 41 31 49 6e 70 75 74 28  ;.    SHA1Input(
34e0: 26 63 74 78 2c 20 28 75 6e 73 69 67 6e 65 64 20  &ctx, (unsigned 
34f0: 63 68 61 72 2a 29 7a 42 75 66 2c 20 28 75 6e 73  char*)zBuf, (uns
3500: 69 67 6e 65 64 29 6e 29 3b 0a 20 20 7d 0a 20 20  igned)n);.  }.  
3510: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 62 6c  fclose(in);.  bl
3520: 6f 62 5f 7a 65 72 6f 28 70 43 6b 73 75 6d 29 3b  ob_zero(pCksum);
3530: 0a 20 20 62 6c 6f 62 5f 72 65 73 69 7a 65 28 70  .  blob_resize(p
3540: 43 6b 73 75 6d 2c 20 34 30 29 3b 0a 20 20 53 48  Cksum, 40);.  SH
3550: 41 31 52 65 73 75 6c 74 28 26 63 74 78 2c 20 7a  A1Result(&ctx, z
3560: 52 65 73 75 6c 74 29 3b 0a 20 20 44 69 67 65 73  Result);.  Diges
3570: 74 54 6f 42 61 73 65 31 36 28 7a 52 65 73 75 6c  tToBase16(zResul
3580: 74 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 70  t, blob_buffer(p
3590: 43 6b 73 75 6d 29 29 3b 0a 20 20 72 65 74 75 72  Cksum));.  retur
35a0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
35b0: 6d 70 75 74 65 20 74 68 65 20 53 48 41 31 20 63  mpute the SHA1 c
35c0: 68 65 63 6b 73 75 6d 20 6f 66 20 61 20 62 6c 6f  hecksum of a blo
35d0: 62 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 53 74  b in memory.  St
35e0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e  ore the resultin
35f0: 67 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 69 6e  g.** checksum in
3600: 20 74 68 65 20 62 6c 6f 62 20 70 43 6b 73 75 6d   the blob pCksum
3610: 2e 20 20 70 43 6b 73 75 6d 20 69 73 20 61 73 73  .  pCksum is ass
3620: 75 6d 65 64 20 74 6f 20 62 65 20 65 69 74 68 65  umed to be eithe
3630: 72 0a 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a  r.** uninitializ
3640: 65 64 20 6f 72 20 74 68 65 20 73 61 6d 65 20 62  ed or the same b
3650: 6c 6f 62 20 61 73 20 70 49 6e 2e 0a 2a 2a 0a 2a  lob as pIn..**.*
3660: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
3670: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
3680: 2f 0a 69 6e 74 20 73 68 61 31 73 75 6d 5f 62 6c  /.int sha1sum_bl
3690: 6f 62 28 63 6f 6e 73 74 20 42 6c 6f 62 20 2a 70  ob(const Blob *p
36a0: 49 6e 2c 20 42 6c 6f 62 20 2a 70 43 6b 73 75 6d  In, Blob *pCksum
36b0: 29 7b 0a 20 20 53 48 41 31 43 6f 6e 74 65 78 74  ){.  SHA1Context
36c0: 20 63 74 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64   ctx;.  unsigned
36d0: 20 63 68 61 72 20 7a 52 65 73 75 6c 74 5b 32 30   char zResult[20
36e0: 5d 3b 0a 0a 20 20 53 48 41 31 52 65 73 65 74 28  ];..  SHA1Reset(
36f0: 26 63 74 78 29 3b 0a 20 20 53 48 41 31 49 6e 70  &ctx);.  SHA1Inp
3700: 75 74 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e  ut(&ctx, (unsign
3710: 65 64 20 63 68 61 72 2a 29 62 6c 6f 62 5f 62 75  ed char*)blob_bu
3720: 66 66 65 72 28 70 49 6e 29 2c 20 62 6c 6f 62 5f  ffer(pIn), blob_
3730: 73 69 7a 65 28 70 49 6e 29 29 3b 0a 20 20 69 66  size(pIn));.  if
3740: 28 20 70 49 6e 3d 3d 70 43 6b 73 75 6d 20 29 7b  ( pIn==pCksum ){
3750: 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28  .    blob_reset(
3760: 70 43 6b 73 75 6d 29 3b 0a 20 20 7d 65 6c 73 65  pCksum);.  }else
3770: 7b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  {.    blob_zero(
3780: 70 43 6b 73 75 6d 29 3b 0a 20 20 7d 0a 20 20 62  pCksum);.  }.  b
3790: 6c 6f 62 5f 72 65 73 69 7a 65 28 70 43 6b 73 75  lob_resize(pCksu
37a0: 6d 2c 20 34 30 29 3b 0a 20 20 53 48 41 31 52 65  m, 40);.  SHA1Re
37b0: 73 75 6c 74 28 26 63 74 78 2c 20 7a 52 65 73 75  sult(&ctx, zResu
37c0: 6c 74 29 3b 0a 20 20 44 69 67 65 73 74 54 6f 42  lt);.  DigestToB
37d0: 61 73 65 31 36 28 7a 52 65 73 75 6c 74 2c 20 62  ase16(zResult, b
37e0: 6c 6f 62 5f 62 75 66 66 65 72 28 70 43 6b 73 75  lob_buffer(pCksu
37f0: 6d 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  m));.  return 0;
3800: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41  .}.../*.** COMMA
3810: 4e 44 3a 20 74 65 73 74 2d 73 68 61 31 73 75 6d  ND: test-sha1sum
3820: 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  .**.** Compute a
3830: 6e 20 53 48 41 31 20 63 68 65 63 6b 73 75 6d 20  n SHA1 checksum 
3840: 6f 66 20 61 6c 6c 20 66 69 6c 65 73 20 6e 61 6d  of all files nam
3850: 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  ed on the comman
3860: 64 2d 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 61 6e  d-line..** If an
3870: 20 66 69 6c 65 20 69 73 20 6e 61 6d 65 64 20 22   file is named "
3880: 2d 22 20 74 68 65 6e 20 74 61 6b 65 20 69 74 73  -" then take its
3890: 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 73 74   content from st
38a0: 61 6e 64 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2f  andard input..*/
38b0: 0a 76 6f 69 64 20 73 68 61 31 73 75 6d 5f 74 65  .void sha1sum_te
38c0: 73 74 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20  st(void){.  int 
38d0: 69 3b 0a 20 20 42 6c 6f 62 20 69 6e 3b 0a 20 20  i;.  Blob in;.  
38e0: 42 6c 6f 62 20 63 6b 73 75 6d 3b 0a 20 20 0a 20  Blob cksum;.  . 
38f0: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 67 2e 61 72   for(i=2; i<g.ar
3900: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  gc; i++){.    if
3910: 28 20 67 2e 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d  ( g.argv[i][0]==
3920: 27 2d 27 20 26 26 20 67 2e 61 72 67 76 5b 69 5d  '-' && g.argv[i]
3930: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]==0 ){.      
3940: 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 63  blob_read_from_c
3950: 68 61 6e 6e 65 6c 28 26 69 6e 2c 20 73 74 64 69  hannel(&in, stdi
3960: 6e 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 68  n, -1);.      sh
3970: 61 31 73 75 6d 5f 62 6c 6f 62 28 26 69 6e 2c 20  a1sum_blob(&in, 
3980: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 7d 65 6c  &cksum);.    }el
3990: 73 65 7b 0a 20 20 20 20 20 20 73 68 61 31 73 75  se{.      sha1su
39a0: 6d 5f 66 69 6c 65 28 67 2e 61 72 67 76 5b 69 5d  m_file(g.argv[i]
39b0: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 7d  , &cksum);.    }
39c0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 20  .    printf("%s 
39d0: 20 25 73 5c 6e 22 2c 20 62 6c 6f 62 5f 73 74 72   %s\n", blob_str
39e0: 28 26 63 6b 73 75 6d 29 2c 20 67 2e 61 72 67 76  (&cksum), g.argv
39f0: 5b 69 5d 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72  [i]);.    blob_r
3a00: 65 73 65 74 28 26 63 6b 73 75 6d 29 3b 0a 20 20  eset(&cksum);.  
3a10: 7d 0a 7d 0a                                      }.}.