Fossil

Hex Artifact Content
Login

Artifact 19c038afd779378da9d49ccd461b67bfd453bc0d75c9e4ebcae2e835f505e27d:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 36 20 44 2e 20 52 69 63 68  (c) 2006 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20   Simplified BSD 
00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a  License (also.**
00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32   known as the "2
00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22  -Clause License"
00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63   or "FreeBSD Lic
00e0: 65 6e 73 65 22 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  ense".).**.** Th
00f0: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0100: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65  stributed in the
0110: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69   hope that it wi
0120: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a  ll be useful,.**
0130: 20 62 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79   but without any
0140: 20 77 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f   warranty; witho
0150: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c  ut even the impl
0160: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a  ied warranty of.
0170: 2a 2a 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69  ** merchantabili
0180: 74 79 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f  ty or fitness fo
0190: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 70  r a particular p
01a0: 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75  urpose..**.** Au
01b0: 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66  thor contact inf
01c0: 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64  ormation:.**   d
01d0: 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20  rh@hwaci.com.** 
01e0: 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61    http://www.hwa
01f0: 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a  ci.com/drh/.**.*
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
0250: 2a 0a 2a 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d  *.** This implem
0260: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 53 48 41 31  entation of SHA1
0270: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 63  ..*/.#include "c
0280: 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64  onfig.h".#includ
0290: 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a  e <sys/types.h>.
02a0: 23 69 6e 63 6c 75 64 65 20 22 73 68 61 31 2e 68  #include "sha1.h
02b0: 22 0a 0a 0a 2f 2a 0a 2a 2a 20 53 48 41 31 20 49  ".../*.** SHA1 I
02c0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 23 31  mplementation #1
02d0: 20 69 73 20 74 68 65 20 68 61 72 64 65 6e 65 64   is the hardened
02e0: 20 53 48 41 31 20 69 6d 70 6c 65 6d 65 6e 74 61   SHA1 implementa
02f0: 74 69 6f 6e 20 62 79 0a 2a 2a 20 4d 61 72 63 20  tion by.** Marc 
0300: 53 74 65 76 65 6e 73 2e 20 20 43 6f 64 65 20 6f  Stevens.  Code o
0310: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 47 69 74  btained from Git
0320: 48 75 62 0a 2a 2a 0a 2a 2a 20 20 20 20 20 68 74  Hub.**.**     ht
0330: 74 70 73 3a 2f 2f 67 69 74 68 75 62 2e 63 6f 6d  tps://github.com
0340: 2f 63 72 2d 6d 61 72 63 73 74 65 76 65 6e 73 2f  /cr-marcstevens/
0350: 73 68 61 31 63 6f 6c 6c 69 73 69 6f 6e 64 65 74  sha1collisiondet
0360: 65 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 44 6f 77  ection.**.** Dow
0370: 6e 6c 6f 61 64 65 64 20 6f 6e 20 32 30 31 37 2d  nloaded on 2017-
0380: 30 33 2d 30 31 20 74 68 65 6e 20 72 65 70 61 63  03-01 then repac
0390: 6b 61 67 65 64 20 74 6f 20 77 6f 72 6b 20 77 69  kaged to work wi
03a0: 74 68 20 46 6f 73 73 69 6c 0a 2a 2a 20 61 6e 64  th Fossil.** and
03b0: 20 6d 61 6b 65 68 65 61 64 65 72 73 2e 0a 2a 2f   makeheaders..*/
03c0: 0a 23 69 66 20 46 4f 53 53 49 4c 5f 48 41 52 44  .#if FOSSIL_HARD
03d0: 45 4e 45 44 5f 53 48 41 31 0a 0a 23 69 66 20 49  ENED_SHA1..#if I
03e0: 4e 54 45 52 46 41 43 45 0a 74 79 70 65 64 65 66  NTERFACE.typedef
03f0: 20 76 6f 69 64 28 2a 63 6f 6c 6c 69 73 69 6f 6e   void(*collision
0400: 5f 62 6c 6f 63 6b 5f 63 61 6c 6c 62 61 63 6b 29  _block_callback)
0410: 28 75 69 6e 74 36 34 5f 74 2c 20 63 6f 6e 73 74  (uint64_t, const
0420: 20 75 69 6e 74 33 32 5f 74 2a 2c 20 63 6f 6e 73   uint32_t*, cons
0430: 74 20 75 69 6e 74 33 32 5f 74 2a 2c 20 63 6f 6e  t uint32_t*, con
0440: 73 74 20 75 69 6e 74 33 32 5f 74 2a 2c 20 63 6f  st uint32_t*, co
0450: 6e 73 74 20 75 69 6e 74 33 32 5f 74 2a 29 3b 0a  nst uint32_t*);.
0460: 73 74 72 75 63 74 20 53 48 41 31 5f 43 54 58 20  struct SHA1_CTX 
0470: 7b 0a 20 20 75 69 6e 74 36 34 5f 74 20 74 6f 74  {.  uint64_t tot
0480: 61 6c 3b 0a 20 20 75 69 6e 74 33 32 5f 74 20 69  al;.  uint32_t i
0490: 68 76 5b 35 5d 3b 0a 20 20 75 6e 73 69 67 6e 65  hv[5];.  unsigne
04a0: 64 20 63 68 61 72 20 62 75 66 66 65 72 5b 36 34  d char buffer[64
04b0: 5d 3b 0a 20 20 69 6e 74 20 62 69 67 65 6e 64 69  ];.  int bigendi
04c0: 61 6e 3b 0a 20 20 69 6e 74 20 66 6f 75 6e 64 5f  an;.  int found_
04d0: 63 6f 6c 6c 69 73 69 6f 6e 3b 0a 20 20 69 6e 74  collision;.  int
04e0: 20 73 61 66 65 5f 68 61 73 68 3b 0a 20 20 69 6e   safe_hash;.  in
04f0: 74 20 64 65 74 65 63 74 5f 63 6f 6c 6c 3b 0a 20  t detect_coll;. 
0500: 20 69 6e 74 20 75 62 63 5f 63 68 65 63 6b 3b 0a   int ubc_check;.
0510: 20 20 69 6e 74 20 72 65 64 75 63 65 64 5f 72 6f    int reduced_ro
0520: 75 6e 64 5f 63 6f 6c 6c 3b 0a 20 20 63 6f 6c 6c  und_coll;.  coll
0530: 69 73 69 6f 6e 5f 62 6c 6f 63 6b 5f 63 61 6c 6c  ision_block_call
0540: 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 3b 0a 0a  back callback;..
0550: 20 20 75 69 6e 74 33 32 5f 74 20 69 68 76 31 5b    uint32_t ihv1[
0560: 35 5d 3b 0a 20 20 75 69 6e 74 33 32 5f 74 20 69  5];.  uint32_t i
0570: 68 76 32 5b 35 5d 3b 0a 20 20 75 69 6e 74 33 32  hv2[5];.  uint32
0580: 5f 74 20 6d 31 5b 38 30 5d 3b 0a 20 20 75 69 6e  _t m1[80];.  uin
0590: 74 33 32 5f 74 20 6d 32 5b 38 30 5d 3b 0a 20 20  t32_t m2[80];.  
05a0: 75 69 6e 74 33 32 5f 74 20 73 74 61 74 65 73 5b  uint32_t states[
05b0: 38 30 5d 5b 35 5d 3b 0a 7d 3b 0a 23 65 6e 64 69  80][5];.};.#endi
05c0: 66 0a 76 6f 69 64 20 53 48 41 31 44 43 49 6e 69  f.void SHA1DCIni
05d0: 74 28 53 48 41 31 5f 43 54 58 2a 29 3b 0a 76 6f  t(SHA1_CTX*);.vo
05e0: 69 64 20 53 48 41 31 44 43 55 70 64 61 74 65 28  id SHA1DCUpdate(
05f0: 53 48 41 31 5f 43 54 58 2a 2c 20 63 6f 6e 73 74  SHA1_CTX*, const
0600: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c   unsigned char*,
0610: 20 75 6e 73 69 67 6e 65 64 29 3b 0a 69 6e 74 20   unsigned);.int 
0620: 53 48 41 31 44 43 46 69 6e 61 6c 28 75 6e 73 69  SHA1DCFinal(unsi
0630: 67 6e 65 64 20 63 68 61 72 5b 32 30 5d 2c 20 53  gned char[20], S
0640: 48 41 31 5f 43 54 58 2a 29 3b 0a 0a 23 64 65 66  HA1_CTX*);..#def
0650: 69 6e 65 20 53 48 41 31 43 6f 6e 74 65 78 74 20  ine SHA1Context 
0660: 53 48 41 31 5f 43 54 58 0a 23 64 65 66 69 6e 65  SHA1_CTX.#define
0670: 20 53 48 41 31 49 6e 69 74 20 53 48 41 31 44 43   SHA1Init SHA1DC
0680: 49 6e 69 74 0a 23 64 65 66 69 6e 65 20 53 48 41  Init.#define SHA
0690: 31 55 70 64 61 74 65 20 53 48 41 31 44 43 55 70  1Update SHA1DCUp
06a0: 64 61 74 65 0a 23 64 65 66 69 6e 65 20 53 48 41  date.#define SHA
06b0: 31 46 69 6e 61 6c 20 53 48 41 31 44 43 46 69 6e  1Final SHA1DCFin
06c0: 61 6c 0a 0a 2f 2a 0a 2a 2a 20 53 48 41 31 20 49  al../*.** SHA1 I
06d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 23 32  mplementation #2
06e0: 3a 20 75 73 65 20 74 68 65 20 53 48 41 31 20 61  : use the SHA1 a
06f0: 6c 67 6f 72 69 74 68 6d 20 62 75 69 6c 74 20 69  lgorithm built i
0700: 6e 74 6f 20 53 53 4c 0a 2a 2f 0a 23 65 6c 69 66  nto SSL.*/.#elif
0710: 20 20 64 65 66 69 6e 65 64 28 46 4f 53 53 49 4c    defined(FOSSIL
0720: 5f 45 4e 41 42 4c 45 5f 53 53 4c 29 0a 0a 23 20  _ENABLE_SSL)..# 
0730: 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c  include <openssl
0740: 2f 73 68 61 2e 68 3e 0a 23 20 64 65 66 69 6e 65  /sha.h>.# define
0750: 20 53 48 41 31 43 6f 6e 74 65 78 74 20 53 48 41   SHA1Context SHA
0760: 5f 43 54 58 0a 23 20 64 65 66 69 6e 65 20 53 48  _CTX.# define SH
0770: 41 31 49 6e 69 74 20 53 48 41 31 5f 49 6e 69 74  A1Init SHA1_Init
0780: 0a 23 20 64 65 66 69 6e 65 20 53 48 41 31 55 70  .# define SHA1Up
0790: 64 61 74 65 20 53 48 41 31 5f 55 70 64 61 74 65  date SHA1_Update
07a0: 0a 23 20 64 65 66 69 6e 65 20 53 48 41 31 46 69  .# define SHA1Fi
07b0: 6e 61 6c 20 53 48 41 31 5f 46 69 6e 61 6c 0a 0a  nal SHA1_Final..
07c0: 2f 2a 0a 2a 2a 20 53 48 41 31 20 49 6d 70 6c 65  /*.** SHA1 Imple
07d0: 6d 65 6e 74 61 74 69 6f 6e 20 23 33 3a 20 20 49  mentation #3:  I
07e0: 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 70 72  f none of the pr
07f0: 65 76 69 6f 75 73 20 74 77 6f 20 53 48 41 31 0a  evious two SHA1.
0800: 2a 2a 20 61 6c 67 6f 72 69 74 68 6d 73 20 77 6f  ** algorithms wo
0810: 72 6b 2c 20 74 68 65 72 65 20 69 73 20 74 68 69  rk, there is thi
0820: 73 20 62 75 69 6c 74 2d 69 6e 2e 20 20 54 68 69  s built-in.  Thi
0830: 73 20 62 75 69 6c 74 2d 69 6e 20 77 61 73 20 74  s built-in was t
0840: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 69  he.** original i
0850: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
0860: 65 64 20 62 79 20 46 6f 73 73 69 6c 2e 0a 2a 2f  ed by Fossil..*/
0870: 0a 23 65 6c 73 65 0a 2f 2a 0a 2a 2a 20 54 68 65  .#else./*.** The
0880: 20 53 48 41 31 20 69 6d 70 6c 65 6d 65 6e 74 61   SHA1 implementa
0890: 74 69 6f 6e 20 62 65 6c 6f 77 20 69 73 20 61 64  tion below is ad
08a0: 61 70 74 65 64 20 66 72 6f 6d 3a 0a 2a 2a 0a 2a  apted from:.**.*
08b0: 2a 20 20 24 4e 65 74 42 53 44 3a 20 73 68 61 31  *  $NetBSD: sha1
08c0: 2e 63 2c 76 20 31 2e 36 20 32 30 30 39 2f 31 31  .c,v 1.6 2009/11
08d0: 2f 30 36 20 32 30 3a 33 31 3a 31 38 20 6a 6f 65  /06 20:31:18 joe
08e0: 72 67 20 45 78 70 20 24 0a 2a 2a 20 20 24 4f 70  rg Exp $.**  $Op
08f0: 65 6e 42 53 44 3a 20 73 68 61 31 2e 63 2c 76 20  enBSD: sha1.c,v 
0900: 31 2e 39 20 31 39 39 37 2f 30 37 2f 32 33 20 32  1.9 1997/07/23 2
0910: 31 3a 31 32 3a 33 32 20 6b 73 74 61 69 6c 65 79  1:12:32 kstailey
0920: 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 53 48 41   Exp $.**.** SHA
0930: 2d 31 20 69 6e 20 43 0a 2a 2a 20 42 79 20 53 74  -1 in C.** By St
0940: 65 76 65 20 52 65 69 64 20 3c 73 74 65 76 65 40  eve Reid <steve@
0950: 65 64 6d 77 65 62 2e 63 6f 6d 3e 0a 2a 2a 20 31  edmweb.com>.** 1
0960: 30 30 25 20 50 75 62 6c 69 63 20 44 6f 6d 61 69  00% Public Domai
0970: 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  n.*/.typedef str
0980: 75 63 74 20 53 48 41 31 43 6f 6e 74 65 78 74 20  uct SHA1Context 
0990: 53 48 41 31 43 6f 6e 74 65 78 74 3b 0a 73 74 72  SHA1Context;.str
09a0: 75 63 74 20 53 48 41 31 43 6f 6e 74 65 78 74 20  uct SHA1Context 
09b0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
09c0: 20 73 74 61 74 65 5b 35 5d 3b 0a 20 20 75 6e 73   state[5];.  uns
09d0: 69 67 6e 65 64 20 69 6e 74 20 63 6f 75 6e 74 5b  igned int count[
09e0: 32 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  2];.  unsigned c
09f0: 68 61 72 20 62 75 66 66 65 72 5b 36 34 5d 3b 0a  har buffer[64];.
0a00: 7d 3b 0a 0a 2f 2a 0a 20 2a 20 62 6c 6b 30 28 29  };../*. * blk0()
0a10: 20 61 6e 64 20 62 6c 6b 28 29 20 70 65 72 66 6f   and blk() perfo
0a20: 72 6d 20 74 68 65 20 69 6e 69 74 69 61 6c 20 65  rm the initial e
0a30: 78 70 61 6e 64 2e 0a 20 2a 20 49 20 67 6f 74 20  xpand.. * I got 
0a40: 74 68 65 20 69 64 65 61 20 6f 66 20 65 78 70 61  the idea of expa
0a50: 6e 64 69 6e 67 20 64 75 72 69 6e 67 20 74 68 65  nding during the
0a60: 20 72 6f 75 6e 64 20 66 75 6e 63 74 69 6f 6e 20   round function 
0a70: 66 72 6f 6d 20 53 53 4c 65 61 79 0a 20 2a 0a 20  from SSLeay. *. 
0a80: 2a 20 62 6c 6b 30 6c 65 28 29 20 66 6f 72 20 6c  * blk0le() for l
0a90: 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 61 6e 64  ittle-endian and
0aa0: 20 62 6c 6b 30 62 65 28 29 20 66 6f 72 20 62 69   blk0be() for bi
0ab0: 67 2d 65 6e 64 69 61 6e 2e 0a 20 2a 2f 0a 23 69  g-endian.. */.#i
0ac0: 66 20 5f 5f 47 4e 55 43 5f 5f 20 26 26 20 28 64  f __GNUC__ && (d
0ad0: 65 66 69 6e 65 64 28 5f 5f 69 33 38 36 5f 5f 29  efined(__i386__)
0ae0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 78 38   || defined(__x8
0af0: 36 5f 36 34 5f 5f 29 29 0a 2f 2a 0a 20 2a 20 47  6_64__))./*. * G
0b00: 43 43 20 62 79 20 69 74 73 65 6c 66 20 6f 6e 6c  CC by itself onl
0b10: 79 20 67 65 6e 65 72 61 74 65 73 20 6c 65 66 74  y generates left
0b20: 20 72 6f 74 61 74 65 73 2e 20 20 55 73 65 20 72   rotates.  Use r
0b30: 69 67 68 74 20 72 6f 74 61 74 65 73 20 69 66 0a  ight rotates if.
0b40: 20 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 62   * possible to b
0b50: 65 20 6b 69 6e 64 65 72 20 74 6f 20 64 69 6e 6b  e kinder to dink
0b60: 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  y implementation
0b70: 73 20 77 69 74 68 20 69 74 65 72 61 74 69 76 65  s with iterative
0b80: 20 72 6f 74 61 74 65 0a 20 2a 20 69 6e 73 74 72   rotate. * instr
0b90: 75 63 74 69 6f 6e 73 2e 0a 20 2a 2f 0a 23 64 65  uctions.. */.#de
0ba0: 66 69 6e 65 20 53 48 41 5f 52 4f 54 28 6f 70 2c  fine SHA_ROT(op,
0bb0: 20 78 2c 20 6b 29 20 5c 0a 20 20 20 20 20 20 20   x, k) \.       
0bc0: 20 28 7b 20 75 6e 73 69 67 6e 65 64 20 69 6e 74   ({ unsigned int
0bd0: 20 79 3b 20 61 73 6d 28 6f 70 20 22 20 25 31 2c   y; asm(op " %1,
0be0: 25 30 22 20 3a 20 22 3d 72 22 20 28 79 29 20 3a  %0" : "=r" (y) :
0bf0: 20 22 49 22 20 28 6b 29 2c 20 22 30 22 20 28 78   "I" (k), "0" (x
0c00: 29 29 3b 20 79 3b 20 7d 29 0a 23 64 65 66 69 6e  )); y; }).#defin
0c10: 65 20 72 6f 6c 28 78 2c 6b 29 20 53 48 41 5f 52  e rol(x,k) SHA_R
0c20: 4f 54 28 22 72 6f 6c 6c 22 2c 20 78 2c 20 6b 29  OT("roll", x, k)
0c30: 0a 23 64 65 66 69 6e 65 20 72 6f 72 28 78 2c 6b  .#define ror(x,k
0c40: 29 20 53 48 41 5f 52 4f 54 28 22 72 6f 72 6c 22  ) SHA_ROT("rorl"
0c50: 2c 20 78 2c 20 6b 29 0a 0a 23 65 6c 73 65 0a 2f  , x, k)..#else./
0c60: 2a 20 47 65 6e 65 72 69 63 20 43 20 65 71 75 69  * Generic C equi
0c70: 76 61 6c 65 6e 74 20 2a 2f 0a 23 64 65 66 69 6e  valent */.#defin
0c80: 65 20 53 48 41 5f 52 4f 54 28 78 2c 6c 2c 72 29  e SHA_ROT(x,l,r)
0c90: 20 28 28 78 29 20 3c 3c 20 28 6c 29 20 7c 20 28   ((x) << (l) | (
0ca0: 78 29 20 3e 3e 20 28 72 29 29 0a 23 64 65 66 69  x) >> (r)).#defi
0cb0: 6e 65 20 72 6f 6c 28 78 2c 6b 29 20 53 48 41 5f  ne rol(x,k) SHA_
0cc0: 52 4f 54 28 78 2c 6b 2c 33 32 2d 28 6b 29 29 0a  ROT(x,k,32-(k)).
0cd0: 23 64 65 66 69 6e 65 20 72 6f 72 28 78 2c 6b 29  #define ror(x,k)
0ce0: 20 53 48 41 5f 52 4f 54 28 78 2c 33 32 2d 28 6b   SHA_ROT(x,32-(k
0cf0: 29 2c 6b 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 0a  ),k).#endif.....
0d00: 0a 23 64 65 66 69 6e 65 20 62 6c 6b 30 6c 65 28  .#define blk0le(
0d10: 69 29 20 28 62 6c 6f 63 6b 5b 69 5d 20 3d 20 28  i) (block[i] = (
0d20: 72 6f 72 28 62 6c 6f 63 6b 5b 69 5d 2c 38 29 26  ror(block[i],8)&
0d30: 30 78 46 46 30 30 46 46 30 30 29 20 5c 0a 20 20  0xFF00FF00) \.  
0d40: 20 20 7c 28 72 6f 6c 28 62 6c 6f 63 6b 5b 69 5d    |(rol(block[i]
0d50: 2c 38 29 26 30 78 30 30 46 46 30 30 46 46 29 29  ,8)&0x00FF00FF))
0d60: 0a 23 64 65 66 69 6e 65 20 62 6c 6b 30 62 65 28  .#define blk0be(
0d70: 69 29 20 62 6c 6f 63 6b 5b 69 5d 0a 23 64 65 66  i) block[i].#def
0d80: 69 6e 65 20 62 6c 6b 28 69 29 20 28 62 6c 6f 63  ine blk(i) (bloc
0d90: 6b 5b 69 26 31 35 5d 20 3d 20 72 6f 6c 28 62 6c  k[i&15] = rol(bl
0da0: 6f 63 6b 5b 28 69 2b 31 33 29 26 31 35 5d 5e 62  ock[(i+13)&15]^b
0db0: 6c 6f 63 6b 5b 28 69 2b 38 29 26 31 35 5d 20 5c  lock[(i+8)&15] \
0dc0: 0a 20 20 20 20 5e 62 6c 6f 63 6b 5b 28 69 2b 32  .    ^block[(i+2
0dd0: 29 26 31 35 5d 5e 62 6c 6f 63 6b 5b 69 26 31 35  )&15]^block[i&15
0de0: 5d 2c 31 29 29 0a 0a 2f 2a 0a 20 2a 20 28 52 30  ],1))../*. * (R0
0df0: 2b 52 31 29 2c 20 52 32 2c 20 52 33 2c 20 52 34  +R1), R2, R3, R4
0e00: 20 61 72 65 20 74 68 65 20 64 69 66 66 65 72 65   are the differe
0e10: 6e 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 28 72  nt operations (r
0e20: 6f 75 6e 64 73 29 20 75 73 65 64 20 69 6e 20 53  ounds) used in S
0e30: 48 41 31 0a 20 2a 0a 20 2a 20 52 6c 30 28 29 20  HA1. *. * Rl0() 
0e40: 66 6f 72 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61  for little-endia
0e50: 6e 20 61 6e 64 20 52 62 30 28 29 20 66 6f 72 20  n and Rb0() for 
0e60: 62 69 67 2d 65 6e 64 69 61 6e 2e 20 20 45 6e 64  big-endian.  End
0e70: 69 61 6e 6e 65 73 73 20 69 73 0a 20 2a 20 64 65  ianness is. * de
0e80: 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d  termined at run-
0e90: 74 69 6d 65 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e  time.. */.#defin
0ea0: 65 20 52 6c 30 28 76 2c 77 2c 78 2c 79 2c 7a 2c  e Rl0(v,w,x,y,z,
0eb0: 69 29 20 5c 0a 20 20 20 20 7a 2b 3d 28 28 77 26  i) \.    z+=((w&
0ec0: 28 78 5e 79 29 29 5e 79 29 2b 62 6c 6b 30 6c 65  (x^y))^y)+blk0le
0ed0: 28 69 29 2b 30 78 35 41 38 32 37 39 39 39 2b 72  (i)+0x5A827999+r
0ee0: 6f 6c 28 76 2c 35 29 3b 77 3d 72 6f 72 28 77 2c  ol(v,5);w=ror(w,
0ef0: 32 29 3b 0a 23 64 65 66 69 6e 65 20 52 62 30 28  2);.#define Rb0(
0f00: 76 2c 77 2c 78 2c 79 2c 7a 2c 69 29 20 5c 0a 20  v,w,x,y,z,i) \. 
0f10: 20 20 20 7a 2b 3d 28 28 77 26 28 78 5e 79 29 29     z+=((w&(x^y))
0f20: 5e 79 29 2b 62 6c 6b 30 62 65 28 69 29 2b 30 78  ^y)+blk0be(i)+0x
0f30: 35 41 38 32 37 39 39 39 2b 72 6f 6c 28 76 2c 35  5A827999+rol(v,5
0f40: 29 3b 77 3d 72 6f 72 28 77 2c 32 29 3b 0a 23 64  );w=ror(w,2);.#d
0f50: 65 66 69 6e 65 20 52 31 28 76 2c 77 2c 78 2c 79  efine R1(v,w,x,y
0f60: 2c 7a 2c 69 29 20 5c 0a 20 20 20 20 7a 2b 3d 28  ,z,i) \.    z+=(
0f70: 28 77 26 28 78 5e 79 29 29 5e 79 29 2b 62 6c 6b  (w&(x^y))^y)+blk
0f80: 28 69 29 2b 30 78 35 41 38 32 37 39 39 39 2b 72  (i)+0x5A827999+r
0f90: 6f 6c 28 76 2c 35 29 3b 77 3d 72 6f 72 28 77 2c  ol(v,5);w=ror(w,
0fa0: 32 29 3b 0a 23 64 65 66 69 6e 65 20 52 32 28 76  2);.#define R2(v
0fb0: 2c 77 2c 78 2c 79 2c 7a 2c 69 29 20 5c 0a 20 20  ,w,x,y,z,i) \.  
0fc0: 20 20 7a 2b 3d 28 77 5e 78 5e 79 29 2b 62 6c 6b    z+=(w^x^y)+blk
0fd0: 28 69 29 2b 30 78 36 45 44 39 45 42 41 31 2b 72  (i)+0x6ED9EBA1+r
0fe0: 6f 6c 28 76 2c 35 29 3b 77 3d 72 6f 72 28 77 2c  ol(v,5);w=ror(w,
0ff0: 32 29 3b 0a 23 64 65 66 69 6e 65 20 52 33 28 76  2);.#define R3(v
1000: 2c 77 2c 78 2c 79 2c 7a 2c 69 29 20 5c 0a 20 20  ,w,x,y,z,i) \.  
1010: 20 20 7a 2b 3d 28 28 28 77 7c 78 29 26 79 29 7c    z+=(((w|x)&y)|
1020: 28 77 26 78 29 29 2b 62 6c 6b 28 69 29 2b 30 78  (w&x))+blk(i)+0x
1030: 38 46 31 42 42 43 44 43 2b 72 6f 6c 28 76 2c 35  8F1BBCDC+rol(v,5
1040: 29 3b 77 3d 72 6f 72 28 77 2c 32 29 3b 0a 23 64  );w=ror(w,2);.#d
1050: 65 66 69 6e 65 20 52 34 28 76 2c 77 2c 78 2c 79  efine R4(v,w,x,y
1060: 2c 7a 2c 69 29 20 5c 0a 20 20 20 20 7a 2b 3d 28  ,z,i) \.    z+=(
1070: 77 5e 78 5e 79 29 2b 62 6c 6b 28 69 29 2b 30 78  w^x^y)+blk(i)+0x
1080: 43 41 36 32 43 31 44 36 2b 72 6f 6c 28 76 2c 35  CA62C1D6+rol(v,5
1090: 29 3b 77 3d 72 6f 72 28 77 2c 32 29 3b 0a 0a 2f  );w=ror(w,2);../
10a0: 2a 0a 20 2a 20 48 61 73 68 20 61 20 73 69 6e 67  *. * Hash a sing
10b0: 6c 65 20 35 31 32 2d 62 69 74 20 62 6c 6f 63 6b  le 512-bit block
10c0: 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 63 6f  . This is the co
10d0: 72 65 20 6f 66 20 74 68 65 20 61 6c 67 6f 72 69  re of the algori
10e0: 74 68 6d 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65  thm.. */.#define
10f0: 20 61 20 71 71 5b 30 5d 0a 23 64 65 66 69 6e 65   a qq[0].#define
1100: 20 62 20 71 71 5b 31 5d 0a 23 64 65 66 69 6e 65   b qq[1].#define
1110: 20 63 20 71 71 5b 32 5d 0a 23 64 65 66 69 6e 65   c qq[2].#define
1120: 20 64 20 71 71 5b 33 5d 0a 23 64 65 66 69 6e 65   d qq[3].#define
1130: 20 65 20 71 71 5b 34 5d 0a 0a 76 6f 69 64 20 53   e qq[4]..void S
1140: 48 41 31 54 72 61 6e 73 66 6f 72 6d 28 75 6e 73  HA1Transform(uns
1150: 69 67 6e 65 64 20 69 6e 74 20 73 74 61 74 65 5b  igned int state[
1160: 35 5d 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  5], const unsign
1170: 65 64 20 63 68 61 72 20 62 75 66 66 65 72 5b 36  ed char buffer[6
1180: 34 5d 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  4]).{.  unsigned
1190: 20 69 6e 74 20 71 71 5b 35 5d 3b 20 2f 2a 20 61   int qq[5]; /* a
11a0: 2c 20 62 2c 20 63 2c 20 64 2c 20 65 3b 20 2a 2f  , b, c, d, e; */
11b0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6f 6e  .  static int on
11c0: 65 20 3d 20 31 3b 0a 20 20 75 6e 73 69 67 6e 65  e = 1;.  unsigne
11d0: 64 20 69 6e 74 20 62 6c 6f 63 6b 5b 31 36 5d 3b  d int block[16];
11e0: 0a 20 20 6d 65 6d 63 70 79 28 62 6c 6f 63 6b 2c  .  memcpy(block,
11f0: 20 62 75 66 66 65 72 2c 20 36 34 29 3b 0a 20 20   buffer, 64);.  
1200: 6d 65 6d 63 70 79 28 71 71 2c 73 74 61 74 65 2c  memcpy(qq,state,
1210: 35 2a 73 69 7a 65 6f 66 28 75 6e 73 69 67 6e 65  5*sizeof(unsigne
1220: 64 20 69 6e 74 29 29 3b 0a 0a 20 20 2f 2a 20 43  d int));..  /* C
1230: 6f 70 79 20 63 6f 6e 74 65 78 74 2d 3e 73 74 61  opy context->sta
1240: 74 65 5b 5d 20 74 6f 20 77 6f 72 6b 69 6e 67 20  te[] to working 
1250: 76 61 72 73 20 2a 2f 0a 20 20 2f 2a 0a 20 20 61  vars */.  /*.  a
1260: 20 3d 20 73 74 61 74 65 5b 30 5d 3b 0a 20 20 62   = state[0];.  b
1270: 20 3d 20 73 74 61 74 65 5b 31 5d 3b 0a 20 20 63   = state[1];.  c
1280: 20 3d 20 73 74 61 74 65 5b 32 5d 3b 0a 20 20 64   = state[2];.  d
1290: 20 3d 20 73 74 61 74 65 5b 33 5d 3b 0a 20 20 65   = state[3];.  e
12a0: 20 3d 20 73 74 61 74 65 5b 34 5d 3b 0a 20 20 2a   = state[4];.  *
12b0: 2f 0a 0a 20 20 2f 2a 20 34 20 72 6f 75 6e 64 73  /..  /* 4 rounds
12c0: 20 6f 66 20 32 30 20 6f 70 65 72 61 74 69 6f 6e   of 20 operation
12d0: 73 20 65 61 63 68 2e 20 4c 6f 6f 70 20 75 6e 72  s each. Loop unr
12e0: 6f 6c 6c 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  olled. */.  if( 
12f0: 31 20 3d 3d 20 2a 28 75 6e 73 69 67 6e 65 64 20  1 == *(unsigned 
1300: 63 68 61 72 2a 29 26 6f 6e 65 20 29 7b 0a 20 20  char*)&one ){.  
1310: 20 20 52 6c 30 28 61 2c 62 2c 63 2c 64 2c 65 2c    Rl0(a,b,c,d,e,
1320: 20 30 29 3b 20 52 6c 30 28 65 2c 61 2c 62 2c 63   0); Rl0(e,a,b,c
1330: 2c 64 2c 20 31 29 3b 20 52 6c 30 28 64 2c 65 2c  ,d, 1); Rl0(d,e,
1340: 61 2c 62 2c 63 2c 20 32 29 3b 20 52 6c 30 28 63  a,b,c, 2); Rl0(c
1350: 2c 64 2c 65 2c 61 2c 62 2c 20 33 29 3b 0a 20 20  ,d,e,a,b, 3);.  
1360: 20 20 52 6c 30 28 62 2c 63 2c 64 2c 65 2c 61 2c    Rl0(b,c,d,e,a,
1370: 20 34 29 3b 20 52 6c 30 28 61 2c 62 2c 63 2c 64   4); Rl0(a,b,c,d
1380: 2c 65 2c 20 35 29 3b 20 52 6c 30 28 65 2c 61 2c  ,e, 5); Rl0(e,a,
1390: 62 2c 63 2c 64 2c 20 36 29 3b 20 52 6c 30 28 64  b,c,d, 6); Rl0(d
13a0: 2c 65 2c 61 2c 62 2c 63 2c 20 37 29 3b 0a 20 20  ,e,a,b,c, 7);.  
13b0: 20 20 52 6c 30 28 63 2c 64 2c 65 2c 61 2c 62 2c    Rl0(c,d,e,a,b,
13c0: 20 38 29 3b 20 52 6c 30 28 62 2c 63 2c 64 2c 65   8); Rl0(b,c,d,e
13d0: 2c 61 2c 20 39 29 3b 20 52 6c 30 28 61 2c 62 2c  ,a, 9); Rl0(a,b,
13e0: 63 2c 64 2c 65 2c 31 30 29 3b 20 52 6c 30 28 65  c,d,e,10); Rl0(e
13f0: 2c 61 2c 62 2c 63 2c 64 2c 31 31 29 3b 0a 20 20  ,a,b,c,d,11);.  
1400: 20 20 52 6c 30 28 64 2c 65 2c 61 2c 62 2c 63 2c    Rl0(d,e,a,b,c,
1410: 31 32 29 3b 20 52 6c 30 28 63 2c 64 2c 65 2c 61  12); Rl0(c,d,e,a
1420: 2c 62 2c 31 33 29 3b 20 52 6c 30 28 62 2c 63 2c  ,b,13); Rl0(b,c,
1430: 64 2c 65 2c 61 2c 31 34 29 3b 20 52 6c 30 28 61  d,e,a,14); Rl0(a
1440: 2c 62 2c 63 2c 64 2c 65 2c 31 35 29 3b 0a 20 20  ,b,c,d,e,15);.  
1450: 7d 65 6c 73 65 7b 0a 20 20 20 20 52 62 30 28 61  }else{.    Rb0(a
1460: 2c 62 2c 63 2c 64 2c 65 2c 20 30 29 3b 20 52 62  ,b,c,d,e, 0); Rb
1470: 30 28 65 2c 61 2c 62 2c 63 2c 64 2c 20 31 29 3b  0(e,a,b,c,d, 1);
1480: 20 52 62 30 28 64 2c 65 2c 61 2c 62 2c 63 2c 20   Rb0(d,e,a,b,c, 
1490: 32 29 3b 20 52 62 30 28 63 2c 64 2c 65 2c 61 2c  2); Rb0(c,d,e,a,
14a0: 62 2c 20 33 29 3b 0a 20 20 20 20 52 62 30 28 62  b, 3);.    Rb0(b
14b0: 2c 63 2c 64 2c 65 2c 61 2c 20 34 29 3b 20 52 62  ,c,d,e,a, 4); Rb
14c0: 30 28 61 2c 62 2c 63 2c 64 2c 65 2c 20 35 29 3b  0(a,b,c,d,e, 5);
14d0: 20 52 62 30 28 65 2c 61 2c 62 2c 63 2c 64 2c 20   Rb0(e,a,b,c,d, 
14e0: 36 29 3b 20 52 62 30 28 64 2c 65 2c 61 2c 62 2c  6); Rb0(d,e,a,b,
14f0: 63 2c 20 37 29 3b 0a 20 20 20 20 52 62 30 28 63  c, 7);.    Rb0(c
1500: 2c 64 2c 65 2c 61 2c 62 2c 20 38 29 3b 20 52 62  ,d,e,a,b, 8); Rb
1510: 30 28 62 2c 63 2c 64 2c 65 2c 61 2c 20 39 29 3b  0(b,c,d,e,a, 9);
1520: 20 52 62 30 28 61 2c 62 2c 63 2c 64 2c 65 2c 31   Rb0(a,b,c,d,e,1
1530: 30 29 3b 20 52 62 30 28 65 2c 61 2c 62 2c 63 2c  0); Rb0(e,a,b,c,
1540: 64 2c 31 31 29 3b 0a 20 20 20 20 52 62 30 28 64  d,11);.    Rb0(d
1550: 2c 65 2c 61 2c 62 2c 63 2c 31 32 29 3b 20 52 62  ,e,a,b,c,12); Rb
1560: 30 28 63 2c 64 2c 65 2c 61 2c 62 2c 31 33 29 3b  0(c,d,e,a,b,13);
1570: 20 52 62 30 28 62 2c 63 2c 64 2c 65 2c 61 2c 31   Rb0(b,c,d,e,a,1
1580: 34 29 3b 20 52 62 30 28 61 2c 62 2c 63 2c 64 2c  4); Rb0(a,b,c,d,
1590: 65 2c 31 35 29 3b 0a 20 20 7d 0a 20 20 52 31 28  e,15);.  }.  R1(
15a0: 65 2c 61 2c 62 2c 63 2c 64 2c 31 36 29 3b 20 52  e,a,b,c,d,16); R
15b0: 31 28 64 2c 65 2c 61 2c 62 2c 63 2c 31 37 29 3b  1(d,e,a,b,c,17);
15c0: 20 52 31 28 63 2c 64 2c 65 2c 61 2c 62 2c 31 38   R1(c,d,e,a,b,18
15d0: 29 3b 20 52 31 28 62 2c 63 2c 64 2c 65 2c 61 2c  ); R1(b,c,d,e,a,
15e0: 31 39 29 3b 0a 20 20 52 32 28 61 2c 62 2c 63 2c  19);.  R2(a,b,c,
15f0: 64 2c 65 2c 32 30 29 3b 20 52 32 28 65 2c 61 2c  d,e,20); R2(e,a,
1600: 62 2c 63 2c 64 2c 32 31 29 3b 20 52 32 28 64 2c  b,c,d,21); R2(d,
1610: 65 2c 61 2c 62 2c 63 2c 32 32 29 3b 20 52 32 28  e,a,b,c,22); R2(
1620: 63 2c 64 2c 65 2c 61 2c 62 2c 32 33 29 3b 0a 20  c,d,e,a,b,23);. 
1630: 20 52 32 28 62 2c 63 2c 64 2c 65 2c 61 2c 32 34   R2(b,c,d,e,a,24
1640: 29 3b 20 52 32 28 61 2c 62 2c 63 2c 64 2c 65 2c  ); R2(a,b,c,d,e,
1650: 32 35 29 3b 20 52 32 28 65 2c 61 2c 62 2c 63 2c  25); R2(e,a,b,c,
1660: 64 2c 32 36 29 3b 20 52 32 28 64 2c 65 2c 61 2c  d,26); R2(d,e,a,
1670: 62 2c 63 2c 32 37 29 3b 0a 20 20 52 32 28 63 2c  b,c,27);.  R2(c,
1680: 64 2c 65 2c 61 2c 62 2c 32 38 29 3b 20 52 32 28  d,e,a,b,28); R2(
1690: 62 2c 63 2c 64 2c 65 2c 61 2c 32 39 29 3b 20 52  b,c,d,e,a,29); R
16a0: 32 28 61 2c 62 2c 63 2c 64 2c 65 2c 33 30 29 3b  2(a,b,c,d,e,30);
16b0: 20 52 32 28 65 2c 61 2c 62 2c 63 2c 64 2c 33 31   R2(e,a,b,c,d,31
16c0: 29 3b 0a 20 20 52 32 28 64 2c 65 2c 61 2c 62 2c  );.  R2(d,e,a,b,
16d0: 63 2c 33 32 29 3b 20 52 32 28 63 2c 64 2c 65 2c  c,32); R2(c,d,e,
16e0: 61 2c 62 2c 33 33 29 3b 20 52 32 28 62 2c 63 2c  a,b,33); R2(b,c,
16f0: 64 2c 65 2c 61 2c 33 34 29 3b 20 52 32 28 61 2c  d,e,a,34); R2(a,
1700: 62 2c 63 2c 64 2c 65 2c 33 35 29 3b 0a 20 20 52  b,c,d,e,35);.  R
1710: 32 28 65 2c 61 2c 62 2c 63 2c 64 2c 33 36 29 3b  2(e,a,b,c,d,36);
1720: 20 52 32 28 64 2c 65 2c 61 2c 62 2c 63 2c 33 37   R2(d,e,a,b,c,37
1730: 29 3b 20 52 32 28 63 2c 64 2c 65 2c 61 2c 62 2c  ); R2(c,d,e,a,b,
1740: 33 38 29 3b 20 52 32 28 62 2c 63 2c 64 2c 65 2c  38); R2(b,c,d,e,
1750: 61 2c 33 39 29 3b 0a 20 20 52 33 28 61 2c 62 2c  a,39);.  R3(a,b,
1760: 63 2c 64 2c 65 2c 34 30 29 3b 20 52 33 28 65 2c  c,d,e,40); R3(e,
1770: 61 2c 62 2c 63 2c 64 2c 34 31 29 3b 20 52 33 28  a,b,c,d,41); R3(
1780: 64 2c 65 2c 61 2c 62 2c 63 2c 34 32 29 3b 20 52  d,e,a,b,c,42); R
1790: 33 28 63 2c 64 2c 65 2c 61 2c 62 2c 34 33 29 3b  3(c,d,e,a,b,43);
17a0: 0a 20 20 52 33 28 62 2c 63 2c 64 2c 65 2c 61 2c  .  R3(b,c,d,e,a,
17b0: 34 34 29 3b 20 52 33 28 61 2c 62 2c 63 2c 64 2c  44); R3(a,b,c,d,
17c0: 65 2c 34 35 29 3b 20 52 33 28 65 2c 61 2c 62 2c  e,45); R3(e,a,b,
17d0: 63 2c 64 2c 34 36 29 3b 20 52 33 28 64 2c 65 2c  c,d,46); R3(d,e,
17e0: 61 2c 62 2c 63 2c 34 37 29 3b 0a 20 20 52 33 28  a,b,c,47);.  R3(
17f0: 63 2c 64 2c 65 2c 61 2c 62 2c 34 38 29 3b 20 52  c,d,e,a,b,48); R
1800: 33 28 62 2c 63 2c 64 2c 65 2c 61 2c 34 39 29 3b  3(b,c,d,e,a,49);
1810: 20 52 33 28 61 2c 62 2c 63 2c 64 2c 65 2c 35 30   R3(a,b,c,d,e,50
1820: 29 3b 20 52 33 28 65 2c 61 2c 62 2c 63 2c 64 2c  ); R3(e,a,b,c,d,
1830: 35 31 29 3b 0a 20 20 52 33 28 64 2c 65 2c 61 2c  51);.  R3(d,e,a,
1840: 62 2c 63 2c 35 32 29 3b 20 52 33 28 63 2c 64 2c  b,c,52); R3(c,d,
1850: 65 2c 61 2c 62 2c 35 33 29 3b 20 52 33 28 62 2c  e,a,b,53); R3(b,
1860: 63 2c 64 2c 65 2c 61 2c 35 34 29 3b 20 52 33 28  c,d,e,a,54); R3(
1870: 61 2c 62 2c 63 2c 64 2c 65 2c 35 35 29 3b 0a 20  a,b,c,d,e,55);. 
1880: 20 52 33 28 65 2c 61 2c 62 2c 63 2c 64 2c 35 36   R3(e,a,b,c,d,56
1890: 29 3b 20 52 33 28 64 2c 65 2c 61 2c 62 2c 63 2c  ); R3(d,e,a,b,c,
18a0: 35 37 29 3b 20 52 33 28 63 2c 64 2c 65 2c 61 2c  57); R3(c,d,e,a,
18b0: 62 2c 35 38 29 3b 20 52 33 28 62 2c 63 2c 64 2c  b,58); R3(b,c,d,
18c0: 65 2c 61 2c 35 39 29 3b 0a 20 20 52 34 28 61 2c  e,a,59);.  R4(a,
18d0: 62 2c 63 2c 64 2c 65 2c 36 30 29 3b 20 52 34 28  b,c,d,e,60); R4(
18e0: 65 2c 61 2c 62 2c 63 2c 64 2c 36 31 29 3b 20 52  e,a,b,c,d,61); R
18f0: 34 28 64 2c 65 2c 61 2c 62 2c 63 2c 36 32 29 3b  4(d,e,a,b,c,62);
1900: 20 52 34 28 63 2c 64 2c 65 2c 61 2c 62 2c 36 33   R4(c,d,e,a,b,63
1910: 29 3b 0a 20 20 52 34 28 62 2c 63 2c 64 2c 65 2c  );.  R4(b,c,d,e,
1920: 61 2c 36 34 29 3b 20 52 34 28 61 2c 62 2c 63 2c  a,64); R4(a,b,c,
1930: 64 2c 65 2c 36 35 29 3b 20 52 34 28 65 2c 61 2c  d,e,65); R4(e,a,
1940: 62 2c 63 2c 64 2c 36 36 29 3b 20 52 34 28 64 2c  b,c,d,66); R4(d,
1950: 65 2c 61 2c 62 2c 63 2c 36 37 29 3b 0a 20 20 52  e,a,b,c,67);.  R
1960: 34 28 63 2c 64 2c 65 2c 61 2c 62 2c 36 38 29 3b  4(c,d,e,a,b,68);
1970: 20 52 34 28 62 2c 63 2c 64 2c 65 2c 61 2c 36 39   R4(b,c,d,e,a,69
1980: 29 3b 20 52 34 28 61 2c 62 2c 63 2c 64 2c 65 2c  ); R4(a,b,c,d,e,
1990: 37 30 29 3b 20 52 34 28 65 2c 61 2c 62 2c 63 2c  70); R4(e,a,b,c,
19a0: 64 2c 37 31 29 3b 0a 20 20 52 34 28 64 2c 65 2c  d,71);.  R4(d,e,
19b0: 61 2c 62 2c 63 2c 37 32 29 3b 20 52 34 28 63 2c  a,b,c,72); R4(c,
19c0: 64 2c 65 2c 61 2c 62 2c 37 33 29 3b 20 52 34 28  d,e,a,b,73); R4(
19d0: 62 2c 63 2c 64 2c 65 2c 61 2c 37 34 29 3b 20 52  b,c,d,e,a,74); R
19e0: 34 28 61 2c 62 2c 63 2c 64 2c 65 2c 37 35 29 3b  4(a,b,c,d,e,75);
19f0: 0a 20 20 52 34 28 65 2c 61 2c 62 2c 63 2c 64 2c  .  R4(e,a,b,c,d,
1a00: 37 36 29 3b 20 52 34 28 64 2c 65 2c 61 2c 62 2c  76); R4(d,e,a,b,
1a10: 63 2c 37 37 29 3b 20 52 34 28 63 2c 64 2c 65 2c  c,77); R4(c,d,e,
1a20: 61 2c 62 2c 37 38 29 3b 20 52 34 28 62 2c 63 2c  a,b,78); R4(b,c,
1a30: 64 2c 65 2c 61 2c 37 39 29 3b 0a 0a 20 20 2f 2a  d,e,a,79);..  /*
1a40: 20 41 64 64 20 74 68 65 20 77 6f 72 6b 69 6e 67   Add the working
1a50: 20 76 61 72 73 20 62 61 63 6b 20 69 6e 74 6f 20   vars back into 
1a60: 63 6f 6e 74 65 78 74 2e 73 74 61 74 65 5b 5d 20  context.state[] 
1a70: 2a 2f 0a 20 20 73 74 61 74 65 5b 30 5d 20 2b 3d  */.  state[0] +=
1a80: 20 61 3b 0a 20 20 73 74 61 74 65 5b 31 5d 20 2b   a;.  state[1] +
1a90: 3d 20 62 3b 0a 20 20 73 74 61 74 65 5b 32 5d 20  = b;.  state[2] 
1aa0: 2b 3d 20 63 3b 0a 20 20 73 74 61 74 65 5b 33 5d  += c;.  state[3]
1ab0: 20 2b 3d 20 64 3b 0a 20 20 73 74 61 74 65 5b 34   += d;.  state[4
1ac0: 5d 20 2b 3d 20 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 20  ] += e;.}.../*. 
1ad0: 2a 20 53 48 41 31 49 6e 69 74 20 2d 20 49 6e 69  * SHA1Init - Ini
1ae0: 74 69 61 6c 69 7a 65 20 6e 65 77 20 63 6f 6e 74  tialize new cont
1af0: 65 78 74 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ext. */.static v
1b00: 6f 69 64 20 53 48 41 31 49 6e 69 74 28 53 48 41  oid SHA1Init(SHA
1b10: 31 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  1Context *contex
1b20: 74 29 7b 0a 20 20 20 20 2f 2a 20 53 48 41 31 20  t){.    /* SHA1 
1b30: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63  initialization c
1b40: 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 20 20  onstants */.    
1b50: 63 6f 6e 74 65 78 74 2d 3e 73 74 61 74 65 5b 30  context->state[0
1b60: 5d 20 3d 20 30 78 36 37 34 35 32 33 30 31 3b 0a  ] = 0x67452301;.
1b70: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 74 61      context->sta
1b80: 74 65 5b 31 5d 20 3d 20 30 78 45 46 43 44 41 42  te[1] = 0xEFCDAB
1b90: 38 39 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d  89;.    context-
1ba0: 3e 73 74 61 74 65 5b 32 5d 20 3d 20 30 78 39 38  >state[2] = 0x98
1bb0: 42 41 44 43 46 45 3b 0a 20 20 20 20 63 6f 6e 74  BADCFE;.    cont
1bc0: 65 78 74 2d 3e 73 74 61 74 65 5b 33 5d 20 3d 20  ext->state[3] = 
1bd0: 30 78 31 30 33 32 35 34 37 36 3b 0a 20 20 20 20  0x10325476;.    
1be0: 63 6f 6e 74 65 78 74 2d 3e 73 74 61 74 65 5b 34  context->state[4
1bf0: 5d 20 3d 20 30 78 43 33 44 32 45 31 46 30 3b 0a  ] = 0xC3D2E1F0;.
1c00: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 63 6f 75      context->cou
1c10: 6e 74 5b 30 5d 20 3d 20 63 6f 6e 74 65 78 74 2d  nt[0] = context-
1c20: 3e 63 6f 75 6e 74 5b 31 5d 20 3d 20 30 3b 0a 7d  >count[1] = 0;.}
1c30: 0a 0a 0a 2f 2a 0a 20 2a 20 52 75 6e 20 79 6f 75  .../*. * Run you
1c40: 72 20 64 61 74 61 20 74 68 72 6f 75 67 68 20 74  r data through t
1c50: 68 69 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  his.. */.static 
1c60: 76 6f 69 64 20 53 48 41 31 55 70 64 61 74 65 28  void SHA1Update(
1c70: 0a 20 20 53 48 41 31 43 6f 6e 74 65 78 74 20 2a  .  SHA1Context *
1c80: 63 6f 6e 74 65 78 74 2c 0a 20 20 63 6f 6e 73 74  context,.  const
1c90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1ca0: 64 61 74 61 2c 0a 20 20 75 6e 73 69 67 6e 65 64  data,.  unsigned
1cb0: 20 69 6e 74 20 6c 65 6e 0a 29 7b 0a 20 20 20 20   int len.){.    
1cc0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20  unsigned int i, 
1cd0: 6a 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6f 6e 74  j;..    j = cont
1ce0: 65 78 74 2d 3e 63 6f 75 6e 74 5b 30 5d 3b 0a 20  ext->count[0];. 
1cf0: 20 20 20 69 66 20 28 28 63 6f 6e 74 65 78 74 2d     if ((context-
1d00: 3e 63 6f 75 6e 74 5b 30 5d 20 2b 3d 20 6c 65 6e  >count[0] += len
1d10: 20 3c 3c 20 33 29 20 3c 20 6a 29 0a 20 20 20 20   << 3) < j).    
1d20: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 63 6f 75      context->cou
1d30: 6e 74 5b 31 5d 20 2b 3d 20 28 6c 65 6e 3e 3e 32  nt[1] += (len>>2
1d40: 39 29 2b 31 3b 0a 20 20 20 20 6a 20 3d 20 28 6a  9)+1;.    j = (j
1d50: 20 3e 3e 20 33 29 20 26 20 36 33 3b 0a 20 20 20   >> 3) & 63;.   
1d60: 20 69 66 20 28 28 6a 20 2b 20 6c 65 6e 29 20 3e   if ((j + len) >
1d70: 20 36 33 29 20 7b 0a 20 20 20 20 20 20 20 20 28   63) {.        (
1d80: 76 6f 69 64 29 6d 65 6d 63 70 79 28 26 63 6f 6e  void)memcpy(&con
1d90: 74 65 78 74 2d 3e 62 75 66 66 65 72 5b 6a 5d 2c  text->buffer[j],
1da0: 20 64 61 74 61 2c 20 28 69 20 3d 20 36 34 2d 6a   data, (i = 64-j
1db0: 29 29 3b 0a 20 20 20 20 20 20 20 20 53 48 41 31  ));.        SHA1
1dc0: 54 72 61 6e 73 66 6f 72 6d 28 63 6f 6e 74 65 78  Transform(contex
1dd0: 74 2d 3e 73 74 61 74 65 2c 20 63 6f 6e 74 65 78  t->state, contex
1de0: 74 2d 3e 62 75 66 66 65 72 29 3b 0a 20 20 20 20  t->buffer);.    
1df0: 20 20 20 20 66 6f 72 20 28 20 3b 20 69 20 2b 20      for ( ; i + 
1e00: 36 33 20 3c 20 6c 65 6e 3b 20 69 20 2b 3d 20 36  63 < len; i += 6
1e10: 34 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  4).            S
1e20: 48 41 31 54 72 61 6e 73 66 6f 72 6d 28 63 6f 6e  HA1Transform(con
1e30: 74 65 78 74 2d 3e 73 74 61 74 65 2c 20 26 64 61  text->state, &da
1e40: 74 61 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[i]);.        
1e50: 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73  j = 0;.    } els
1e60: 65 20 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20  e {.        i = 
1e70: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f  0;.    }.    (vo
1e80: 69 64 29 6d 65 6d 63 70 79 28 26 63 6f 6e 74 65  id)memcpy(&conte
1e90: 78 74 2d 3e 62 75 66 66 65 72 5b 6a 5d 2c 20 26  xt->buffer[j], &
1ea0: 64 61 74 61 5b 69 5d 2c 20 6c 65 6e 20 2d 20 69  data[i], len - i
1eb0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 20 2a 20 41 64 64  );.}.../*. * Add
1ec0: 20 70 61 64 64 69 6e 67 20 61 6e 64 20 72 65 74   padding and ret
1ed0: 75 72 6e 20 74 68 65 20 6d 65 73 73 61 67 65 20  urn the message 
1ee0: 64 69 67 65 73 74 2e 0a 20 2a 2f 0a 73 74 61 74  digest.. */.stat
1ef0: 69 63 20 76 6f 69 64 20 53 48 41 31 46 69 6e 61  ic void SHA1Fina
1f00: 6c 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  l(unsigned char 
1f10: 2a 64 69 67 65 73 74 2c 20 53 48 41 31 43 6f 6e  *digest, SHA1Con
1f20: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
1f30: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
1f40: 20 69 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   i;.    unsigned
1f50: 20 63 68 61 72 20 66 69 6e 61 6c 63 6f 75 6e 74   char finalcount
1f60: 5b 38 5d 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69  [8];..    for (i
1f70: 20 3d 20 30 3b 20 69 20 3c 20 38 3b 20 69 2b 2b   = 0; i < 8; i++
1f80: 29 20 7b 0a 20 20 20 20 20 20 20 20 66 69 6e 61  ) {.        fina
1f90: 6c 63 6f 75 6e 74 5b 69 5d 20 3d 20 28 75 6e 73  lcount[i] = (uns
1fa0: 69 67 6e 65 64 20 63 68 61 72 29 28 28 63 6f 6e  igned char)((con
1fb0: 74 65 78 74 2d 3e 63 6f 75 6e 74 5b 28 69 20 3e  text->count[(i >
1fc0: 3d 20 34 20 3f 20 30 20 3a 20 31 29 5d 0a 20 20  = 4 ? 0 : 1)].  
1fd0: 20 20 20 20 20 20 20 3e 3e 20 28 28 33 2d 28 69         >> ((3-(i
1fe0: 20 26 20 33 29 29 20 2a 20 38 29 20 29 20 26 20   & 3)) * 8) ) & 
1ff0: 32 35 35 29 3b 20 2f 2a 20 45 6e 64 69 61 6e 20  255); /* Endian 
2000: 69 6e 64 65 70 65 6e 64 65 6e 74 20 2a 2f 0a 20  independent */. 
2010: 20 20 20 7d 0a 20 20 20 20 53 48 41 31 55 70 64     }.    SHA1Upd
2020: 61 74 65 28 63 6f 6e 74 65 78 74 2c 20 28 63 6f  ate(context, (co
2030: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
2040: 72 20 2a 29 22 5c 32 30 30 22 2c 20 31 29 3b 0a  r *)"\200", 1);.
2050: 20 20 20 20 77 68 69 6c 65 20 28 28 63 6f 6e 74      while ((cont
2060: 65 78 74 2d 3e 63 6f 75 6e 74 5b 30 5d 20 26 20  ext->count[0] & 
2070: 35 30 34 29 20 21 3d 20 34 34 38 29 0a 20 20 20  504) != 448).   
2080: 20 20 20 20 20 53 48 41 31 55 70 64 61 74 65 28       SHA1Update(
2090: 63 6f 6e 74 65 78 74 2c 20 28 63 6f 6e 73 74 20  context, (const 
20a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
20b0: 22 5c 30 22 2c 20 31 29 3b 0a 20 20 20 20 53 48  "\0", 1);.    SH
20c0: 41 31 55 70 64 61 74 65 28 63 6f 6e 74 65 78 74  A1Update(context
20d0: 2c 20 66 69 6e 61 6c 63 6f 75 6e 74 2c 20 38 29  , finalcount, 8)
20e0: 3b 20 20 2f 2a 20 53 68 6f 75 6c 64 20 63 61 75  ;  /* Should cau
20f0: 73 65 20 61 20 53 48 41 31 54 72 61 6e 73 66 6f  se a SHA1Transfo
2100: 72 6d 28 29 20 2a 2f 0a 0a 20 20 20 20 69 66 20  rm() */..    if 
2110: 28 64 69 67 65 73 74 29 20 7b 0a 20 20 20 20 20  (digest) {.     
2120: 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69     for (i = 0; i
2130: 20 3c 20 32 30 3b 20 69 2b 2b 29 0a 20 20 20 20   < 20; i++).    
2140: 20 20 20 20 20 20 20 20 64 69 67 65 73 74 5b 69          digest[i
2150: 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ] = (unsigned ch
2160: 61 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar).            
2170: 20 20 20 20 28 28 63 6f 6e 74 65 78 74 2d 3e 73      ((context->s
2180: 74 61 74 65 5b 69 3e 3e 32 5d 20 3e 3e 20 28 28  tate[i>>2] >> ((
2190: 33 2d 28 69 20 26 20 33 29 29 20 2a 20 38 29 20  3-(i & 3)) * 8) 
21a0: 29 20 26 20 32 35 35 29 3b 0a 20 20 20 20 7d 0a  ) & 255);.    }.
21b0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 42 75 69 6c  }.#endif /* Buil
21c0: 74 2d 69 6e 20 53 48 41 31 20 69 6d 70 6c 65 6d  t-in SHA1 implem
21d0: 65 6e 61 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a  enation */../*.*
21e0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 64 69 67 65  * Convert a dige
21f0: 73 74 20 69 6e 74 6f 20 62 61 73 65 2d 31 36 2e  st into base-16.
2200: 20 20 64 69 67 65 73 74 20 73 68 6f 75 6c 64 20    digest should 
2210: 62 65 20 64 65 63 6c 61 72 65 64 20 61 73 0a 2a  be declared as.*
2220: 2a 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72  * "unsigned char
2230: 20 64 69 67 65 73 74 5b 32 30 5d 22 20 69 6e 20   digest[20]" in 
2240: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
2250: 74 69 6f 6e 2e 20 20 54 68 65 20 53 48 41 31 0a  tion.  The SHA1.
2260: 2a 2a 20 64 69 67 65 73 74 20 69 73 20 73 74 6f  ** digest is sto
2270: 72 65 64 20 69 6e 20 74 68 65 20 66 69 72 73 74  red in the first
2280: 20 32 30 20 62 79 74 65 73 2e 20 20 7a 42 75 66   20 bytes.  zBuf
2290: 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 22 63   should.** be "c
22a0: 68 61 72 20 7a 42 75 66 5b 34 31 5d 22 2e 0a 2a  har zBuf[41]"..*
22b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 69  /.static void Di
22c0: 67 65 73 74 54 6f 42 61 73 65 31 36 28 75 6e 73  gestToBase16(uns
22d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 69 67 65  igned char *dige
22e0: 73 74 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  st, char *zBuf){
22f0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2300: 63 68 61 72 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d  char zEncode[] =
2310: 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64   "0123456789abcd
2320: 65 66 22 3b 0a 20 20 69 6e 74 20 69 78 3b 0a 0a  ef";.  int ix;..
2330: 20 20 66 6f 72 28 69 78 3d 30 3b 20 69 78 3c 32    for(ix=0; ix<2
2340: 30 3b 20 69 78 2b 2b 29 7b 0a 20 20 20 20 2a 7a  0; ix++){.    *z
2350: 42 75 66 2b 2b 20 3d 20 7a 45 6e 63 6f 64 65 5b  Buf++ = zEncode[
2360: 28 2a 64 69 67 65 73 74 3e 3e 34 29 26 30 78 66  (*digest>>4)&0xf
2370: 5d 3b 0a 20 20 20 20 2a 7a 42 75 66 2b 2b 20 3d  ];.    *zBuf++ =
2380: 20 7a 45 6e 63 6f 64 65 5b 2a 64 69 67 65 73 74   zEncode[*digest
2390: 2b 2b 20 26 20 30 78 66 5d 3b 0a 20 20 7d 0a 20  ++ & 0xf];.  }. 
23a0: 20 2a 7a 42 75 66 20 3d 20 27 5c 30 27 3b 0a 7d   *zBuf = '\0';.}
23b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74  ../*.** The stat
23c0: 65 20 6f 66 20 61 20 69 6e 63 72 65 6d 65 6e 74  e of a increment
23d0: 61 6c 20 53 48 41 31 20 63 68 65 63 6b 73 75 6d  al SHA1 checksum
23e0: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 20 20 4f   computation.  O
23f0: 6e 6c 79 20 6f 6e 65 0a 2a 2a 20 73 75 63 68 20  nly one.** such 
2400: 63 6f 6d 70 75 74 61 74 69 6f 6e 20 63 61 6e 20  computation can 
2410: 62 65 20 75 6e 64 65 72 77 61 79 20 61 74 20 61  be underway at a
2420: 20 74 69 6d 65 2c 20 6f 66 20 63 6f 75 72 73 65   time, of course
2430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 48 41 31  ..*/.static SHA1
2440: 43 6f 6e 74 65 78 74 20 69 6e 63 72 43 74 78 3b  Context incrCtx;
2450: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
2460: 49 6e 69 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  Init = 0;../*.**
2470: 20 41 64 64 20 6d 6f 72 65 20 74 65 78 74 20 74   Add more text t
2480: 6f 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  o the incrementa
2490: 6c 20 53 48 41 31 20 63 68 65 63 6b 73 75 6d 2e  l SHA1 checksum.
24a0: 0a 2a 2f 0a 76 6f 69 64 20 73 68 61 31 73 75 6d  .*/.void sha1sum
24b0: 5f 73 74 65 70 5f 74 65 78 74 28 63 6f 6e 73 74  _step_text(const
24c0: 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e   char *zText, in
24d0: 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 69 66 28  t nBytes){.  if(
24e0: 20 21 69 6e 63 72 49 6e 69 74 20 29 7b 0a 20 20   !incrInit ){.  
24f0: 20 20 53 48 41 31 49 6e 69 74 28 26 69 6e 63 72    SHA1Init(&incr
2500: 43 74 78 29 3b 0a 20 20 20 20 69 6e 63 72 49 6e  Ctx);.    incrIn
2510: 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  it = 1;.  }.  if
2520: 28 20 6e 42 79 74 65 73 3c 3d 30 20 29 7b 0a 20  ( nBytes<=0 ){. 
2530: 20 20 20 69 66 28 20 6e 42 79 74 65 73 3d 3d 30     if( nBytes==0
2540: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e   ) return;.    n
2550: 42 79 74 65 73 20 3d 20 73 74 72 6c 65 6e 28 7a  Bytes = strlen(z
2560: 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 53 48 41  Text);.  }.  SHA
2570: 31 55 70 64 61 74 65 28 26 69 6e 63 72 43 74 78  1Update(&incrCtx
2580: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
2590: 2a 29 7a 54 65 78 74 2c 20 6e 42 79 74 65 73 29  *)zText, nBytes)
25a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
25b0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
25c0: 62 6c 6f 62 20 74 6f 20 74 68 65 20 69 6e 63 72  blob to the incr
25d0: 65 6d 65 6e 74 61 6c 20 53 48 41 31 20 63 68 65  emental SHA1 che
25e0: 63 6b 73 75 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cksum..*/.void s
25f0: 68 61 31 73 75 6d 5f 73 74 65 70 5f 62 6c 6f 62  ha1sum_step_blob
2600: 28 42 6c 6f 62 20 2a 70 29 7b 0a 20 20 73 68 61  (Blob *p){.  sha
2610: 31 73 75 6d 5f 73 74 65 70 5f 74 65 78 74 28 62  1sum_step_text(b
2620: 6c 6f 62 5f 62 75 66 66 65 72 28 70 29 2c 20 62  lob_buffer(p), b
2630: 6c 6f 62 5f 73 69 7a 65 28 70 29 29 3b 0a 7d 0a  lob_size(p));.}.
2640: 0a 2f 2a 0a 2a 2a 20 46 69 6e 69 73 68 20 74 68  ./*.** Finish th
2650: 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 53 48  e incremental SH
2660: 41 31 20 63 68 65 63 6b 73 75 6d 2e 20 20 53 74  A1 checksum.  St
2670: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
2680: 6e 20 62 6c 6f 62 20 70 4f 75 74 0a 2a 2a 20 69  n blob pOut.** i
2690: 66 20 70 4f 75 74 21 3d 30 2e 20 20 41 6c 73 6f  f pOut!=0.  Also
26a0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
26b0: 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 2e  r to the result.
26c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 65 73 65  .**.** This rese
26d0: 74 73 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  ts the increment
26e0: 61 6c 20 63 68 65 63 6b 73 75 6d 20 70 72 65 70  al checksum prep
26f0: 61 72 69 6e 67 20 66 6f 72 20 74 68 65 20 6e 65  aring for the ne
2700: 78 74 20 72 6f 75 6e 64 0a 2a 2a 20 6f 66 20 63  xt round.** of c
2710: 6f 6d 70 75 74 61 74 69 6f 6e 2e 20 20 54 68 65  omputation.  The
2720: 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20   return pointer 
2730: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 61 74  points to a stat
2740: 69 63 20 62 75 66 66 65 72 20 74 68 61 74 0a 2a  ic buffer that.*
2750: 2a 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  * is overwritten
2760: 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
2770: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 66 75 6e  alls to this fun
2780: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a  ction..*/.char *
2790: 73 68 61 31 73 75 6d 5f 66 69 6e 69 73 68 28 42  sha1sum_finish(B
27a0: 6c 6f 62 20 2a 70 4f 75 74 29 7b 0a 20 20 75 6e  lob *pOut){.  un
27b0: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 52 65 73  signed char zRes
27c0: 75 6c 74 5b 32 30 5d 3b 0a 20 20 73 74 61 74 69  ult[20];.  stati
27d0: 63 20 63 68 61 72 20 7a 4f 75 74 5b 34 31 5d 3b  c char zOut[41];
27e0: 0a 20 20 73 68 61 31 73 75 6d 5f 73 74 65 70 5f  .  sha1sum_step_
27f0: 74 65 78 74 28 30 2c 30 29 3b 0a 20 20 53 48 41  text(0,0);.  SHA
2800: 31 46 69 6e 61 6c 28 7a 52 65 73 75 6c 74 2c 20  1Final(zResult, 
2810: 26 69 6e 63 72 43 74 78 29 3b 0a 20 20 69 6e 63  &incrCtx);.  inc
2820: 72 49 6e 69 74 20 3d 20 30 3b 0a 20 20 44 69 67  rInit = 0;.  Dig
2830: 65 73 74 54 6f 42 61 73 65 31 36 28 7a 52 65 73  estToBase16(zRes
2840: 75 6c 74 2c 20 7a 4f 75 74 29 3b 0a 20 20 69 66  ult, zOut);.  if
2850: 28 20 70 4f 75 74 20 29 7b 0a 20 20 20 20 62 6c  ( pOut ){.    bl
2860: 6f 62 5f 7a 65 72 6f 28 70 4f 75 74 29 3b 0a 20  ob_zero(pOut);. 
2870: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
2880: 4f 75 74 2c 20 7a 4f 75 74 2c 20 34 30 29 3b 0a  Out, zOut, 40);.
2890: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75    }.  return zOu
28a0: 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  t;.}.../*.** Com
28b0: 70 75 74 65 20 74 68 65 20 53 48 41 31 20 63 68  pute the SHA1 ch
28c0: 65 63 6b 73 75 6d 20 6f 66 20 61 20 66 69 6c 65  ecksum of a file
28d0: 20 6f 6e 20 64 69 73 6b 2e 20 20 53 74 6f 72 65   on disk.  Store
28e0: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a   the resulting.*
28f0: 2a 20 63 68 65 63 6b 73 75 6d 20 69 6e 20 74 68  * checksum in th
2900: 65 20 62 6c 6f 62 20 70 43 6b 73 75 6d 2e 20 20  e blob pCksum.  
2910: 70 43 6b 73 75 6d 20 69 73 20 61 73 73 75 6d 65  pCksum is assume
2920: 64 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69  d to be initiali
2930: 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  zed..**.** Retur
2940: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2950: 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
2960: 68 61 31 73 75 6d 5f 66 69 6c 65 28 63 6f 6e 73  ha1sum_file(cons
2970: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2980: 65 2c 20 69 6e 74 20 65 46 54 79 70 65 2c 20 42  e, int eFType, B
2990: 6c 6f 62 20 2a 70 43 6b 73 75 6d 29 7b 0a 20 20  lob *pCksum){.  
29a0: 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 53 48 41 31  FILE *in;.  SHA1
29b0: 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 75  Context ctx;.  u
29c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 52 65  nsigned char zRe
29d0: 73 75 6c 74 5b 32 30 5d 3b 0a 20 20 63 68 61 72  sult[20];.  char
29e0: 20 7a 42 75 66 5b 31 30 32 34 30 5d 3b 0a 0a 20   zBuf[10240];.. 
29f0: 20 69 66 28 20 65 46 54 79 70 65 3d 3d 52 65 70   if( eFType==Rep
2a00: 6f 46 49 4c 45 20 26 26 20 66 69 6c 65 5f 69 73  oFILE && file_is
2a10: 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 20  link(zFilename) 
2a20: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 74 65 61  ){.    /* Instea
2a30: 64 20 6f 66 20 66 69 6c 65 20 63 6f 6e 74 65 6e  d of file conten
2a40: 74 2c 20 72 65 74 75 72 6e 20 73 68 61 31 20 6f  t, return sha1 o
2a50: 66 20 6c 69 6e 6b 20 64 65 73 74 69 6e 61 74 69  f link destinati
2a60: 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 42  on path */.    B
2a70: 6c 6f 62 20 64 65 73 74 69 6e 61 74 69 6f 6e 50  lob destinationP
2a80: 61 74 68 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b  ath;.    int rc;
2a90: 0a 0a 20 20 20 20 62 6c 6f 62 5f 72 65 61 64 5f  ..    blob_read_
2aa0: 6c 69 6e 6b 28 26 64 65 73 74 69 6e 61 74 69 6f  link(&destinatio
2ab0: 6e 50 61 74 68 2c 20 7a 46 69 6c 65 6e 61 6d 65  nPath, zFilename
2ac0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 68 61 31  );.    rc = sha1
2ad0: 73 75 6d 5f 62 6c 6f 62 28 26 64 65 73 74 69 6e  sum_blob(&destin
2ae0: 61 74 69 6f 6e 50 61 74 68 2c 20 70 43 6b 73 75  ationPath, pCksu
2af0: 6d 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73  m);.    blob_res
2b00: 65 74 28 26 64 65 73 74 69 6e 61 74 69 6f 6e 50  et(&destinationP
2b10: 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ath);.    return
2b20: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 6e 20 3d   rc;.  }..  in =
2b30: 20 66 6f 73 73 69 6c 5f 66 6f 70 65 6e 28 7a 46   fossil_fopen(zF
2b40: 69 6c 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20  ilename,"rb");. 
2b50: 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
2b60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2b70: 20 20 53 48 41 31 49 6e 69 74 28 26 63 74 78 29    SHA1Init(&ctx)
2b80: 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
2b90: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 6e 20 3d 20   int n;.    n = 
2ba0: 66 72 65 61 64 28 7a 42 75 66 2c 20 31 2c 20 73  fread(zBuf, 1, s
2bb0: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 69 6e 29  izeof(zBuf), in)
2bc0: 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30 20 29  ;.    if( n<=0 )
2bd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 53 48 41 31   break;.    SHA1
2be0: 55 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e  Update(&ctx, (un
2bf0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75  signed char*)zBu
2c00: 66 2c 20 28 75 6e 73 69 67 6e 65 64 29 6e 29 3b  f, (unsigned)n);
2c10: 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e  .  }.  fclose(in
2c20: 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 70  );.  blob_zero(p
2c30: 43 6b 73 75 6d 29 3b 0a 20 20 62 6c 6f 62 5f 72  Cksum);.  blob_r
2c40: 65 73 69 7a 65 28 70 43 6b 73 75 6d 2c 20 34 30  esize(pCksum, 40
2c50: 29 3b 0a 20 20 53 48 41 31 46 69 6e 61 6c 28 7a  );.  SHA1Final(z
2c60: 52 65 73 75 6c 74 2c 20 26 63 74 78 29 3b 0a 20  Result, &ctx);. 
2c70: 20 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 28   DigestToBase16(
2c80: 7a 52 65 73 75 6c 74 2c 20 62 6c 6f 62 5f 62 75  zResult, blob_bu
2c90: 66 66 65 72 28 70 43 6b 73 75 6d 29 29 3b 0a 20  ffer(pCksum));. 
2ca0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2cb0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
2cc0: 53 48 41 31 20 63 68 65 63 6b 73 75 6d 20 6f 66  SHA1 checksum of
2cd0: 20 61 20 62 6c 6f 62 20 69 6e 20 6d 65 6d 6f 72   a blob in memor
2ce0: 79 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  y.  Store the re
2cf0: 73 75 6c 74 69 6e 67 0a 2a 2a 20 63 68 65 63 6b  sulting.** check
2d00: 73 75 6d 20 69 6e 20 74 68 65 20 62 6c 6f 62 20  sum in the blob 
2d10: 70 43 6b 73 75 6d 2e 20 20 70 43 6b 73 75 6d 20  pCksum.  pCksum 
2d20: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  is assumed to be
2d30: 20 65 69 74 68 65 72 0a 2a 2a 20 75 6e 69 6e 69   either.** unini
2d40: 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20  tialized or the 
2d50: 73 61 6d 65 20 62 6c 6f 62 20 61 73 20 70 49 6e  same blob as pIn
2d60: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
2d70: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
2d80: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 68 61 31  ors..*/.int sha1
2d90: 73 75 6d 5f 62 6c 6f 62 28 63 6f 6e 73 74 20 42  sum_blob(const B
2da0: 6c 6f 62 20 2a 70 49 6e 2c 20 42 6c 6f 62 20 2a  lob *pIn, Blob *
2db0: 70 43 6b 73 75 6d 29 7b 0a 20 20 53 48 41 31 43  pCksum){.  SHA1C
2dc0: 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 75 6e  ontext ctx;.  un
2dd0: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 52 65 73  signed char zRes
2de0: 75 6c 74 5b 32 30 5d 3b 0a 0a 20 20 53 48 41 31  ult[20];..  SHA1
2df0: 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 53 48  Init(&ctx);.  SH
2e00: 41 31 55 70 64 61 74 65 28 26 63 74 78 2c 20 28  A1Update(&ctx, (
2e10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 62  unsigned char*)b
2e20: 6c 6f 62 5f 62 75 66 66 65 72 28 70 49 6e 29 2c  lob_buffer(pIn),
2e30: 20 62 6c 6f 62 5f 73 69 7a 65 28 70 49 6e 29 29   blob_size(pIn))
2e40: 3b 0a 20 20 69 66 28 20 70 49 6e 3d 3d 70 43 6b  ;.  if( pIn==pCk
2e50: 73 75 6d 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f  sum ){.    blob_
2e60: 72 65 73 65 74 28 70 43 6b 73 75 6d 29 3b 0a 20  reset(pCksum);. 
2e70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 6c 6f 62   }else{.    blob
2e80: 5f 7a 65 72 6f 28 70 43 6b 73 75 6d 29 3b 0a 20  _zero(pCksum);. 
2e90: 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73 69 7a 65   }.  blob_resize
2ea0: 28 70 43 6b 73 75 6d 2c 20 34 30 29 3b 0a 20 20  (pCksum, 40);.  
2eb0: 53 48 41 31 46 69 6e 61 6c 28 7a 52 65 73 75 6c  SHA1Final(zResul
2ec0: 74 2c 20 26 63 74 78 29 3b 0a 20 20 44 69 67 65  t, &ctx);.  Dige
2ed0: 73 74 54 6f 42 61 73 65 31 36 28 7a 52 65 73 75  stToBase16(zResu
2ee0: 6c 74 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28  lt, blob_buffer(
2ef0: 70 43 6b 73 75 6d 29 29 3b 0a 20 20 72 65 74 75  pCksum));.  retu
2f00: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
2f10: 6f 6d 70 75 74 65 20 74 68 65 20 53 48 41 31 20  ompute the SHA1 
2f20: 63 68 65 63 6b 73 75 6d 20 6f 66 20 61 20 7a 65  checksum of a ze
2f30: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ro-terminated st
2f40: 72 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 72 65  ring.  The.** re
2f50: 73 75 6c 74 20 69 73 20 68 65 6c 64 20 69 6e 20  sult is held in 
2f60: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
2f70: 66 72 6f 6d 20 6d 70 72 69 6e 74 66 28 29 2e 0a  from mprintf()..
2f80: 2a 2f 0a 63 68 61 72 20 2a 73 68 61 31 73 75 6d  */.char *sha1sum
2f90: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
2fa0: 29 7b 0a 20 20 53 48 41 31 43 6f 6e 74 65 78 74  ){.  SHA1Context
2fb0: 20 63 74 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64   ctx;.  unsigned
2fc0: 20 63 68 61 72 20 7a 52 65 73 75 6c 74 5b 32 30   char zResult[20
2fd0: 5d 3b 0a 20 20 63 68 61 72 20 7a 44 69 67 65 73  ];.  char zDiges
2fe0: 74 5b 34 31 5d 3b 0a 0a 20 20 53 48 41 31 49 6e  t[41];..  SHA1In
2ff0: 69 74 28 26 63 74 78 29 3b 0a 20 20 53 48 41 31  it(&ctx);.  SHA1
3000: 55 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e  Update(&ctx, (un
3010: 73 69 67 6e 65 64 20 63 6f 6e 73 74 20 63 68 61  signed const cha
3020: 72 2a 29 7a 49 6e 2c 20 73 74 72 6c 65 6e 28 7a  r*)zIn, strlen(z
3030: 49 6e 29 29 3b 0a 20 20 53 48 41 31 46 69 6e 61  In));.  SHA1Fina
3040: 6c 28 7a 52 65 73 75 6c 74 2c 20 26 63 74 78 29  l(zResult, &ctx)
3050: 3b 0a 20 20 44 69 67 65 73 74 54 6f 42 61 73 65  ;.  DigestToBase
3060: 31 36 28 7a 52 65 73 75 6c 74 2c 20 7a 44 69 67  16(zResult, zDig
3070: 65 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  est);.  return m
3080: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 44 69  printf("%s", zDi
3090: 67 65 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  gest);.}../*.** 
30a0: 43 6f 6e 76 65 72 74 20 61 20 63 6c 65 61 72 74  Convert a cleart
30b0: 65 78 74 20 70 61 73 73 77 6f 72 64 20 66 6f 72  ext password for
30c0: 20 61 20 73 70 65 63 69 66 69 63 20 75 73 65 72   a specific user
30d0: 20 69 6e 74 6f 20 61 20 53 48 41 31 20 68 61 73   into a SHA1 has
30e0: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 6c 67  h..**.** The alg
30f0: 6f 72 69 74 68 6d 20 68 65 72 65 20 69 73 3a 0a  orithm here is:.
3100: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 48 41 31  **.**       SHA1
3110: 28 20 70 72 6f 6a 65 63 74 2d 63 6f 64 65 20 2b  ( project-code +
3120: 20 22 2f 22 20 2b 20 6c 6f 67 69 6e 20 2b 20 22   "/" + login + "
3130: 2f 22 20 2b 20 70 61 73 73 77 6f 72 64 20 29 0a  /" + password ).
3140: 2a 2a 0a 2a 2a 20 49 6e 20 77 6f 72 64 73 3a 20  **.** In words: 
3150: 54 68 65 20 75 73 65 72 73 20 6c 6f 67 69 6e 20  The users login 
3160: 6e 61 6d 65 20 61 6e 64 20 70 61 73 73 77 6f 72  name and passwor
3170: 64 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74  d are appended t
3180: 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6a 65 63 74  o the.** project
3190: 20 49 44 20 63 6f 64 65 20 61 6e 64 20 74 68 65   ID code and the
31a0: 20 53 48 41 31 20 68 61 73 68 20 6f 66 20 74 68   SHA1 hash of th
31b0: 65 20 72 65 73 75 6c 74 20 69 73 20 63 6f 6d 70  e result is comp
31c0: 75 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uted..**.** The 
31d0: 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 66  result of this f
31e0: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 73  unction is the s
31f0: 68 61 72 65 64 20 73 65 63 72 65 74 20 75 73 65  hared secret use
3200: 64 20 62 79 20 61 20 63 6c 69 65 6e 74 0a 2a 2a  d by a client.**
3210: 20 74 6f 20 61 75 74 68 65 6e 74 69 63 61 74 65   to authenticate
3220: 20 74 6f 20 61 20 73 65 72 76 65 72 20 66 6f 72   to a server for
3230: 20 74 68 65 20 73 79 6e 63 20 70 72 6f 74 6f 63   the sync protoc
3240: 6f 6c 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20  ol.  It is also 
3250: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 74 6f  the.** value sto
3260: 72 65 64 20 69 6e 20 74 68 65 20 55 53 45 52 2e  red in the USER.
3270: 50 57 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  PW field of the 
3280: 64 61 74 61 62 61 73 65 2e 20 20 42 79 20 6d 69  database.  By mi
3290: 78 69 6e 67 20 69 6e 20 74 68 65 0a 2a 2a 20 6c  xing in the.** l
32a0: 6f 67 69 6e 20 6e 61 6d 65 20 61 6e 64 20 74 68  ogin name and th
32b0: 65 20 70 72 6f 6a 65 63 74 20 69 64 20 77 69 74  e project id wit
32c0: 68 20 74 68 65 20 68 61 73 68 2c 20 64 69 66 66  h the hash, diff
32d0: 65 72 65 6e 74 20 73 68 61 72 65 64 20 73 65 63  erent shared sec
32e0: 72 65 74 73 0a 2a 2a 20 61 72 65 20 6f 62 74 61  rets.** are obta
32f0: 69 6e 65 64 20 65 76 65 6e 20 69 66 20 74 77 6f  ined even if two
3300: 20 75 73 65 72 73 20 73 65 6c 65 63 74 20 74 68   users select th
3310: 65 20 73 61 6d 65 20 70 61 73 73 77 6f 72 64 2c  e same password,
3320: 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73 69 6e 67   or if a.** sing
3330: 6c 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  le user selects 
3340: 74 68 65 20 73 61 6d 65 20 70 61 73 73 77 6f 72  the same passwor
3350: 64 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 70  d for multiple p
3360: 72 6f 6a 65 63 74 73 2e 0a 2a 2f 0a 63 68 61 72  rojects..*/.char
3370: 20 2a 73 68 61 31 5f 73 68 61 72 65 64 5f 73 65   *sha1_shared_se
3380: 63 72 65 74 28 0a 20 20 63 6f 6e 73 74 20 63 68  cret(.  const ch
3390: 61 72 20 2a 7a 50 77 2c 20 20 20 20 20 20 20 20  ar *zPw,        
33a0: 2f 2a 20 54 68 65 20 70 61 73 73 77 6f 72 64 20  /* The password 
33b0: 74 6f 20 65 6e 63 72 79 70 74 20 2a 2f 0a 20 20  to encrypt */.  
33c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 67  const char *zLog
33d0: 69 6e 2c 20 20 20 20 20 2f 2a 20 55 73 65 72 6e  in,     /* Usern
33e0: 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ame */.  const c
33f0: 68 61 72 20 2a 7a 50 72 6f 6a 43 6f 64 65 20 20  har *zProjCode  
3400: 20 2f 2a 20 50 72 6f 6a 65 63 74 2d 63 6f 64 65   /* Project-code
3410: 2e 20 20 55 73 65 20 62 75 69 6c 74 2d 69 6e 20  .  Use built-in 
3420: 70 72 6f 6a 65 63 74 20 63 6f 64 65 20 69 66 20  project code if 
3430: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  NULL */.){.  sta
3440: 74 69 63 20 63 68 61 72 20 2a 7a 50 72 6f 6a 65  tic char *zProje
3450: 63 74 49 64 20 3d 20 30 3b 0a 20 20 53 48 41 31  ctId = 0;.  SHA1
3460: 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 75  Context ctx;.  u
3470: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 52 65  nsigned char zRe
3480: 73 75 6c 74 5b 32 30 5d 3b 0a 20 20 63 68 61 72  sult[20];.  char
3490: 20 7a 44 69 67 65 73 74 5b 34 31 5d 3b 0a 0a 20   zDigest[41];.. 
34a0: 20 53 48 41 31 49 6e 69 74 28 26 63 74 78 29 3b   SHA1Init(&ctx);
34b0: 0a 20 20 69 66 28 20 7a 50 72 6f 6a 43 6f 64 65  .  if( zProjCode
34c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ==0 ){.    if( z
34d0: 50 72 6f 6a 65 63 74 49 64 3d 3d 30 20 29 7b 0a  ProjectId==0 ){.
34e0: 20 20 20 20 20 20 7a 50 72 6f 6a 65 63 74 49 64        zProjectId
34f0: 20 3d 20 64 62 5f 67 65 74 28 22 70 72 6f 6a 65   = db_get("proje
3500: 63 74 2d 63 6f 64 65 22 2c 20 30 29 3b 0a 0a 20  ct-code", 0);.. 
3510: 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66       /* On the f
3520: 69 72 73 74 20 78 66 65 72 20 72 65 71 75 65 73  irst xfer reques
3530: 74 20 6f 66 20 61 20 63 6c 6f 6e 65 2c 20 74 68  t of a clone, th
3540: 65 20 70 72 6f 6a 65 63 74 2d 63 6f 64 65 20 69  e project-code i
3550: 73 20 6e 6f 74 20 79 65 74 0a 20 20 20 20 20 20  s not yet.      
3560: 2a 2a 20 6b 6e 6f 77 6e 2e 20 20 55 73 65 20 74  ** known.  Use t
3570: 68 65 20 63 6c 65 61 72 74 65 78 74 20 70 61 73  he cleartext pas
3580: 73 77 6f 72 64 2c 20 73 69 6e 63 65 20 74 68 61  sword, since tha
3590: 74 20 69 73 20 61 6c 6c 20 77 65 20 68 61 76 65  t is all we have
35a0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
35b0: 20 69 66 28 20 7a 50 72 6f 6a 65 63 74 49 64 3d   if( zProjectId=
35c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
35d0: 74 75 72 6e 20 6d 70 72 69 6e 74 66 28 22 25 73  turn mprintf("%s
35e0: 22 2c 20 7a 50 77 29 3b 0a 20 20 20 20 20 20 7d  ", zPw);.      }
35f0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 72 6f 6a  .    }.    zProj
3600: 43 6f 64 65 20 3d 20 7a 50 72 6f 6a 65 63 74 49  Code = zProjectI
3610: 64 3b 0a 20 20 7d 0a 20 20 53 48 41 31 55 70 64  d;.  }.  SHA1Upd
3620: 61 74 65 28 26 63 74 78 2c 20 28 75 6e 73 69 67  ate(&ctx, (unsig
3630: 6e 65 64 20 63 68 61 72 2a 29 7a 50 72 6f 6a 43  ned char*)zProjC
3640: 6f 64 65 2c 20 73 74 72 6c 65 6e 28 7a 50 72 6f  ode, strlen(zPro
3650: 6a 43 6f 64 65 29 29 3b 0a 20 20 53 48 41 31 55  jCode));.  SHA1U
3660: 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e 73  pdate(&ctx, (uns
3670: 69 67 6e 65 64 20 63 68 61 72 2a 29 22 2f 22 2c  igned char*)"/",
3680: 20 31 29 3b 0a 20 20 53 48 41 31 55 70 64 61 74   1);.  SHA1Updat
3690: 65 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e 65  e(&ctx, (unsigne
36a0: 64 20 63 68 61 72 2a 29 7a 4c 6f 67 69 6e 2c 20  d char*)zLogin, 
36b0: 73 74 72 6c 65 6e 28 7a 4c 6f 67 69 6e 29 29 3b  strlen(zLogin));
36c0: 0a 20 20 53 48 41 31 55 70 64 61 74 65 28 26 63  .  SHA1Update(&c
36d0: 74 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  tx, (unsigned ch
36e0: 61 72 2a 29 22 2f 22 2c 20 31 29 3b 0a 20 20 53  ar*)"/", 1);.  S
36f0: 48 41 31 55 70 64 61 74 65 28 26 63 74 78 2c 20  HA1Update(&ctx, 
3700: 28 75 6e 73 69 67 6e 65 64 20 63 6f 6e 73 74 20  (unsigned const 
3710: 63 68 61 72 2a 29 7a 50 77 2c 20 73 74 72 6c 65  char*)zPw, strle
3720: 6e 28 7a 50 77 29 29 3b 0a 20 20 53 48 41 31 46  n(zPw));.  SHA1F
3730: 69 6e 61 6c 28 7a 52 65 73 75 6c 74 2c 20 26 63  inal(zResult, &c
3740: 74 78 29 3b 0a 20 20 44 69 67 65 73 74 54 6f 42  tx);.  DigestToB
3750: 61 73 65 31 36 28 7a 52 65 73 75 6c 74 2c 20 7a  ase16(zResult, z
3760: 44 69 67 65 73 74 29 3b 0a 20 20 72 65 74 75 72  Digest);.  retur
3770: 6e 20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  n mprintf("%s", 
3780: 7a 44 69 67 65 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  zDigest);.}../*.
3790: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65  ** Implement the
37a0: 20 73 68 61 72 65 64 5f 73 65 63 72 65 74 28 29   shared_secret()
37b0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20   SQL function.  
37c0: 73 68 61 72 65 64 5f 73 65 63 72 65 74 28 29 20  shared_secret() 
37d0: 74 61 6b 65 73 20 74 77 6f 20 6f 72 0a 2a 2a 20  takes two or.** 
37e0: 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 3b  three arguments;
37f0: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
3800: 65 6e 74 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  ent is optional.
3810: 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 20 63  .**.** (1) The c
3820: 6c 65 61 72 74 65 78 74 20 70 61 73 73 77 6f 72  leartext passwor
3830: 64 0a 2a 2a 20 28 32 29 20 54 68 65 20 6c 6f 67  d.** (2) The log
3840: 69 6e 20 6e 61 6d 65 0a 2a 2a 20 28 33 29 20 54  in name.** (3) T
3850: 68 65 20 70 72 6f 6a 65 63 74 20 63 6f 64 65 0a  he project code.
3860: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 73 68  **.** Returns sh
3870: 61 31 28 24 70 61 73 73 77 6f 72 64 2f 24 6c 6f  a1($password/$lo
3880: 67 69 6e 2f 24 70 72 6f 6a 63 6f 64 65 29 2e 0a  gin/$projcode)..
3890: 2a 2f 0a 76 6f 69 64 20 73 68 61 31 5f 73 68 61  */.void sha1_sha
38a0: 72 65 64 5f 73 65 63 72 65 74 5f 73 71 6c 5f 66  red_secret_sql_f
38b0: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
38c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
38d0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
38e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
38f0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
3900: 73 74 20 63 68 61 72 20 2a 7a 50 77 3b 0a 20 20  st char *zPw;.  
3910: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 67  const char *zLog
3920: 69 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  in;.  const char
3930: 20 2a 7a 50 72 6f 6a 69 64 3b 0a 0a 20 20 61 73   *zProjid;..  as
3940: 73 65 72 74 28 20 61 72 67 63 3d 3d 32 20 7c 7c  sert( argc==2 ||
3950: 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20 20 7a 50   argc==3 );.  zP
3960: 77 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  w = (const char*
3970: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
3980: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
3990: 69 66 28 20 7a 50 77 3d 3d 30 20 7c 7c 20 7a 50  if( zPw==0 || zP
39a0: 77 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  w[0]==0 ) return
39b0: 3b 0a 20 20 7a 4c 6f 67 69 6e 20 3d 20 28 63 6f  ;.  zLogin = (co
39c0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
39d0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
39e0: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 4c 6f  v[1]);.  if( zLo
39f0: 67 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  gin==0 ) return;
3a00: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29  .  if( argc==3 )
3a10: 7b 0a 20 20 20 20 7a 50 72 6f 6a 69 64 20 3d 20  {.    zProjid = 
3a20: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
3a30: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
3a40: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66  argv[2]);.    if
3a50: 28 20 7a 50 72 6f 6a 69 64 20 26 26 20 7a 50 72  ( zProjid && zPr
3a60: 6f 6a 69 64 5b 30 5d 3d 3d 30 20 29 20 7a 50 72  ojid[0]==0 ) zPr
3a70: 6f 6a 69 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ojid = 0;.  }els
3a80: 65 7b 0a 20 20 20 20 7a 50 72 6f 6a 69 64 20 3d  e{.    zProjid =
3a90: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
3aa0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
3ab0: 6e 74 65 78 74 2c 20 73 68 61 31 5f 73 68 61 72  ntext, sha1_shar
3ac0: 65 64 5f 73 65 63 72 65 74 28 7a 50 77 2c 20 7a  ed_secret(zPw, z
3ad0: 4c 6f 67 69 6e 2c 20 7a 50 72 6f 6a 69 64 29 2c  Login, zProjid),
3ae0: 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20   -1,.           
3af0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 73 73 69             fossi
3b00: 6c 5f 66 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  l_free);.}../*.*
3b10: 2a 20 43 4f 4d 4d 41 4e 44 3a 20 73 68 61 31 73  * COMMAND: sha1s
3b20: 75 6d 2a 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  um*.**.** Usage:
3b30: 20 25 66 6f 73 73 69 6c 20 73 68 61 31 73 75 6d   %fossil sha1sum
3b40: 20 46 49 4c 45 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 43   FILE....**.** C
3b50: 6f 6d 70 75 74 65 20 61 6e 20 53 48 41 31 20 63  ompute an SHA1 c
3b60: 68 65 63 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 66  hecksum of all f
3b70: 69 6c 65 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68  iles named on th
3b80: 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2e 0a  e command-line..
3b90: 2a 2a 20 49 66 20 61 20 66 69 6c 65 20 69 73 20  ** If a file is 
3ba0: 6e 61 6d 65 64 20 22 2d 22 20 74 68 65 6e 20 74  named "-" then t
3bb0: 61 6b 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  ake its content 
3bc0: 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 69 6e  from standard in
3bd0: 70 75 74 2e 0a 2a 2a 20 4f 70 74 69 6f 6e 73 3a  put..** Options:
3be0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2d 68 2c 20 2d 2d  .**.**    -h, --
3bf0: 64 65 72 65 66 65 72 65 6e 63 65 20 20 20 20 20  dereference     
3c00: 49 66 20 46 49 4c 45 20 69 73 20 61 20 73 79 6d  If FILE is a sym
3c10: 62 6f 6c 69 63 20 6c 69 6e 6b 2c 20 63 6f 6d 70  bolic link, comp
3c20: 75 74 65 20 74 68 65 20 68 61 73 68 0a 2a 2a 20  ute the hash.** 
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c40: 20 20 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20           on the 
3c50: 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20  object that the 
3c60: 6c 69 6e 6b 20 70 6f 69 6e 74 73 20 74 6f 2e 20  link points to. 
3c70: 20 4e 6f 72 6d 61 6c 6c 79 2c 0a 2a 2a 20 20 20   Normally,.**   
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 20 20 20 20 20 20 20 74 68 65 20 68 61 73 68 20         the hash 
3ca0: 69 73 20 6f 76 65 72 20 74 68 65 20 6e 61 6d 65  is over the name
3cb0: 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 74   of the object t
3cc0: 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ce0: 74 68 65 20 6c 69 6e 6b 20 70 6f 69 6e 74 73 20  the link points 
3cf0: 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 68 61 31  to..*/.void sha1
3d00: 73 75 6d 5f 74 65 73 74 28 76 6f 69 64 29 7b 0a  sum_test(void){.
3d10: 20 20 69 6e 74 20 69 3b 0a 20 20 42 6c 6f 62 20    int i;.  Blob 
3d20: 69 6e 3b 0a 20 20 42 6c 6f 62 20 63 6b 73 75 6d  in;.  Blob cksum
3d30: 3b 0a 20 20 69 6e 74 20 65 46 54 79 70 65 20 3d  ;.  int eFType =
3d40: 20 53 79 6d 46 49 4c 45 3b 0a 20 20 69 66 28 20   SymFILE;.  if( 
3d50: 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 64 65 72  find_option("der
3d60: 65 66 65 72 65 6e 63 65 22 2c 22 68 22 2c 30 29  eference","h",0)
3d70: 21 3d 30 20 29 7b 0a 20 20 20 20 65 46 54 79 70  !=0 ){.    eFTyp
3d80: 65 20 3d 20 45 78 74 46 49 4c 45 3b 0a 20 20 7d  e = ExtFILE;.  }
3d90: 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 67  ..  for(i=2; i<g
3da0: 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  .argc; i++){.   
3db0: 20 62 6c 6f 62 5f 69 6e 69 74 28 26 63 6b 73 75   blob_init(&cksu
3dc0: 6d 2c 20 22 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  m, "************
3dd0: 2a 2a 20 6e 6f 74 20 66 6f 75 6e 64 20 2a 2a 2a  ** not found ***
3de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 22 2c 20 2d  ************", -
3df0: 31 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 61 72  1);.    if( g.ar
3e00: 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 26 26  gv[i][0]=='-' &&
3e10: 20 67 2e 61 72 67 76 5b 69 5d 5b 31 5d 3d 3d 30   g.argv[i][1]==0
3e20: 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72   ){.      blob_r
3e30: 65 61 64 5f 66 72 6f 6d 5f 63 68 61 6e 6e 65 6c  ead_from_channel
3e40: 28 26 69 6e 2c 20 73 74 64 69 6e 2c 20 2d 31 29  (&in, stdin, -1)
3e50: 3b 0a 20 20 20 20 20 20 73 68 61 31 73 75 6d 5f  ;.      sha1sum_
3e60: 62 6c 6f 62 28 26 69 6e 2c 20 26 63 6b 73 75 6d  blob(&in, &cksum
3e70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
3e80: 20 20 20 20 73 68 61 31 73 75 6d 5f 66 69 6c 65      sha1sum_file
3e90: 28 67 2e 61 72 67 76 5b 69 5d 2c 20 65 46 54 79  (g.argv[i], eFTy
3ea0: 70 65 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  pe, &cksum);.   
3eb0: 20 7d 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72   }.    fossil_pr
3ec0: 69 6e 74 28 22 25 73 20 20 25 73 5c 6e 22 2c 20  int("%s  %s\n", 
3ed0: 62 6c 6f 62 5f 73 74 72 28 26 63 6b 73 75 6d 29  blob_str(&cksum)
3ee0: 2c 20 67 2e 61 72 67 76 5b 69 5d 29 3b 0a 20 20  , g.argv[i]);.  
3ef0: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 6b    blob_reset(&ck
3f00: 73 75 6d 29 3b 0a 20 20 7d 0a 7d 0a              sum);.  }.}.