/ Hex Artifact Content
Login

Artifact 30966d568654a4fd962fb324753e49429b7379e1f72d2be489ade963121f5943:


0000: 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 69 73 20 70  /*.** Run this p
0010: 72 6f 67 72 61 6d 20 77 69 74 68 20 61 20 73 69  rogram with a si
0020: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  ngle argument wh
0030: 69 63 68 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ich is the name 
0040: 6f 66 20 74 68 65 0a 2a 2a 20 46 6f 73 73 69 6c  of the.** Fossil
0050: 20 22 6d 61 6e 69 66 65 73 74 22 20 66 69 6c 65   "manifest" file
0060: 20 66 6f 72 20 61 20 70 72 6f 6a 65 63 74 2c 20   for a project, 
0070: 61 6e 64 20 74 68 69 73 20 70 72 6f 67 72 61 6d  and this program
0080: 20 77 69 6c 6c 20 65 6d 69 74 20 6f 6e 0a 2a 2a   will emit on.**
0090: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
00a0: 20 74 68 65 20 22 73 6f 75 72 63 65 20 69 64 22   the "source id"
00b0: 20 66 6f 72 20 66 6f 72 20 74 68 65 20 70 72 6f   for for the pro
00c0: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20  gram..**.** (1) 
00d0: 20 54 68 65 20 22 73 6f 75 72 63 65 20 69 64 22   The "source id"
00e0: 20 69 73 20 74 68 65 20 64 61 74 65 20 6f 66 20   is the date of 
00f0: 63 68 65 63 6b 2d 69 6e 20 74 6f 67 65 74 68 65  check-in togethe
0100: 72 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 20  r with the .**  
0110: 20 20 20 20 53 48 41 33 20 68 61 73 68 20 6f 66      SHA3 hash of
0120: 20 74 68 65 20 6d 61 6e 69 66 65 73 74 20 66 69   the manifest fi
0130: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20 20 41  le..**.** (2)  A
0140: 6c 6c 20 69 6e 64 69 76 69 64 75 61 6c 20 66 69  ll individual fi
0150: 6c 65 20 68 61 73 68 65 73 20 69 6e 20 74 68 65  le hashes in the
0160: 20 6d 61 6e 69 66 65 73 74 20 61 72 65 20 76 65   manifest are ve
0170: 72 69 66 69 65 64 2e 20 20 49 66 20 61 6e 79 0a  rified.  If any.
0180: 2a 2a 20 20 20 20 20 20 73 6f 75 72 63 65 20 66  **      source f
0190: 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ile has changed,
01a0: 20 74 68 65 20 53 48 41 33 20 68 61 73 68 20 65   the SHA3 hash e
01b0: 6e 64 73 20 77 69 74 68 20 22 6d 6f 64 69 66 69  nds with "modifi
01c0: 65 64 22 2e 0a 2a 2a 0a 2a 2f 0a 23 69 6e 63 6c  ed"..**.*/.#incl
01d0: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
01e0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68  include <stdio.h
01f0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  >.#include <stri
0200: 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ng.h>.#include <
0210: 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e  sys/types.h>.#in
0220: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0230: 0a 2f 2a 20 50 6f 72 74 61 62 6c 65 20 36 34 2d  ./* Portable 64-
0240: 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  bit unsigned int
0250: 65 67 65 72 73 20 2a 2f 0a 23 69 66 20 64 65 66  egers */.#if def
0260: 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 7c  ined(_MSC_VER) |
0270: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 42 4f 52 4c  | defined(__BORL
0280: 41 4e 44 43 5f 5f 29 0a 20 20 74 79 70 65 64 65  ANDC__).  typede
0290: 66 20 75 6e 73 69 67 6e 65 64 20 5f 5f 69 6e 74  f unsigned __int
02a0: 36 34 20 75 36 34 3b 0a 23 65 6c 73 65 0a 20 20  64 u64;.#else.  
02b0: 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64  typedef unsigned
02c0: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 20 75   long long int u
02d0: 36 34 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  64;.#endif.../*.
02e0: 2a 2a 20 4d 61 63 72 6f 73 20 74 6f 20 64 65 74  ** Macros to det
02f0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 74  ermine whether t
0300: 68 65 20 6d 61 63 68 69 6e 65 20 69 73 20 62 69  he machine is bi
0310: 67 20 6f 72 20 6c 69 74 74 6c 65 20 65 6e 64 69  g or little endi
0320: 61 6e 2c 0a 2a 2a 20 61 6e 64 20 77 68 65 74 68  an,.** and wheth
0330: 65 72 20 6f 72 20 6e 6f 74 20 74 68 61 74 20 64  er or not that d
0340: 65 74 65 72 6d 69 6e 61 74 69 6f 6e 20 69 73 20  etermination is 
0350: 72 75 6e 2d 74 69 6d 65 20 6f 72 20 63 6f 6d 70  run-time or comp
0360: 69 6c 65 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ile-time..**.** 
0370: 46 6f 72 20 62 65 73 74 20 70 65 72 66 6f 72 6d  For best perform
0380: 61 6e 63 65 2c 20 61 6e 20 61 74 74 65 6d 70 74  ance, an attempt
0390: 20 69 73 20 6d 61 64 65 20 74 6f 20 67 75 65 73   is made to gues
03a0: 73 20 61 74 20 74 68 65 20 62 79 74 65 2d 6f 72  s at the byte-or
03b0: 64 65 72 0a 2a 2a 20 75 73 69 6e 67 20 43 2d 70  der.** using C-p
03c0: 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72  reprocessor macr
03d0: 6f 73 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  os.  If that is 
03e0: 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  unsuccessful, or
03f0: 20 69 66 0a 2a 2a 20 2d 44 42 59 54 45 4f 52 44   if.** -DBYTEORD
0400: 45 52 3d 30 20 69 73 20 73 65 74 2c 20 74 68 65  ER=0 is set, the
0410: 6e 20 62 79 74 65 2d 6f 72 64 65 72 20 69 73 20  n byte-order is 
0420: 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 61 74  determined.** at
0430: 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2f 0a 23 69   run-time..*/.#i
0440: 66 6e 64 65 66 20 42 59 54 45 4f 52 44 45 52 0a  fndef BYTEORDER.
0450: 23 20 69 66 20 64 65 66 69 6e 65 64 28 69 33 38  # if defined(i38
0460: 36 29 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65  6)     || define
0470: 64 28 5f 5f 69 33 38 36 5f 5f 29 20 20 20 7c 7c  d(__i386__)   ||
0480: 20 64 65 66 69 6e 65 64 28 5f 4d 5f 49 58 38 36   defined(_M_IX86
0490: 29 20 7c 7c 20 20 20 20 5c 0a 20 20 20 20 20 64  ) ||    \.     d
04a0: 65 66 69 6e 65 64 28 5f 5f 78 38 36 5f 36 34 29  efined(__x86_64)
04b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 78 38   || defined(__x8
04c0: 36 5f 36 34 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  6_64__) || defin
04d0: 65 64 28 5f 4d 5f 58 36 34 29 20 20 7c 7c 20 20  ed(_M_X64)  ||  
04e0: 20 20 5c 0a 20 20 20 20 20 64 65 66 69 6e 65 64    \.     defined
04f0: 28 5f 4d 5f 41 4d 44 36 34 29 20 7c 7c 20 64 65  (_M_AMD64) || de
0500: 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 20 20 20  fined(_M_ARM)   
0510: 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 78    || defined(__x
0520: 38 36 29 20 20 20 7c 7c 20 20 20 20 5c 0a 20 20  86)   ||    \.  
0530: 20 20 20 64 65 66 69 6e 65 64 28 5f 5f 61 72 6d     defined(__arm
0540: 5f 5f 29 0a 23 20 20 20 64 65 66 69 6e 65 20 42  __).#   define B
0550: 59 54 45 4f 52 44 45 52 20 20 20 20 31 32 33 34  YTEORDER    1234
0560: 0a 23 20 65 6c 69 66 20 64 65 66 69 6e 65 64 28  .# elif defined(
0570: 73 70 61 72 63 29 20 20 20 20 7c 7c 20 64 65 66  sparc)    || def
0580: 69 6e 65 64 28 5f 5f 70 70 63 5f 5f 29 0a 23 20  ined(__ppc__).# 
0590: 20 20 64 65 66 69 6e 65 20 42 59 54 45 4f 52 44    define BYTEORD
05a0: 45 52 20 20 20 20 34 33 32 31 0a 23 20 65 6c 73  ER    4321.# els
05b0: 65 0a 23 20 20 20 64 65 66 69 6e 65 20 42 59 54  e.#   define BYT
05c0: 45 4f 52 44 45 52 20 30 0a 23 20 65 6e 64 69 66  EORDER 0.# endif
05d0: 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a  .#endif..../*.**
05e0: 20 53 74 61 74 65 20 73 74 72 75 63 74 75 72 65   State structure
05f0: 20 66 6f 72 20 61 20 53 48 41 33 20 68 61 73 68   for a SHA3 hash
0600: 20 69 6e 20 70 72 6f 67 72 65 73 73 0a 2a 2f 0a   in progress.*/.
0610: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0620: 48 41 33 43 6f 6e 74 65 78 74 20 53 48 41 33 43  HA3Context SHA3C
0630: 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 53  ontext;.struct S
0640: 48 41 33 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  HA3Context {.  u
0650: 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 73  nion {.    u64 s
0660: 5b 32 35 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [25];           
0670: 20 20 20 20 20 2f 2a 20 4b 65 63 63 61 6b 20 73       /* Keccak s
0680: 74 61 74 65 2e 20 35 78 35 20 6c 69 6e 65 73 20  tate. 5x5 lines 
0690: 6f 66 20 36 34 20 62 69 74 73 20 65 61 63 68 20  of 64 bits each 
06a0: 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
06b0: 63 68 61 72 20 78 5b 31 36 30 30 5d 3b 20 20 20  char x[1600];   
06c0: 20 2f 2a 20 2e 2e 2e 20 6f 72 20 31 36 30 30 20   /* ... or 1600 
06d0: 62 79 74 65 73 20 2a 2f 0a 20 20 7d 20 75 3b 0a  bytes */.  } u;.
06e0: 20 20 75 6e 73 69 67 6e 65 64 20 6e 52 61 74 65    unsigned nRate
06f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  ;        /* Byte
0700: 73 20 6f 66 20 69 6e 70 75 74 20 61 63 63 65 70  s of input accep
0710: 74 65 64 20 70 65 72 20 4b 65 63 63 61 6b 20 69  ted per Keccak i
0720: 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e  teration */.  un
0730: 73 69 67 6e 65 64 20 6e 4c 6f 61 64 65 64 3b 20  signed nLoaded; 
0740: 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 62 79       /* Input by
0750: 74 65 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  tes loaded into 
0760: 75 2e 78 5b 5d 20 73 6f 20 66 61 72 20 74 68 69  u.x[] so far thi
0770: 73 20 63 79 63 6c 65 20 2a 2f 0a 20 20 75 6e 73  s cycle */.  uns
0780: 69 67 6e 65 64 20 69 78 4d 61 73 6b 3b 20 20 20  igned ixMask;   
0790: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 6e 65      /* Insert ne
07a0: 78 74 20 69 6e 70 75 74 20 69 6e 74 6f 20 75 2e  xt input into u.
07b0: 78 5b 6e 4c 6f 61 64 65 64 5e 69 78 4d 61 73 6b  x[nLoaded^ixMask
07c0: 5d 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ]. */.};../*.** 
07d0: 41 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  A single step of
07e0: 20 74 68 65 20 4b 65 63 63 61 6b 20 6d 69 78 69   the Keccak mixi
07f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ng function for 
0800: 61 20 31 36 30 30 2d 62 69 74 20 73 74 61 74 65  a 1600-bit state
0810: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0820: 4b 65 63 63 61 6b 46 31 36 30 30 53 74 65 70 28  KeccakF1600Step(
0830: 53 48 41 33 43 6f 6e 74 65 78 74 20 2a 70 29 7b  SHA3Context *p){
0840: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20  .  int i;.  u64 
0850: 42 30 2c 20 42 31 2c 20 42 32 2c 20 42 33 2c 20  B0, B1, B2, B3, 
0860: 42 34 3b 0a 20 20 75 36 34 20 43 30 2c 20 43 31  B4;.  u64 C0, C1
0870: 2c 20 43 32 2c 20 43 33 2c 20 43 34 3b 0a 20 20  , C2, C3, C4;.  
0880: 75 36 34 20 44 30 2c 20 44 31 2c 20 44 32 2c 20  u64 D0, D1, D2, 
0890: 44 33 2c 20 44 34 3b 0a 20 20 73 74 61 74 69 63  D3, D4;.  static
08a0: 20 63 6f 6e 73 74 20 75 36 34 20 52 43 5b 5d 20   const u64 RC[] 
08b0: 3d 20 7b 0a 20 20 20 20 30 78 30 30 30 30 30 30  = {.    0x000000
08c0: 30 30 30 30 30 30 30 30 30 31 55 4c 4c 2c 20 20  0000000001ULL,  
08d0: 30 78 30 30 30 30 30 30 30 30 30 30 30 30 38 30  0x00000000000080
08e0: 38 32 55 4c 4c 2c 0a 20 20 20 20 30 78 38 30 30  82ULL,.    0x800
08f0: 30 30 30 30 30 30 30 30 30 38 30 38 61 55 4c 4c  000000000808aULL
0900: 2c 20 20 30 78 38 30 30 30 30 30 30 30 38 30 30  ,  0x80000000800
0910: 30 38 30 30 30 55 4c 4c 2c 0a 20 20 20 20 30 78  08000ULL,.    0x
0920: 30 30 30 30 30 30 30 30 30 30 30 30 38 30 38 62  000000000000808b
0930: 55 4c 4c 2c 20 20 30 78 30 30 30 30 30 30 30 30  ULL,  0x00000000
0940: 38 30 30 30 30 30 30 31 55 4c 4c 2c 0a 20 20 20  80000001ULL,.   
0950: 20 30 78 38 30 30 30 30 30 30 30 38 30 30 30 38   0x8000000080008
0960: 30 38 31 55 4c 4c 2c 20 20 30 78 38 30 30 30 30  081ULL,  0x80000
0970: 30 30 30 30 30 30 30 38 30 30 39 55 4c 4c 2c 0a  00000008009ULL,.
0980: 20 20 20 20 30 78 30 30 30 30 30 30 30 30 30 30      0x0000000000
0990: 30 30 30 30 38 61 55 4c 4c 2c 20 20 30 78 30 30  00008aULL,  0x00
09a0: 30 30 30 30 30 30 30 30 30 30 30 30 38 38 55 4c  00000000000088UL
09b0: 4c 2c 0a 20 20 20 20 30 78 30 30 30 30 30 30 30  L,.    0x0000000
09c0: 30 38 30 30 30 38 30 30 39 55 4c 4c 2c 20 20 30  080008009ULL,  0
09d0: 78 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30  x000000008000000
09e0: 61 55 4c 4c 2c 0a 20 20 20 20 30 78 30 30 30 30  aULL,.    0x0000
09f0: 30 30 30 30 38 30 30 30 38 30 38 62 55 4c 4c 2c  00008000808bULL,
0a00: 20 20 30 78 38 30 30 30 30 30 30 30 30 30 30 30    0x800000000000
0a10: 30 30 38 62 55 4c 4c 2c 0a 20 20 20 20 30 78 38  008bULL,.    0x8
0a20: 30 30 30 30 30 30 30 30 30 30 30 38 30 38 39 55  000000000008089U
0a30: 4c 4c 2c 20 20 30 78 38 30 30 30 30 30 30 30 30  LL,  0x800000000
0a40: 30 30 30 38 30 30 33 55 4c 4c 2c 0a 20 20 20 20  0008003ULL,.    
0a50: 30 78 38 30 30 30 30 30 30 30 30 30 30 30 38 30  0x80000000000080
0a60: 30 32 55 4c 4c 2c 20 20 30 78 38 30 30 30 30 30  02ULL,  0x800000
0a70: 30 30 30 30 30 30 30 30 38 30 55 4c 4c 2c 0a 20  0000000080ULL,. 
0a80: 20 20 20 30 78 30 30 30 30 30 30 30 30 30 30 30     0x00000000000
0a90: 30 38 30 30 61 55 4c 4c 2c 20 20 30 78 38 30 30  0800aULL,  0x800
0aa0: 30 30 30 30 30 38 30 30 30 30 30 30 61 55 4c 4c  000008000000aULL
0ab0: 2c 0a 20 20 20 20 30 78 38 30 30 30 30 30 30 30  ,.    0x80000000
0ac0: 38 30 30 30 38 30 38 31 55 4c 4c 2c 20 20 30 78  80008081ULL,  0x
0ad0: 38 30 30 30 30 30 30 30 30 30 30 30 38 30 38 30  8000000000008080
0ae0: 55 4c 4c 2c 0a 20 20 20 20 30 78 30 30 30 30 30  ULL,.    0x00000
0af0: 30 30 30 38 30 30 30 30 30 30 31 55 4c 4c 2c 20  00080000001ULL, 
0b00: 20 30 78 38 30 30 30 30 30 30 30 38 30 30 30 38   0x8000000080008
0b10: 30 30 38 55 4c 4c 0a 20 20 7d 3b 0a 23 20 64 65  008ULL.  };.# de
0b20: 66 69 6e 65 20 41 30 30 20 28 70 2d 3e 75 2e 73  fine A00 (p->u.s
0b30: 5b 30 5d 29 0a 23 20 64 65 66 69 6e 65 20 41 30  [0]).# define A0
0b40: 31 20 28 70 2d 3e 75 2e 73 5b 31 5d 29 0a 23 20  1 (p->u.s[1]).# 
0b50: 64 65 66 69 6e 65 20 41 30 32 20 28 70 2d 3e 75  define A02 (p->u
0b60: 2e 73 5b 32 5d 29 0a 23 20 64 65 66 69 6e 65 20  .s[2]).# define 
0b70: 41 30 33 20 28 70 2d 3e 75 2e 73 5b 33 5d 29 0a  A03 (p->u.s[3]).
0b80: 23 20 64 65 66 69 6e 65 20 41 30 34 20 28 70 2d  # define A04 (p-
0b90: 3e 75 2e 73 5b 34 5d 29 0a 23 20 64 65 66 69 6e  >u.s[4]).# defin
0ba0: 65 20 41 31 30 20 28 70 2d 3e 75 2e 73 5b 35 5d  e A10 (p->u.s[5]
0bb0: 29 0a 23 20 64 65 66 69 6e 65 20 41 31 31 20 28  ).# define A11 (
0bc0: 70 2d 3e 75 2e 73 5b 36 5d 29 0a 23 20 64 65 66  p->u.s[6]).# def
0bd0: 69 6e 65 20 41 31 32 20 28 70 2d 3e 75 2e 73 5b  ine A12 (p->u.s[
0be0: 37 5d 29 0a 23 20 64 65 66 69 6e 65 20 41 31 33  7]).# define A13
0bf0: 20 28 70 2d 3e 75 2e 73 5b 38 5d 29 0a 23 20 64   (p->u.s[8]).# d
0c00: 65 66 69 6e 65 20 41 31 34 20 28 70 2d 3e 75 2e  efine A14 (p->u.
0c10: 73 5b 39 5d 29 0a 23 20 64 65 66 69 6e 65 20 41  s[9]).# define A
0c20: 32 30 20 28 70 2d 3e 75 2e 73 5b 31 30 5d 29 0a  20 (p->u.s[10]).
0c30: 23 20 64 65 66 69 6e 65 20 41 32 31 20 28 70 2d  # define A21 (p-
0c40: 3e 75 2e 73 5b 31 31 5d 29 0a 23 20 64 65 66 69  >u.s[11]).# defi
0c50: 6e 65 20 41 32 32 20 28 70 2d 3e 75 2e 73 5b 31  ne A22 (p->u.s[1
0c60: 32 5d 29 0a 23 20 64 65 66 69 6e 65 20 41 32 33  2]).# define A23
0c70: 20 28 70 2d 3e 75 2e 73 5b 31 33 5d 29 0a 23 20   (p->u.s[13]).# 
0c80: 64 65 66 69 6e 65 20 41 32 34 20 28 70 2d 3e 75  define A24 (p->u
0c90: 2e 73 5b 31 34 5d 29 0a 23 20 64 65 66 69 6e 65  .s[14]).# define
0ca0: 20 41 33 30 20 28 70 2d 3e 75 2e 73 5b 31 35 5d   A30 (p->u.s[15]
0cb0: 29 0a 23 20 64 65 66 69 6e 65 20 41 33 31 20 28  ).# define A31 (
0cc0: 70 2d 3e 75 2e 73 5b 31 36 5d 29 0a 23 20 64 65  p->u.s[16]).# de
0cd0: 66 69 6e 65 20 41 33 32 20 28 70 2d 3e 75 2e 73  fine A32 (p->u.s
0ce0: 5b 31 37 5d 29 0a 23 20 64 65 66 69 6e 65 20 41  [17]).# define A
0cf0: 33 33 20 28 70 2d 3e 75 2e 73 5b 31 38 5d 29 0a  33 (p->u.s[18]).
0d00: 23 20 64 65 66 69 6e 65 20 41 33 34 20 28 70 2d  # define A34 (p-
0d10: 3e 75 2e 73 5b 31 39 5d 29 0a 23 20 64 65 66 69  >u.s[19]).# defi
0d20: 6e 65 20 41 34 30 20 28 70 2d 3e 75 2e 73 5b 32  ne A40 (p->u.s[2
0d30: 30 5d 29 0a 23 20 64 65 66 69 6e 65 20 41 34 31  0]).# define A41
0d40: 20 28 70 2d 3e 75 2e 73 5b 32 31 5d 29 0a 23 20   (p->u.s[21]).# 
0d50: 64 65 66 69 6e 65 20 41 34 32 20 28 70 2d 3e 75  define A42 (p->u
0d60: 2e 73 5b 32 32 5d 29 0a 23 20 64 65 66 69 6e 65  .s[22]).# define
0d70: 20 41 34 33 20 28 70 2d 3e 75 2e 73 5b 32 33 5d   A43 (p->u.s[23]
0d80: 29 0a 23 20 64 65 66 69 6e 65 20 41 34 34 20 28  ).# define A44 (
0d90: 70 2d 3e 75 2e 73 5b 32 34 5d 29 0a 23 20 64 65  p->u.s[24]).# de
0da0: 66 69 6e 65 20 52 4f 4c 36 34 28 61 2c 78 29 20  fine ROL64(a,x) 
0db0: 28 28 61 3c 3c 78 29 7c 28 61 3e 3e 28 36 34 2d  ((a<<x)|(a>>(64-
0dc0: 78 29 29 29 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  x)))..  for(i=0;
0dd0: 20 69 3c 32 34 3b 20 69 2b 3d 34 29 7b 0a 20 20   i<24; i+=4){.  
0de0: 20 20 43 30 20 3d 20 41 30 30 5e 41 31 30 5e 41    C0 = A00^A10^A
0df0: 32 30 5e 41 33 30 5e 41 34 30 3b 0a 20 20 20 20  20^A30^A40;.    
0e00: 43 31 20 3d 20 41 30 31 5e 41 31 31 5e 41 32 31  C1 = A01^A11^A21
0e10: 5e 41 33 31 5e 41 34 31 3b 0a 20 20 20 20 43 32  ^A31^A41;.    C2
0e20: 20 3d 20 41 30 32 5e 41 31 32 5e 41 32 32 5e 41   = A02^A12^A22^A
0e30: 33 32 5e 41 34 32 3b 0a 20 20 20 20 43 33 20 3d  32^A42;.    C3 =
0e40: 20 41 30 33 5e 41 31 33 5e 41 32 33 5e 41 33 33   A03^A13^A23^A33
0e50: 5e 41 34 33 3b 0a 20 20 20 20 43 34 20 3d 20 41  ^A43;.    C4 = A
0e60: 30 34 5e 41 31 34 5e 41 32 34 5e 41 33 34 5e 41  04^A14^A24^A34^A
0e70: 34 34 3b 0a 20 20 20 20 44 30 20 3d 20 43 34 5e  44;.    D0 = C4^
0e80: 52 4f 4c 36 34 28 43 31 2c 20 31 29 3b 0a 20 20  ROL64(C1, 1);.  
0e90: 20 20 44 31 20 3d 20 43 30 5e 52 4f 4c 36 34 28    D1 = C0^ROL64(
0ea0: 43 32 2c 20 31 29 3b 0a 20 20 20 20 44 32 20 3d  C2, 1);.    D2 =
0eb0: 20 43 31 5e 52 4f 4c 36 34 28 43 33 2c 20 31 29   C1^ROL64(C3, 1)
0ec0: 3b 0a 20 20 20 20 44 33 20 3d 20 43 32 5e 52 4f  ;.    D3 = C2^RO
0ed0: 4c 36 34 28 43 34 2c 20 31 29 3b 0a 20 20 20 20  L64(C4, 1);.    
0ee0: 44 34 20 3d 20 43 33 5e 52 4f 4c 36 34 28 43 30  D4 = C3^ROL64(C0
0ef0: 2c 20 31 29 3b 0a 0a 20 20 20 20 42 30 20 3d 20  , 1);..    B0 = 
0f00: 28 41 30 30 5e 44 30 29 3b 0a 20 20 20 20 42 31  (A00^D0);.    B1
0f10: 20 3d 20 52 4f 4c 36 34 28 28 41 31 31 5e 44 31   = ROL64((A11^D1
0f20: 29 2c 20 34 34 29 3b 0a 20 20 20 20 42 32 20 3d  ), 44);.    B2 =
0f30: 20 52 4f 4c 36 34 28 28 41 32 32 5e 44 32 29 2c   ROL64((A22^D2),
0f40: 20 34 33 29 3b 0a 20 20 20 20 42 33 20 3d 20 52   43);.    B3 = R
0f50: 4f 4c 36 34 28 28 41 33 33 5e 44 33 29 2c 20 32  OL64((A33^D3), 2
0f60: 31 29 3b 0a 20 20 20 20 42 34 20 3d 20 52 4f 4c  1);.    B4 = ROL
0f70: 36 34 28 28 41 34 34 5e 44 34 29 2c 20 31 34 29  64((A44^D4), 14)
0f80: 3b 0a 20 20 20 20 41 30 30 20 3d 20 20 20 42 30  ;.    A00 =   B0
0f90: 20 5e 28 28 7e 42 31 29 26 20 20 42 32 20 29 3b   ^((~B1)&  B2 );
0fa0: 0a 20 20 20 20 41 30 30 20 5e 3d 20 52 43 5b 69  .    A00 ^= RC[i
0fb0: 5d 3b 0a 20 20 20 20 41 31 31 20 3d 20 20 20 42  ];.    A11 =   B
0fc0: 31 20 5e 28 28 7e 42 32 29 26 20 20 42 33 20 29  1 ^((~B2)&  B3 )
0fd0: 3b 0a 20 20 20 20 41 32 32 20 3d 20 20 20 42 32  ;.    A22 =   B2
0fe0: 20 5e 28 28 7e 42 33 29 26 20 20 42 34 20 29 3b   ^((~B3)&  B4 );
0ff0: 0a 20 20 20 20 41 33 33 20 3d 20 20 20 42 33 20  .    A33 =   B3 
1000: 5e 28 28 7e 42 34 29 26 20 20 42 30 20 29 3b 0a  ^((~B4)&  B0 );.
1010: 20 20 20 20 41 34 34 20 3d 20 20 20 42 34 20 5e      A44 =   B4 ^
1020: 28 28 7e 42 30 29 26 20 20 42 31 20 29 3b 0a 0a  ((~B0)&  B1 );..
1030: 20 20 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28      B2 = ROL64((
1040: 41 32 30 5e 44 30 29 2c 20 33 29 3b 0a 20 20 20  A20^D0), 3);.   
1050: 20 42 33 20 3d 20 52 4f 4c 36 34 28 28 41 33 31   B3 = ROL64((A31
1060: 5e 44 31 29 2c 20 34 35 29 3b 0a 20 20 20 20 42  ^D1), 45);.    B
1070: 34 20 3d 20 52 4f 4c 36 34 28 28 41 34 32 5e 44  4 = ROL64((A42^D
1080: 32 29 2c 20 36 31 29 3b 0a 20 20 20 20 42 30 20  2), 61);.    B0 
1090: 3d 20 52 4f 4c 36 34 28 28 41 30 33 5e 44 33 29  = ROL64((A03^D3)
10a0: 2c 20 32 38 29 3b 0a 20 20 20 20 42 31 20 3d 20  , 28);.    B1 = 
10b0: 52 4f 4c 36 34 28 28 41 31 34 5e 44 34 29 2c 20  ROL64((A14^D4), 
10c0: 32 30 29 3b 0a 20 20 20 20 41 32 30 20 3d 20 20  20);.    A20 =  
10d0: 20 42 30 20 5e 28 28 7e 42 31 29 26 20 20 42 32   B0 ^((~B1)&  B2
10e0: 20 29 3b 0a 20 20 20 20 41 33 31 20 3d 20 20 20   );.    A31 =   
10f0: 42 31 20 5e 28 28 7e 42 32 29 26 20 20 42 33 20  B1 ^((~B2)&  B3 
1100: 29 3b 0a 20 20 20 20 41 34 32 20 3d 20 20 20 42  );.    A42 =   B
1110: 32 20 5e 28 28 7e 42 33 29 26 20 20 42 34 20 29  2 ^((~B3)&  B4 )
1120: 3b 0a 20 20 20 20 41 30 33 20 3d 20 20 20 42 33  ;.    A03 =   B3
1130: 20 5e 28 28 7e 42 34 29 26 20 20 42 30 20 29 3b   ^((~B4)&  B0 );
1140: 0a 20 20 20 20 41 31 34 20 3d 20 20 20 42 34 20  .    A14 =   B4 
1150: 5e 28 28 7e 42 30 29 26 20 20 42 31 20 29 3b 0a  ^((~B0)&  B1 );.
1160: 0a 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34 28  .    B4 = ROL64(
1170: 28 41 34 30 5e 44 30 29 2c 20 31 38 29 3b 0a 20  (A40^D0), 18);. 
1180: 20 20 20 42 30 20 3d 20 52 4f 4c 36 34 28 28 41     B0 = ROL64((A
1190: 30 31 5e 44 31 29 2c 20 31 29 3b 0a 20 20 20 20  01^D1), 1);.    
11a0: 42 31 20 3d 20 52 4f 4c 36 34 28 28 41 31 32 5e  B1 = ROL64((A12^
11b0: 44 32 29 2c 20 36 29 3b 0a 20 20 20 20 42 32 20  D2), 6);.    B2 
11c0: 3d 20 52 4f 4c 36 34 28 28 41 32 33 5e 44 33 29  = ROL64((A23^D3)
11d0: 2c 20 32 35 29 3b 0a 20 20 20 20 42 33 20 3d 20  , 25);.    B3 = 
11e0: 52 4f 4c 36 34 28 28 41 33 34 5e 44 34 29 2c 20  ROL64((A34^D4), 
11f0: 38 29 3b 0a 20 20 20 20 41 34 30 20 3d 20 20 20  8);.    A40 =   
1200: 42 30 20 5e 28 28 7e 42 31 29 26 20 20 42 32 20  B0 ^((~B1)&  B2 
1210: 29 3b 0a 20 20 20 20 41 30 31 20 3d 20 20 20 42  );.    A01 =   B
1220: 31 20 5e 28 28 7e 42 32 29 26 20 20 42 33 20 29  1 ^((~B2)&  B3 )
1230: 3b 0a 20 20 20 20 41 31 32 20 3d 20 20 20 42 32  ;.    A12 =   B2
1240: 20 5e 28 28 7e 42 33 29 26 20 20 42 34 20 29 3b   ^((~B3)&  B4 );
1250: 0a 20 20 20 20 41 32 33 20 3d 20 20 20 42 33 20  .    A23 =   B3 
1260: 5e 28 28 7e 42 34 29 26 20 20 42 30 20 29 3b 0a  ^((~B4)&  B0 );.
1270: 20 20 20 20 41 33 34 20 3d 20 20 20 42 34 20 5e      A34 =   B4 ^
1280: 28 28 7e 42 30 29 26 20 20 42 31 20 29 3b 0a 0a  ((~B0)&  B1 );..
1290: 20 20 20 20 42 31 20 3d 20 52 4f 4c 36 34 28 28      B1 = ROL64((
12a0: 41 31 30 5e 44 30 29 2c 20 33 36 29 3b 0a 20 20  A10^D0), 36);.  
12b0: 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28 41 32    B2 = ROL64((A2
12c0: 31 5e 44 31 29 2c 20 31 30 29 3b 0a 20 20 20 20  1^D1), 10);.    
12d0: 42 33 20 3d 20 52 4f 4c 36 34 28 28 41 33 32 5e  B3 = ROL64((A32^
12e0: 44 32 29 2c 20 31 35 29 3b 0a 20 20 20 20 42 34  D2), 15);.    B4
12f0: 20 3d 20 52 4f 4c 36 34 28 28 41 34 33 5e 44 33   = ROL64((A43^D3
1300: 29 2c 20 35 36 29 3b 0a 20 20 20 20 42 30 20 3d  ), 56);.    B0 =
1310: 20 52 4f 4c 36 34 28 28 41 30 34 5e 44 34 29 2c   ROL64((A04^D4),
1320: 20 32 37 29 3b 0a 20 20 20 20 41 31 30 20 3d 20   27);.    A10 = 
1330: 20 20 42 30 20 5e 28 28 7e 42 31 29 26 20 20 42    B0 ^((~B1)&  B
1340: 32 20 29 3b 0a 20 20 20 20 41 32 31 20 3d 20 20  2 );.    A21 =  
1350: 20 42 31 20 5e 28 28 7e 42 32 29 26 20 20 42 33   B1 ^((~B2)&  B3
1360: 20 29 3b 0a 20 20 20 20 41 33 32 20 3d 20 20 20   );.    A32 =   
1370: 42 32 20 5e 28 28 7e 42 33 29 26 20 20 42 34 20  B2 ^((~B3)&  B4 
1380: 29 3b 0a 20 20 20 20 41 34 33 20 3d 20 20 20 42  );.    A43 =   B
1390: 33 20 5e 28 28 7e 42 34 29 26 20 20 42 30 20 29  3 ^((~B4)&  B0 )
13a0: 3b 0a 20 20 20 20 41 30 34 20 3d 20 20 20 42 34  ;.    A04 =   B4
13b0: 20 5e 28 28 7e 42 30 29 26 20 20 42 31 20 29 3b   ^((~B0)&  B1 );
13c0: 0a 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c 36 34  ..    B3 = ROL64
13d0: 28 28 41 33 30 5e 44 30 29 2c 20 34 31 29 3b 0a  ((A30^D0), 41);.
13e0: 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34 28 28      B4 = ROL64((
13f0: 41 34 31 5e 44 31 29 2c 20 32 29 3b 0a 20 20 20  A41^D1), 2);.   
1400: 20 42 30 20 3d 20 52 4f 4c 36 34 28 28 41 30 32   B0 = ROL64((A02
1410: 5e 44 32 29 2c 20 36 32 29 3b 0a 20 20 20 20 42  ^D2), 62);.    B
1420: 31 20 3d 20 52 4f 4c 36 34 28 28 41 31 33 5e 44  1 = ROL64((A13^D
1430: 33 29 2c 20 35 35 29 3b 0a 20 20 20 20 42 32 20  3), 55);.    B2 
1440: 3d 20 52 4f 4c 36 34 28 28 41 32 34 5e 44 34 29  = ROL64((A24^D4)
1450: 2c 20 33 39 29 3b 0a 20 20 20 20 41 33 30 20 3d  , 39);.    A30 =
1460: 20 20 20 42 30 20 5e 28 28 7e 42 31 29 26 20 20     B0 ^((~B1)&  
1470: 42 32 20 29 3b 0a 20 20 20 20 41 34 31 20 3d 20  B2 );.    A41 = 
1480: 20 20 42 31 20 5e 28 28 7e 42 32 29 26 20 20 42    B1 ^((~B2)&  B
1490: 33 20 29 3b 0a 20 20 20 20 41 30 32 20 3d 20 20  3 );.    A02 =  
14a0: 20 42 32 20 5e 28 28 7e 42 33 29 26 20 20 42 34   B2 ^((~B3)&  B4
14b0: 20 29 3b 0a 20 20 20 20 41 31 33 20 3d 20 20 20   );.    A13 =   
14c0: 42 33 20 5e 28 28 7e 42 34 29 26 20 20 42 30 20  B3 ^((~B4)&  B0 
14d0: 29 3b 0a 20 20 20 20 41 32 34 20 3d 20 20 20 42  );.    A24 =   B
14e0: 34 20 5e 28 28 7e 42 30 29 26 20 20 42 31 20 29  4 ^((~B0)&  B1 )
14f0: 3b 0a 0a 20 20 20 20 43 30 20 3d 20 41 30 30 5e  ;..    C0 = A00^
1500: 41 32 30 5e 41 34 30 5e 41 31 30 5e 41 33 30 3b  A20^A40^A10^A30;
1510: 0a 20 20 20 20 43 31 20 3d 20 41 31 31 5e 41 33  .    C1 = A11^A3
1520: 31 5e 41 30 31 5e 41 32 31 5e 41 34 31 3b 0a 20  1^A01^A21^A41;. 
1530: 20 20 20 43 32 20 3d 20 41 32 32 5e 41 34 32 5e     C2 = A22^A42^
1540: 41 31 32 5e 41 33 32 5e 41 30 32 3b 0a 20 20 20  A12^A32^A02;.   
1550: 20 43 33 20 3d 20 41 33 33 5e 41 30 33 5e 41 32   C3 = A33^A03^A2
1560: 33 5e 41 34 33 5e 41 31 33 3b 0a 20 20 20 20 43  3^A43^A13;.    C
1570: 34 20 3d 20 41 34 34 5e 41 31 34 5e 41 33 34 5e  4 = A44^A14^A34^
1580: 41 30 34 5e 41 32 34 3b 0a 20 20 20 20 44 30 20  A04^A24;.    D0 
1590: 3d 20 43 34 5e 52 4f 4c 36 34 28 43 31 2c 20 31  = C4^ROL64(C1, 1
15a0: 29 3b 0a 20 20 20 20 44 31 20 3d 20 43 30 5e 52  );.    D1 = C0^R
15b0: 4f 4c 36 34 28 43 32 2c 20 31 29 3b 0a 20 20 20  OL64(C2, 1);.   
15c0: 20 44 32 20 3d 20 43 31 5e 52 4f 4c 36 34 28 43   D2 = C1^ROL64(C
15d0: 33 2c 20 31 29 3b 0a 20 20 20 20 44 33 20 3d 20  3, 1);.    D3 = 
15e0: 43 32 5e 52 4f 4c 36 34 28 43 34 2c 20 31 29 3b  C2^ROL64(C4, 1);
15f0: 0a 20 20 20 20 44 34 20 3d 20 43 33 5e 52 4f 4c  .    D4 = C3^ROL
1600: 36 34 28 43 30 2c 20 31 29 3b 0a 0a 20 20 20 20  64(C0, 1);..    
1610: 42 30 20 3d 20 28 41 30 30 5e 44 30 29 3b 0a 20  B0 = (A00^D0);. 
1620: 20 20 20 42 31 20 3d 20 52 4f 4c 36 34 28 28 41     B1 = ROL64((A
1630: 33 31 5e 44 31 29 2c 20 34 34 29 3b 0a 20 20 20  31^D1), 44);.   
1640: 20 42 32 20 3d 20 52 4f 4c 36 34 28 28 41 31 32   B2 = ROL64((A12
1650: 5e 44 32 29 2c 20 34 33 29 3b 0a 20 20 20 20 42  ^D2), 43);.    B
1660: 33 20 3d 20 52 4f 4c 36 34 28 28 41 34 33 5e 44  3 = ROL64((A43^D
1670: 33 29 2c 20 32 31 29 3b 0a 20 20 20 20 42 34 20  3), 21);.    B4 
1680: 3d 20 52 4f 4c 36 34 28 28 41 32 34 5e 44 34 29  = ROL64((A24^D4)
1690: 2c 20 31 34 29 3b 0a 20 20 20 20 41 30 30 20 3d  , 14);.    A00 =
16a0: 20 20 20 42 30 20 5e 28 28 7e 42 31 29 26 20 20     B0 ^((~B1)&  
16b0: 42 32 20 29 3b 0a 20 20 20 20 41 30 30 20 5e 3d  B2 );.    A00 ^=
16c0: 20 52 43 5b 69 2b 31 5d 3b 0a 20 20 20 20 41 33   RC[i+1];.    A3
16d0: 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42 32 29  1 =   B1 ^((~B2)
16e0: 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41 31 32  &  B3 );.    A12
16f0: 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33 29 26   =   B2 ^((~B3)&
1700: 20 20 42 34 20 29 3b 0a 20 20 20 20 41 34 33 20    B4 );.    A43 
1710: 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29 26 20  =   B3 ^((~B4)& 
1720: 20 42 30 20 29 3b 0a 20 20 20 20 41 32 34 20 3d   B0 );.    A24 =
1730: 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26 20 20     B4 ^((~B0)&  
1740: 42 31 20 29 3b 0a 0a 20 20 20 20 42 32 20 3d 20  B1 );..    B2 = 
1750: 52 4f 4c 36 34 28 28 41 34 30 5e 44 30 29 2c 20  ROL64((A40^D0), 
1760: 33 29 3b 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c  3);.    B3 = ROL
1770: 36 34 28 28 41 32 31 5e 44 31 29 2c 20 34 35 29  64((A21^D1), 45)
1780: 3b 0a 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34  ;.    B4 = ROL64
1790: 28 28 41 30 32 5e 44 32 29 2c 20 36 31 29 3b 0a  ((A02^D2), 61);.
17a0: 20 20 20 20 42 30 20 3d 20 52 4f 4c 36 34 28 28      B0 = ROL64((
17b0: 41 33 33 5e 44 33 29 2c 20 32 38 29 3b 0a 20 20  A33^D3), 28);.  
17c0: 20 20 42 31 20 3d 20 52 4f 4c 36 34 28 28 41 31    B1 = ROL64((A1
17d0: 34 5e 44 34 29 2c 20 32 30 29 3b 0a 20 20 20 20  4^D4), 20);.    
17e0: 41 34 30 20 3d 20 20 20 42 30 20 5e 28 28 7e 42  A40 =   B0 ^((~B
17f0: 31 29 26 20 20 42 32 20 29 3b 0a 20 20 20 20 41  1)&  B2 );.    A
1800: 32 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42 32  21 =   B1 ^((~B2
1810: 29 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41 30  )&  B3 );.    A0
1820: 32 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33 29  2 =   B2 ^((~B3)
1830: 26 20 20 42 34 20 29 3b 0a 20 20 20 20 41 33 33  &  B4 );.    A33
1840: 20 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29 26   =   B3 ^((~B4)&
1850: 20 20 42 30 20 29 3b 0a 20 20 20 20 41 31 34 20    B0 );.    A14 
1860: 3d 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26 20  =   B4 ^((~B0)& 
1870: 20 42 31 20 29 3b 0a 0a 20 20 20 20 42 34 20 3d   B1 );..    B4 =
1880: 20 52 4f 4c 36 34 28 28 41 33 30 5e 44 30 29 2c   ROL64((A30^D0),
1890: 20 31 38 29 3b 0a 20 20 20 20 42 30 20 3d 20 52   18);.    B0 = R
18a0: 4f 4c 36 34 28 28 41 31 31 5e 44 31 29 2c 20 31  OL64((A11^D1), 1
18b0: 29 3b 0a 20 20 20 20 42 31 20 3d 20 52 4f 4c 36  );.    B1 = ROL6
18c0: 34 28 28 41 34 32 5e 44 32 29 2c 20 36 29 3b 0a  4((A42^D2), 6);.
18d0: 20 20 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28      B2 = ROL64((
18e0: 41 32 33 5e 44 33 29 2c 20 32 35 29 3b 0a 20 20  A23^D3), 25);.  
18f0: 20 20 42 33 20 3d 20 52 4f 4c 36 34 28 28 41 30    B3 = ROL64((A0
1900: 34 5e 44 34 29 2c 20 38 29 3b 0a 20 20 20 20 41  4^D4), 8);.    A
1910: 33 30 20 3d 20 20 20 42 30 20 5e 28 28 7e 42 31  30 =   B0 ^((~B1
1920: 29 26 20 20 42 32 20 29 3b 0a 20 20 20 20 41 31  )&  B2 );.    A1
1930: 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42 32 29  1 =   B1 ^((~B2)
1940: 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41 34 32  &  B3 );.    A42
1950: 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33 29 26   =   B2 ^((~B3)&
1960: 20 20 42 34 20 29 3b 0a 20 20 20 20 41 32 33 20    B4 );.    A23 
1970: 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29 26 20  =   B3 ^((~B4)& 
1980: 20 42 30 20 29 3b 0a 20 20 20 20 41 30 34 20 3d   B0 );.    A04 =
1990: 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26 20 20     B4 ^((~B0)&  
19a0: 42 31 20 29 3b 0a 0a 20 20 20 20 42 31 20 3d 20  B1 );..    B1 = 
19b0: 52 4f 4c 36 34 28 28 41 32 30 5e 44 30 29 2c 20  ROL64((A20^D0), 
19c0: 33 36 29 3b 0a 20 20 20 20 42 32 20 3d 20 52 4f  36);.    B2 = RO
19d0: 4c 36 34 28 28 41 30 31 5e 44 31 29 2c 20 31 30  L64((A01^D1), 10
19e0: 29 3b 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c 36  );.    B3 = ROL6
19f0: 34 28 28 41 33 32 5e 44 32 29 2c 20 31 35 29 3b  4((A32^D2), 15);
1a00: 0a 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34 28  .    B4 = ROL64(
1a10: 28 41 31 33 5e 44 33 29 2c 20 35 36 29 3b 0a 20  (A13^D3), 56);. 
1a20: 20 20 20 42 30 20 3d 20 52 4f 4c 36 34 28 28 41     B0 = ROL64((A
1a30: 34 34 5e 44 34 29 2c 20 32 37 29 3b 0a 20 20 20  44^D4), 27);.   
1a40: 20 41 32 30 20 3d 20 20 20 42 30 20 5e 28 28 7e   A20 =   B0 ^((~
1a50: 42 31 29 26 20 20 42 32 20 29 3b 0a 20 20 20 20  B1)&  B2 );.    
1a60: 41 30 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42  A01 =   B1 ^((~B
1a70: 32 29 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41  2)&  B3 );.    A
1a80: 33 32 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33  32 =   B2 ^((~B3
1a90: 29 26 20 20 42 34 20 29 3b 0a 20 20 20 20 41 31  )&  B4 );.    A1
1aa0: 33 20 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29  3 =   B3 ^((~B4)
1ab0: 26 20 20 42 30 20 29 3b 0a 20 20 20 20 41 34 34  &  B0 );.    A44
1ac0: 20 3d 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26   =   B4 ^((~B0)&
1ad0: 20 20 42 31 20 29 3b 0a 0a 20 20 20 20 42 33 20    B1 );..    B3 
1ae0: 3d 20 52 4f 4c 36 34 28 28 41 31 30 5e 44 30 29  = ROL64((A10^D0)
1af0: 2c 20 34 31 29 3b 0a 20 20 20 20 42 34 20 3d 20  , 41);.    B4 = 
1b00: 52 4f 4c 36 34 28 28 41 34 31 5e 44 31 29 2c 20  ROL64((A41^D1), 
1b10: 32 29 3b 0a 20 20 20 20 42 30 20 3d 20 52 4f 4c  2);.    B0 = ROL
1b20: 36 34 28 28 41 32 32 5e 44 32 29 2c 20 36 32 29  64((A22^D2), 62)
1b30: 3b 0a 20 20 20 20 42 31 20 3d 20 52 4f 4c 36 34  ;.    B1 = ROL64
1b40: 28 28 41 30 33 5e 44 33 29 2c 20 35 35 29 3b 0a  ((A03^D3), 55);.
1b50: 20 20 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28      B2 = ROL64((
1b60: 41 33 34 5e 44 34 29 2c 20 33 39 29 3b 0a 20 20  A34^D4), 39);.  
1b70: 20 20 41 31 30 20 3d 20 20 20 42 30 20 5e 28 28    A10 =   B0 ^((
1b80: 7e 42 31 29 26 20 20 42 32 20 29 3b 0a 20 20 20  ~B1)&  B2 );.   
1b90: 20 41 34 31 20 3d 20 20 20 42 31 20 5e 28 28 7e   A41 =   B1 ^((~
1ba0: 42 32 29 26 20 20 42 33 20 29 3b 0a 20 20 20 20  B2)&  B3 );.    
1bb0: 41 32 32 20 3d 20 20 20 42 32 20 5e 28 28 7e 42  A22 =   B2 ^((~B
1bc0: 33 29 26 20 20 42 34 20 29 3b 0a 20 20 20 20 41  3)&  B4 );.    A
1bd0: 30 33 20 3d 20 20 20 42 33 20 5e 28 28 7e 42 34  03 =   B3 ^((~B4
1be0: 29 26 20 20 42 30 20 29 3b 0a 20 20 20 20 41 33  )&  B0 );.    A3
1bf0: 34 20 3d 20 20 20 42 34 20 5e 28 28 7e 42 30 29  4 =   B4 ^((~B0)
1c00: 26 20 20 42 31 20 29 3b 0a 0a 20 20 20 20 43 30  &  B1 );..    C0
1c10: 20 3d 20 41 30 30 5e 41 34 30 5e 41 33 30 5e 41   = A00^A40^A30^A
1c20: 32 30 5e 41 31 30 3b 0a 20 20 20 20 43 31 20 3d  20^A10;.    C1 =
1c30: 20 41 33 31 5e 41 32 31 5e 41 31 31 5e 41 30 31   A31^A21^A11^A01
1c40: 5e 41 34 31 3b 0a 20 20 20 20 43 32 20 3d 20 41  ^A41;.    C2 = A
1c50: 31 32 5e 41 30 32 5e 41 34 32 5e 41 33 32 5e 41  12^A02^A42^A32^A
1c60: 32 32 3b 0a 20 20 20 20 43 33 20 3d 20 41 34 33  22;.    C3 = A43
1c70: 5e 41 33 33 5e 41 32 33 5e 41 31 33 5e 41 30 33  ^A33^A23^A13^A03
1c80: 3b 0a 20 20 20 20 43 34 20 3d 20 41 32 34 5e 41  ;.    C4 = A24^A
1c90: 31 34 5e 41 30 34 5e 41 34 34 5e 41 33 34 3b 0a  14^A04^A44^A34;.
1ca0: 20 20 20 20 44 30 20 3d 20 43 34 5e 52 4f 4c 36      D0 = C4^ROL6
1cb0: 34 28 43 31 2c 20 31 29 3b 0a 20 20 20 20 44 31  4(C1, 1);.    D1
1cc0: 20 3d 20 43 30 5e 52 4f 4c 36 34 28 43 32 2c 20   = C0^ROL64(C2, 
1cd0: 31 29 3b 0a 20 20 20 20 44 32 20 3d 20 43 31 5e  1);.    D2 = C1^
1ce0: 52 4f 4c 36 34 28 43 33 2c 20 31 29 3b 0a 20 20  ROL64(C3, 1);.  
1cf0: 20 20 44 33 20 3d 20 43 32 5e 52 4f 4c 36 34 28    D3 = C2^ROL64(
1d00: 43 34 2c 20 31 29 3b 0a 20 20 20 20 44 34 20 3d  C4, 1);.    D4 =
1d10: 20 43 33 5e 52 4f 4c 36 34 28 43 30 2c 20 31 29   C3^ROL64(C0, 1)
1d20: 3b 0a 0a 20 20 20 20 42 30 20 3d 20 28 41 30 30  ;..    B0 = (A00
1d30: 5e 44 30 29 3b 0a 20 20 20 20 42 31 20 3d 20 52  ^D0);.    B1 = R
1d40: 4f 4c 36 34 28 28 41 32 31 5e 44 31 29 2c 20 34  OL64((A21^D1), 4
1d50: 34 29 3b 0a 20 20 20 20 42 32 20 3d 20 52 4f 4c  4);.    B2 = ROL
1d60: 36 34 28 28 41 34 32 5e 44 32 29 2c 20 34 33 29  64((A42^D2), 43)
1d70: 3b 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c 36 34  ;.    B3 = ROL64
1d80: 28 28 41 31 33 5e 44 33 29 2c 20 32 31 29 3b 0a  ((A13^D3), 21);.
1d90: 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34 28 28      B4 = ROL64((
1da0: 41 33 34 5e 44 34 29 2c 20 31 34 29 3b 0a 20 20  A34^D4), 14);.  
1db0: 20 20 41 30 30 20 3d 20 20 20 42 30 20 5e 28 28    A00 =   B0 ^((
1dc0: 7e 42 31 29 26 20 20 42 32 20 29 3b 0a 20 20 20  ~B1)&  B2 );.   
1dd0: 20 41 30 30 20 5e 3d 20 52 43 5b 69 2b 32 5d 3b   A00 ^= RC[i+2];
1de0: 0a 20 20 20 20 41 32 31 20 3d 20 20 20 42 31 20  .    A21 =   B1 
1df0: 5e 28 28 7e 42 32 29 26 20 20 42 33 20 29 3b 0a  ^((~B2)&  B3 );.
1e00: 20 20 20 20 41 34 32 20 3d 20 20 20 42 32 20 5e      A42 =   B2 ^
1e10: 28 28 7e 42 33 29 26 20 20 42 34 20 29 3b 0a 20  ((~B3)&  B4 );. 
1e20: 20 20 20 41 31 33 20 3d 20 20 20 42 33 20 5e 28     A13 =   B3 ^(
1e30: 28 7e 42 34 29 26 20 20 42 30 20 29 3b 0a 20 20  (~B4)&  B0 );.  
1e40: 20 20 41 33 34 20 3d 20 20 20 42 34 20 5e 28 28    A34 =   B4 ^((
1e50: 7e 42 30 29 26 20 20 42 31 20 29 3b 0a 0a 20 20  ~B0)&  B1 );..  
1e60: 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28 41 33    B2 = ROL64((A3
1e70: 30 5e 44 30 29 2c 20 33 29 3b 0a 20 20 20 20 42  0^D0), 3);.    B
1e80: 33 20 3d 20 52 4f 4c 36 34 28 28 41 30 31 5e 44  3 = ROL64((A01^D
1e90: 31 29 2c 20 34 35 29 3b 0a 20 20 20 20 42 34 20  1), 45);.    B4 
1ea0: 3d 20 52 4f 4c 36 34 28 28 41 32 32 5e 44 32 29  = ROL64((A22^D2)
1eb0: 2c 20 36 31 29 3b 0a 20 20 20 20 42 30 20 3d 20  , 61);.    B0 = 
1ec0: 52 4f 4c 36 34 28 28 41 34 33 5e 44 33 29 2c 20  ROL64((A43^D3), 
1ed0: 32 38 29 3b 0a 20 20 20 20 42 31 20 3d 20 52 4f  28);.    B1 = RO
1ee0: 4c 36 34 28 28 41 31 34 5e 44 34 29 2c 20 32 30  L64((A14^D4), 20
1ef0: 29 3b 0a 20 20 20 20 41 33 30 20 3d 20 20 20 42  );.    A30 =   B
1f00: 30 20 5e 28 28 7e 42 31 29 26 20 20 42 32 20 29  0 ^((~B1)&  B2 )
1f10: 3b 0a 20 20 20 20 41 30 31 20 3d 20 20 20 42 31  ;.    A01 =   B1
1f20: 20 5e 28 28 7e 42 32 29 26 20 20 42 33 20 29 3b   ^((~B2)&  B3 );
1f30: 0a 20 20 20 20 41 32 32 20 3d 20 20 20 42 32 20  .    A22 =   B2 
1f40: 5e 28 28 7e 42 33 29 26 20 20 42 34 20 29 3b 0a  ^((~B3)&  B4 );.
1f50: 20 20 20 20 41 34 33 20 3d 20 20 20 42 33 20 5e      A43 =   B3 ^
1f60: 28 28 7e 42 34 29 26 20 20 42 30 20 29 3b 0a 20  ((~B4)&  B0 );. 
1f70: 20 20 20 41 31 34 20 3d 20 20 20 42 34 20 5e 28     A14 =   B4 ^(
1f80: 28 7e 42 30 29 26 20 20 42 31 20 29 3b 0a 0a 20  (~B0)&  B1 );.. 
1f90: 20 20 20 42 34 20 3d 20 52 4f 4c 36 34 28 28 41     B4 = ROL64((A
1fa0: 31 30 5e 44 30 29 2c 20 31 38 29 3b 0a 20 20 20  10^D0), 18);.   
1fb0: 20 42 30 20 3d 20 52 4f 4c 36 34 28 28 41 33 31   B0 = ROL64((A31
1fc0: 5e 44 31 29 2c 20 31 29 3b 0a 20 20 20 20 42 31  ^D1), 1);.    B1
1fd0: 20 3d 20 52 4f 4c 36 34 28 28 41 30 32 5e 44 32   = ROL64((A02^D2
1fe0: 29 2c 20 36 29 3b 0a 20 20 20 20 42 32 20 3d 20  ), 6);.    B2 = 
1ff0: 52 4f 4c 36 34 28 28 41 32 33 5e 44 33 29 2c 20  ROL64((A23^D3), 
2000: 32 35 29 3b 0a 20 20 20 20 42 33 20 3d 20 52 4f  25);.    B3 = RO
2010: 4c 36 34 28 28 41 34 34 5e 44 34 29 2c 20 38 29  L64((A44^D4), 8)
2020: 3b 0a 20 20 20 20 41 31 30 20 3d 20 20 20 42 30  ;.    A10 =   B0
2030: 20 5e 28 28 7e 42 31 29 26 20 20 42 32 20 29 3b   ^((~B1)&  B2 );
2040: 0a 20 20 20 20 41 33 31 20 3d 20 20 20 42 31 20  .    A31 =   B1 
2050: 5e 28 28 7e 42 32 29 26 20 20 42 33 20 29 3b 0a  ^((~B2)&  B3 );.
2060: 20 20 20 20 41 30 32 20 3d 20 20 20 42 32 20 5e      A02 =   B2 ^
2070: 28 28 7e 42 33 29 26 20 20 42 34 20 29 3b 0a 20  ((~B3)&  B4 );. 
2080: 20 20 20 41 32 33 20 3d 20 20 20 42 33 20 5e 28     A23 =   B3 ^(
2090: 28 7e 42 34 29 26 20 20 42 30 20 29 3b 0a 20 20  (~B4)&  B0 );.  
20a0: 20 20 41 34 34 20 3d 20 20 20 42 34 20 5e 28 28    A44 =   B4 ^((
20b0: 7e 42 30 29 26 20 20 42 31 20 29 3b 0a 0a 20 20  ~B0)&  B1 );..  
20c0: 20 20 42 31 20 3d 20 52 4f 4c 36 34 28 28 41 34    B1 = ROL64((A4
20d0: 30 5e 44 30 29 2c 20 33 36 29 3b 0a 20 20 20 20  0^D0), 36);.    
20e0: 42 32 20 3d 20 52 4f 4c 36 34 28 28 41 31 31 5e  B2 = ROL64((A11^
20f0: 44 31 29 2c 20 31 30 29 3b 0a 20 20 20 20 42 33  D1), 10);.    B3
2100: 20 3d 20 52 4f 4c 36 34 28 28 41 33 32 5e 44 32   = ROL64((A32^D2
2110: 29 2c 20 31 35 29 3b 0a 20 20 20 20 42 34 20 3d  ), 15);.    B4 =
2120: 20 52 4f 4c 36 34 28 28 41 30 33 5e 44 33 29 2c   ROL64((A03^D3),
2130: 20 35 36 29 3b 0a 20 20 20 20 42 30 20 3d 20 52   56);.    B0 = R
2140: 4f 4c 36 34 28 28 41 32 34 5e 44 34 29 2c 20 32  OL64((A24^D4), 2
2150: 37 29 3b 0a 20 20 20 20 41 34 30 20 3d 20 20 20  7);.    A40 =   
2160: 42 30 20 5e 28 28 7e 42 31 29 26 20 20 42 32 20  B0 ^((~B1)&  B2 
2170: 29 3b 0a 20 20 20 20 41 31 31 20 3d 20 20 20 42  );.    A11 =   B
2180: 31 20 5e 28 28 7e 42 32 29 26 20 20 42 33 20 29  1 ^((~B2)&  B3 )
2190: 3b 0a 20 20 20 20 41 33 32 20 3d 20 20 20 42 32  ;.    A32 =   B2
21a0: 20 5e 28 28 7e 42 33 29 26 20 20 42 34 20 29 3b   ^((~B3)&  B4 );
21b0: 0a 20 20 20 20 41 30 33 20 3d 20 20 20 42 33 20  .    A03 =   B3 
21c0: 5e 28 28 7e 42 34 29 26 20 20 42 30 20 29 3b 0a  ^((~B4)&  B0 );.
21d0: 20 20 20 20 41 32 34 20 3d 20 20 20 42 34 20 5e      A24 =   B4 ^
21e0: 28 28 7e 42 30 29 26 20 20 42 31 20 29 3b 0a 0a  ((~B0)&  B1 );..
21f0: 20 20 20 20 42 33 20 3d 20 52 4f 4c 36 34 28 28      B3 = ROL64((
2200: 41 32 30 5e 44 30 29 2c 20 34 31 29 3b 0a 20 20  A20^D0), 41);.  
2210: 20 20 42 34 20 3d 20 52 4f 4c 36 34 28 28 41 34    B4 = ROL64((A4
2220: 31 5e 44 31 29 2c 20 32 29 3b 0a 20 20 20 20 42  1^D1), 2);.    B
2230: 30 20 3d 20 52 4f 4c 36 34 28 28 41 31 32 5e 44  0 = ROL64((A12^D
2240: 32 29 2c 20 36 32 29 3b 0a 20 20 20 20 42 31 20  2), 62);.    B1 
2250: 3d 20 52 4f 4c 36 34 28 28 41 33 33 5e 44 33 29  = ROL64((A33^D3)
2260: 2c 20 35 35 29 3b 0a 20 20 20 20 42 32 20 3d 20  , 55);.    B2 = 
2270: 52 4f 4c 36 34 28 28 41 30 34 5e 44 34 29 2c 20  ROL64((A04^D4), 
2280: 33 39 29 3b 0a 20 20 20 20 41 32 30 20 3d 20 20  39);.    A20 =  
2290: 20 42 30 20 5e 28 28 7e 42 31 29 26 20 20 42 32   B0 ^((~B1)&  B2
22a0: 20 29 3b 0a 20 20 20 20 41 34 31 20 3d 20 20 20   );.    A41 =   
22b0: 42 31 20 5e 28 28 7e 42 32 29 26 20 20 42 33 20  B1 ^((~B2)&  B3 
22c0: 29 3b 0a 20 20 20 20 41 31 32 20 3d 20 20 20 42  );.    A12 =   B
22d0: 32 20 5e 28 28 7e 42 33 29 26 20 20 42 34 20 29  2 ^((~B3)&  B4 )
22e0: 3b 0a 20 20 20 20 41 33 33 20 3d 20 20 20 42 33  ;.    A33 =   B3
22f0: 20 5e 28 28 7e 42 34 29 26 20 20 42 30 20 29 3b   ^((~B4)&  B0 );
2300: 0a 20 20 20 20 41 30 34 20 3d 20 20 20 42 34 20  .    A04 =   B4 
2310: 5e 28 28 7e 42 30 29 26 20 20 42 31 20 29 3b 0a  ^((~B0)&  B1 );.
2320: 0a 20 20 20 20 43 30 20 3d 20 41 30 30 5e 41 33  .    C0 = A00^A3
2330: 30 5e 41 31 30 5e 41 34 30 5e 41 32 30 3b 0a 20  0^A10^A40^A20;. 
2340: 20 20 20 43 31 20 3d 20 41 32 31 5e 41 30 31 5e     C1 = A21^A01^
2350: 41 33 31 5e 41 31 31 5e 41 34 31 3b 0a 20 20 20  A31^A11^A41;.   
2360: 20 43 32 20 3d 20 41 34 32 5e 41 32 32 5e 41 30   C2 = A42^A22^A0
2370: 32 5e 41 33 32 5e 41 31 32 3b 0a 20 20 20 20 43  2^A32^A12;.    C
2380: 33 20 3d 20 41 31 33 5e 41 34 33 5e 41 32 33 5e  3 = A13^A43^A23^
2390: 41 30 33 5e 41 33 33 3b 0a 20 20 20 20 43 34 20  A03^A33;.    C4 
23a0: 3d 20 41 33 34 5e 41 31 34 5e 41 34 34 5e 41 32  = A34^A14^A44^A2
23b0: 34 5e 41 30 34 3b 0a 20 20 20 20 44 30 20 3d 20  4^A04;.    D0 = 
23c0: 43 34 5e 52 4f 4c 36 34 28 43 31 2c 20 31 29 3b  C4^ROL64(C1, 1);
23d0: 0a 20 20 20 20 44 31 20 3d 20 43 30 5e 52 4f 4c  .    D1 = C0^ROL
23e0: 36 34 28 43 32 2c 20 31 29 3b 0a 20 20 20 20 44  64(C2, 1);.    D
23f0: 32 20 3d 20 43 31 5e 52 4f 4c 36 34 28 43 33 2c  2 = C1^ROL64(C3,
2400: 20 31 29 3b 0a 20 20 20 20 44 33 20 3d 20 43 32   1);.    D3 = C2
2410: 5e 52 4f 4c 36 34 28 43 34 2c 20 31 29 3b 0a 20  ^ROL64(C4, 1);. 
2420: 20 20 20 44 34 20 3d 20 43 33 5e 52 4f 4c 36 34     D4 = C3^ROL64
2430: 28 43 30 2c 20 31 29 3b 0a 0a 20 20 20 20 42 30  (C0, 1);..    B0
2440: 20 3d 20 28 41 30 30 5e 44 30 29 3b 0a 20 20 20   = (A00^D0);.   
2450: 20 42 31 20 3d 20 52 4f 4c 36 34 28 28 41 30 31   B1 = ROL64((A01
2460: 5e 44 31 29 2c 20 34 34 29 3b 0a 20 20 20 20 42  ^D1), 44);.    B
2470: 32 20 3d 20 52 4f 4c 36 34 28 28 41 30 32 5e 44  2 = ROL64((A02^D
2480: 32 29 2c 20 34 33 29 3b 0a 20 20 20 20 42 33 20  2), 43);.    B3 
2490: 3d 20 52 4f 4c 36 34 28 28 41 30 33 5e 44 33 29  = ROL64((A03^D3)
24a0: 2c 20 32 31 29 3b 0a 20 20 20 20 42 34 20 3d 20  , 21);.    B4 = 
24b0: 52 4f 4c 36 34 28 28 41 30 34 5e 44 34 29 2c 20  ROL64((A04^D4), 
24c0: 31 34 29 3b 0a 20 20 20 20 41 30 30 20 3d 20 20  14);.    A00 =  
24d0: 20 42 30 20 5e 28 28 7e 42 31 29 26 20 20 42 32   B0 ^((~B1)&  B2
24e0: 20 29 3b 0a 20 20 20 20 41 30 30 20 5e 3d 20 52   );.    A00 ^= R
24f0: 43 5b 69 2b 33 5d 3b 0a 20 20 20 20 41 30 31 20  C[i+3];.    A01 
2500: 3d 20 20 20 42 31 20 5e 28 28 7e 42 32 29 26 20  =   B1 ^((~B2)& 
2510: 20 42 33 20 29 3b 0a 20 20 20 20 41 30 32 20 3d   B3 );.    A02 =
2520: 20 20 20 42 32 20 5e 28 28 7e 42 33 29 26 20 20     B2 ^((~B3)&  
2530: 42 34 20 29 3b 0a 20 20 20 20 41 30 33 20 3d 20  B4 );.    A03 = 
2540: 20 20 42 33 20 5e 28 28 7e 42 34 29 26 20 20 42    B3 ^((~B4)&  B
2550: 30 20 29 3b 0a 20 20 20 20 41 30 34 20 3d 20 20  0 );.    A04 =  
2560: 20 42 34 20 5e 28 28 7e 42 30 29 26 20 20 42 31   B4 ^((~B0)&  B1
2570: 20 29 3b 0a 0a 20 20 20 20 42 32 20 3d 20 52 4f   );..    B2 = RO
2580: 4c 36 34 28 28 41 31 30 5e 44 30 29 2c 20 33 29  L64((A10^D0), 3)
2590: 3b 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c 36 34  ;.    B3 = ROL64
25a0: 28 28 41 31 31 5e 44 31 29 2c 20 34 35 29 3b 0a  ((A11^D1), 45);.
25b0: 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34 28 28      B4 = ROL64((
25c0: 41 31 32 5e 44 32 29 2c 20 36 31 29 3b 0a 20 20  A12^D2), 61);.  
25d0: 20 20 42 30 20 3d 20 52 4f 4c 36 34 28 28 41 31    B0 = ROL64((A1
25e0: 33 5e 44 33 29 2c 20 32 38 29 3b 0a 20 20 20 20  3^D3), 28);.    
25f0: 42 31 20 3d 20 52 4f 4c 36 34 28 28 41 31 34 5e  B1 = ROL64((A14^
2600: 44 34 29 2c 20 32 30 29 3b 0a 20 20 20 20 41 31  D4), 20);.    A1
2610: 30 20 3d 20 20 20 42 30 20 5e 28 28 7e 42 31 29  0 =   B0 ^((~B1)
2620: 26 20 20 42 32 20 29 3b 0a 20 20 20 20 41 31 31  &  B2 );.    A11
2630: 20 3d 20 20 20 42 31 20 5e 28 28 7e 42 32 29 26   =   B1 ^((~B2)&
2640: 20 20 42 33 20 29 3b 0a 20 20 20 20 41 31 32 20    B3 );.    A12 
2650: 3d 20 20 20 42 32 20 5e 28 28 7e 42 33 29 26 20  =   B2 ^((~B3)& 
2660: 20 42 34 20 29 3b 0a 20 20 20 20 41 31 33 20 3d   B4 );.    A13 =
2670: 20 20 20 42 33 20 5e 28 28 7e 42 34 29 26 20 20     B3 ^((~B4)&  
2680: 42 30 20 29 3b 0a 20 20 20 20 41 31 34 20 3d 20  B0 );.    A14 = 
2690: 20 20 42 34 20 5e 28 28 7e 42 30 29 26 20 20 42    B4 ^((~B0)&  B
26a0: 31 20 29 3b 0a 0a 20 20 20 20 42 34 20 3d 20 52  1 );..    B4 = R
26b0: 4f 4c 36 34 28 28 41 32 30 5e 44 30 29 2c 20 31  OL64((A20^D0), 1
26c0: 38 29 3b 0a 20 20 20 20 42 30 20 3d 20 52 4f 4c  8);.    B0 = ROL
26d0: 36 34 28 28 41 32 31 5e 44 31 29 2c 20 31 29 3b  64((A21^D1), 1);
26e0: 0a 20 20 20 20 42 31 20 3d 20 52 4f 4c 36 34 28  .    B1 = ROL64(
26f0: 28 41 32 32 5e 44 32 29 2c 20 36 29 3b 0a 20 20  (A22^D2), 6);.  
2700: 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28 41 32    B2 = ROL64((A2
2710: 33 5e 44 33 29 2c 20 32 35 29 3b 0a 20 20 20 20  3^D3), 25);.    
2720: 42 33 20 3d 20 52 4f 4c 36 34 28 28 41 32 34 5e  B3 = ROL64((A24^
2730: 44 34 29 2c 20 38 29 3b 0a 20 20 20 20 41 32 30  D4), 8);.    A20
2740: 20 3d 20 20 20 42 30 20 5e 28 28 7e 42 31 29 26   =   B0 ^((~B1)&
2750: 20 20 42 32 20 29 3b 0a 20 20 20 20 41 32 31 20    B2 );.    A21 
2760: 3d 20 20 20 42 31 20 5e 28 28 7e 42 32 29 26 20  =   B1 ^((~B2)& 
2770: 20 42 33 20 29 3b 0a 20 20 20 20 41 32 32 20 3d   B3 );.    A22 =
2780: 20 20 20 42 32 20 5e 28 28 7e 42 33 29 26 20 20     B2 ^((~B3)&  
2790: 42 34 20 29 3b 0a 20 20 20 20 41 32 33 20 3d 20  B4 );.    A23 = 
27a0: 20 20 42 33 20 5e 28 28 7e 42 34 29 26 20 20 42    B3 ^((~B4)&  B
27b0: 30 20 29 3b 0a 20 20 20 20 41 32 34 20 3d 20 20  0 );.    A24 =  
27c0: 20 42 34 20 5e 28 28 7e 42 30 29 26 20 20 42 31   B4 ^((~B0)&  B1
27d0: 20 29 3b 0a 0a 20 20 20 20 42 31 20 3d 20 52 4f   );..    B1 = RO
27e0: 4c 36 34 28 28 41 33 30 5e 44 30 29 2c 20 33 36  L64((A30^D0), 36
27f0: 29 3b 0a 20 20 20 20 42 32 20 3d 20 52 4f 4c 36  );.    B2 = ROL6
2800: 34 28 28 41 33 31 5e 44 31 29 2c 20 31 30 29 3b  4((A31^D1), 10);
2810: 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c 36 34 28  .    B3 = ROL64(
2820: 28 41 33 32 5e 44 32 29 2c 20 31 35 29 3b 0a 20  (A32^D2), 15);. 
2830: 20 20 20 42 34 20 3d 20 52 4f 4c 36 34 28 28 41     B4 = ROL64((A
2840: 33 33 5e 44 33 29 2c 20 35 36 29 3b 0a 20 20 20  33^D3), 56);.   
2850: 20 42 30 20 3d 20 52 4f 4c 36 34 28 28 41 33 34   B0 = ROL64((A34
2860: 5e 44 34 29 2c 20 32 37 29 3b 0a 20 20 20 20 41  ^D4), 27);.    A
2870: 33 30 20 3d 20 20 20 42 30 20 5e 28 28 7e 42 31  30 =   B0 ^((~B1
2880: 29 26 20 20 42 32 20 29 3b 0a 20 20 20 20 41 33  )&  B2 );.    A3
2890: 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42 32 29  1 =   B1 ^((~B2)
28a0: 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41 33 32  &  B3 );.    A32
28b0: 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33 29 26   =   B2 ^((~B3)&
28c0: 20 20 42 34 20 29 3b 0a 20 20 20 20 41 33 33 20    B4 );.    A33 
28d0: 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29 26 20  =   B3 ^((~B4)& 
28e0: 20 42 30 20 29 3b 0a 20 20 20 20 41 33 34 20 3d   B0 );.    A34 =
28f0: 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26 20 20     B4 ^((~B0)&  
2900: 42 31 20 29 3b 0a 0a 20 20 20 20 42 33 20 3d 20  B1 );..    B3 = 
2910: 52 4f 4c 36 34 28 28 41 34 30 5e 44 30 29 2c 20  ROL64((A40^D0), 
2920: 34 31 29 3b 0a 20 20 20 20 42 34 20 3d 20 52 4f  41);.    B4 = RO
2930: 4c 36 34 28 28 41 34 31 5e 44 31 29 2c 20 32 29  L64((A41^D1), 2)
2940: 3b 0a 20 20 20 20 42 30 20 3d 20 52 4f 4c 36 34  ;.    B0 = ROL64
2950: 28 28 41 34 32 5e 44 32 29 2c 20 36 32 29 3b 0a  ((A42^D2), 62);.
2960: 20 20 20 20 42 31 20 3d 20 52 4f 4c 36 34 28 28      B1 = ROL64((
2970: 41 34 33 5e 44 33 29 2c 20 35 35 29 3b 0a 20 20  A43^D3), 55);.  
2980: 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28 41 34    B2 = ROL64((A4
2990: 34 5e 44 34 29 2c 20 33 39 29 3b 0a 20 20 20 20  4^D4), 39);.    
29a0: 41 34 30 20 3d 20 20 20 42 30 20 5e 28 28 7e 42  A40 =   B0 ^((~B
29b0: 31 29 26 20 20 42 32 20 29 3b 0a 20 20 20 20 41  1)&  B2 );.    A
29c0: 34 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42 32  41 =   B1 ^((~B2
29d0: 29 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41 34  )&  B3 );.    A4
29e0: 32 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33 29  2 =   B2 ^((~B3)
29f0: 26 20 20 42 34 20 29 3b 0a 20 20 20 20 41 34 33  &  B4 );.    A43
2a00: 20 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29 26   =   B3 ^((~B4)&
2a10: 20 20 42 30 20 29 3b 0a 20 20 20 20 41 34 34 20    B0 );.    A44 
2a20: 3d 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26 20  =   B4 ^((~B0)& 
2a30: 20 42 31 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   B1 );.  }.}../*
2a40: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2a50: 20 6e 65 77 20 68 61 73 68 2e 20 20 69 53 69 7a   new hash.  iSiz
2a60: 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  e determines the
2a70: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 61 73   size of the has
2a80: 68 0a 2a 2a 20 69 6e 20 62 69 74 73 20 61 6e 64  h.** in bits and
2a90: 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f   should be one o
2aa0: 66 20 32 32 34 2c 20 32 35 36 2c 20 33 38 34 2c  f 224, 256, 384,
2ab0: 20 6f 72 20 35 31 32 2e 20 20 4f 72 20 69 53 69   or 512.  Or iSi
2ac0: 7a 65 0a 2a 2a 20 63 61 6e 20 62 65 20 7a 65 72  ze.** can be zer
2ad0: 6f 20 74 6f 20 75 73 65 20 74 68 65 20 64 65 66  o to use the def
2ae0: 61 75 6c 74 20 68 61 73 68 20 73 69 7a 65 20 6f  ault hash size o
2af0: 66 20 32 35 36 20 62 69 74 73 2e 0a 2a 2f 0a 73  f 256 bits..*/.s
2b00: 74 61 74 69 63 20 76 6f 69 64 20 53 48 41 33 49  tatic void SHA3I
2b10: 6e 69 74 28 53 48 41 33 43 6f 6e 74 65 78 74 20  nit(SHA3Context 
2b20: 2a 70 2c 20 69 6e 74 20 69 53 69 7a 65 29 7b 0a  *p, int iSize){.
2b30: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
2b40: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2b50: 28 20 69 53 69 7a 65 3e 3d 31 32 38 20 26 26 20  ( iSize>=128 && 
2b60: 69 53 69 7a 65 3c 3d 35 31 32 20 29 7b 0a 20 20  iSize<=512 ){.  
2b70: 20 20 70 2d 3e 6e 52 61 74 65 20 3d 20 28 31 36    p->nRate = (16
2b80: 30 30 20 2d 20 28 28 69 53 69 7a 65 20 2b 20 33  00 - ((iSize + 3
2b90: 31 29 26 7e 33 31 29 2a 32 29 2f 38 3b 0a 20 20  1)&~31)*2)/8;.  
2ba0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 52  }else{.    p->nR
2bb0: 61 74 65 20 3d 20 28 31 36 30 30 20 2d 20 32 2a  ate = (1600 - 2*
2bc0: 32 35 36 29 2f 38 3b 0a 20 20 7d 0a 23 69 66 20  256)/8;.  }.#if 
2bd0: 42 59 54 45 4f 52 44 45 52 3d 3d 31 32 33 34 0a  BYTEORDER==1234.
2be0: 20 20 2f 2a 20 4b 6e 6f 77 6e 20 74 6f 20 62 65    /* Known to be
2bf0: 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 61   little-endian a
2c00: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
2c10: 4e 6f 2d 6f 70 20 2a 2f 0a 23 65 6c 69 66 20 42  No-op */.#elif B
2c20: 59 54 45 4f 52 44 45 52 3d 3d 34 33 32 31 0a 20  YTEORDER==4321. 
2c30: 20 70 2d 3e 69 78 4d 61 73 6b 20 3d 20 37 3b 20   p->ixMask = 7; 
2c40: 20 2f 2a 20 42 69 67 2d 65 6e 64 69 61 6e 20 2a   /* Big-endian *
2c50: 2f 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20  /.#else.  {.    
2c60: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
2c70: 69 6e 74 20 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  int one = 1;.   
2c80: 20 69 66 28 20 31 3d 3d 2a 28 75 6e 73 69 67 6e   if( 1==*(unsign
2c90: 65 64 20 63 68 61 72 2a 29 26 6f 6e 65 20 29 7b  ed char*)&one ){
2ca0: 0a 20 20 20 20 20 20 2f 2a 20 4c 69 74 74 6c 65  .      /* Little
2cb0: 20 65 6e 64 69 61 6e 2e 20 20 4e 6f 20 62 79 74   endian.  No byt
2cc0: 65 20 73 77 61 70 70 69 6e 67 2e 20 2a 2f 0a 20  e swapping. */. 
2cd0: 20 20 20 20 20 70 2d 3e 69 78 4d 61 73 6b 20 3d       p->ixMask =
2ce0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
2cf0: 20 20 20 20 20 2f 2a 20 42 69 67 20 65 6e 64 69       /* Big endi
2d00: 61 6e 2e 20 20 42 79 74 65 20 73 77 61 70 2e 20  an.  Byte swap. 
2d10: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 69 78 4d 61  */.      p->ixMa
2d20: 73 6b 20 3d 20 37 3b 0a 20 20 20 20 7d 0a 20 20  sk = 7;.    }.  
2d30: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
2d40: 2a 20 4d 61 6b 65 20 63 6f 6e 73 65 63 75 74 69  * Make consecuti
2d50: 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20  ve calls to the 
2d60: 53 48 41 33 55 70 64 61 74 65 20 66 75 6e 63 74  SHA3Update funct
2d70: 69 6f 6e 20 74 6f 20 61 64 64 20 6e 65 77 20 63  ion to add new c
2d80: 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 74 68 65  ontent.** to the
2d90: 20 68 61 73 68 0a 2a 2f 0a 73 74 61 74 69 63 20   hash.*/.static 
2da0: 76 6f 69 64 20 53 48 41 33 55 70 64 61 74 65 28  void SHA3Update(
2db0: 0a 20 20 53 48 41 33 43 6f 6e 74 65 78 74 20 2a  .  SHA3Context *
2dc0: 70 2c 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  p,.  const unsig
2dd0: 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 2c  ned char *aData,
2de0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
2df0: 6e 44 61 74 61 0a 29 7b 0a 20 20 75 6e 73 69 67  nData.){.  unsig
2e00: 6e 65 64 20 69 6e 74 20 69 20 3d 20 30 3b 0a 23  ned int i = 0;.#
2e10: 69 66 20 42 59 54 45 4f 52 44 45 52 3d 3d 31 32  if BYTEORDER==12
2e20: 33 34 0a 20 20 69 66 28 20 28 70 2d 3e 6e 4c 6f  34.  if( (p->nLo
2e30: 61 64 65 64 20 25 20 38 29 3d 3d 30 20 26 26 20  aded % 8)==0 && 
2e40: 28 28 61 44 61 74 61 20 2d 20 28 63 6f 6e 73 74  ((aData - (const
2e50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29   unsigned char*)
2e60: 30 29 26 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0)&7)==0 ){.    
2e70: 66 6f 72 28 3b 20 69 2b 37 3c 6e 44 61 74 61 3b  for(; i+7<nData;
2e80: 20 69 2b 3d 38 29 7b 0a 20 20 20 20 20 20 70 2d   i+=8){.      p-
2e90: 3e 75 2e 73 5b 70 2d 3e 6e 4c 6f 61 64 65 64 2f  >u.s[p->nLoaded/
2ea0: 38 5d 20 5e 3d 20 2a 28 75 36 34 2a 29 26 61 44  8] ^= *(u64*)&aD
2eb0: 61 74 61 5b 69 5d 3b 0a 20 20 20 20 20 20 70 2d  ata[i];.      p-
2ec0: 3e 6e 4c 6f 61 64 65 64 20 2b 3d 20 38 3b 0a 20  >nLoaded += 8;. 
2ed0: 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 61       if( p->nLoa
2ee0: 64 65 64 3e 3d 70 2d 3e 6e 52 61 74 65 20 29 7b  ded>=p->nRate ){
2ef0: 0a 20 20 20 20 20 20 20 20 4b 65 63 63 61 6b 46  .        KeccakF
2f00: 31 36 30 30 53 74 65 70 28 70 29 3b 0a 20 20 20  1600Step(p);.   
2f10: 20 20 20 20 20 70 2d 3e 6e 4c 6f 61 64 65 64 20       p->nLoaded 
2f20: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2f30: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
2f40: 66 6f 72 28 3b 20 69 3c 6e 44 61 74 61 3b 20 69  for(; i<nData; i
2f50: 2b 2b 29 7b 0a 23 69 66 20 42 59 54 45 4f 52 44  ++){.#if BYTEORD
2f60: 45 52 3d 3d 31 32 33 34 0a 20 20 20 20 70 2d 3e  ER==1234.    p->
2f70: 75 2e 78 5b 70 2d 3e 6e 4c 6f 61 64 65 64 5d 20  u.x[p->nLoaded] 
2f80: 5e 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 23 65 6c  ^= aData[i];.#el
2f90: 69 66 20 42 59 54 45 4f 52 44 45 52 3d 3d 34 33  if BYTEORDER==43
2fa0: 32 31 0a 20 20 20 20 70 2d 3e 75 2e 78 5b 70 2d  21.    p->u.x[p-
2fb0: 3e 6e 4c 6f 61 64 65 64 5e 30 78 30 37 5d 20 5e  >nLoaded^0x07] ^
2fc0: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 23 65 6c 73  = aData[i];.#els
2fd0: 65 0a 20 20 20 20 70 2d 3e 75 2e 78 5b 70 2d 3e  e.    p->u.x[p->
2fe0: 6e 4c 6f 61 64 65 64 5e 70 2d 3e 69 78 4d 61 73  nLoaded^p->ixMas
2ff0: 6b 5d 20 5e 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  k] ^= aData[i];.
3000: 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 6e 4c  #endif.    p->nL
3010: 6f 61 64 65 64 2b 2b 3b 0a 20 20 20 20 69 66 28  oaded++;.    if(
3020: 20 70 2d 3e 6e 4c 6f 61 64 65 64 3d 3d 70 2d 3e   p->nLoaded==p->
3030: 6e 52 61 74 65 20 29 7b 0a 20 20 20 20 20 20 4b  nRate ){.      K
3040: 65 63 63 61 6b 46 31 36 30 30 53 74 65 70 28 70  eccakF1600Step(p
3050: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 6f 61  );.      p->nLoa
3060: 64 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ded = 0;.    }. 
3070: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 66 74 65   }.}../*.** Afte
3080: 72 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61  r all content ha
3090: 73 20 62 65 65 6e 20 61 64 64 65 64 2c 20 69 6e  s been added, in
30a0: 76 6f 6b 65 20 53 48 41 33 46 69 6e 61 6c 28 29  voke SHA3Final()
30b0: 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74   to compute.** t
30c0: 68 65 20 66 69 6e 61 6c 20 68 61 73 68 2e 20 20  he final hash.  
30d0: 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  The function ret
30e0: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
30f0: 6f 20 74 68 65 20 62 69 6e 61 72 79 0a 2a 2a 20  o the binary.** 
3100: 68 61 73 68 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  hash value..*/.s
3110: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63  tatic unsigned c
3120: 68 61 72 20 2a 53 48 41 33 46 69 6e 61 6c 28 53  har *SHA3Final(S
3130: 48 41 33 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a  HA3Context *p){.
3140: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
3150: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 61 64  ;.  if( p->nLoad
3160: 65 64 3d 3d 70 2d 3e 6e 52 61 74 65 2d 31 20 29  ed==p->nRate-1 )
3170: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  {.    const unsi
3180: 67 6e 65 64 20 63 68 61 72 20 63 31 20 3d 20 30  gned char c1 = 0
3190: 78 38 36 3b 0a 20 20 20 20 53 48 41 33 55 70 64  x86;.    SHA3Upd
31a0: 61 74 65 28 70 2c 20 26 63 31 2c 20 31 29 3b 0a  ate(p, &c1, 1);.
31b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
31c0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
31d0: 20 63 32 20 3d 20 30 78 30 36 3b 0a 20 20 20 20   c2 = 0x06;.    
31e0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
31f0: 68 61 72 20 63 33 20 3d 20 30 78 38 30 3b 0a 20  har c3 = 0x80;. 
3200: 20 20 20 53 48 41 33 55 70 64 61 74 65 28 70 2c     SHA3Update(p,
3210: 20 26 63 32 2c 20 31 29 3b 0a 20 20 20 20 70 2d   &c2, 1);.    p-
3220: 3e 6e 4c 6f 61 64 65 64 20 3d 20 70 2d 3e 6e 52  >nLoaded = p->nR
3230: 61 74 65 20 2d 20 31 3b 0a 20 20 20 20 53 48 41  ate - 1;.    SHA
3240: 33 55 70 64 61 74 65 28 70 2c 20 26 63 33 2c 20  3Update(p, &c3, 
3250: 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  1);.  }.  for(i=
3260: 30 3b 20 69 3c 70 2d 3e 6e 52 61 74 65 3b 20 69  0; i<p->nRate; i
3270: 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 75 2e 78 5b  ++){.    p->u.x[
3280: 69 2b 70 2d 3e 6e 52 61 74 65 5d 20 3d 20 70 2d  i+p->nRate] = p-
3290: 3e 75 2e 78 5b 69 5e 70 2d 3e 69 78 4d 61 73 6b  >u.x[i^p->ixMask
32a0: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
32b0: 26 70 2d 3e 75 2e 78 5b 70 2d 3e 6e 52 61 74 65  &p->u.x[p->nRate
32c0: 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ];.}../*.** Conv
32d0: 65 72 74 20 61 20 64 69 67 65 73 74 20 69 6e 74  ert a digest int
32e0: 6f 20 62 61 73 65 2d 31 36 2e 20 20 64 69 67 65  o base-16.  dige
32f0: 73 74 20 73 68 6f 75 6c 64 20 62 65 20 64 65 63  st should be dec
3300: 6c 61 72 65 64 20 61 73 0a 2a 2a 20 22 75 6e 73  lared as.** "uns
3310: 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73  igned char diges
3320: 74 5b 32 30 5d 22 20 69 6e 20 74 68 65 20 63 61  t[20]" in the ca
3330: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20  lling function. 
3340: 20 54 68 65 20 53 48 41 33 0a 2a 2a 20 64 69 67   The SHA3.** dig
3350: 65 73 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  est is stored in
3360: 20 74 68 65 20 66 69 72 73 74 20 32 30 20 62 79   the first 20 by
3370: 74 65 73 2e 20 20 7a 42 75 66 20 73 68 6f 75 6c  tes.  zBuf shoul
3380: 64 0a 2a 2a 20 62 65 20 22 63 68 61 72 20 7a 42  d.** be "char zB
3390: 75 66 5b 34 31 5d 22 2e 0a 2a 2f 0a 73 74 61 74  uf[41]"..*/.stat
33a0: 69 63 20 76 6f 69 64 20 44 69 67 65 73 74 54 6f  ic void DigestTo
33b0: 42 61 73 65 31 36 28 75 6e 73 69 67 6e 65 64 20  Base16(unsigned 
33c0: 63 68 61 72 20 2a 64 69 67 65 73 74 2c 20 63 68  char *digest, ch
33d0: 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42  ar *zBuf, int nB
33e0: 79 74 65 29 7b 0a 20 20 73 74 61 74 69 63 20 63  yte){.  static c
33f0: 6f 6e 73 74 20 63 68 61 72 20 7a 45 6e 63 6f 64  onst char zEncod
3400: 65 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38  e[] = "012345678
3410: 39 61 62 63 64 65 66 22 3b 0a 20 20 69 6e 74 20  9abcdef";.  int 
3420: 69 78 3b 0a 0a 20 20 66 6f 72 28 69 78 3d 30 3b  ix;..  for(ix=0;
3430: 20 69 78 3c 6e 42 79 74 65 3b 20 69 78 2b 2b 29   ix<nByte; ix++)
3440: 7b 0a 20 20 20 20 2a 7a 42 75 66 2b 2b 20 3d 20  {.    *zBuf++ = 
3450: 7a 45 6e 63 6f 64 65 5b 28 2a 64 69 67 65 73 74  zEncode[(*digest
3460: 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20 20 2a  >>4)&0xf];.    *
3470: 7a 42 75 66 2b 2b 20 3d 20 7a 45 6e 63 6f 64 65  zBuf++ = zEncode
3480: 5b 2a 64 69 67 65 73 74 2b 2b 20 26 20 30 78 66  [*digest++ & 0xf
3490: 5d 3b 0a 20 20 7d 0a 20 20 2a 7a 42 75 66 20 3d  ];.  }.  *zBuf =
34a0: 20 27 5c 30 27 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   '\0';.}.../*.**
34b0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 53 48 41   Compute the SHA
34c0: 33 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 61 20  3 checksum of a 
34d0: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 20 53  file on disk.  S
34e0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 69  tore the resulti
34f0: 6e 67 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 69  ng.** checksum i
3500: 6e 20 74 68 65 20 62 6c 6f 62 20 70 43 6b 73 75  n the blob pCksu
3510: 6d 2e 20 20 70 43 6b 73 75 6d 20 69 73 20 61 73  m.  pCksum is as
3520: 73 75 6d 65 64 20 74 6f 20 62 65 20 69 6e 69 74  sumed to be init
3530: 69 61 6c 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  ialized..**.** R
3540: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
3550: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73   of errors..*/.s
3560: 74 61 74 69 63 20 69 6e 74 20 73 68 61 33 73 75  tatic int sha3su
3570: 6d 5f 66 69 6c 65 28 63 6f 6e 73 74 20 63 68 61  m_file(const cha
3580: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
3590: 74 20 69 53 69 7a 65 2c 20 63 68 61 72 20 2a 70  t iSize, char *p
35a0: 43 6b 73 75 6d 29 7b 0a 20 20 46 49 4c 45 20 2a  Cksum){.  FILE *
35b0: 69 6e 3b 0a 20 20 53 48 41 33 43 6f 6e 74 65 78  in;.  SHA3Contex
35c0: 74 20 63 74 78 3b 0a 20 20 63 68 61 72 20 7a 42  t ctx;.  char zB
35d0: 75 66 5b 31 30 32 34 30 5d 3b 0a 0a 20 20 69 6e  uf[10240];..  in
35e0: 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61   = fopen(zFilena
35f0: 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20  me,"rb");.  if( 
3600: 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  in==0 ){.    ret
3610: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 53 48 41  urn 1;.  }.  SHA
3620: 33 49 6e 69 74 28 26 63 74 78 2c 20 69 53 69 7a  3Init(&ctx, iSiz
3630: 65 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20  e);.  for(;;){. 
3640: 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29     int n = (int)
3650: 66 72 65 61 64 28 7a 42 75 66 2c 20 31 2c 20 73  fread(zBuf, 1, s
3660: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 69 6e 29  izeof(zBuf), in)
3670: 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30 20 29  ;.    if( n<=0 )
3680: 20 62 72 65 61 6b 3b 0a 20 20 20 20 53 48 41 33   break;.    SHA3
3690: 55 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e  Update(&ctx, (un
36a0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75  signed char*)zBu
36b0: 66 2c 20 28 75 6e 73 69 67 6e 65 64 29 6e 29 3b  f, (unsigned)n);
36c0: 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e  .  }.  fclose(in
36d0: 29 3b 0a 20 20 44 69 67 65 73 74 54 6f 42 61 73  );.  DigestToBas
36e0: 65 31 36 28 53 48 41 33 46 69 6e 61 6c 28 26 63  e16(SHA3Final(&c
36f0: 74 78 29 2c 20 70 43 6b 73 75 6d 2c 20 69 53 69  tx), pCksum, iSi
3700: 7a 65 2f 38 29 3b 0a 20 20 72 65 74 75 72 6e 20  ze/8);.  return 
3710: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
3720: 53 48 41 31 20 69 6d 70 6c 65 6d 65 6e 74 61 74  SHA1 implementat
3730: 69 6f 6e 20 62 65 6c 6f 77 20 69 73 20 61 64 61  ion below is ada
3740: 70 74 65 64 20 66 72 6f 6d 3a 0a 2a 2a 0a 2a 2a  pted from:.**.**
3750: 20 20 24 4e 65 74 42 53 44 3a 20 73 68 61 31 2e    $NetBSD: sha1.
3760: 63 2c 76 20 31 2e 36 20 32 30 30 39 2f 31 31 2f  c,v 1.6 2009/11/
3770: 30 36 20 32 30 3a 33 31 3a 31 38 20 6a 6f 65 72  06 20:31:18 joer
3780: 67 20 45 78 70 20 24 0a 2a 2a 20 20 24 4f 70 65  g Exp $.**  $Ope
3790: 6e 42 53 44 3a 20 73 68 61 31 2e 63 2c 76 20 31  nBSD: sha1.c,v 1
37a0: 2e 39 20 31 39 39 37 2f 30 37 2f 32 33 20 32 31  .9 1997/07/23 21
37b0: 3a 31 32 3a 33 32 20 6b 73 74 61 69 6c 65 79 20  :12:32 kstailey 
37c0: 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 53 48 41 2d  Exp $.**.** SHA-
37d0: 31 20 69 6e 20 43 0a 2a 2a 20 42 79 20 53 74 65  1 in C.** By Ste
37e0: 76 65 20 52 65 69 64 20 3c 73 74 65 76 65 40 65  ve Reid <steve@e
37f0: 64 6d 77 65 62 2e 63 6f 6d 3e 0a 2a 2a 20 31 30  dmweb.com>.** 10
3800: 30 25 20 50 75 62 6c 69 63 20 44 6f 6d 61 69 6e  0% Public Domain
3810: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
3820: 63 74 20 53 48 41 31 43 6f 6e 74 65 78 74 20 53  ct SHA1Context S
3830: 48 41 31 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  HA1Context;.stru
3840: 63 74 20 53 48 41 31 43 6f 6e 74 65 78 74 20 7b  ct SHA1Context {
3850: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
3860: 73 74 61 74 65 5b 35 5d 3b 0a 20 20 75 6e 73 69  state[5];.  unsi
3870: 67 6e 65 64 20 69 6e 74 20 63 6f 75 6e 74 5b 32  gned int count[2
3880: 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ];.  unsigned ch
3890: 61 72 20 62 75 66 66 65 72 5b 36 34 5d 3b 0a 7d  ar buffer[64];.}
38a0: 3b 0a 0a 2f 2a 0a 20 2a 20 62 6c 6b 30 28 29 20  ;../*. * blk0() 
38b0: 61 6e 64 20 62 6c 6b 28 29 20 70 65 72 66 6f 72  and blk() perfor
38c0: 6d 20 74 68 65 20 69 6e 69 74 69 61 6c 20 65 78  m the initial ex
38d0: 70 61 6e 64 2e 0a 20 2a 20 49 20 67 6f 74 20 74  pand.. * I got t
38e0: 68 65 20 69 64 65 61 20 6f 66 20 65 78 70 61 6e  he idea of expan
38f0: 64 69 6e 67 20 64 75 72 69 6e 67 20 74 68 65 20  ding during the 
3900: 72 6f 75 6e 64 20 66 75 6e 63 74 69 6f 6e 20 66  round function f
3910: 72 6f 6d 20 53 53 4c 65 61 79 0a 20 2a 0a 20 2a  rom SSLeay. *. *
3920: 20 62 6c 6b 30 6c 65 28 29 20 66 6f 72 20 6c 69   blk0le() for li
3930: 74 74 6c 65 2d 65 6e 64 69 61 6e 20 61 6e 64 20  ttle-endian and 
3940: 62 6c 6b 30 62 65 28 29 20 66 6f 72 20 62 69 67  blk0be() for big
3950: 2d 65 6e 64 69 61 6e 2e 0a 20 2a 2f 0a 23 69 66  -endian.. */.#if
3960: 20 5f 5f 47 4e 55 43 5f 5f 20 26 26 20 28 64 65   __GNUC__ && (de
3970: 66 69 6e 65 64 28 5f 5f 69 33 38 36 5f 5f 29 20  fined(__i386__) 
3980: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 78 38 36  || defined(__x86
3990: 5f 36 34 5f 5f 29 29 0a 2f 2a 0a 20 2a 20 47 43  _64__))./*. * GC
39a0: 43 20 62 79 20 69 74 73 65 6c 66 20 6f 6e 6c 79  C by itself only
39b0: 20 67 65 6e 65 72 61 74 65 73 20 6c 65 66 74 20   generates left 
39c0: 72 6f 74 61 74 65 73 2e 20 20 55 73 65 20 72 69  rotates.  Use ri
39d0: 67 68 74 20 72 6f 74 61 74 65 73 20 69 66 0a 20  ght rotates if. 
39e0: 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 62 65  * possible to be
39f0: 20 6b 69 6e 64 65 72 20 74 6f 20 64 69 6e 6b 79   kinder to dinky
3a00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
3a10: 20 77 69 74 68 20 69 74 65 72 61 74 69 76 65 20   with iterative 
3a20: 72 6f 74 61 74 65 0a 20 2a 20 69 6e 73 74 72 75  rotate. * instru
3a30: 63 74 69 6f 6e 73 2e 0a 20 2a 2f 0a 23 64 65 66  ctions.. */.#def
3a40: 69 6e 65 20 53 48 41 5f 52 4f 54 28 6f 70 2c 20  ine SHA_ROT(op, 
3a50: 78 2c 20 6b 29 20 5c 0a 20 20 20 20 20 20 20 20  x, k) \.        
3a60: 28 7b 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ({ unsigned int 
3a70: 79 3b 20 61 73 6d 28 6f 70 20 22 20 25 31 2c 25  y; asm(op " %1,%
3a80: 30 22 20 3a 20 22 3d 72 22 20 28 79 29 20 3a 20  0" : "=r" (y) : 
3a90: 22 49 22 20 28 6b 29 2c 20 22 30 22 20 28 78 29  "I" (k), "0" (x)
3aa0: 29 3b 20 79 3b 20 7d 29 0a 23 64 65 66 69 6e 65  ); y; }).#define
3ab0: 20 72 6f 6c 28 78 2c 6b 29 20 53 48 41 5f 52 4f   rol(x,k) SHA_RO
3ac0: 54 28 22 72 6f 6c 6c 22 2c 20 78 2c 20 6b 29 0a  T("roll", x, k).
3ad0: 23 64 65 66 69 6e 65 20 72 6f 72 28 78 2c 6b 29  #define ror(x,k)
3ae0: 20 53 48 41 5f 52 4f 54 28 22 72 6f 72 6c 22 2c   SHA_ROT("rorl",
3af0: 20 78 2c 20 6b 29 0a 0a 23 65 6c 73 65 0a 2f 2a   x, k)..#else./*
3b00: 20 47 65 6e 65 72 69 63 20 43 20 65 71 75 69 76   Generic C equiv
3b10: 61 6c 65 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  alent */.#define
3b20: 20 53 48 41 5f 52 4f 54 28 78 2c 6c 2c 72 29 20   SHA_ROT(x,l,r) 
3b30: 28 28 78 29 20 3c 3c 20 28 6c 29 20 7c 20 28 78  ((x) << (l) | (x
3b40: 29 20 3e 3e 20 28 72 29 29 0a 23 64 65 66 69 6e  ) >> (r)).#defin
3b50: 65 20 72 6f 6c 28 78 2c 6b 29 20 53 48 41 5f 52  e rol(x,k) SHA_R
3b60: 4f 54 28 78 2c 6b 2c 33 32 2d 28 6b 29 29 0a 23  OT(x,k,32-(k)).#
3b70: 64 65 66 69 6e 65 20 72 6f 72 28 78 2c 6b 29 20  define ror(x,k) 
3b80: 53 48 41 5f 52 4f 54 28 78 2c 33 32 2d 28 6b 29  SHA_ROT(x,32-(k)
3b90: 2c 6b 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 0a 0a  ,k).#endif......
3ba0: 23 64 65 66 69 6e 65 20 62 6c 6b 30 6c 65 28 69  #define blk0le(i
3bb0: 29 20 28 62 6c 6f 63 6b 5b 69 5d 20 3d 20 28 72  ) (block[i] = (r
3bc0: 6f 72 28 62 6c 6f 63 6b 5b 69 5d 2c 38 29 26 30  or(block[i],8)&0
3bd0: 78 46 46 30 30 46 46 30 30 29 20 5c 0a 20 20 20  xFF00FF00) \.   
3be0: 20 7c 28 72 6f 6c 28 62 6c 6f 63 6b 5b 69 5d 2c   |(rol(block[i],
3bf0: 38 29 26 30 78 30 30 46 46 30 30 46 46 29 29 0a  8)&0x00FF00FF)).
3c00: 23 64 65 66 69 6e 65 20 62 6c 6b 30 62 65 28 69  #define blk0be(i
3c10: 29 20 62 6c 6f 63 6b 5b 69 5d 0a 23 64 65 66 69  ) block[i].#defi
3c20: 6e 65 20 62 6c 6b 28 69 29 20 28 62 6c 6f 63 6b  ne blk(i) (block
3c30: 5b 69 26 31 35 5d 20 3d 20 72 6f 6c 28 62 6c 6f  [i&15] = rol(blo
3c40: 63 6b 5b 28 69 2b 31 33 29 26 31 35 5d 5e 62 6c  ck[(i+13)&15]^bl
3c50: 6f 63 6b 5b 28 69 2b 38 29 26 31 35 5d 20 5c 0a  ock[(i+8)&15] \.
3c60: 20 20 20 20 5e 62 6c 6f 63 6b 5b 28 69 2b 32 29      ^block[(i+2)
3c70: 26 31 35 5d 5e 62 6c 6f 63 6b 5b 69 26 31 35 5d  &15]^block[i&15]
3c80: 2c 31 29 29 0a 0a 2f 2a 0a 20 2a 20 28 52 30 2b  ,1))../*. * (R0+
3c90: 52 31 29 2c 20 52 32 2c 20 52 33 2c 20 52 34 20  R1), R2, R3, R4 
3ca0: 61 72 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  are the differen
3cb0: 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 28 72 6f  t operations (ro
3cc0: 75 6e 64 73 29 20 75 73 65 64 20 69 6e 20 53 48  unds) used in SH
3cd0: 41 31 0a 20 2a 0a 20 2a 20 52 6c 30 28 29 20 66  A1. *. * Rl0() f
3ce0: 6f 72 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e  or little-endian
3cf0: 20 61 6e 64 20 52 62 30 28 29 20 66 6f 72 20 62   and Rb0() for b
3d00: 69 67 2d 65 6e 64 69 61 6e 2e 20 20 45 6e 64 69  ig-endian.  Endi
3d10: 61 6e 6e 65 73 73 20 69 73 0a 20 2a 20 64 65 74  anness is. * det
3d20: 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74  ermined at run-t
3d30: 69 6d 65 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65  ime.. */.#define
3d40: 20 52 6c 30 28 76 2c 77 2c 78 2c 79 2c 7a 2c 69   Rl0(v,w,x,y,z,i
3d50: 29 20 5c 0a 20 20 20 20 7a 2b 3d 28 28 77 26 28  ) \.    z+=((w&(
3d60: 78 5e 79 29 29 5e 79 29 2b 62 6c 6b 30 6c 65 28  x^y))^y)+blk0le(
3d70: 69 29 2b 30 78 35 41 38 32 37 39 39 39 2b 72 6f  i)+0x5A827999+ro
3d80: 6c 28 76 2c 35 29 3b 77 3d 72 6f 72 28 77 2c 32  l(v,5);w=ror(w,2
3d90: 29 3b 0a 23 64 65 66 69 6e 65 20 52 62 30 28 76  );.#define Rb0(v
3da0: 2c 77 2c 78 2c 79 2c 7a 2c 69 29 20 5c 0a 20 20  ,w,x,y,z,i) \.  
3db0: 20 20 7a 2b 3d 28 28 77 26 28 78 5e 79 29 29 5e    z+=((w&(x^y))^
3dc0: 79 29 2b 62 6c 6b 30 62 65 28 69 29 2b 30 78 35  y)+blk0be(i)+0x5
3dd0: 41 38 32 37 39 39 39 2b 72 6f 6c 28 76 2c 35 29  A827999+rol(v,5)
3de0: 3b 77 3d 72 6f 72 28 77 2c 32 29 3b 0a 23 64 65  ;w=ror(w,2);.#de
3df0: 66 69 6e 65 20 52 31 28 76 2c 77 2c 78 2c 79 2c  fine R1(v,w,x,y,
3e00: 7a 2c 69 29 20 5c 0a 20 20 20 20 7a 2b 3d 28 28  z,i) \.    z+=((
3e10: 77 26 28 78 5e 79 29 29 5e 79 29 2b 62 6c 6b 28  w&(x^y))^y)+blk(
3e20: 69 29 2b 30 78 35 41 38 32 37 39 39 39 2b 72 6f  i)+0x5A827999+ro
3e30: 6c 28 76 2c 35 29 3b 77 3d 72 6f 72 28 77 2c 32  l(v,5);w=ror(w,2
3e40: 29 3b 0a 23 64 65 66 69 6e 65 20 52 32 28 76 2c  );.#define R2(v,
3e50: 77 2c 78 2c 79 2c 7a 2c 69 29 20 5c 0a 20 20 20  w,x,y,z,i) \.   
3e60: 20 7a 2b 3d 28 77 5e 78 5e 79 29 2b 62 6c 6b 28   z+=(w^x^y)+blk(
3e70: 69 29 2b 30 78 36 45 44 39 45 42 41 31 2b 72 6f  i)+0x6ED9EBA1+ro
3e80: 6c 28 76 2c 35 29 3b 77 3d 72 6f 72 28 77 2c 32  l(v,5);w=ror(w,2
3e90: 29 3b 0a 23 64 65 66 69 6e 65 20 52 33 28 76 2c  );.#define R3(v,
3ea0: 77 2c 78 2c 79 2c 7a 2c 69 29 20 5c 0a 20 20 20  w,x,y,z,i) \.   
3eb0: 20 7a 2b 3d 28 28 28 77 7c 78 29 26 79 29 7c 28   z+=(((w|x)&y)|(
3ec0: 77 26 78 29 29 2b 62 6c 6b 28 69 29 2b 30 78 38  w&x))+blk(i)+0x8
3ed0: 46 31 42 42 43 44 43 2b 72 6f 6c 28 76 2c 35 29  F1BBCDC+rol(v,5)
3ee0: 3b 77 3d 72 6f 72 28 77 2c 32 29 3b 0a 23 64 65  ;w=ror(w,2);.#de
3ef0: 66 69 6e 65 20 52 34 28 76 2c 77 2c 78 2c 79 2c  fine R4(v,w,x,y,
3f00: 7a 2c 69 29 20 5c 0a 20 20 20 20 7a 2b 3d 28 77  z,i) \.    z+=(w
3f10: 5e 78 5e 79 29 2b 62 6c 6b 28 69 29 2b 30 78 43  ^x^y)+blk(i)+0xC
3f20: 41 36 32 43 31 44 36 2b 72 6f 6c 28 76 2c 35 29  A62C1D6+rol(v,5)
3f30: 3b 77 3d 72 6f 72 28 77 2c 32 29 3b 0a 0a 2f 2a  ;w=ror(w,2);../*
3f40: 0a 20 2a 20 48 61 73 68 20 61 20 73 69 6e 67 6c  . * Hash a singl
3f50: 65 20 35 31 32 2d 62 69 74 20 62 6c 6f 63 6b 2e  e 512-bit block.
3f60: 20 54 68 69 73 20 69 73 20 74 68 65 20 63 6f 72   This is the cor
3f70: 65 20 6f 66 20 74 68 65 20 61 6c 67 6f 72 69 74  e of the algorit
3f80: 68 6d 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20  hm.. */.#define 
3f90: 61 20 71 71 5b 30 5d 0a 23 64 65 66 69 6e 65 20  a qq[0].#define 
3fa0: 62 20 71 71 5b 31 5d 0a 23 64 65 66 69 6e 65 20  b qq[1].#define 
3fb0: 63 20 71 71 5b 32 5d 0a 23 64 65 66 69 6e 65 20  c qq[2].#define 
3fc0: 64 20 71 71 5b 33 5d 0a 23 64 65 66 69 6e 65 20  d qq[3].#define 
3fd0: 65 20 71 71 5b 34 5d 0a 0a 73 74 61 74 69 63 20  e qq[4]..static 
3fe0: 76 6f 69 64 20 53 48 41 31 54 72 61 6e 73 66 6f  void SHA1Transfo
3ff0: 72 6d 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  rm(.  unsigned i
4000: 6e 74 20 73 74 61 74 65 5b 35 5d 2c 0a 20 20 63  nt state[5],.  c
4010: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4020: 61 72 20 62 75 66 66 65 72 5b 36 34 5d 0a 29 7b  ar buffer[64].){
4030: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
4040: 71 71 5b 35 5d 3b 20 2f 2a 20 61 2c 20 62 2c 20  qq[5]; /* a, b, 
4050: 63 2c 20 64 2c 20 65 3b 20 2a 2f 0a 20 20 73 74  c, d, e; */.  st
4060: 61 74 69 63 20 69 6e 74 20 6f 6e 65 20 3d 20 31  atic int one = 1
4070: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
4080: 20 62 6c 6f 63 6b 5b 31 36 5d 3b 0a 20 20 6d 65   block[16];.  me
4090: 6d 63 70 79 28 62 6c 6f 63 6b 2c 20 62 75 66 66  mcpy(block, buff
40a0: 65 72 2c 20 36 34 29 3b 0a 20 20 6d 65 6d 63 70  er, 64);.  memcp
40b0: 79 28 71 71 2c 73 74 61 74 65 2c 35 2a 73 69 7a  y(qq,state,5*siz
40c0: 65 6f 66 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  eof(unsigned int
40d0: 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 63  ));..  /* Copy c
40e0: 6f 6e 74 65 78 74 2d 3e 73 74 61 74 65 5b 5d 20  ontext->state[] 
40f0: 74 6f 20 77 6f 72 6b 69 6e 67 20 76 61 72 73 20  to working vars 
4100: 2a 2f 0a 20 20 2f 2a 0a 20 20 61 20 3d 20 73 74  */.  /*.  a = st
4110: 61 74 65 5b 30 5d 3b 0a 20 20 62 20 3d 20 73 74  ate[0];.  b = st
4120: 61 74 65 5b 31 5d 3b 0a 20 20 63 20 3d 20 73 74  ate[1];.  c = st
4130: 61 74 65 5b 32 5d 3b 0a 20 20 64 20 3d 20 73 74  ate[2];.  d = st
4140: 61 74 65 5b 33 5d 3b 0a 20 20 65 20 3d 20 73 74  ate[3];.  e = st
4150: 61 74 65 5b 34 5d 3b 0a 20 20 2a 2f 0a 0a 20 20  ate[4];.  */..  
4160: 2f 2a 20 34 20 72 6f 75 6e 64 73 20 6f 66 20 32  /* 4 rounds of 2
4170: 30 20 6f 70 65 72 61 74 69 6f 6e 73 20 65 61 63  0 operations eac
4180: 68 2e 20 4c 6f 6f 70 20 75 6e 72 6f 6c 6c 65 64  h. Loop unrolled
4190: 2e 20 2a 2f 0a 20 20 69 66 28 20 31 20 3d 3d 20  . */.  if( 1 == 
41a0: 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  *(unsigned char*
41b0: 29 26 6f 6e 65 20 29 7b 0a 20 20 20 20 52 6c 30  )&one ){.    Rl0
41c0: 28 61 2c 62 2c 63 2c 64 2c 65 2c 20 30 29 3b 20  (a,b,c,d,e, 0); 
41d0: 52 6c 30 28 65 2c 61 2c 62 2c 63 2c 64 2c 20 31  Rl0(e,a,b,c,d, 1
41e0: 29 3b 20 52 6c 30 28 64 2c 65 2c 61 2c 62 2c 63  ); Rl0(d,e,a,b,c
41f0: 2c 20 32 29 3b 20 52 6c 30 28 63 2c 64 2c 65 2c  , 2); Rl0(c,d,e,
4200: 61 2c 62 2c 20 33 29 3b 0a 20 20 20 20 52 6c 30  a,b, 3);.    Rl0
4210: 28 62 2c 63 2c 64 2c 65 2c 61 2c 20 34 29 3b 20  (b,c,d,e,a, 4); 
4220: 52 6c 30 28 61 2c 62 2c 63 2c 64 2c 65 2c 20 35  Rl0(a,b,c,d,e, 5
4230: 29 3b 20 52 6c 30 28 65 2c 61 2c 62 2c 63 2c 64  ); Rl0(e,a,b,c,d
4240: 2c 20 36 29 3b 20 52 6c 30 28 64 2c 65 2c 61 2c  , 6); Rl0(d,e,a,
4250: 62 2c 63 2c 20 37 29 3b 0a 20 20 20 20 52 6c 30  b,c, 7);.    Rl0
4260: 28 63 2c 64 2c 65 2c 61 2c 62 2c 20 38 29 3b 20  (c,d,e,a,b, 8); 
4270: 52 6c 30 28 62 2c 63 2c 64 2c 65 2c 61 2c 20 39  Rl0(b,c,d,e,a, 9
4280: 29 3b 20 52 6c 30 28 61 2c 62 2c 63 2c 64 2c 65  ); Rl0(a,b,c,d,e
4290: 2c 31 30 29 3b 20 52 6c 30 28 65 2c 61 2c 62 2c  ,10); Rl0(e,a,b,
42a0: 63 2c 64 2c 31 31 29 3b 0a 20 20 20 20 52 6c 30  c,d,11);.    Rl0
42b0: 28 64 2c 65 2c 61 2c 62 2c 63 2c 31 32 29 3b 20  (d,e,a,b,c,12); 
42c0: 52 6c 30 28 63 2c 64 2c 65 2c 61 2c 62 2c 31 33  Rl0(c,d,e,a,b,13
42d0: 29 3b 20 52 6c 30 28 62 2c 63 2c 64 2c 65 2c 61  ); Rl0(b,c,d,e,a
42e0: 2c 31 34 29 3b 20 52 6c 30 28 61 2c 62 2c 63 2c  ,14); Rl0(a,b,c,
42f0: 64 2c 65 2c 31 35 29 3b 0a 20 20 7d 65 6c 73 65  d,e,15);.  }else
4300: 7b 0a 20 20 20 20 52 62 30 28 61 2c 62 2c 63 2c  {.    Rb0(a,b,c,
4310: 64 2c 65 2c 20 30 29 3b 20 52 62 30 28 65 2c 61  d,e, 0); Rb0(e,a
4320: 2c 62 2c 63 2c 64 2c 20 31 29 3b 20 52 62 30 28  ,b,c,d, 1); Rb0(
4330: 64 2c 65 2c 61 2c 62 2c 63 2c 20 32 29 3b 20 52  d,e,a,b,c, 2); R
4340: 62 30 28 63 2c 64 2c 65 2c 61 2c 62 2c 20 33 29  b0(c,d,e,a,b, 3)
4350: 3b 0a 20 20 20 20 52 62 30 28 62 2c 63 2c 64 2c  ;.    Rb0(b,c,d,
4360: 65 2c 61 2c 20 34 29 3b 20 52 62 30 28 61 2c 62  e,a, 4); Rb0(a,b
4370: 2c 63 2c 64 2c 65 2c 20 35 29 3b 20 52 62 30 28  ,c,d,e, 5); Rb0(
4380: 65 2c 61 2c 62 2c 63 2c 64 2c 20 36 29 3b 20 52  e,a,b,c,d, 6); R
4390: 62 30 28 64 2c 65 2c 61 2c 62 2c 63 2c 20 37 29  b0(d,e,a,b,c, 7)
43a0: 3b 0a 20 20 20 20 52 62 30 28 63 2c 64 2c 65 2c  ;.    Rb0(c,d,e,
43b0: 61 2c 62 2c 20 38 29 3b 20 52 62 30 28 62 2c 63  a,b, 8); Rb0(b,c
43c0: 2c 64 2c 65 2c 61 2c 20 39 29 3b 20 52 62 30 28  ,d,e,a, 9); Rb0(
43d0: 61 2c 62 2c 63 2c 64 2c 65 2c 31 30 29 3b 20 52  a,b,c,d,e,10); R
43e0: 62 30 28 65 2c 61 2c 62 2c 63 2c 64 2c 31 31 29  b0(e,a,b,c,d,11)
43f0: 3b 0a 20 20 20 20 52 62 30 28 64 2c 65 2c 61 2c  ;.    Rb0(d,e,a,
4400: 62 2c 63 2c 31 32 29 3b 20 52 62 30 28 63 2c 64  b,c,12); Rb0(c,d
4410: 2c 65 2c 61 2c 62 2c 31 33 29 3b 20 52 62 30 28  ,e,a,b,13); Rb0(
4420: 62 2c 63 2c 64 2c 65 2c 61 2c 31 34 29 3b 20 52  b,c,d,e,a,14); R
4430: 62 30 28 61 2c 62 2c 63 2c 64 2c 65 2c 31 35 29  b0(a,b,c,d,e,15)
4440: 3b 0a 20 20 7d 0a 20 20 52 31 28 65 2c 61 2c 62  ;.  }.  R1(e,a,b
4450: 2c 63 2c 64 2c 31 36 29 3b 20 52 31 28 64 2c 65  ,c,d,16); R1(d,e
4460: 2c 61 2c 62 2c 63 2c 31 37 29 3b 20 52 31 28 63  ,a,b,c,17); R1(c
4470: 2c 64 2c 65 2c 61 2c 62 2c 31 38 29 3b 20 52 31  ,d,e,a,b,18); R1
4480: 28 62 2c 63 2c 64 2c 65 2c 61 2c 31 39 29 3b 0a  (b,c,d,e,a,19);.
4490: 20 20 52 32 28 61 2c 62 2c 63 2c 64 2c 65 2c 32    R2(a,b,c,d,e,2
44a0: 30 29 3b 20 52 32 28 65 2c 61 2c 62 2c 63 2c 64  0); R2(e,a,b,c,d
44b0: 2c 32 31 29 3b 20 52 32 28 64 2c 65 2c 61 2c 62  ,21); R2(d,e,a,b
44c0: 2c 63 2c 32 32 29 3b 20 52 32 28 63 2c 64 2c 65  ,c,22); R2(c,d,e
44d0: 2c 61 2c 62 2c 32 33 29 3b 0a 20 20 52 32 28 62  ,a,b,23);.  R2(b
44e0: 2c 63 2c 64 2c 65 2c 61 2c 32 34 29 3b 20 52 32  ,c,d,e,a,24); R2
44f0: 28 61 2c 62 2c 63 2c 64 2c 65 2c 32 35 29 3b 20  (a,b,c,d,e,25); 
4500: 52 32 28 65 2c 61 2c 62 2c 63 2c 64 2c 32 36 29  R2(e,a,b,c,d,26)
4510: 3b 20 52 32 28 64 2c 65 2c 61 2c 62 2c 63 2c 32  ; R2(d,e,a,b,c,2
4520: 37 29 3b 0a 20 20 52 32 28 63 2c 64 2c 65 2c 61  7);.  R2(c,d,e,a
4530: 2c 62 2c 32 38 29 3b 20 52 32 28 62 2c 63 2c 64  ,b,28); R2(b,c,d
4540: 2c 65 2c 61 2c 32 39 29 3b 20 52 32 28 61 2c 62  ,e,a,29); R2(a,b
4550: 2c 63 2c 64 2c 65 2c 33 30 29 3b 20 52 32 28 65  ,c,d,e,30); R2(e
4560: 2c 61 2c 62 2c 63 2c 64 2c 33 31 29 3b 0a 20 20  ,a,b,c,d,31);.  
4570: 52 32 28 64 2c 65 2c 61 2c 62 2c 63 2c 33 32 29  R2(d,e,a,b,c,32)
4580: 3b 20 52 32 28 63 2c 64 2c 65 2c 61 2c 62 2c 33  ; R2(c,d,e,a,b,3
4590: 33 29 3b 20 52 32 28 62 2c 63 2c 64 2c 65 2c 61  3); R2(b,c,d,e,a
45a0: 2c 33 34 29 3b 20 52 32 28 61 2c 62 2c 63 2c 64  ,34); R2(a,b,c,d
45b0: 2c 65 2c 33 35 29 3b 0a 20 20 52 32 28 65 2c 61  ,e,35);.  R2(e,a
45c0: 2c 62 2c 63 2c 64 2c 33 36 29 3b 20 52 32 28 64  ,b,c,d,36); R2(d
45d0: 2c 65 2c 61 2c 62 2c 63 2c 33 37 29 3b 20 52 32  ,e,a,b,c,37); R2
45e0: 28 63 2c 64 2c 65 2c 61 2c 62 2c 33 38 29 3b 20  (c,d,e,a,b,38); 
45f0: 52 32 28 62 2c 63 2c 64 2c 65 2c 61 2c 33 39 29  R2(b,c,d,e,a,39)
4600: 3b 0a 20 20 52 33 28 61 2c 62 2c 63 2c 64 2c 65  ;.  R3(a,b,c,d,e
4610: 2c 34 30 29 3b 20 52 33 28 65 2c 61 2c 62 2c 63  ,40); R3(e,a,b,c
4620: 2c 64 2c 34 31 29 3b 20 52 33 28 64 2c 65 2c 61  ,d,41); R3(d,e,a
4630: 2c 62 2c 63 2c 34 32 29 3b 20 52 33 28 63 2c 64  ,b,c,42); R3(c,d
4640: 2c 65 2c 61 2c 62 2c 34 33 29 3b 0a 20 20 52 33  ,e,a,b,43);.  R3
4650: 28 62 2c 63 2c 64 2c 65 2c 61 2c 34 34 29 3b 20  (b,c,d,e,a,44); 
4660: 52 33 28 61 2c 62 2c 63 2c 64 2c 65 2c 34 35 29  R3(a,b,c,d,e,45)
4670: 3b 20 52 33 28 65 2c 61 2c 62 2c 63 2c 64 2c 34  ; R3(e,a,b,c,d,4
4680: 36 29 3b 20 52 33 28 64 2c 65 2c 61 2c 62 2c 63  6); R3(d,e,a,b,c
4690: 2c 34 37 29 3b 0a 20 20 52 33 28 63 2c 64 2c 65  ,47);.  R3(c,d,e
46a0: 2c 61 2c 62 2c 34 38 29 3b 20 52 33 28 62 2c 63  ,a,b,48); R3(b,c
46b0: 2c 64 2c 65 2c 61 2c 34 39 29 3b 20 52 33 28 61  ,d,e,a,49); R3(a
46c0: 2c 62 2c 63 2c 64 2c 65 2c 35 30 29 3b 20 52 33  ,b,c,d,e,50); R3
46d0: 28 65 2c 61 2c 62 2c 63 2c 64 2c 35 31 29 3b 0a  (e,a,b,c,d,51);.
46e0: 20 20 52 33 28 64 2c 65 2c 61 2c 62 2c 63 2c 35    R3(d,e,a,b,c,5
46f0: 32 29 3b 20 52 33 28 63 2c 64 2c 65 2c 61 2c 62  2); R3(c,d,e,a,b
4700: 2c 35 33 29 3b 20 52 33 28 62 2c 63 2c 64 2c 65  ,53); R3(b,c,d,e
4710: 2c 61 2c 35 34 29 3b 20 52 33 28 61 2c 62 2c 63  ,a,54); R3(a,b,c
4720: 2c 64 2c 65 2c 35 35 29 3b 0a 20 20 52 33 28 65  ,d,e,55);.  R3(e
4730: 2c 61 2c 62 2c 63 2c 64 2c 35 36 29 3b 20 52 33  ,a,b,c,d,56); R3
4740: 28 64 2c 65 2c 61 2c 62 2c 63 2c 35 37 29 3b 20  (d,e,a,b,c,57); 
4750: 52 33 28 63 2c 64 2c 65 2c 61 2c 62 2c 35 38 29  R3(c,d,e,a,b,58)
4760: 3b 20 52 33 28 62 2c 63 2c 64 2c 65 2c 61 2c 35  ; R3(b,c,d,e,a,5
4770: 39 29 3b 0a 20 20 52 34 28 61 2c 62 2c 63 2c 64  9);.  R4(a,b,c,d
4780: 2c 65 2c 36 30 29 3b 20 52 34 28 65 2c 61 2c 62  ,e,60); R4(e,a,b
4790: 2c 63 2c 64 2c 36 31 29 3b 20 52 34 28 64 2c 65  ,c,d,61); R4(d,e
47a0: 2c 61 2c 62 2c 63 2c 36 32 29 3b 20 52 34 28 63  ,a,b,c,62); R4(c
47b0: 2c 64 2c 65 2c 61 2c 62 2c 36 33 29 3b 0a 20 20  ,d,e,a,b,63);.  
47c0: 52 34 28 62 2c 63 2c 64 2c 65 2c 61 2c 36 34 29  R4(b,c,d,e,a,64)
47d0: 3b 20 52 34 28 61 2c 62 2c 63 2c 64 2c 65 2c 36  ; R4(a,b,c,d,e,6
47e0: 35 29 3b 20 52 34 28 65 2c 61 2c 62 2c 63 2c 64  5); R4(e,a,b,c,d
47f0: 2c 36 36 29 3b 20 52 34 28 64 2c 65 2c 61 2c 62  ,66); R4(d,e,a,b
4800: 2c 63 2c 36 37 29 3b 0a 20 20 52 34 28 63 2c 64  ,c,67);.  R4(c,d
4810: 2c 65 2c 61 2c 62 2c 36 38 29 3b 20 52 34 28 62  ,e,a,b,68); R4(b
4820: 2c 63 2c 64 2c 65 2c 61 2c 36 39 29 3b 20 52 34  ,c,d,e,a,69); R4
4830: 28 61 2c 62 2c 63 2c 64 2c 65 2c 37 30 29 3b 20  (a,b,c,d,e,70); 
4840: 52 34 28 65 2c 61 2c 62 2c 63 2c 64 2c 37 31 29  R4(e,a,b,c,d,71)
4850: 3b 0a 20 20 52 34 28 64 2c 65 2c 61 2c 62 2c 63  ;.  R4(d,e,a,b,c
4860: 2c 37 32 29 3b 20 52 34 28 63 2c 64 2c 65 2c 61  ,72); R4(c,d,e,a
4870: 2c 62 2c 37 33 29 3b 20 52 34 28 62 2c 63 2c 64  ,b,73); R4(b,c,d
4880: 2c 65 2c 61 2c 37 34 29 3b 20 52 34 28 61 2c 62  ,e,a,74); R4(a,b
4890: 2c 63 2c 64 2c 65 2c 37 35 29 3b 0a 20 20 52 34  ,c,d,e,75);.  R4
48a0: 28 65 2c 61 2c 62 2c 63 2c 64 2c 37 36 29 3b 20  (e,a,b,c,d,76); 
48b0: 52 34 28 64 2c 65 2c 61 2c 62 2c 63 2c 37 37 29  R4(d,e,a,b,c,77)
48c0: 3b 20 52 34 28 63 2c 64 2c 65 2c 61 2c 62 2c 37  ; R4(c,d,e,a,b,7
48d0: 38 29 3b 20 52 34 28 62 2c 63 2c 64 2c 65 2c 61  8); R4(b,c,d,e,a
48e0: 2c 37 39 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  ,79);..  /* Add 
48f0: 74 68 65 20 77 6f 72 6b 69 6e 67 20 76 61 72 73  the working vars
4900: 20 62 61 63 6b 20 69 6e 74 6f 20 63 6f 6e 74 65   back into conte
4910: 78 74 2e 73 74 61 74 65 5b 5d 20 2a 2f 0a 20 20  xt.state[] */.  
4920: 73 74 61 74 65 5b 30 5d 20 2b 3d 20 61 3b 0a 20  state[0] += a;. 
4930: 20 73 74 61 74 65 5b 31 5d 20 2b 3d 20 62 3b 0a   state[1] += b;.
4940: 20 20 73 74 61 74 65 5b 32 5d 20 2b 3d 20 63 3b    state[2] += c;
4950: 0a 20 20 73 74 61 74 65 5b 33 5d 20 2b 3d 20 64  .  state[3] += d
4960: 3b 0a 20 20 73 74 61 74 65 5b 34 5d 20 2b 3d 20  ;.  state[4] += 
4970: 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 20 2a 20 53 48 41  e;.}.../*. * SHA
4980: 31 49 6e 69 74 20 2d 20 49 6e 69 74 69 61 6c 69  1Init - Initiali
4990: 7a 65 20 6e 65 77 20 63 6f 6e 74 65 78 74 0a 20  ze new context. 
49a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
49b0: 48 41 31 49 6e 69 74 28 53 48 41 31 43 6f 6e 74  HA1Init(SHA1Cont
49c0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
49d0: 20 20 20 2f 2a 20 53 48 41 31 20 69 6e 69 74 69     /* SHA1 initi
49e0: 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e 73 74 61  alization consta
49f0: 6e 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 74 65  nts */.    conte
4a00: 78 74 2d 3e 73 74 61 74 65 5b 30 5d 20 3d 20 30  xt->state[0] = 0
4a10: 78 36 37 34 35 32 33 30 31 3b 0a 20 20 20 20 63  x67452301;.    c
4a20: 6f 6e 74 65 78 74 2d 3e 73 74 61 74 65 5b 31 5d  ontext->state[1]
4a30: 20 3d 20 30 78 45 46 43 44 41 42 38 39 3b 0a 20   = 0xEFCDAB89;. 
4a40: 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 74 61 74     context->stat
4a50: 65 5b 32 5d 20 3d 20 30 78 39 38 42 41 44 43 46  e[2] = 0x98BADCF
4a60: 45 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e  E;.    context->
4a70: 73 74 61 74 65 5b 33 5d 20 3d 20 30 78 31 30 33  state[3] = 0x103
4a80: 32 35 34 37 36 3b 0a 20 20 20 20 63 6f 6e 74 65  25476;.    conte
4a90: 78 74 2d 3e 73 74 61 74 65 5b 34 5d 20 3d 20 30  xt->state[4] = 0
4aa0: 78 43 33 44 32 45 31 46 30 3b 0a 20 20 20 20 63  xC3D2E1F0;.    c
4ab0: 6f 6e 74 65 78 74 2d 3e 63 6f 75 6e 74 5b 30 5d  ontext->count[0]
4ac0: 20 3d 20 63 6f 6e 74 65 78 74 2d 3e 63 6f 75 6e   = context->coun
4ad0: 74 5b 31 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a  t[1] = 0;.}.../*
4ae0: 0a 20 2a 20 52 75 6e 20 79 6f 75 72 20 64 61 74  . * Run your dat
4af0: 61 20 74 68 72 6f 75 67 68 20 74 68 69 73 2e 0a  a through this..
4b00: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
4b10: 53 48 41 31 55 70 64 61 74 65 28 0a 20 20 53 48  SHA1Update(.  SH
4b20: 41 31 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  A1Context *conte
4b30: 78 74 2c 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  xt,.  const unsi
4b40: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c  gned char *data,
4b50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
4b60: 6c 65 6e 0a 29 7b 0a 20 20 20 20 75 6e 73 69 67  len.){.    unsig
4b70: 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20  ned int i, j;.. 
4b80: 20 20 20 6a 20 3d 20 63 6f 6e 74 65 78 74 2d 3e     j = context->
4b90: 63 6f 75 6e 74 5b 30 5d 3b 0a 20 20 20 20 69 66  count[0];.    if
4ba0: 20 28 28 63 6f 6e 74 65 78 74 2d 3e 63 6f 75 6e   ((context->coun
4bb0: 74 5b 30 5d 20 2b 3d 20 6c 65 6e 20 3c 3c 20 33  t[0] += len << 3
4bc0: 29 20 3c 20 6a 29 0a 20 20 20 20 20 20 20 20 63  ) < j).        c
4bd0: 6f 6e 74 65 78 74 2d 3e 63 6f 75 6e 74 5b 31 5d  ontext->count[1]
4be0: 20 2b 3d 20 28 6c 65 6e 3e 3e 32 39 29 2b 31 3b   += (len>>29)+1;
4bf0: 0a 20 20 20 20 6a 20 3d 20 28 6a 20 3e 3e 20 33  .    j = (j >> 3
4c00: 29 20 26 20 36 33 3b 0a 20 20 20 20 69 66 20 28  ) & 63;.    if (
4c10: 28 6a 20 2b 20 6c 65 6e 29 20 3e 20 36 33 29 20  (j + len) > 63) 
4c20: 7b 0a 20 20 20 20 20 20 20 20 28 76 6f 69 64 29  {.        (void)
4c30: 6d 65 6d 63 70 79 28 26 63 6f 6e 74 65 78 74 2d  memcpy(&context-
4c40: 3e 62 75 66 66 65 72 5b 6a 5d 2c 20 64 61 74 61  >buffer[j], data
4c50: 2c 20 28 69 20 3d 20 36 34 2d 6a 29 29 3b 0a 20  , (i = 64-j));. 
4c60: 20 20 20 20 20 20 20 53 48 41 31 54 72 61 6e 73         SHA1Trans
4c70: 66 6f 72 6d 28 63 6f 6e 74 65 78 74 2d 3e 73 74  form(context->st
4c80: 61 74 65 2c 20 63 6f 6e 74 65 78 74 2d 3e 62 75  ate, context->bu
4c90: 66 66 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66  ffer);.        f
4ca0: 6f 72 20 28 20 3b 20 69 20 2b 20 36 33 20 3c 20  or ( ; i + 63 < 
4cb0: 6c 65 6e 3b 20 69 20 2b 3d 20 36 34 29 0a 20 20  len; i += 64).  
4cc0: 20 20 20 20 20 20 20 20 20 20 53 48 41 31 54 72            SHA1Tr
4cd0: 61 6e 73 66 6f 72 6d 28 63 6f 6e 74 65 78 74 2d  ansform(context-
4ce0: 3e 73 74 61 74 65 2c 20 26 64 61 74 61 5b 69 5d  >state, &data[i]
4cf0: 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 30  );.        j = 0
4d00: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
4d10: 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20         i = 0;.  
4d20: 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29 6d 65    }.    (void)me
4d30: 6d 63 70 79 28 26 63 6f 6e 74 65 78 74 2d 3e 62  mcpy(&context->b
4d40: 75 66 66 65 72 5b 6a 5d 2c 20 26 64 61 74 61 5b  uffer[j], &data[
4d50: 69 5d 2c 20 6c 65 6e 20 2d 20 69 29 3b 0a 7d 0a  i], len - i);.}.
4d60: 0a 0a 2f 2a 0a 20 2a 20 41 64 64 20 70 61 64 64  ../*. * Add padd
4d70: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
4d80: 68 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  he message diges
4d90: 74 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t.. */.static vo
4da0: 69 64 20 53 48 41 31 46 69 6e 61 6c 28 75 6e 73  id SHA1Final(uns
4db0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 69 67 65  igned char *dige
4dc0: 73 74 2c 20 53 48 41 31 43 6f 6e 74 65 78 74 20  st, SHA1Context 
4dd0: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 20 20 75  *context){.    u
4de0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
4df0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
4e00: 20 66 69 6e 61 6c 63 6f 75 6e 74 5b 38 5d 3b 0a   finalcount[8];.
4e10: 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b  .    for (i = 0;
4e20: 20 69 20 3c 20 38 3b 20 69 2b 2b 29 20 7b 0a 20   i < 8; i++) {. 
4e30: 20 20 20 20 20 20 20 66 69 6e 61 6c 63 6f 75 6e         finalcoun
4e40: 74 5b 69 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64  t[i] = (unsigned
4e50: 20 63 68 61 72 29 28 28 63 6f 6e 74 65 78 74 2d   char)((context-
4e60: 3e 63 6f 75 6e 74 5b 28 69 20 3e 3d 20 34 20 3f  >count[(i >= 4 ?
4e70: 20 30 20 3a 20 31 29 5d 0a 20 20 20 20 20 20 20   0 : 1)].       
4e80: 20 20 3e 3e 20 28 28 33 2d 28 69 20 26 20 33 29    >> ((3-(i & 3)
4e90: 29 20 2a 20 38 29 20 29 20 26 20 32 35 35 29 3b  ) * 8) ) & 255);
4ea0: 20 2f 2a 20 45 6e 64 69 61 6e 20 69 6e 64 65 70   /* Endian indep
4eb0: 65 6e 64 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a  endent */.    }.
4ec0: 20 20 20 20 53 48 41 31 55 70 64 61 74 65 28 63      SHA1Update(c
4ed0: 6f 6e 74 65 78 74 2c 20 28 63 6f 6e 73 74 20 75  ontext, (const u
4ee0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 22  nsigned char *)"
4ef0: 5c 32 30 30 22 2c 20 31 29 3b 0a 20 20 20 20 77  \200", 1);.    w
4f00: 68 69 6c 65 20 28 28 63 6f 6e 74 65 78 74 2d 3e  hile ((context->
4f10: 63 6f 75 6e 74 5b 30 5d 20 26 20 35 30 34 29 20  count[0] & 504) 
4f20: 21 3d 20 34 34 38 29 0a 20 20 20 20 20 20 20 20  != 448).        
4f30: 53 48 41 31 55 70 64 61 74 65 28 63 6f 6e 74 65  SHA1Update(conte
4f40: 78 74 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  xt, (const unsig
4f50: 6e 65 64 20 63 68 61 72 20 2a 29 22 5c 30 22 2c  ned char *)"\0",
4f60: 20 31 29 3b 0a 20 20 20 20 53 48 41 31 55 70 64   1);.    SHA1Upd
4f70: 61 74 65 28 63 6f 6e 74 65 78 74 2c 20 66 69 6e  ate(context, fin
4f80: 61 6c 63 6f 75 6e 74 2c 20 38 29 3b 20 20 2f 2a  alcount, 8);  /*
4f90: 20 53 68 6f 75 6c 64 20 63 61 75 73 65 20 61 20   Should cause a 
4fa0: 53 48 41 31 54 72 61 6e 73 66 6f 72 6d 28 29 20  SHA1Transform() 
4fb0: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 64 69 67 65  */..    if (dige
4fc0: 73 74 29 20 7b 0a 20 20 20 20 20 20 20 20 66 6f  st) {.        fo
4fd0: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 32 30  r (i = 0; i < 20
4fe0: 3b 20 69 2b 2b 29 0a 20 20 20 20 20 20 20 20 20  ; i++).         
4ff0: 20 20 20 64 69 67 65 73 74 5b 69 5d 20 3d 20 28     digest[i] = (
5000: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 0a 20  unsigned char). 
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5020: 28 63 6f 6e 74 65 78 74 2d 3e 73 74 61 74 65 5b  (context->state[
5030: 69 3e 3e 32 5d 20 3e 3e 20 28 28 33 2d 28 69 20  i>>2] >> ((3-(i 
5040: 26 20 33 29 29 20 2a 20 38 29 20 29 20 26 20 32  & 3)) * 8) ) & 2
5050: 35 35 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 2f  55);.    }.}.../
5060: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
5070: 20 53 48 41 31 20 63 68 65 63 6b 73 75 6d 20 6f   SHA1 checksum o
5080: 66 20 61 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  f a file on disk
5090: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  .  Store the res
50a0: 75 6c 74 69 6e 67 0a 2a 2a 20 63 68 65 63 6b 73  ulting.** checks
50b0: 75 6d 20 69 6e 20 74 68 65 20 62 6c 6f 62 20 70  um in the blob p
50c0: 43 6b 73 75 6d 2e 20 20 70 43 6b 73 75 6d 20 69  Cksum.  pCksum i
50d0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20  s assumed to be 
50e0: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 0a  initialized..**.
50f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
5100: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
5110: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
5120: 61 31 73 75 6d 5f 66 69 6c 65 28 63 6f 6e 73 74  a1sum_file(const
5130: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
5140: 2c 20 63 68 61 72 20 2a 70 43 6b 73 75 6d 29 7b  , char *pCksum){
5150: 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 53  .  FILE *in;.  S
5160: 48 41 31 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a  HA1Context ctx;.
5170: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5180: 7a 52 65 73 75 6c 74 5b 32 30 5d 3b 0a 20 20 63  zResult[20];.  c
5190: 68 61 72 20 7a 42 75 66 5b 31 30 32 34 30 5d 3b  har zBuf[10240];
51a0: 0a 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a  ..  in = fopen(z
51b0: 46 69 6c 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a  Filename,"rb");.
51c0: 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
51d0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
51e0: 0a 20 20 53 48 41 31 49 6e 69 74 28 26 63 74 78  .  SHA1Init(&ctx
51f0: 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
5200: 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 66    int n = (int)f
5210: 72 65 61 64 28 7a 42 75 66 2c 20 31 2c 20 73 69  read(zBuf, 1, si
5220: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 69 6e 29 3b  zeof(zBuf), in);
5230: 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30 20 29 20  .    if( n<=0 ) 
5240: 62 72 65 61 6b 3b 0a 20 20 20 20 53 48 41 31 55  break;.    SHA1U
5250: 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e 73  pdate(&ctx, (uns
5260: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75 66  igned char*)zBuf
5270: 2c 20 28 75 6e 73 69 67 6e 65 64 29 6e 29 3b 0a  , (unsigned)n);.
5280: 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29    }.  fclose(in)
5290: 3b 0a 20 20 53 48 41 31 46 69 6e 61 6c 28 7a 52  ;.  SHA1Final(zR
52a0: 65 73 75 6c 74 2c 20 26 63 74 78 29 3b 0a 20 20  esult, &ctx);.  
52b0: 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 28 7a  DigestToBase16(z
52c0: 52 65 73 75 6c 74 2c 20 70 43 6b 73 75 6d 2c 20  Result, pCksum, 
52d0: 32 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  20);.  return 0;
52e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  .}../*.** Print 
52f0: 61 20 75 73 61 67 65 20 63 6f 6d 6d 65 6e 74 20  a usage comment 
5300: 61 6e 64 20 71 75 69 74 2e 0a 2a 2f 0a 73 74 61  and quit..*/.sta
5310: 74 69 63 20 76 6f 69 64 20 75 73 61 67 65 28 63  tic void usage(c
5320: 6f 6e 73 74 20 63 68 61 72 20 2a 61 72 67 76 30  onst char *argv0
5330: 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  ){.  fprintf(std
5340: 65 72 72 2c 20 0a 20 20 20 20 20 22 55 73 61 67  err, .     "Usag
5350: 65 3a 20 25 73 20 6d 61 6e 69 66 65 73 74 5c 6e  e: %s manifest\n
5360: 22 0a 20 20 20 20 20 22 4f 70 74 69 6f 6e 73 3a  ".     "Options:
5370: 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 2d 76 20  \n".     "   -v 
5380: 20 44 69 61 67 6e 6f 73 74 69 63 20 6f 75 74 70   Diagnostic outp
5390: 75 74 5c 6e 22 0a 20 20 20 20 20 2c 20 61 72 67  ut\n".     , arg
53a0: 76 30 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a  v0);.  exit(1);.
53b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  }../*.** Find th
53c0: 65 20 66 69 72 73 74 20 77 68 69 74 65 73 70 61  e first whitespa
53d0: 63 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  ce character in 
53e0: 61 20 73 74 72 69 6e 67 2e 20 20 53 65 74 20 74  a string.  Set t
53f0: 68 61 74 20 77 68 69 74 65 73 70 61 63 65 0a 2a  hat whitespace.*
5400: 2a 20 74 6f 20 61 20 5c 30 30 30 20 74 65 72 6d  * to a \000 term
5410: 69 6e 61 74 6f 72 20 61 6e 64 20 72 65 74 75 72  inator and retur
5420: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
5430: 68 65 20 6e 65 78 74 20 63 68 61 72 61 63 74 65  he next characte
5440: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r..*/.static cha
5450: 72 20 2a 6e 65 78 74 54 6f 6b 65 6e 28 63 68 61  r *nextToken(cha
5460: 72 20 2a 7a 29 7b 0a 20 20 77 68 69 6c 65 28 20  r *z){.  while( 
5470: 2a 7a 20 26 26 20 21 69 73 73 70 61 63 65 28 2a  *z && !isspace(*
5480: 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 69 66 28 20  z) ) z++;.  if( 
5490: 2a 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a  *z==0 ) return z
54a0: 3b 0a 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 72 65  ;.  *z = 0;.  re
54b0: 74 75 72 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a 20 20  turn &z[1];.}.  
54c0: 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61  ..int main(int a
54d0: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
54e0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
54f0: 2a 7a 4d 61 6e 69 66 65 73 74 20 3d 20 30 3b 0a  *zManifest = 0;.
5500: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62    int i;.  int b
5510: 56 65 72 62 6f 73 65 20 3d 20 30 3b 0a 20 20 46  Verbose = 0;.  F
5520: 49 4c 45 20 2a 69 6e 3b 0a 20 20 69 6e 74 20 61  ILE *in;.  int a
5530: 6c 6c 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 69  llValid = 1;.  i
5540: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 44  nt rc;.  char zD
5550: 61 74 65 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20  ate[50];.  char 
5560: 7a 48 61 73 68 5b 31 30 30 5d 3b 0a 20 20 63 68  zHash[100];.  ch
5570: 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d 3b 0a  ar zLine[1000];.
5580: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72  .  for(i=1; i<ar
5590: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  gc; i++){.    co
55a0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 72  nst char *z = ar
55b0: 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a  gv[i];.    if( z
55c0: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
55d0: 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20    if( z[1]=='-' 
55e0: 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) z++;.      if(
55f0: 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 76 22 29   strcmp(z, "-v")
5600: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
5610: 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20  Verbose = 1;.   
5620: 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 7b     }else.      {
5630: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
5640: 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77  (stderr, "unknow
5650: 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 22  n option \"%s\""
5660: 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  , argv[i]);.    
5670: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
5680: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
5690: 66 28 20 7a 4d 61 6e 69 66 65 73 74 21 3d 30 20  f( zManifest!=0 
56a0: 29 7b 0a 20 20 20 20 20 20 75 73 61 67 65 28 61  ){.      usage(a
56b0: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c  rgv[0]);.    }el
56c0: 73 65 7b 0a 20 20 20 20 20 20 7a 4d 61 6e 69 66  se{.      zManif
56d0: 65 73 74 20 3d 20 7a 3b 0a 20 20 20 20 7d 0a 20  est = z;.    }. 
56e0: 20 7d 0a 20 20 69 66 28 20 7a 4d 61 6e 69 66 65   }.  if( zManife
56f0: 73 74 3d 3d 30 20 29 20 75 73 61 67 65 28 61 72  st==0 ) usage(ar
5700: 67 76 5b 30 5d 29 3b 0a 20 20 7a 44 61 74 65 5b  gv[0]);.  zDate[
5710: 30 5d 20 3d 20 30 3b 0a 20 20 69 6e 20 3d 20 66  0] = 0;.  in = f
5720: 6f 70 65 6e 28 7a 4d 61 6e 69 66 65 73 74 2c 20  open(zManifest, 
5730: 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d  "rb");.  if( in=
5740: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
5750: 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f  f(stderr, "canno
5760: 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f  t open \"%s\" fo
5770: 72 20 72 65 61 64 69 6e 67 5c 6e 22 2c 20 7a 4d  r reading\n", zM
5780: 61 6e 69 66 65 73 74 29 3b 0a 20 20 20 20 65 78  anifest);.    ex
5790: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 77 68 69  it(1);.  }.  whi
57a0: 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c  le( fgets(zLine,
57b0: 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20   sizeof(zLine), 
57c0: 69 6e 29 20 29 7b 0a 20 20 20 20 69 66 28 20 73  in) ){.    if( s
57d0: 74 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 20 22 44  trncmp(zLine, "D
57e0: 20 32 30 22 2c 20 34 29 3d 3d 30 20 29 7b 0a 20   20", 4)==0 ){. 
57f0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 61 74       memcpy(zDat
5800: 65 2c 20 26 7a 4c 69 6e 65 5b 32 5d 2c 20 31 30  e, &zLine[2], 10
5810: 29 3b 0a 20 20 20 20 20 20 7a 44 61 74 65 5b 31  );.      zDate[1
5820: 30 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  0] = ' ';.      
5830: 6d 65 6d 63 70 79 28 26 7a 44 61 74 65 5b 31 31  memcpy(&zDate[11
5840: 5d 2c 20 26 7a 4c 69 6e 65 5b 31 33 5d 2c 20 38  ], &zLine[13], 8
5850: 29 3b 0a 20 20 20 20 20 20 7a 44 61 74 65 5b 31  );.      zDate[1
5860: 39 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  9] = 0;.      co
5870: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
5880: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4c    if( strncmp(zL
5890: 69 6e 65 2c 20 22 46 20 22 2c 20 32 29 3d 3d 30  ine, "F ", 2)==0
58a0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
58b0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 26 7a 4c 69  zFilename = &zLi
58c0: 6e 65 5b 32 5d 3b 0a 20 20 20 20 20 20 63 68 61  ne[2];.      cha
58d0: 72 20 2a 7a 4d 48 61 73 68 20 3d 20 6e 65 78 74  r *zMHash = next
58e0: 54 6f 6b 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  Token(zFilename)
58f0: 3b 0a 20 20 20 20 20 20 6e 65 78 74 54 6f 6b 65  ;.      nextToke
5900: 6e 28 7a 4d 48 61 73 68 29 3b 0a 20 20 20 20 20  n(zMHash);.     
5910: 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 4d 48 61   if( strlen(zMHa
5920: 73 68 29 3d 3d 34 30 20 29 7b 0a 20 20 20 20 20  sh)==40 ){.     
5930: 20 20 20 72 63 20 3d 20 73 68 61 31 73 75 6d 5f     rc = sha1sum_
5940: 66 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  file(zFilename, 
5950: 7a 48 61 73 68 29 3b 0a 20 20 20 20 20 20 7d 65  zHash);.      }e
5960: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
5970: 3d 20 73 68 61 33 73 75 6d 5f 66 69 6c 65 28 7a  = sha3sum_file(z
5980: 46 69 6c 65 6e 61 6d 65 2c 20 32 35 36 2c 20 7a  Filename, 256, z
5990: 48 61 73 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Hash);.      }. 
59a0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
59b0: 20 20 20 20 20 20 20 61 6c 6c 56 61 6c 69 64 20         allValid 
59c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
59d0: 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20   bVerbose ){.   
59e0: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 68         printf("h
59f0: 61 73 68 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e  ash failed: %s\n
5a00: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
5a10: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
5a20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5a30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5a40: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
5a50: 7a 48 61 73 68 2c 20 7a 4d 48 61 73 68 29 21 3d  zHash, zMHash)!=
5a60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 6c 6c  0 ){.        all
5a70: 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Valid = 0;.     
5a80: 20 20 20 69 66 28 20 62 56 65 72 62 6f 73 65 20     if( bVerbose 
5a90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  ){.          pri
5aa0: 6e 74 66 28 22 77 72 6f 6e 67 20 68 61 73 68 3a  ntf("wrong hash:
5ab0: 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d   %s\n", zFilenam
5ac0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72  e);.          pr
5ad0: 69 6e 74 66 28 22 2e 2e 2e 20 65 78 70 65 63 74  intf("... expect
5ae0: 65 64 3a 20 25 73 5c 6e 22 2c 20 7a 4d 48 61 73  ed: %s\n", zMHas
5af0: 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72  h);.          pr
5b00: 69 6e 74 66 28 22 2e 2e 2e 20 67 6f 74 3a 20 20  intf("... got:  
5b10: 20 20 20 20 25 73 5c 6e 22 2c 20 7a 48 61 73 68      %s\n", zHash
5b20: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
5b30: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
5b40: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
5b50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5b60: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 73   fclose(in);.  s
5b70: 68 61 33 73 75 6d 5f 66 69 6c 65 28 7a 4d 61 6e  ha3sum_file(zMan
5b80: 69 66 65 73 74 2c 20 32 35 36 2c 20 7a 48 61 73  ifest, 256, zHas
5b90: 68 29 3b 0a 20 20 69 66 28 20 21 61 6c 6c 56 61  h);.  if( !allVa
5ba0: 6c 69 64 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  lid ){.    print
5bb0: 66 28 22 25 73 20 25 2e 36 30 73 61 6c 74 31 5c  f("%s %.60salt1\
5bc0: 6e 22 2c 20 7a 44 61 74 65 2c 20 7a 48 61 73 68  n", zDate, zHash
5bd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5be0: 70 72 69 6e 74 66 28 22 25 73 20 25 73 5c 6e 22  printf("%s %s\n"
5bf0: 2c 20 7a 44 61 74 65 2c 20 7a 48 61 73 68 29 3b  , zDate, zHash);
5c00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
5c10: 0a 7d 0a                                         .}.