/ Hex Artifact Content
Login

Artifact dd33d2a9c1538e545ecd6dcba620d0d783c5c4a232283e127c8478e649ad38bf:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 2d 30 33 2d 30 38  /*.** 2017-03-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e  SQLite extension
0190: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 75 6e 63   implements func
01a0: 74 69 6f 6e 73 20 74 68 61 74 20 63 6f 6d 70 75  tions that compu
01b0: 74 65 20 53 48 41 33 20 68 61 73 68 65 73 2e 0a  te SHA3 hashes..
01c0: 2a 2a 20 54 77 6f 20 53 51 4c 20 66 75 6e 63 74  ** Two SQL funct
01d0: 69 6f 6e 73 20 61 72 65 20 69 6d 70 6c 65 6d 65  ions are impleme
01e0: 6e 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  nted:.**.**     
01f0: 73 68 61 33 28 58 2c 53 49 5a 45 29 0a 2a 2a 20  sha3(X,SIZE).** 
0200: 20 20 20 20 73 68 61 33 5f 71 75 65 72 79 28 59      sha3_query(Y
0210: 2c 53 49 5a 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65  ,SIZE).**.** The
0220: 20 73 68 61 33 28 58 29 20 66 75 6e 63 74 69 6f   sha3(X) functio
0230: 6e 20 63 6f 6d 70 75 74 65 73 20 74 68 65 20 53  n computes the S
0240: 48 41 33 20 68 61 73 68 20 6f 66 20 74 68 65 20  HA3 hash of the 
0250: 69 6e 70 75 74 20 58 2c 20 6f 72 20 4e 55 4c 4c  input X, or NULL
0260: 20 69 66 0a 2a 2a 20 58 20 69 73 20 4e 55 4c 4c   if.** X is NULL
0270: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 68 61 33  ..**.** The sha3
0280: 5f 71 75 65 72 79 28 59 29 20 66 75 6e 63 74 69  _query(Y) functi
0290: 6f 6e 20 65 76 61 6c 75 74 65 73 20 61 6c 6c 20  on evalutes all 
02a0: 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 53  queries in the S
02b0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66  QL statements of
02c0: 20 59 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e   Y.** and return
02d0: 73 20 61 20 68 61 73 68 20 6f 66 20 74 68 65 69  s a hash of thei
02e0: 72 20 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a  r results..**.**
02f0: 20 54 68 65 20 53 49 5a 45 20 61 72 67 75 6d 65   The SIZE argume
0300: 6e 74 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20  nt is optional. 
0310: 20 49 66 20 6f 6d 69 74 74 65 64 2c 20 74 68 65   If omitted, the
0320: 20 53 48 41 33 2d 32 35 36 20 68 61 73 68 20 61   SHA3-256 hash a
0330: 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 69 73 20 75  lgorithm.** is u
0340: 73 65 64 2e 20 20 49 66 20 53 49 5a 45 20 69 73  sed.  If SIZE is
0350: 20 69 6e 63 6c 75 64 65 64 20 69 74 20 6d 75 73   included it mus
0360: 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  t be one of the 
0370: 69 6e 74 65 67 65 72 73 20 32 32 34 2c 20 32 35  integers 224, 25
0380: 36 2c 0a 2a 2a 20 33 38 34 2c 20 6f 72 20 35 31  6,.** 384, or 51
0390: 32 2c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  2, to determine 
03a0: 53 48 41 33 20 68 61 73 68 20 76 61 72 69 61 6e  SHA3 hash varian
03b0: 74 20 74 68 61 74 20 69 73 20 63 6f 6d 70 75 74  t that is comput
03c0: 65 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ed..*/.#if !defi
03d0: 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29  ned(SQLITE_CORE)
03e0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
03f0: 54 45 5f 45 4e 41 42 4c 45 5f 53 48 41 33 29 0a  TE_ENABLE_SHA3).
0400: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
0410: 49 54 45 49 4e 54 5f 48 29 0a 23 69 6e 63 6c 75  ITEINT_H).#inclu
0420: 64 65 20 22 73 71 6c 69 74 65 33 65 78 74 2e 68  de "sqlite3ext.h
0430: 22 0a 23 65 6e 64 69 66 0a 53 51 4c 49 54 45 5f  ".#endif.SQLITE_
0440: 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a  EXTENSION_INIT1.
0450: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0460: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0470: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
0480: 20 3c 73 74 64 61 72 67 2e 68 3e 0a 23 69 66 64   <stdarg.h>.#ifd
0490: 65 66 20 53 51 4c 49 54 45 5f 43 4f 52 45 0a 23  ef SQLITE_CORE.#
04a0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
04b0: 6e 74 2e 68 22 0a 23 65 6c 73 65 0a 74 79 70 65  nt.h".#else.type
04c0: 64 65 66 20 73 71 6c 69 74 65 33 5f 75 69 6e 74  def sqlite3_uint
04d0: 36 34 20 75 36 34 3b 0a 23 65 6e 64 69 66 0a 0a  64 u64;.#endif..
04e0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
04f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0530: 2a 2a 20 54 68 65 20 48 61 73 68 20 45 6e 67 69  ** The Hash Engi
0540: 6e 65 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  ne.*/./*.** Macr
0550: 6f 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  os to determine 
0560: 77 68 65 74 68 65 72 20 74 68 65 20 6d 61 63 68  whether the mach
0570: 69 6e 65 20 69 73 20 62 69 67 20 6f 72 20 6c 69  ine is big or li
0580: 74 74 6c 65 20 65 6e 64 69 61 6e 2c 0a 2a 2a 20  ttle endian,.** 
0590: 61 6e 64 20 77 68 65 74 68 65 72 20 6f 72 20 6e  and whether or n
05a0: 6f 74 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  ot that determin
05b0: 61 74 69 6f 6e 20 69 73 20 72 75 6e 2d 74 69 6d  ation is run-tim
05c0: 65 20 6f 72 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e or compile-tim
05d0: 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 62 65 73  e..**.** For bes
05e0: 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 61  t performance, a
05f0: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
0600: 65 20 74 6f 20 67 75 65 73 73 20 61 74 20 74 68  e to guess at th
0610: 65 20 62 79 74 65 2d 6f 72 64 65 72 0a 2a 2a 20  e byte-order.** 
0620: 75 73 69 6e 67 20 43 2d 70 72 65 70 72 6f 63 65  using C-preproce
0630: 73 73 6f 72 20 6d 61 63 72 6f 73 2e 20 20 49 66  ssor macros.  If
0640: 20 74 68 61 74 20 69 73 20 75 6e 73 75 63 63 65   that is unsucce
0650: 73 73 66 75 6c 2c 20 6f 72 20 69 66 0a 2a 2a 20  ssful, or if.** 
0660: 2d 44 53 48 41 33 5f 42 59 54 45 4f 52 44 45 52  -DSHA3_BYTEORDER
0670: 3d 30 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  =0 is set, then 
0680: 62 79 74 65 2d 6f 72 64 65 72 20 69 73 20 64 65  byte-order is de
0690: 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 61 74 20 72  termined.** at r
06a0: 75 6e 2d 74 69 6d 65 2e 0a 2a 2f 0a 23 69 66 6e  un-time..*/.#ifn
06b0: 64 65 66 20 53 48 41 33 5f 42 59 54 45 4f 52 44  def SHA3_BYTEORD
06c0: 45 52 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28  ER.# if defined(
06d0: 69 33 38 36 29 20 20 20 20 20 7c 7c 20 64 65 66  i386)     || def
06e0: 69 6e 65 64 28 5f 5f 69 33 38 36 5f 5f 29 20 20  ined(__i386__)  
06f0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 4d 5f 49   || defined(_M_I
0700: 58 38 36 29 20 7c 7c 20 20 20 20 5c 0a 20 20 20  X86) ||    \.   
0710: 20 20 64 65 66 69 6e 65 64 28 5f 5f 78 38 36 5f    defined(__x86_
0720: 36 34 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  64) || defined(_
0730: 5f 78 38 36 5f 36 34 5f 5f 29 20 7c 7c 20 64 65  _x86_64__) || de
0740: 66 69 6e 65 64 28 5f 4d 5f 58 36 34 29 20 20 7c  fined(_M_X64)  |
0750: 7c 20 20 20 20 5c 0a 20 20 20 20 20 64 65 66 69  |    \.     defi
0760: 6e 65 64 28 5f 4d 5f 41 4d 44 36 34 29 20 7c 7c  ned(_M_AMD64) ||
0770: 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29   defined(_M_ARM)
0780: 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28       || defined(
0790: 5f 5f 78 38 36 29 20 20 20 7c 7c 20 20 20 20 5c  __x86)   ||    \
07a0: 0a 20 20 20 20 20 64 65 66 69 6e 65 64 28 5f 5f  .     defined(__
07b0: 61 72 6d 5f 5f 29 0a 23 20 20 20 64 65 66 69 6e  arm__).#   defin
07c0: 65 20 53 48 41 33 5f 42 59 54 45 4f 52 44 45 52  e SHA3_BYTEORDER
07d0: 20 20 20 20 31 32 33 34 0a 23 20 65 6c 69 66 20      1234.# elif 
07e0: 64 65 66 69 6e 65 64 28 73 70 61 72 63 29 20 20  defined(sparc)  
07f0: 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 70    || defined(__p
0800: 70 63 5f 5f 29 0a 23 20 20 20 64 65 66 69 6e 65  pc__).#   define
0810: 20 53 48 41 33 5f 42 59 54 45 4f 52 44 45 52 20   SHA3_BYTEORDER 
0820: 20 20 20 34 33 32 31 0a 23 20 65 6c 73 65 0a 23     4321.# else.#
0830: 20 20 20 64 65 66 69 6e 65 20 53 48 41 33 5f 42     define SHA3_B
0840: 59 54 45 4f 52 44 45 52 20 30 0a 23 20 65 6e 64  YTEORDER 0.# end
0850: 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  if.#endif.../*.*
0860: 2a 20 53 74 61 74 65 20 73 74 72 75 63 74 75 72  * State structur
0870: 65 20 66 6f 72 20 61 20 53 48 41 33 20 68 61 73  e for a SHA3 has
0880: 68 20 69 6e 20 70 72 6f 67 72 65 73 73 0a 2a 2f  h in progress.*/
0890: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
08a0: 53 48 41 33 43 6f 6e 74 65 78 74 20 53 48 41 33  SHA3Context SHA3
08b0: 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
08c0: 53 48 41 33 43 6f 6e 74 65 78 74 20 7b 0a 20 20  SHA3Context {.  
08d0: 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20  union {.    u64 
08e0: 73 5b 32 35 5d 3b 20 20 20 20 20 20 20 20 20 20  s[25];          
08f0: 20 20 20 20 20 20 2f 2a 20 4b 65 63 63 61 6b 20        /* Keccak 
0900: 73 74 61 74 65 2e 20 35 78 35 20 6c 69 6e 65 73  state. 5x5 lines
0910: 20 6f 66 20 36 34 20 62 69 74 73 20 65 61 63 68   of 64 bits each
0920: 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
0930: 20 63 68 61 72 20 78 5b 31 36 30 30 5d 3b 20 20   char x[1600];  
0940: 20 20 2f 2a 20 2e 2e 2e 20 6f 72 20 31 36 30 30    /* ... or 1600
0950: 20 62 79 74 65 73 20 2a 2f 0a 20 20 7d 20 75 3b   bytes */.  } u;
0960: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6e 52 61 74  .  unsigned nRat
0970: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74  e;        /* Byt
0980: 65 73 20 6f 66 20 69 6e 70 75 74 20 61 63 63 65  es of input acce
0990: 70 74 65 64 20 70 65 72 20 4b 65 63 63 61 6b 20  pted per Keccak 
09a0: 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  iteration */.  u
09b0: 6e 73 69 67 6e 65 64 20 6e 4c 6f 61 64 65 64 3b  nsigned nLoaded;
09c0: 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 62        /* Input b
09d0: 79 74 65 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  ytes loaded into
09e0: 20 75 2e 78 5b 5d 20 73 6f 20 66 61 72 20 74 68   u.x[] so far th
09f0: 69 73 20 63 79 63 6c 65 20 2a 2f 0a 20 20 75 6e  is cycle */.  un
0a00: 73 69 67 6e 65 64 20 69 78 4d 61 73 6b 3b 20 20  signed ixMask;  
0a10: 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 6e       /* Insert n
0a20: 65 78 74 20 69 6e 70 75 74 20 69 6e 74 6f 20 75  ext input into u
0a30: 2e 78 5b 6e 4c 6f 61 64 65 64 5e 69 78 4d 61 73  .x[nLoaded^ixMas
0a40: 6b 5d 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  k]. */.};../*.**
0a50: 20 41 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   A single step o
0a60: 66 20 74 68 65 20 4b 65 63 63 61 6b 20 6d 69 78  f the Keccak mix
0a70: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ing function for
0a80: 20 61 20 31 36 30 30 2d 62 69 74 20 73 74 61 74   a 1600-bit stat
0a90: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
0aa0: 20 4b 65 63 63 61 6b 46 31 36 30 30 53 74 65 70   KeccakF1600Step
0ab0: 28 53 48 41 33 43 6f 6e 74 65 78 74 20 2a 70 29  (SHA3Context *p)
0ac0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34  {.  int i;.  u64
0ad0: 20 62 30 2c 20 62 31 2c 20 62 32 2c 20 62 33 2c   b0, b1, b2, b3,
0ae0: 20 62 34 3b 0a 20 20 75 36 34 20 63 30 2c 20 63   b4;.  u64 c0, c
0af0: 31 2c 20 63 32 2c 20 63 33 2c 20 63 34 3b 0a 20  1, c2, c3, c4;. 
0b00: 20 75 36 34 20 64 30 2c 20 64 31 2c 20 64 32 2c   u64 d0, d1, d2,
0b10: 20 64 33 2c 20 64 34 3b 0a 20 20 73 74 61 74 69   d3, d4;.  stati
0b20: 63 20 63 6f 6e 73 74 20 75 36 34 20 52 43 5b 5d  c const u64 RC[]
0b30: 20 3d 20 7b 0a 20 20 20 20 30 78 30 30 30 30 30   = {.    0x00000
0b40: 30 30 30 30 30 30 30 30 30 30 31 55 4c 4c 2c 20  00000000001ULL, 
0b50: 20 30 78 30 30 30 30 30 30 30 30 30 30 30 30 38   0x0000000000008
0b60: 30 38 32 55 4c 4c 2c 0a 20 20 20 20 30 78 38 30  082ULL,.    0x80
0b70: 30 30 30 30 30 30 30 30 30 30 38 30 38 61 55 4c  0000000000808aUL
0b80: 4c 2c 20 20 30 78 38 30 30 30 30 30 30 30 38 30  L,  0x8000000080
0b90: 30 30 38 30 30 30 55 4c 4c 2c 0a 20 20 20 20 30  008000ULL,.    0
0ba0: 78 30 30 30 30 30 30 30 30 30 30 30 30 38 30 38  x000000000000808
0bb0: 62 55 4c 4c 2c 20 20 30 78 30 30 30 30 30 30 30  bULL,  0x0000000
0bc0: 30 38 30 30 30 30 30 30 31 55 4c 4c 2c 0a 20 20  080000001ULL,.  
0bd0: 20 20 30 78 38 30 30 30 30 30 30 30 38 30 30 30    0x800000008000
0be0: 38 30 38 31 55 4c 4c 2c 20 20 30 78 38 30 30 30  8081ULL,  0x8000
0bf0: 30 30 30 30 30 30 30 30 38 30 30 39 55 4c 4c 2c  000000008009ULL,
0c00: 0a 20 20 20 20 30 78 30 30 30 30 30 30 30 30 30  .    0x000000000
0c10: 30 30 30 30 30 38 61 55 4c 4c 2c 20 20 30 78 30  000008aULL,  0x0
0c20: 30 30 30 30 30 30 30 30 30 30 30 30 30 38 38 55  000000000000088U
0c30: 4c 4c 2c 0a 20 20 20 20 30 78 30 30 30 30 30 30  LL,.    0x000000
0c40: 30 30 38 30 30 30 38 30 30 39 55 4c 4c 2c 20 20  0080008009ULL,  
0c50: 30 78 30 30 30 30 30 30 30 30 38 30 30 30 30 30  0x00000000800000
0c60: 30 61 55 4c 4c 2c 0a 20 20 20 20 30 78 30 30 30  0aULL,.    0x000
0c70: 30 30 30 30 30 38 30 30 30 38 30 38 62 55 4c 4c  000008000808bULL
0c80: 2c 20 20 30 78 38 30 30 30 30 30 30 30 30 30 30  ,  0x80000000000
0c90: 30 30 30 38 62 55 4c 4c 2c 0a 20 20 20 20 30 78  0008bULL,.    0x
0ca0: 38 30 30 30 30 30 30 30 30 30 30 30 38 30 38 39  8000000000008089
0cb0: 55 4c 4c 2c 20 20 30 78 38 30 30 30 30 30 30 30  ULL,  0x80000000
0cc0: 30 30 30 30 38 30 30 33 55 4c 4c 2c 0a 20 20 20  00008003ULL,.   
0cd0: 20 30 78 38 30 30 30 30 30 30 30 30 30 30 30 38   0x8000000000008
0ce0: 30 30 32 55 4c 4c 2c 20 20 30 78 38 30 30 30 30  002ULL,  0x80000
0cf0: 30 30 30 30 30 30 30 30 30 38 30 55 4c 4c 2c 0a  00000000080ULL,.
0d00: 20 20 20 20 30 78 30 30 30 30 30 30 30 30 30 30      0x0000000000
0d10: 30 30 38 30 30 61 55 4c 4c 2c 20 20 30 78 38 30  00800aULL,  0x80
0d20: 30 30 30 30 30 30 38 30 30 30 30 30 30 61 55 4c  0000008000000aUL
0d30: 4c 2c 0a 20 20 20 20 30 78 38 30 30 30 30 30 30  L,.    0x8000000
0d40: 30 38 30 30 30 38 30 38 31 55 4c 4c 2c 20 20 30  080008081ULL,  0
0d50: 78 38 30 30 30 30 30 30 30 30 30 30 30 38 30 38  x800000000000808
0d60: 30 55 4c 4c 2c 0a 20 20 20 20 30 78 30 30 30 30  0ULL,.    0x0000
0d70: 30 30 30 30 38 30 30 30 30 30 30 31 55 4c 4c 2c  000080000001ULL,
0d80: 20 20 30 78 38 30 30 30 30 30 30 30 38 30 30 30    0x800000008000
0d90: 38 30 30 38 55 4c 4c 0a 20 20 7d 3b 0a 23 20 64  8008ULL.  };.# d
0da0: 65 66 69 6e 65 20 61 30 30 20 28 70 2d 3e 75 2e  efine a00 (p->u.
0db0: 73 5b 30 5d 29 0a 23 20 64 65 66 69 6e 65 20 61  s[0]).# define a
0dc0: 30 31 20 28 70 2d 3e 75 2e 73 5b 31 5d 29 0a 23  01 (p->u.s[1]).#
0dd0: 20 64 65 66 69 6e 65 20 61 30 32 20 28 70 2d 3e   define a02 (p->
0de0: 75 2e 73 5b 32 5d 29 0a 23 20 64 65 66 69 6e 65  u.s[2]).# define
0df0: 20 61 30 33 20 28 70 2d 3e 75 2e 73 5b 33 5d 29   a03 (p->u.s[3])
0e00: 0a 23 20 64 65 66 69 6e 65 20 61 30 34 20 28 70  .# define a04 (p
0e10: 2d 3e 75 2e 73 5b 34 5d 29 0a 23 20 64 65 66 69  ->u.s[4]).# defi
0e20: 6e 65 20 61 31 30 20 28 70 2d 3e 75 2e 73 5b 35  ne a10 (p->u.s[5
0e30: 5d 29 0a 23 20 64 65 66 69 6e 65 20 61 31 31 20  ]).# define a11 
0e40: 28 70 2d 3e 75 2e 73 5b 36 5d 29 0a 23 20 64 65  (p->u.s[6]).# de
0e50: 66 69 6e 65 20 61 31 32 20 28 70 2d 3e 75 2e 73  fine a12 (p->u.s
0e60: 5b 37 5d 29 0a 23 20 64 65 66 69 6e 65 20 61 31  [7]).# define a1
0e70: 33 20 28 70 2d 3e 75 2e 73 5b 38 5d 29 0a 23 20  3 (p->u.s[8]).# 
0e80: 64 65 66 69 6e 65 20 61 31 34 20 28 70 2d 3e 75  define a14 (p->u
0e90: 2e 73 5b 39 5d 29 0a 23 20 64 65 66 69 6e 65 20  .s[9]).# define 
0ea0: 61 32 30 20 28 70 2d 3e 75 2e 73 5b 31 30 5d 29  a20 (p->u.s[10])
0eb0: 0a 23 20 64 65 66 69 6e 65 20 61 32 31 20 28 70  .# define a21 (p
0ec0: 2d 3e 75 2e 73 5b 31 31 5d 29 0a 23 20 64 65 66  ->u.s[11]).# def
0ed0: 69 6e 65 20 61 32 32 20 28 70 2d 3e 75 2e 73 5b  ine a22 (p->u.s[
0ee0: 31 32 5d 29 0a 23 20 64 65 66 69 6e 65 20 61 32  12]).# define a2
0ef0: 33 20 28 70 2d 3e 75 2e 73 5b 31 33 5d 29 0a 23  3 (p->u.s[13]).#
0f00: 20 64 65 66 69 6e 65 20 61 32 34 20 28 70 2d 3e   define a24 (p->
0f10: 75 2e 73 5b 31 34 5d 29 0a 23 20 64 65 66 69 6e  u.s[14]).# defin
0f20: 65 20 61 33 30 20 28 70 2d 3e 75 2e 73 5b 31 35  e a30 (p->u.s[15
0f30: 5d 29 0a 23 20 64 65 66 69 6e 65 20 61 33 31 20  ]).# define a31 
0f40: 28 70 2d 3e 75 2e 73 5b 31 36 5d 29 0a 23 20 64  (p->u.s[16]).# d
0f50: 65 66 69 6e 65 20 61 33 32 20 28 70 2d 3e 75 2e  efine a32 (p->u.
0f60: 73 5b 31 37 5d 29 0a 23 20 64 65 66 69 6e 65 20  s[17]).# define 
0f70: 61 33 33 20 28 70 2d 3e 75 2e 73 5b 31 38 5d 29  a33 (p->u.s[18])
0f80: 0a 23 20 64 65 66 69 6e 65 20 61 33 34 20 28 70  .# define a34 (p
0f90: 2d 3e 75 2e 73 5b 31 39 5d 29 0a 23 20 64 65 66  ->u.s[19]).# def
0fa0: 69 6e 65 20 61 34 30 20 28 70 2d 3e 75 2e 73 5b  ine a40 (p->u.s[
0fb0: 32 30 5d 29 0a 23 20 64 65 66 69 6e 65 20 61 34  20]).# define a4
0fc0: 31 20 28 70 2d 3e 75 2e 73 5b 32 31 5d 29 0a 23  1 (p->u.s[21]).#
0fd0: 20 64 65 66 69 6e 65 20 61 34 32 20 28 70 2d 3e   define a42 (p->
0fe0: 75 2e 73 5b 32 32 5d 29 0a 23 20 64 65 66 69 6e  u.s[22]).# defin
0ff0: 65 20 61 34 33 20 28 70 2d 3e 75 2e 73 5b 32 33  e a43 (p->u.s[23
1000: 5d 29 0a 23 20 64 65 66 69 6e 65 20 61 34 34 20  ]).# define a44 
1010: 28 70 2d 3e 75 2e 73 5b 32 34 5d 29 0a 23 20 64  (p->u.s[24]).# d
1020: 65 66 69 6e 65 20 52 4f 4c 36 34 28 61 2c 78 29  efine ROL64(a,x)
1030: 20 28 28 61 3c 3c 78 29 7c 28 61 3e 3e 28 36 34   ((a<<x)|(a>>(64
1040: 2d 78 29 29 29 0a 0a 20 20 66 6f 72 28 69 3d 30  -x)))..  for(i=0
1050: 3b 20 69 3c 32 34 3b 20 69 2b 3d 34 29 7b 0a 20  ; i<24; i+=4){. 
1060: 20 20 20 63 30 20 3d 20 61 30 30 5e 61 31 30 5e     c0 = a00^a10^
1070: 61 32 30 5e 61 33 30 5e 61 34 30 3b 0a 20 20 20  a20^a30^a40;.   
1080: 20 63 31 20 3d 20 61 30 31 5e 61 31 31 5e 61 32   c1 = a01^a11^a2
1090: 31 5e 61 33 31 5e 61 34 31 3b 0a 20 20 20 20 63  1^a31^a41;.    c
10a0: 32 20 3d 20 61 30 32 5e 61 31 32 5e 61 32 32 5e  2 = a02^a12^a22^
10b0: 61 33 32 5e 61 34 32 3b 0a 20 20 20 20 63 33 20  a32^a42;.    c3 
10c0: 3d 20 61 30 33 5e 61 31 33 5e 61 32 33 5e 61 33  = a03^a13^a23^a3
10d0: 33 5e 61 34 33 3b 0a 20 20 20 20 63 34 20 3d 20  3^a43;.    c4 = 
10e0: 61 30 34 5e 61 31 34 5e 61 32 34 5e 61 33 34 5e  a04^a14^a24^a34^
10f0: 61 34 34 3b 0a 20 20 20 20 64 30 20 3d 20 63 34  a44;.    d0 = c4
1100: 5e 52 4f 4c 36 34 28 63 31 2c 20 31 29 3b 0a 20  ^ROL64(c1, 1);. 
1110: 20 20 20 64 31 20 3d 20 63 30 5e 52 4f 4c 36 34     d1 = c0^ROL64
1120: 28 63 32 2c 20 31 29 3b 0a 20 20 20 20 64 32 20  (c2, 1);.    d2 
1130: 3d 20 63 31 5e 52 4f 4c 36 34 28 63 33 2c 20 31  = c1^ROL64(c3, 1
1140: 29 3b 0a 20 20 20 20 64 33 20 3d 20 63 32 5e 52  );.    d3 = c2^R
1150: 4f 4c 36 34 28 63 34 2c 20 31 29 3b 0a 20 20 20  OL64(c4, 1);.   
1160: 20 64 34 20 3d 20 63 33 5e 52 4f 4c 36 34 28 63   d4 = c3^ROL64(c
1170: 30 2c 20 31 29 3b 0a 0a 20 20 20 20 62 30 20 3d  0, 1);..    b0 =
1180: 20 28 61 30 30 5e 64 30 29 3b 0a 20 20 20 20 62   (a00^d0);.    b
1190: 31 20 3d 20 52 4f 4c 36 34 28 28 61 31 31 5e 64  1 = ROL64((a11^d
11a0: 31 29 2c 20 34 34 29 3b 0a 20 20 20 20 62 32 20  1), 44);.    b2 
11b0: 3d 20 52 4f 4c 36 34 28 28 61 32 32 5e 64 32 29  = ROL64((a22^d2)
11c0: 2c 20 34 33 29 3b 0a 20 20 20 20 62 33 20 3d 20  , 43);.    b3 = 
11d0: 52 4f 4c 36 34 28 28 61 33 33 5e 64 33 29 2c 20  ROL64((a33^d3), 
11e0: 32 31 29 3b 0a 20 20 20 20 62 34 20 3d 20 52 4f  21);.    b4 = RO
11f0: 4c 36 34 28 28 61 34 34 5e 64 34 29 2c 20 31 34  L64((a44^d4), 14
1200: 29 3b 0a 20 20 20 20 61 30 30 20 3d 20 20 20 62  );.    a00 =   b
1210: 30 20 5e 28 28 7e 62 31 29 26 20 20 62 32 20 29  0 ^((~b1)&  b2 )
1220: 3b 0a 20 20 20 20 61 30 30 20 5e 3d 20 52 43 5b  ;.    a00 ^= RC[
1230: 69 5d 3b 0a 20 20 20 20 61 31 31 20 3d 20 20 20  i];.    a11 =   
1240: 62 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33 20  b1 ^((~b2)&  b3 
1250: 29 3b 0a 20 20 20 20 61 32 32 20 3d 20 20 20 62  );.    a22 =   b
1260: 32 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20 29  2 ^((~b3)&  b4 )
1270: 3b 0a 20 20 20 20 61 33 33 20 3d 20 20 20 62 33  ;.    a33 =   b3
1280: 20 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29 3b   ^((~b4)&  b0 );
1290: 0a 20 20 20 20 61 34 34 20 3d 20 20 20 62 34 20  .    a44 =   b4 
12a0: 5e 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b 0a  ^((~b0)&  b1 );.
12b0: 0a 20 20 20 20 62 32 20 3d 20 52 4f 4c 36 34 28  .    b2 = ROL64(
12c0: 28 61 32 30 5e 64 30 29 2c 20 33 29 3b 0a 20 20  (a20^d0), 3);.  
12d0: 20 20 62 33 20 3d 20 52 4f 4c 36 34 28 28 61 33    b3 = ROL64((a3
12e0: 31 5e 64 31 29 2c 20 34 35 29 3b 0a 20 20 20 20  1^d1), 45);.    
12f0: 62 34 20 3d 20 52 4f 4c 36 34 28 28 61 34 32 5e  b4 = ROL64((a42^
1300: 64 32 29 2c 20 36 31 29 3b 0a 20 20 20 20 62 30  d2), 61);.    b0
1310: 20 3d 20 52 4f 4c 36 34 28 28 61 30 33 5e 64 33   = ROL64((a03^d3
1320: 29 2c 20 32 38 29 3b 0a 20 20 20 20 62 31 20 3d  ), 28);.    b1 =
1330: 20 52 4f 4c 36 34 28 28 61 31 34 5e 64 34 29 2c   ROL64((a14^d4),
1340: 20 32 30 29 3b 0a 20 20 20 20 61 32 30 20 3d 20   20);.    a20 = 
1350: 20 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62    b0 ^((~b1)&  b
1360: 32 20 29 3b 0a 20 20 20 20 61 33 31 20 3d 20 20  2 );.    a31 =  
1370: 20 62 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33   b1 ^((~b2)&  b3
1380: 20 29 3b 0a 20 20 20 20 61 34 32 20 3d 20 20 20   );.    a42 =   
1390: 62 32 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20  b2 ^((~b3)&  b4 
13a0: 29 3b 0a 20 20 20 20 61 30 33 20 3d 20 20 20 62  );.    a03 =   b
13b0: 33 20 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29  3 ^((~b4)&  b0 )
13c0: 3b 0a 20 20 20 20 61 31 34 20 3d 20 20 20 62 34  ;.    a14 =   b4
13d0: 20 5e 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b   ^((~b0)&  b1 );
13e0: 0a 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34  ..    b4 = ROL64
13f0: 28 28 61 34 30 5e 64 30 29 2c 20 31 38 29 3b 0a  ((a40^d0), 18);.
1400: 20 20 20 20 62 30 20 3d 20 52 4f 4c 36 34 28 28      b0 = ROL64((
1410: 61 30 31 5e 64 31 29 2c 20 31 29 3b 0a 20 20 20  a01^d1), 1);.   
1420: 20 62 31 20 3d 20 52 4f 4c 36 34 28 28 61 31 32   b1 = ROL64((a12
1430: 5e 64 32 29 2c 20 36 29 3b 0a 20 20 20 20 62 32  ^d2), 6);.    b2
1440: 20 3d 20 52 4f 4c 36 34 28 28 61 32 33 5e 64 33   = ROL64((a23^d3
1450: 29 2c 20 32 35 29 3b 0a 20 20 20 20 62 33 20 3d  ), 25);.    b3 =
1460: 20 52 4f 4c 36 34 28 28 61 33 34 5e 64 34 29 2c   ROL64((a34^d4),
1470: 20 38 29 3b 0a 20 20 20 20 61 34 30 20 3d 20 20   8);.    a40 =  
1480: 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62 32   b0 ^((~b1)&  b2
1490: 20 29 3b 0a 20 20 20 20 61 30 31 20 3d 20 20 20   );.    a01 =   
14a0: 62 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33 20  b1 ^((~b2)&  b3 
14b0: 29 3b 0a 20 20 20 20 61 31 32 20 3d 20 20 20 62  );.    a12 =   b
14c0: 32 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20 29  2 ^((~b3)&  b4 )
14d0: 3b 0a 20 20 20 20 61 32 33 20 3d 20 20 20 62 33  ;.    a23 =   b3
14e0: 20 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29 3b   ^((~b4)&  b0 );
14f0: 0a 20 20 20 20 61 33 34 20 3d 20 20 20 62 34 20  .    a34 =   b4 
1500: 5e 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b 0a  ^((~b0)&  b1 );.
1510: 0a 20 20 20 20 62 31 20 3d 20 52 4f 4c 36 34 28  .    b1 = ROL64(
1520: 28 61 31 30 5e 64 30 29 2c 20 33 36 29 3b 0a 20  (a10^d0), 36);. 
1530: 20 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28 61     b2 = ROL64((a
1540: 32 31 5e 64 31 29 2c 20 31 30 29 3b 0a 20 20 20  21^d1), 10);.   
1550: 20 62 33 20 3d 20 52 4f 4c 36 34 28 28 61 33 32   b3 = ROL64((a32
1560: 5e 64 32 29 2c 20 31 35 29 3b 0a 20 20 20 20 62  ^d2), 15);.    b
1570: 34 20 3d 20 52 4f 4c 36 34 28 28 61 34 33 5e 64  4 = ROL64((a43^d
1580: 33 29 2c 20 35 36 29 3b 0a 20 20 20 20 62 30 20  3), 56);.    b0 
1590: 3d 20 52 4f 4c 36 34 28 28 61 30 34 5e 64 34 29  = ROL64((a04^d4)
15a0: 2c 20 32 37 29 3b 0a 20 20 20 20 61 31 30 20 3d  , 27);.    a10 =
15b0: 20 20 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20     b0 ^((~b1)&  
15c0: 62 32 20 29 3b 0a 20 20 20 20 61 32 31 20 3d 20  b2 );.    a21 = 
15d0: 20 20 62 31 20 5e 28 28 7e 62 32 29 26 20 20 62    b1 ^((~b2)&  b
15e0: 33 20 29 3b 0a 20 20 20 20 61 33 32 20 3d 20 20  3 );.    a32 =  
15f0: 20 62 32 20 5e 28 28 7e 62 33 29 26 20 20 62 34   b2 ^((~b3)&  b4
1600: 20 29 3b 0a 20 20 20 20 61 34 33 20 3d 20 20 20   );.    a43 =   
1610: 62 33 20 5e 28 28 7e 62 34 29 26 20 20 62 30 20  b3 ^((~b4)&  b0 
1620: 29 3b 0a 20 20 20 20 61 30 34 20 3d 20 20 20 62  );.    a04 =   b
1630: 34 20 5e 28 28 7e 62 30 29 26 20 20 62 31 20 29  4 ^((~b0)&  b1 )
1640: 3b 0a 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c 36  ;..    b3 = ROL6
1650: 34 28 28 61 33 30 5e 64 30 29 2c 20 34 31 29 3b  4((a30^d0), 41);
1660: 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34 28  .    b4 = ROL64(
1670: 28 61 34 31 5e 64 31 29 2c 20 32 29 3b 0a 20 20  (a41^d1), 2);.  
1680: 20 20 62 30 20 3d 20 52 4f 4c 36 34 28 28 61 30    b0 = ROL64((a0
1690: 32 5e 64 32 29 2c 20 36 32 29 3b 0a 20 20 20 20  2^d2), 62);.    
16a0: 62 31 20 3d 20 52 4f 4c 36 34 28 28 61 31 33 5e  b1 = ROL64((a13^
16b0: 64 33 29 2c 20 35 35 29 3b 0a 20 20 20 20 62 32  d3), 55);.    b2
16c0: 20 3d 20 52 4f 4c 36 34 28 28 61 32 34 5e 64 34   = ROL64((a24^d4
16d0: 29 2c 20 33 39 29 3b 0a 20 20 20 20 61 33 30 20  ), 39);.    a30 
16e0: 3d 20 20 20 62 30 20 5e 28 28 7e 62 31 29 26 20  =   b0 ^((~b1)& 
16f0: 20 62 32 20 29 3b 0a 20 20 20 20 61 34 31 20 3d   b2 );.    a41 =
1700: 20 20 20 62 31 20 5e 28 28 7e 62 32 29 26 20 20     b1 ^((~b2)&  
1710: 62 33 20 29 3b 0a 20 20 20 20 61 30 32 20 3d 20  b3 );.    a02 = 
1720: 20 20 62 32 20 5e 28 28 7e 62 33 29 26 20 20 62    b2 ^((~b3)&  b
1730: 34 20 29 3b 0a 20 20 20 20 61 31 33 20 3d 20 20  4 );.    a13 =  
1740: 20 62 33 20 5e 28 28 7e 62 34 29 26 20 20 62 30   b3 ^((~b4)&  b0
1750: 20 29 3b 0a 20 20 20 20 61 32 34 20 3d 20 20 20   );.    a24 =   
1760: 62 34 20 5e 28 28 7e 62 30 29 26 20 20 62 31 20  b4 ^((~b0)&  b1 
1770: 29 3b 0a 0a 20 20 20 20 63 30 20 3d 20 61 30 30  );..    c0 = a00
1780: 5e 61 32 30 5e 61 34 30 5e 61 31 30 5e 61 33 30  ^a20^a40^a10^a30
1790: 3b 0a 20 20 20 20 63 31 20 3d 20 61 31 31 5e 61  ;.    c1 = a11^a
17a0: 33 31 5e 61 30 31 5e 61 32 31 5e 61 34 31 3b 0a  31^a01^a21^a41;.
17b0: 20 20 20 20 63 32 20 3d 20 61 32 32 5e 61 34 32      c2 = a22^a42
17c0: 5e 61 31 32 5e 61 33 32 5e 61 30 32 3b 0a 20 20  ^a12^a32^a02;.  
17d0: 20 20 63 33 20 3d 20 61 33 33 5e 61 30 33 5e 61    c3 = a33^a03^a
17e0: 32 33 5e 61 34 33 5e 61 31 33 3b 0a 20 20 20 20  23^a43^a13;.    
17f0: 63 34 20 3d 20 61 34 34 5e 61 31 34 5e 61 33 34  c4 = a44^a14^a34
1800: 5e 61 30 34 5e 61 32 34 3b 0a 20 20 20 20 64 30  ^a04^a24;.    d0
1810: 20 3d 20 63 34 5e 52 4f 4c 36 34 28 63 31 2c 20   = c4^ROL64(c1, 
1820: 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 63 30 5e  1);.    d1 = c0^
1830: 52 4f 4c 36 34 28 63 32 2c 20 31 29 3b 0a 20 20  ROL64(c2, 1);.  
1840: 20 20 64 32 20 3d 20 63 31 5e 52 4f 4c 36 34 28    d2 = c1^ROL64(
1850: 63 33 2c 20 31 29 3b 0a 20 20 20 20 64 33 20 3d  c3, 1);.    d3 =
1860: 20 63 32 5e 52 4f 4c 36 34 28 63 34 2c 20 31 29   c2^ROL64(c4, 1)
1870: 3b 0a 20 20 20 20 64 34 20 3d 20 63 33 5e 52 4f  ;.    d4 = c3^RO
1880: 4c 36 34 28 63 30 2c 20 31 29 3b 0a 0a 20 20 20  L64(c0, 1);..   
1890: 20 62 30 20 3d 20 28 61 30 30 5e 64 30 29 3b 0a   b0 = (a00^d0);.
18a0: 20 20 20 20 62 31 20 3d 20 52 4f 4c 36 34 28 28      b1 = ROL64((
18b0: 61 33 31 5e 64 31 29 2c 20 34 34 29 3b 0a 20 20  a31^d1), 44);.  
18c0: 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28 61 31    b2 = ROL64((a1
18d0: 32 5e 64 32 29 2c 20 34 33 29 3b 0a 20 20 20 20  2^d2), 43);.    
18e0: 62 33 20 3d 20 52 4f 4c 36 34 28 28 61 34 33 5e  b3 = ROL64((a43^
18f0: 64 33 29 2c 20 32 31 29 3b 0a 20 20 20 20 62 34  d3), 21);.    b4
1900: 20 3d 20 52 4f 4c 36 34 28 28 61 32 34 5e 64 34   = ROL64((a24^d4
1910: 29 2c 20 31 34 29 3b 0a 20 20 20 20 61 30 30 20  ), 14);.    a00 
1920: 3d 20 20 20 62 30 20 5e 28 28 7e 62 31 29 26 20  =   b0 ^((~b1)& 
1930: 20 62 32 20 29 3b 0a 20 20 20 20 61 30 30 20 5e   b2 );.    a00 ^
1940: 3d 20 52 43 5b 69 2b 31 5d 3b 0a 20 20 20 20 61  = RC[i+1];.    a
1950: 33 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62 32  31 =   b1 ^((~b2
1960: 29 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61 31  )&  b3 );.    a1
1970: 32 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33 29  2 =   b2 ^((~b3)
1980: 26 20 20 62 34 20 29 3b 0a 20 20 20 20 61 34 33  &  b4 );.    a43
1990: 20 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29 26   =   b3 ^((~b4)&
19a0: 20 20 62 30 20 29 3b 0a 20 20 20 20 61 32 34 20    b0 );.    a24 
19b0: 3d 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26 20  =   b4 ^((~b0)& 
19c0: 20 62 31 20 29 3b 0a 0a 20 20 20 20 62 32 20 3d   b1 );..    b2 =
19d0: 20 52 4f 4c 36 34 28 28 61 34 30 5e 64 30 29 2c   ROL64((a40^d0),
19e0: 20 33 29 3b 0a 20 20 20 20 62 33 20 3d 20 52 4f   3);.    b3 = RO
19f0: 4c 36 34 28 28 61 32 31 5e 64 31 29 2c 20 34 35  L64((a21^d1), 45
1a00: 29 3b 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c 36  );.    b4 = ROL6
1a10: 34 28 28 61 30 32 5e 64 32 29 2c 20 36 31 29 3b  4((a02^d2), 61);
1a20: 0a 20 20 20 20 62 30 20 3d 20 52 4f 4c 36 34 28  .    b0 = ROL64(
1a30: 28 61 33 33 5e 64 33 29 2c 20 32 38 29 3b 0a 20  (a33^d3), 28);. 
1a40: 20 20 20 62 31 20 3d 20 52 4f 4c 36 34 28 28 61     b1 = ROL64((a
1a50: 31 34 5e 64 34 29 2c 20 32 30 29 3b 0a 20 20 20  14^d4), 20);.   
1a60: 20 61 34 30 20 3d 20 20 20 62 30 20 5e 28 28 7e   a40 =   b0 ^((~
1a70: 62 31 29 26 20 20 62 32 20 29 3b 0a 20 20 20 20  b1)&  b2 );.    
1a80: 61 32 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62  a21 =   b1 ^((~b
1a90: 32 29 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61  2)&  b3 );.    a
1aa0: 30 32 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33  02 =   b2 ^((~b3
1ab0: 29 26 20 20 62 34 20 29 3b 0a 20 20 20 20 61 33  )&  b4 );.    a3
1ac0: 33 20 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29  3 =   b3 ^((~b4)
1ad0: 26 20 20 62 30 20 29 3b 0a 20 20 20 20 61 31 34  &  b0 );.    a14
1ae0: 20 3d 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26   =   b4 ^((~b0)&
1af0: 20 20 62 31 20 29 3b 0a 0a 20 20 20 20 62 34 20    b1 );..    b4 
1b00: 3d 20 52 4f 4c 36 34 28 28 61 33 30 5e 64 30 29  = ROL64((a30^d0)
1b10: 2c 20 31 38 29 3b 0a 20 20 20 20 62 30 20 3d 20  , 18);.    b0 = 
1b20: 52 4f 4c 36 34 28 28 61 31 31 5e 64 31 29 2c 20  ROL64((a11^d1), 
1b30: 31 29 3b 0a 20 20 20 20 62 31 20 3d 20 52 4f 4c  1);.    b1 = ROL
1b40: 36 34 28 28 61 34 32 5e 64 32 29 2c 20 36 29 3b  64((a42^d2), 6);
1b50: 0a 20 20 20 20 62 32 20 3d 20 52 4f 4c 36 34 28  .    b2 = ROL64(
1b60: 28 61 32 33 5e 64 33 29 2c 20 32 35 29 3b 0a 20  (a23^d3), 25);. 
1b70: 20 20 20 62 33 20 3d 20 52 4f 4c 36 34 28 28 61     b3 = ROL64((a
1b80: 30 34 5e 64 34 29 2c 20 38 29 3b 0a 20 20 20 20  04^d4), 8);.    
1b90: 61 33 30 20 3d 20 20 20 62 30 20 5e 28 28 7e 62  a30 =   b0 ^((~b
1ba0: 31 29 26 20 20 62 32 20 29 3b 0a 20 20 20 20 61  1)&  b2 );.    a
1bb0: 31 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62 32  11 =   b1 ^((~b2
1bc0: 29 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61 34  )&  b3 );.    a4
1bd0: 32 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33 29  2 =   b2 ^((~b3)
1be0: 26 20 20 62 34 20 29 3b 0a 20 20 20 20 61 32 33  &  b4 );.    a23
1bf0: 20 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29 26   =   b3 ^((~b4)&
1c00: 20 20 62 30 20 29 3b 0a 20 20 20 20 61 30 34 20    b0 );.    a04 
1c10: 3d 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26 20  =   b4 ^((~b0)& 
1c20: 20 62 31 20 29 3b 0a 0a 20 20 20 20 62 31 20 3d   b1 );..    b1 =
1c30: 20 52 4f 4c 36 34 28 28 61 32 30 5e 64 30 29 2c   ROL64((a20^d0),
1c40: 20 33 36 29 3b 0a 20 20 20 20 62 32 20 3d 20 52   36);.    b2 = R
1c50: 4f 4c 36 34 28 28 61 30 31 5e 64 31 29 2c 20 31  OL64((a01^d1), 1
1c60: 30 29 3b 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c  0);.    b3 = ROL
1c70: 36 34 28 28 61 33 32 5e 64 32 29 2c 20 31 35 29  64((a32^d2), 15)
1c80: 3b 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34  ;.    b4 = ROL64
1c90: 28 28 61 31 33 5e 64 33 29 2c 20 35 36 29 3b 0a  ((a13^d3), 56);.
1ca0: 20 20 20 20 62 30 20 3d 20 52 4f 4c 36 34 28 28      b0 = ROL64((
1cb0: 61 34 34 5e 64 34 29 2c 20 32 37 29 3b 0a 20 20  a44^d4), 27);.  
1cc0: 20 20 61 32 30 20 3d 20 20 20 62 30 20 5e 28 28    a20 =   b0 ^((
1cd0: 7e 62 31 29 26 20 20 62 32 20 29 3b 0a 20 20 20  ~b1)&  b2 );.   
1ce0: 20 61 30 31 20 3d 20 20 20 62 31 20 5e 28 28 7e   a01 =   b1 ^((~
1cf0: 62 32 29 26 20 20 62 33 20 29 3b 0a 20 20 20 20  b2)&  b3 );.    
1d00: 61 33 32 20 3d 20 20 20 62 32 20 5e 28 28 7e 62  a32 =   b2 ^((~b
1d10: 33 29 26 20 20 62 34 20 29 3b 0a 20 20 20 20 61  3)&  b4 );.    a
1d20: 31 33 20 3d 20 20 20 62 33 20 5e 28 28 7e 62 34  13 =   b3 ^((~b4
1d30: 29 26 20 20 62 30 20 29 3b 0a 20 20 20 20 61 34  )&  b0 );.    a4
1d40: 34 20 3d 20 20 20 62 34 20 5e 28 28 7e 62 30 29  4 =   b4 ^((~b0)
1d50: 26 20 20 62 31 20 29 3b 0a 0a 20 20 20 20 62 33  &  b1 );..    b3
1d60: 20 3d 20 52 4f 4c 36 34 28 28 61 31 30 5e 64 30   = ROL64((a10^d0
1d70: 29 2c 20 34 31 29 3b 0a 20 20 20 20 62 34 20 3d  ), 41);.    b4 =
1d80: 20 52 4f 4c 36 34 28 28 61 34 31 5e 64 31 29 2c   ROL64((a41^d1),
1d90: 20 32 29 3b 0a 20 20 20 20 62 30 20 3d 20 52 4f   2);.    b0 = RO
1da0: 4c 36 34 28 28 61 32 32 5e 64 32 29 2c 20 36 32  L64((a22^d2), 62
1db0: 29 3b 0a 20 20 20 20 62 31 20 3d 20 52 4f 4c 36  );.    b1 = ROL6
1dc0: 34 28 28 61 30 33 5e 64 33 29 2c 20 35 35 29 3b  4((a03^d3), 55);
1dd0: 0a 20 20 20 20 62 32 20 3d 20 52 4f 4c 36 34 28  .    b2 = ROL64(
1de0: 28 61 33 34 5e 64 34 29 2c 20 33 39 29 3b 0a 20  (a34^d4), 39);. 
1df0: 20 20 20 61 31 30 20 3d 20 20 20 62 30 20 5e 28     a10 =   b0 ^(
1e00: 28 7e 62 31 29 26 20 20 62 32 20 29 3b 0a 20 20  (~b1)&  b2 );.  
1e10: 20 20 61 34 31 20 3d 20 20 20 62 31 20 5e 28 28    a41 =   b1 ^((
1e20: 7e 62 32 29 26 20 20 62 33 20 29 3b 0a 20 20 20  ~b2)&  b3 );.   
1e30: 20 61 32 32 20 3d 20 20 20 62 32 20 5e 28 28 7e   a22 =   b2 ^((~
1e40: 62 33 29 26 20 20 62 34 20 29 3b 0a 20 20 20 20  b3)&  b4 );.    
1e50: 61 30 33 20 3d 20 20 20 62 33 20 5e 28 28 7e 62  a03 =   b3 ^((~b
1e60: 34 29 26 20 20 62 30 20 29 3b 0a 20 20 20 20 61  4)&  b0 );.    a
1e70: 33 34 20 3d 20 20 20 62 34 20 5e 28 28 7e 62 30  34 =   b4 ^((~b0
1e80: 29 26 20 20 62 31 20 29 3b 0a 0a 20 20 20 20 63  )&  b1 );..    c
1e90: 30 20 3d 20 61 30 30 5e 61 34 30 5e 61 33 30 5e  0 = a00^a40^a30^
1ea0: 61 32 30 5e 61 31 30 3b 0a 20 20 20 20 63 31 20  a20^a10;.    c1 
1eb0: 3d 20 61 33 31 5e 61 32 31 5e 61 31 31 5e 61 30  = a31^a21^a11^a0
1ec0: 31 5e 61 34 31 3b 0a 20 20 20 20 63 32 20 3d 20  1^a41;.    c2 = 
1ed0: 61 31 32 5e 61 30 32 5e 61 34 32 5e 61 33 32 5e  a12^a02^a42^a32^
1ee0: 61 32 32 3b 0a 20 20 20 20 63 33 20 3d 20 61 34  a22;.    c3 = a4
1ef0: 33 5e 61 33 33 5e 61 32 33 5e 61 31 33 5e 61 30  3^a33^a23^a13^a0
1f00: 33 3b 0a 20 20 20 20 63 34 20 3d 20 61 32 34 5e  3;.    c4 = a24^
1f10: 61 31 34 5e 61 30 34 5e 61 34 34 5e 61 33 34 3b  a14^a04^a44^a34;
1f20: 0a 20 20 20 20 64 30 20 3d 20 63 34 5e 52 4f 4c  .    d0 = c4^ROL
1f30: 36 34 28 63 31 2c 20 31 29 3b 0a 20 20 20 20 64  64(c1, 1);.    d
1f40: 31 20 3d 20 63 30 5e 52 4f 4c 36 34 28 63 32 2c  1 = c0^ROL64(c2,
1f50: 20 31 29 3b 0a 20 20 20 20 64 32 20 3d 20 63 31   1);.    d2 = c1
1f60: 5e 52 4f 4c 36 34 28 63 33 2c 20 31 29 3b 0a 20  ^ROL64(c3, 1);. 
1f70: 20 20 20 64 33 20 3d 20 63 32 5e 52 4f 4c 36 34     d3 = c2^ROL64
1f80: 28 63 34 2c 20 31 29 3b 0a 20 20 20 20 64 34 20  (c4, 1);.    d4 
1f90: 3d 20 63 33 5e 52 4f 4c 36 34 28 63 30 2c 20 31  = c3^ROL64(c0, 1
1fa0: 29 3b 0a 0a 20 20 20 20 62 30 20 3d 20 28 61 30  );..    b0 = (a0
1fb0: 30 5e 64 30 29 3b 0a 20 20 20 20 62 31 20 3d 20  0^d0);.    b1 = 
1fc0: 52 4f 4c 36 34 28 28 61 32 31 5e 64 31 29 2c 20  ROL64((a21^d1), 
1fd0: 34 34 29 3b 0a 20 20 20 20 62 32 20 3d 20 52 4f  44);.    b2 = RO
1fe0: 4c 36 34 28 28 61 34 32 5e 64 32 29 2c 20 34 33  L64((a42^d2), 43
1ff0: 29 3b 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c 36  );.    b3 = ROL6
2000: 34 28 28 61 31 33 5e 64 33 29 2c 20 32 31 29 3b  4((a13^d3), 21);
2010: 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34 28  .    b4 = ROL64(
2020: 28 61 33 34 5e 64 34 29 2c 20 31 34 29 3b 0a 20  (a34^d4), 14);. 
2030: 20 20 20 61 30 30 20 3d 20 20 20 62 30 20 5e 28     a00 =   b0 ^(
2040: 28 7e 62 31 29 26 20 20 62 32 20 29 3b 0a 20 20  (~b1)&  b2 );.  
2050: 20 20 61 30 30 20 5e 3d 20 52 43 5b 69 2b 32 5d    a00 ^= RC[i+2]
2060: 3b 0a 20 20 20 20 61 32 31 20 3d 20 20 20 62 31  ;.    a21 =   b1
2070: 20 5e 28 28 7e 62 32 29 26 20 20 62 33 20 29 3b   ^((~b2)&  b3 );
2080: 0a 20 20 20 20 61 34 32 20 3d 20 20 20 62 32 20  .    a42 =   b2 
2090: 5e 28 28 7e 62 33 29 26 20 20 62 34 20 29 3b 0a  ^((~b3)&  b4 );.
20a0: 20 20 20 20 61 31 33 20 3d 20 20 20 62 33 20 5e      a13 =   b3 ^
20b0: 28 28 7e 62 34 29 26 20 20 62 30 20 29 3b 0a 20  ((~b4)&  b0 );. 
20c0: 20 20 20 61 33 34 20 3d 20 20 20 62 34 20 5e 28     a34 =   b4 ^(
20d0: 28 7e 62 30 29 26 20 20 62 31 20 29 3b 0a 0a 20  (~b0)&  b1 );.. 
20e0: 20 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28 61     b2 = ROL64((a
20f0: 33 30 5e 64 30 29 2c 20 33 29 3b 0a 20 20 20 20  30^d0), 3);.    
2100: 62 33 20 3d 20 52 4f 4c 36 34 28 28 61 30 31 5e  b3 = ROL64((a01^
2110: 64 31 29 2c 20 34 35 29 3b 0a 20 20 20 20 62 34  d1), 45);.    b4
2120: 20 3d 20 52 4f 4c 36 34 28 28 61 32 32 5e 64 32   = ROL64((a22^d2
2130: 29 2c 20 36 31 29 3b 0a 20 20 20 20 62 30 20 3d  ), 61);.    b0 =
2140: 20 52 4f 4c 36 34 28 28 61 34 33 5e 64 33 29 2c   ROL64((a43^d3),
2150: 20 32 38 29 3b 0a 20 20 20 20 62 31 20 3d 20 52   28);.    b1 = R
2160: 4f 4c 36 34 28 28 61 31 34 5e 64 34 29 2c 20 32  OL64((a14^d4), 2
2170: 30 29 3b 0a 20 20 20 20 61 33 30 20 3d 20 20 20  0);.    a30 =   
2180: 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62 32 20  b0 ^((~b1)&  b2 
2190: 29 3b 0a 20 20 20 20 61 30 31 20 3d 20 20 20 62  );.    a01 =   b
21a0: 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33 20 29  1 ^((~b2)&  b3 )
21b0: 3b 0a 20 20 20 20 61 32 32 20 3d 20 20 20 62 32  ;.    a22 =   b2
21c0: 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20 29 3b   ^((~b3)&  b4 );
21d0: 0a 20 20 20 20 61 34 33 20 3d 20 20 20 62 33 20  .    a43 =   b3 
21e0: 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29 3b 0a  ^((~b4)&  b0 );.
21f0: 20 20 20 20 61 31 34 20 3d 20 20 20 62 34 20 5e      a14 =   b4 ^
2200: 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b 0a 0a  ((~b0)&  b1 );..
2210: 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34 28 28      b4 = ROL64((
2220: 61 31 30 5e 64 30 29 2c 20 31 38 29 3b 0a 20 20  a10^d0), 18);.  
2230: 20 20 62 30 20 3d 20 52 4f 4c 36 34 28 28 61 33    b0 = ROL64((a3
2240: 31 5e 64 31 29 2c 20 31 29 3b 0a 20 20 20 20 62  1^d1), 1);.    b
2250: 31 20 3d 20 52 4f 4c 36 34 28 28 61 30 32 5e 64  1 = ROL64((a02^d
2260: 32 29 2c 20 36 29 3b 0a 20 20 20 20 62 32 20 3d  2), 6);.    b2 =
2270: 20 52 4f 4c 36 34 28 28 61 32 33 5e 64 33 29 2c   ROL64((a23^d3),
2280: 20 32 35 29 3b 0a 20 20 20 20 62 33 20 3d 20 52   25);.    b3 = R
2290: 4f 4c 36 34 28 28 61 34 34 5e 64 34 29 2c 20 38  OL64((a44^d4), 8
22a0: 29 3b 0a 20 20 20 20 61 31 30 20 3d 20 20 20 62  );.    a10 =   b
22b0: 30 20 5e 28 28 7e 62 31 29 26 20 20 62 32 20 29  0 ^((~b1)&  b2 )
22c0: 3b 0a 20 20 20 20 61 33 31 20 3d 20 20 20 62 31  ;.    a31 =   b1
22d0: 20 5e 28 28 7e 62 32 29 26 20 20 62 33 20 29 3b   ^((~b2)&  b3 );
22e0: 0a 20 20 20 20 61 30 32 20 3d 20 20 20 62 32 20  .    a02 =   b2 
22f0: 5e 28 28 7e 62 33 29 26 20 20 62 34 20 29 3b 0a  ^((~b3)&  b4 );.
2300: 20 20 20 20 61 32 33 20 3d 20 20 20 62 33 20 5e      a23 =   b3 ^
2310: 28 28 7e 62 34 29 26 20 20 62 30 20 29 3b 0a 20  ((~b4)&  b0 );. 
2320: 20 20 20 61 34 34 20 3d 20 20 20 62 34 20 5e 28     a44 =   b4 ^(
2330: 28 7e 62 30 29 26 20 20 62 31 20 29 3b 0a 0a 20  (~b0)&  b1 );.. 
2340: 20 20 20 62 31 20 3d 20 52 4f 4c 36 34 28 28 61     b1 = ROL64((a
2350: 34 30 5e 64 30 29 2c 20 33 36 29 3b 0a 20 20 20  40^d0), 36);.   
2360: 20 62 32 20 3d 20 52 4f 4c 36 34 28 28 61 31 31   b2 = ROL64((a11
2370: 5e 64 31 29 2c 20 31 30 29 3b 0a 20 20 20 20 62  ^d1), 10);.    b
2380: 33 20 3d 20 52 4f 4c 36 34 28 28 61 33 32 5e 64  3 = ROL64((a32^d
2390: 32 29 2c 20 31 35 29 3b 0a 20 20 20 20 62 34 20  2), 15);.    b4 
23a0: 3d 20 52 4f 4c 36 34 28 28 61 30 33 5e 64 33 29  = ROL64((a03^d3)
23b0: 2c 20 35 36 29 3b 0a 20 20 20 20 62 30 20 3d 20  , 56);.    b0 = 
23c0: 52 4f 4c 36 34 28 28 61 32 34 5e 64 34 29 2c 20  ROL64((a24^d4), 
23d0: 32 37 29 3b 0a 20 20 20 20 61 34 30 20 3d 20 20  27);.    a40 =  
23e0: 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62 32   b0 ^((~b1)&  b2
23f0: 20 29 3b 0a 20 20 20 20 61 31 31 20 3d 20 20 20   );.    a11 =   
2400: 62 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33 20  b1 ^((~b2)&  b3 
2410: 29 3b 0a 20 20 20 20 61 33 32 20 3d 20 20 20 62  );.    a32 =   b
2420: 32 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20 29  2 ^((~b3)&  b4 )
2430: 3b 0a 20 20 20 20 61 30 33 20 3d 20 20 20 62 33  ;.    a03 =   b3
2440: 20 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29 3b   ^((~b4)&  b0 );
2450: 0a 20 20 20 20 61 32 34 20 3d 20 20 20 62 34 20  .    a24 =   b4 
2460: 5e 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b 0a  ^((~b0)&  b1 );.
2470: 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c 36 34 28  .    b3 = ROL64(
2480: 28 61 32 30 5e 64 30 29 2c 20 34 31 29 3b 0a 20  (a20^d0), 41);. 
2490: 20 20 20 62 34 20 3d 20 52 4f 4c 36 34 28 28 61     b4 = ROL64((a
24a0: 34 31 5e 64 31 29 2c 20 32 29 3b 0a 20 20 20 20  41^d1), 2);.    
24b0: 62 30 20 3d 20 52 4f 4c 36 34 28 28 61 31 32 5e  b0 = ROL64((a12^
24c0: 64 32 29 2c 20 36 32 29 3b 0a 20 20 20 20 62 31  d2), 62);.    b1
24d0: 20 3d 20 52 4f 4c 36 34 28 28 61 33 33 5e 64 33   = ROL64((a33^d3
24e0: 29 2c 20 35 35 29 3b 0a 20 20 20 20 62 32 20 3d  ), 55);.    b2 =
24f0: 20 52 4f 4c 36 34 28 28 61 30 34 5e 64 34 29 2c   ROL64((a04^d4),
2500: 20 33 39 29 3b 0a 20 20 20 20 61 32 30 20 3d 20   39);.    a20 = 
2510: 20 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62    b0 ^((~b1)&  b
2520: 32 20 29 3b 0a 20 20 20 20 61 34 31 20 3d 20 20  2 );.    a41 =  
2530: 20 62 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33   b1 ^((~b2)&  b3
2540: 20 29 3b 0a 20 20 20 20 61 31 32 20 3d 20 20 20   );.    a12 =   
2550: 62 32 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20  b2 ^((~b3)&  b4 
2560: 29 3b 0a 20 20 20 20 61 33 33 20 3d 20 20 20 62  );.    a33 =   b
2570: 33 20 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29  3 ^((~b4)&  b0 )
2580: 3b 0a 20 20 20 20 61 30 34 20 3d 20 20 20 62 34  ;.    a04 =   b4
2590: 20 5e 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b   ^((~b0)&  b1 );
25a0: 0a 0a 20 20 20 20 63 30 20 3d 20 61 30 30 5e 61  ..    c0 = a00^a
25b0: 33 30 5e 61 31 30 5e 61 34 30 5e 61 32 30 3b 0a  30^a10^a40^a20;.
25c0: 20 20 20 20 63 31 20 3d 20 61 32 31 5e 61 30 31      c1 = a21^a01
25d0: 5e 61 33 31 5e 61 31 31 5e 61 34 31 3b 0a 20 20  ^a31^a11^a41;.  
25e0: 20 20 63 32 20 3d 20 61 34 32 5e 61 32 32 5e 61    c2 = a42^a22^a
25f0: 30 32 5e 61 33 32 5e 61 31 32 3b 0a 20 20 20 20  02^a32^a12;.    
2600: 63 33 20 3d 20 61 31 33 5e 61 34 33 5e 61 32 33  c3 = a13^a43^a23
2610: 5e 61 30 33 5e 61 33 33 3b 0a 20 20 20 20 63 34  ^a03^a33;.    c4
2620: 20 3d 20 61 33 34 5e 61 31 34 5e 61 34 34 5e 61   = a34^a14^a44^a
2630: 32 34 5e 61 30 34 3b 0a 20 20 20 20 64 30 20 3d  24^a04;.    d0 =
2640: 20 63 34 5e 52 4f 4c 36 34 28 63 31 2c 20 31 29   c4^ROL64(c1, 1)
2650: 3b 0a 20 20 20 20 64 31 20 3d 20 63 30 5e 52 4f  ;.    d1 = c0^RO
2660: 4c 36 34 28 63 32 2c 20 31 29 3b 0a 20 20 20 20  L64(c2, 1);.    
2670: 64 32 20 3d 20 63 31 5e 52 4f 4c 36 34 28 63 33  d2 = c1^ROL64(c3
2680: 2c 20 31 29 3b 0a 20 20 20 20 64 33 20 3d 20 63  , 1);.    d3 = c
2690: 32 5e 52 4f 4c 36 34 28 63 34 2c 20 31 29 3b 0a  2^ROL64(c4, 1);.
26a0: 20 20 20 20 64 34 20 3d 20 63 33 5e 52 4f 4c 36      d4 = c3^ROL6
26b0: 34 28 63 30 2c 20 31 29 3b 0a 0a 20 20 20 20 62  4(c0, 1);..    b
26c0: 30 20 3d 20 28 61 30 30 5e 64 30 29 3b 0a 20 20  0 = (a00^d0);.  
26d0: 20 20 62 31 20 3d 20 52 4f 4c 36 34 28 28 61 30    b1 = ROL64((a0
26e0: 31 5e 64 31 29 2c 20 34 34 29 3b 0a 20 20 20 20  1^d1), 44);.    
26f0: 62 32 20 3d 20 52 4f 4c 36 34 28 28 61 30 32 5e  b2 = ROL64((a02^
2700: 64 32 29 2c 20 34 33 29 3b 0a 20 20 20 20 62 33  d2), 43);.    b3
2710: 20 3d 20 52 4f 4c 36 34 28 28 61 30 33 5e 64 33   = ROL64((a03^d3
2720: 29 2c 20 32 31 29 3b 0a 20 20 20 20 62 34 20 3d  ), 21);.    b4 =
2730: 20 52 4f 4c 36 34 28 28 61 30 34 5e 64 34 29 2c   ROL64((a04^d4),
2740: 20 31 34 29 3b 0a 20 20 20 20 61 30 30 20 3d 20   14);.    a00 = 
2750: 20 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62    b0 ^((~b1)&  b
2760: 32 20 29 3b 0a 20 20 20 20 61 30 30 20 5e 3d 20  2 );.    a00 ^= 
2770: 52 43 5b 69 2b 33 5d 3b 0a 20 20 20 20 61 30 31  RC[i+3];.    a01
2780: 20 3d 20 20 20 62 31 20 5e 28 28 7e 62 32 29 26   =   b1 ^((~b2)&
2790: 20 20 62 33 20 29 3b 0a 20 20 20 20 61 30 32 20    b3 );.    a02 
27a0: 3d 20 20 20 62 32 20 5e 28 28 7e 62 33 29 26 20  =   b2 ^((~b3)& 
27b0: 20 62 34 20 29 3b 0a 20 20 20 20 61 30 33 20 3d   b4 );.    a03 =
27c0: 20 20 20 62 33 20 5e 28 28 7e 62 34 29 26 20 20     b3 ^((~b4)&  
27d0: 62 30 20 29 3b 0a 20 20 20 20 61 30 34 20 3d 20  b0 );.    a04 = 
27e0: 20 20 62 34 20 5e 28 28 7e 62 30 29 26 20 20 62    b4 ^((~b0)&  b
27f0: 31 20 29 3b 0a 0a 20 20 20 20 62 32 20 3d 20 52  1 );..    b2 = R
2800: 4f 4c 36 34 28 28 61 31 30 5e 64 30 29 2c 20 33  OL64((a10^d0), 3
2810: 29 3b 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c 36  );.    b3 = ROL6
2820: 34 28 28 61 31 31 5e 64 31 29 2c 20 34 35 29 3b  4((a11^d1), 45);
2830: 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34 28  .    b4 = ROL64(
2840: 28 61 31 32 5e 64 32 29 2c 20 36 31 29 3b 0a 20  (a12^d2), 61);. 
2850: 20 20 20 62 30 20 3d 20 52 4f 4c 36 34 28 28 61     b0 = ROL64((a
2860: 31 33 5e 64 33 29 2c 20 32 38 29 3b 0a 20 20 20  13^d3), 28);.   
2870: 20 62 31 20 3d 20 52 4f 4c 36 34 28 28 61 31 34   b1 = ROL64((a14
2880: 5e 64 34 29 2c 20 32 30 29 3b 0a 20 20 20 20 61  ^d4), 20);.    a
2890: 31 30 20 3d 20 20 20 62 30 20 5e 28 28 7e 62 31  10 =   b0 ^((~b1
28a0: 29 26 20 20 62 32 20 29 3b 0a 20 20 20 20 61 31  )&  b2 );.    a1
28b0: 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62 32 29  1 =   b1 ^((~b2)
28c0: 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61 31 32  &  b3 );.    a12
28d0: 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33 29 26   =   b2 ^((~b3)&
28e0: 20 20 62 34 20 29 3b 0a 20 20 20 20 61 31 33 20    b4 );.    a13 
28f0: 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29 26 20  =   b3 ^((~b4)& 
2900: 20 62 30 20 29 3b 0a 20 20 20 20 61 31 34 20 3d   b0 );.    a14 =
2910: 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26 20 20     b4 ^((~b0)&  
2920: 62 31 20 29 3b 0a 0a 20 20 20 20 62 34 20 3d 20  b1 );..    b4 = 
2930: 52 4f 4c 36 34 28 28 61 32 30 5e 64 30 29 2c 20  ROL64((a20^d0), 
2940: 31 38 29 3b 0a 20 20 20 20 62 30 20 3d 20 52 4f  18);.    b0 = RO
2950: 4c 36 34 28 28 61 32 31 5e 64 31 29 2c 20 31 29  L64((a21^d1), 1)
2960: 3b 0a 20 20 20 20 62 31 20 3d 20 52 4f 4c 36 34  ;.    b1 = ROL64
2970: 28 28 61 32 32 5e 64 32 29 2c 20 36 29 3b 0a 20  ((a22^d2), 6);. 
2980: 20 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28 61     b2 = ROL64((a
2990: 32 33 5e 64 33 29 2c 20 32 35 29 3b 0a 20 20 20  23^d3), 25);.   
29a0: 20 62 33 20 3d 20 52 4f 4c 36 34 28 28 61 32 34   b3 = ROL64((a24
29b0: 5e 64 34 29 2c 20 38 29 3b 0a 20 20 20 20 61 32  ^d4), 8);.    a2
29c0: 30 20 3d 20 20 20 62 30 20 5e 28 28 7e 62 31 29  0 =   b0 ^((~b1)
29d0: 26 20 20 62 32 20 29 3b 0a 20 20 20 20 61 32 31  &  b2 );.    a21
29e0: 20 3d 20 20 20 62 31 20 5e 28 28 7e 62 32 29 26   =   b1 ^((~b2)&
29f0: 20 20 62 33 20 29 3b 0a 20 20 20 20 61 32 32 20    b3 );.    a22 
2a00: 3d 20 20 20 62 32 20 5e 28 28 7e 62 33 29 26 20  =   b2 ^((~b3)& 
2a10: 20 62 34 20 29 3b 0a 20 20 20 20 61 32 33 20 3d   b4 );.    a23 =
2a20: 20 20 20 62 33 20 5e 28 28 7e 62 34 29 26 20 20     b3 ^((~b4)&  
2a30: 62 30 20 29 3b 0a 20 20 20 20 61 32 34 20 3d 20  b0 );.    a24 = 
2a40: 20 20 62 34 20 5e 28 28 7e 62 30 29 26 20 20 62    b4 ^((~b0)&  b
2a50: 31 20 29 3b 0a 0a 20 20 20 20 62 31 20 3d 20 52  1 );..    b1 = R
2a60: 4f 4c 36 34 28 28 61 33 30 5e 64 30 29 2c 20 33  OL64((a30^d0), 3
2a70: 36 29 3b 0a 20 20 20 20 62 32 20 3d 20 52 4f 4c  6);.    b2 = ROL
2a80: 36 34 28 28 61 33 31 5e 64 31 29 2c 20 31 30 29  64((a31^d1), 10)
2a90: 3b 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c 36 34  ;.    b3 = ROL64
2aa0: 28 28 61 33 32 5e 64 32 29 2c 20 31 35 29 3b 0a  ((a32^d2), 15);.
2ab0: 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34 28 28      b4 = ROL64((
2ac0: 61 33 33 5e 64 33 29 2c 20 35 36 29 3b 0a 20 20  a33^d3), 56);.  
2ad0: 20 20 62 30 20 3d 20 52 4f 4c 36 34 28 28 61 33    b0 = ROL64((a3
2ae0: 34 5e 64 34 29 2c 20 32 37 29 3b 0a 20 20 20 20  4^d4), 27);.    
2af0: 61 33 30 20 3d 20 20 20 62 30 20 5e 28 28 7e 62  a30 =   b0 ^((~b
2b00: 31 29 26 20 20 62 32 20 29 3b 0a 20 20 20 20 61  1)&  b2 );.    a
2b10: 33 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62 32  31 =   b1 ^((~b2
2b20: 29 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61 33  )&  b3 );.    a3
2b30: 32 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33 29  2 =   b2 ^((~b3)
2b40: 26 20 20 62 34 20 29 3b 0a 20 20 20 20 61 33 33  &  b4 );.    a33
2b50: 20 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29 26   =   b3 ^((~b4)&
2b60: 20 20 62 30 20 29 3b 0a 20 20 20 20 61 33 34 20    b0 );.    a34 
2b70: 3d 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26 20  =   b4 ^((~b0)& 
2b80: 20 62 31 20 29 3b 0a 0a 20 20 20 20 62 33 20 3d   b1 );..    b3 =
2b90: 20 52 4f 4c 36 34 28 28 61 34 30 5e 64 30 29 2c   ROL64((a40^d0),
2ba0: 20 34 31 29 3b 0a 20 20 20 20 62 34 20 3d 20 52   41);.    b4 = R
2bb0: 4f 4c 36 34 28 28 61 34 31 5e 64 31 29 2c 20 32  OL64((a41^d1), 2
2bc0: 29 3b 0a 20 20 20 20 62 30 20 3d 20 52 4f 4c 36  );.    b0 = ROL6
2bd0: 34 28 28 61 34 32 5e 64 32 29 2c 20 36 32 29 3b  4((a42^d2), 62);
2be0: 0a 20 20 20 20 62 31 20 3d 20 52 4f 4c 36 34 28  .    b1 = ROL64(
2bf0: 28 61 34 33 5e 64 33 29 2c 20 35 35 29 3b 0a 20  (a43^d3), 55);. 
2c00: 20 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28 61     b2 = ROL64((a
2c10: 34 34 5e 64 34 29 2c 20 33 39 29 3b 0a 20 20 20  44^d4), 39);.   
2c20: 20 61 34 30 20 3d 20 20 20 62 30 20 5e 28 28 7e   a40 =   b0 ^((~
2c30: 62 31 29 26 20 20 62 32 20 29 3b 0a 20 20 20 20  b1)&  b2 );.    
2c40: 61 34 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62  a41 =   b1 ^((~b
2c50: 32 29 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61  2)&  b3 );.    a
2c60: 34 32 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33  42 =   b2 ^((~b3
2c70: 29 26 20 20 62 34 20 29 3b 0a 20 20 20 20 61 34  )&  b4 );.    a4
2c80: 33 20 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29  3 =   b3 ^((~b4)
2c90: 26 20 20 62 30 20 29 3b 0a 20 20 20 20 61 34 34  &  b0 );.    a44
2ca0: 20 3d 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26   =   b4 ^((~b0)&
2cb0: 20 20 62 31 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f    b1 );.  }.}../
2cc0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
2cd0: 61 20 6e 65 77 20 68 61 73 68 2e 20 20 69 53 69  a new hash.  iSi
2ce0: 7a 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  ze determines th
2cf0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 61  e size of the ha
2d00: 73 68 0a 2a 2a 20 69 6e 20 62 69 74 73 20 61 6e  sh.** in bits an
2d10: 64 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  d should be one 
2d20: 6f 66 20 32 32 34 2c 20 32 35 36 2c 20 33 38 34  of 224, 256, 384
2d30: 2c 20 6f 72 20 35 31 32 2e 20 20 4f 72 20 69 53  , or 512.  Or iS
2d40: 69 7a 65 0a 2a 2a 20 63 61 6e 20 62 65 20 7a 65  ize.** can be ze
2d50: 72 6f 20 74 6f 20 75 73 65 20 74 68 65 20 64 65  ro to use the de
2d60: 66 61 75 6c 74 20 68 61 73 68 20 73 69 7a 65 20  fault hash size 
2d70: 6f 66 20 32 35 36 20 62 69 74 73 2e 0a 2a 2f 0a  of 256 bits..*/.
2d80: 73 74 61 74 69 63 20 76 6f 69 64 20 53 48 41 33  static void SHA3
2d90: 49 6e 69 74 28 53 48 41 33 43 6f 6e 74 65 78 74  Init(SHA3Context
2da0: 20 2a 70 2c 20 69 6e 74 20 69 53 69 7a 65 29 7b   *p, int iSize){
2db0: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
2dc0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
2dd0: 66 28 20 69 53 69 7a 65 3e 3d 31 32 38 20 26 26  f( iSize>=128 &&
2de0: 20 69 53 69 7a 65 3c 3d 35 31 32 20 29 7b 0a 20   iSize<=512 ){. 
2df0: 20 20 20 70 2d 3e 6e 52 61 74 65 20 3d 20 28 31     p->nRate = (1
2e00: 36 30 30 20 2d 20 28 28 69 53 69 7a 65 20 2b 20  600 - ((iSize + 
2e10: 33 31 29 26 7e 33 31 29 2a 32 29 2f 38 3b 0a 20  31)&~31)*2)/8;. 
2e20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e   }else{.    p->n
2e30: 52 61 74 65 20 3d 20 28 31 36 30 30 20 2d 20 32  Rate = (1600 - 2
2e40: 2a 32 35 36 29 2f 38 3b 0a 20 20 7d 0a 23 69 66  *256)/8;.  }.#if
2e50: 20 53 48 41 33 5f 42 59 54 45 4f 52 44 45 52 3d   SHA3_BYTEORDER=
2e60: 3d 31 32 33 34 0a 20 20 2f 2a 20 4b 6e 6f 77 6e  =1234.  /* Known
2e70: 20 74 6f 20 62 65 20 6c 69 74 74 6c 65 2d 65 6e   to be little-en
2e80: 64 69 61 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d  dian at compile-
2e90: 74 69 6d 65 2e 20 4e 6f 2d 6f 70 20 2a 2f 0a 23  time. No-op */.#
2ea0: 65 6c 69 66 20 53 48 41 33 5f 42 59 54 45 4f 52  elif SHA3_BYTEOR
2eb0: 44 45 52 3d 3d 34 33 32 31 0a 20 20 70 2d 3e 69  DER==4321.  p->i
2ec0: 78 4d 61 73 6b 20 3d 20 37 3b 20 20 2f 2a 20 42  xMask = 7;  /* B
2ed0: 69 67 2d 65 6e 64 69 61 6e 20 2a 2f 0a 23 65 6c  ig-endian */.#el
2ee0: 73 65 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69  se.  {.    stati
2ef0: 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6f  c unsigned int o
2f00: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ne = 1;.    if( 
2f10: 31 3d 3d 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  1==*(unsigned ch
2f20: 61 72 2a 29 26 6f 6e 65 20 29 7b 0a 20 20 20 20  ar*)&one ){.    
2f30: 20 20 2f 2a 20 4c 69 74 74 6c 65 20 65 6e 64 69    /* Little endi
2f40: 61 6e 2e 20 20 4e 6f 20 62 79 74 65 20 73 77 61  an.  No byte swa
2f50: 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  pping. */.      
2f60: 70 2d 3e 69 78 4d 61 73 6b 20 3d 20 30 3b 0a 20  p->ixMask = 0;. 
2f70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f80: 2f 2a 20 42 69 67 20 65 6e 64 69 61 6e 2e 20 20  /* Big endian.  
2f90: 42 79 74 65 20 73 77 61 70 2e 20 2a 2f 0a 20 20  Byte swap. */.  
2fa0: 20 20 20 20 70 2d 3e 69 78 4d 61 73 6b 20 3d 20      p->ixMask = 
2fb0: 37 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  7;.    }.  }.#en
2fc0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
2fd0: 65 20 63 6f 6e 73 65 63 75 74 69 76 65 20 63 61  e consecutive ca
2fe0: 6c 6c 73 20 74 6f 20 74 68 65 20 53 48 41 33 55  lls to the SHA3U
2ff0: 70 64 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 74  pdate function t
3000: 6f 20 61 64 64 20 6e 65 77 20 63 6f 6e 74 65 6e  o add new conten
3010: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68  t.** to the hash
3020: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3030: 53 48 41 33 55 70 64 61 74 65 28 0a 20 20 53 48  SHA3Update(.  SH
3040: 41 33 43 6f 6e 74 65 78 74 20 2a 70 2c 0a 20 20  A3Context *p,.  
3050: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
3060: 68 61 72 20 2a 61 44 61 74 61 2c 0a 20 20 75 6e  har *aData,.  un
3070: 73 69 67 6e 65 64 20 69 6e 74 20 6e 44 61 74 61  signed int nData
3080: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
3090: 6e 74 20 69 20 3d 20 30 3b 0a 23 69 66 20 53 48  nt i = 0;.#if SH
30a0: 41 33 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31 32  A3_BYTEORDER==12
30b0: 33 34 0a 20 20 69 66 28 20 28 70 2d 3e 6e 4c 6f  34.  if( (p->nLo
30c0: 61 64 65 64 20 25 20 38 29 3d 3d 30 20 26 26 20  aded % 8)==0 && 
30d0: 28 28 61 44 61 74 61 20 2d 20 28 63 6f 6e 73 74  ((aData - (const
30e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29   unsigned char*)
30f0: 30 29 26 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0)&7)==0 ){.    
3100: 66 6f 72 28 3b 20 69 2b 37 3c 6e 44 61 74 61 3b  for(; i+7<nData;
3110: 20 69 2b 3d 38 29 7b 0a 20 20 20 20 20 20 70 2d   i+=8){.      p-
3120: 3e 75 2e 73 5b 70 2d 3e 6e 4c 6f 61 64 65 64 2f  >u.s[p->nLoaded/
3130: 38 5d 20 5e 3d 20 2a 28 75 36 34 2a 29 26 61 44  8] ^= *(u64*)&aD
3140: 61 74 61 5b 69 5d 3b 0a 20 20 20 20 20 20 70 2d  ata[i];.      p-
3150: 3e 6e 4c 6f 61 64 65 64 20 2b 3d 20 38 3b 0a 20  >nLoaded += 8;. 
3160: 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 61       if( p->nLoa
3170: 64 65 64 3e 3d 70 2d 3e 6e 52 61 74 65 20 29 7b  ded>=p->nRate ){
3180: 0a 20 20 20 20 20 20 20 20 4b 65 63 63 61 6b 46  .        KeccakF
3190: 31 36 30 30 53 74 65 70 28 70 29 3b 0a 20 20 20  1600Step(p);.   
31a0: 20 20 20 20 20 70 2d 3e 6e 4c 6f 61 64 65 64 20       p->nLoaded 
31b0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
31c0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
31d0: 66 6f 72 28 3b 20 69 3c 6e 44 61 74 61 3b 20 69  for(; i<nData; i
31e0: 2b 2b 29 7b 0a 23 69 66 20 53 48 41 33 5f 42 59  ++){.#if SHA3_BY
31f0: 54 45 4f 52 44 45 52 3d 3d 31 32 33 34 0a 20 20  TEORDER==1234.  
3200: 20 20 70 2d 3e 75 2e 78 5b 70 2d 3e 6e 4c 6f 61    p->u.x[p->nLoa
3210: 64 65 64 5d 20 5e 3d 20 61 44 61 74 61 5b 69 5d  ded] ^= aData[i]
3220: 3b 0a 23 65 6c 69 66 20 53 48 41 33 5f 42 59 54  ;.#elif SHA3_BYT
3230: 45 4f 52 44 45 52 3d 3d 34 33 32 31 0a 20 20 20  EORDER==4321.   
3240: 20 70 2d 3e 75 2e 78 5b 70 2d 3e 6e 4c 6f 61 64   p->u.x[p->nLoad
3250: 65 64 5e 30 78 30 37 5d 20 5e 3d 20 61 44 61 74  ed^0x07] ^= aDat
3260: 61 5b 69 5d 3b 0a 23 65 6c 73 65 0a 20 20 20 20  a[i];.#else.    
3270: 70 2d 3e 75 2e 78 5b 70 2d 3e 6e 4c 6f 61 64 65  p->u.x[p->nLoade
3280: 64 5e 70 2d 3e 69 78 4d 61 73 6b 5d 20 5e 3d 20  d^p->ixMask] ^= 
3290: 61 44 61 74 61 5b 69 5d 3b 0a 23 65 6e 64 69 66  aData[i];.#endif
32a0: 0a 20 20 20 20 70 2d 3e 6e 4c 6f 61 64 65 64 2b  .    p->nLoaded+
32b0: 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c  +;.    if( p->nL
32c0: 6f 61 64 65 64 3d 3d 70 2d 3e 6e 52 61 74 65 20  oaded==p->nRate 
32d0: 29 7b 0a 20 20 20 20 20 20 4b 65 63 63 61 6b 46  ){.      KeccakF
32e0: 31 36 30 30 53 74 65 70 28 70 29 3b 0a 20 20 20  1600Step(p);.   
32f0: 20 20 20 70 2d 3e 6e 4c 6f 61 64 65 64 20 3d 20     p->nLoaded = 
3300: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
3310: 2f 2a 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20  /*.** After all 
3320: 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e  content has been
3330: 20 61 64 64 65 64 2c 20 69 6e 76 6f 6b 65 20 53   added, invoke S
3340: 48 41 33 46 69 6e 61 6c 28 29 20 74 6f 20 63 6f  HA3Final() to co
3350: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 66 69 6e  mpute.** the fin
3360: 61 6c 20 68 61 73 68 2e 20 20 54 68 65 20 66 75  al hash.  The fu
3370: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
3380: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3390: 62 69 6e 61 72 79 0a 2a 2a 20 68 61 73 68 20 76  binary.** hash v
33a0: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
33b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 53  unsigned char *S
33c0: 48 41 33 46 69 6e 61 6c 28 53 48 41 33 43 6f 6e  HA3Final(SHA3Con
33d0: 74 65 78 74 20 2a 70 29 7b 0a 20 20 75 6e 73 69  text *p){.  unsi
33e0: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 66  gned int i;.  if
33f0: 28 20 70 2d 3e 6e 4c 6f 61 64 65 64 3d 3d 70 2d  ( p->nLoaded==p-
3400: 3e 6e 52 61 74 65 2d 31 20 29 7b 0a 20 20 20 20  >nRate-1 ){.    
3410: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
3420: 68 61 72 20 63 31 20 3d 20 30 78 38 36 3b 0a 20  har c1 = 0x86;. 
3430: 20 20 20 53 48 41 33 55 70 64 61 74 65 28 70 2c     SHA3Update(p,
3440: 20 26 63 31 2c 20 31 29 3b 0a 20 20 7d 65 6c 73   &c1, 1);.  }els
3450: 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e{.    const uns
3460: 69 67 6e 65 64 20 63 68 61 72 20 63 32 20 3d 20  igned char c2 = 
3470: 30 78 30 36 3b 0a 20 20 20 20 63 6f 6e 73 74 20  0x06;.    const 
3480: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 33  unsigned char c3
3490: 20 3d 20 30 78 38 30 3b 0a 20 20 20 20 53 48 41   = 0x80;.    SHA
34a0: 33 55 70 64 61 74 65 28 70 2c 20 26 63 32 2c 20  3Update(p, &c2, 
34b0: 31 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c 6f 61 64  1);.    p->nLoad
34c0: 65 64 20 3d 20 70 2d 3e 6e 52 61 74 65 20 2d 20  ed = p->nRate - 
34d0: 31 3b 0a 20 20 20 20 53 48 41 33 55 70 64 61 74  1;.    SHA3Updat
34e0: 65 28 70 2c 20 26 63 33 2c 20 31 29 3b 0a 20 20  e(p, &c3, 1);.  
34f0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
3500: 2d 3e 6e 52 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  ->nRate; i++){. 
3510: 20 20 20 70 2d 3e 75 2e 78 5b 69 2b 70 2d 3e 6e     p->u.x[i+p->n
3520: 52 61 74 65 5d 20 3d 20 70 2d 3e 75 2e 78 5b 69  Rate] = p->u.x[i
3530: 5e 70 2d 3e 69 78 4d 61 73 6b 5d 3b 0a 20 20 7d  ^p->ixMask];.  }
3540: 0a 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 75 2e  .  return &p->u.
3550: 78 5b 70 2d 3e 6e 52 61 74 65 5d 3b 0a 7d 0a 2f  x[p->nRate];.}./
3560: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 68 61 73  * End of the has
3570: 68 69 6e 67 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a  hing logic.*****
3580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35c0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
35d0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
35e0: 6f 66 20 74 68 65 20 73 68 61 33 28 58 2c 53 49  of the sha3(X,SI
35f0: 5a 45 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  ZE) function..**
3600: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 42 4c 4f  .** Return a BLO
3610: 42 20 77 68 69 63 68 20 69 73 20 74 68 65 20 53  B which is the S
3620: 49 5a 45 2d 62 69 74 20 53 48 41 33 20 68 61 73  IZE-bit SHA3 has
3630: 68 20 6f 66 20 58 2e 20 20 54 68 65 20 64 65 66  h of X.  The def
3640: 61 75 6c 74 0a 2a 2a 20 73 69 7a 65 20 69 73 20  ault.** size is 
3650: 32 35 36 2e 20 20 49 66 20 58 20 69 73 20 61 20  256.  If X is a 
3660: 42 4c 4f 42 2c 20 69 74 20 69 73 20 68 61 73 68  BLOB, it is hash
3670: 65 64 20 61 73 20 69 73 2e 20 20 0a 2a 2a 20 46  ed as is.  .** F
3680: 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20 6e 6f 6e  or all other non
3690: 2d 4e 55 4c 4c 20 74 79 70 65 73 20 6f 66 20 69  -NULL types of i
36a0: 6e 70 75 74 2c 20 58 20 69 73 20 63 6f 6e 76 65  nput, X is conve
36b0: 72 74 65 64 20 69 6e 74 6f 20 61 20 55 54 46 2d  rted into a UTF-
36c0: 38 20 73 74 72 69 6e 67 0a 2a 2a 20 61 6e 64 20  8 string.** and 
36d0: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 68 61  the string is ha
36e0: 73 68 65 64 20 77 69 74 68 6f 75 74 20 74 68 65  shed without the
36f0: 20 74 72 61 69 6c 69 6e 67 20 30 78 30 30 20 74   trailing 0x00 t
3700: 65 72 6d 69 6e 61 74 6f 72 2e 20 20 54 68 65 20  erminator.  The 
3710: 68 61 73 68 0a 2a 2a 20 6f 66 20 61 20 4e 55 4c  hash.** of a NUL
3720: 4c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e  L value is NULL.
3730: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3740: 73 68 61 33 46 75 6e 63 28 0a 20 20 73 71 6c 69  sha3Func(.  sqli
3750: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
3760: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
3770: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
3780: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 53 48  e **argv.){.  SH
3790: 41 33 43 6f 6e 74 65 78 74 20 63 78 3b 0a 20 20  A3Context cx;.  
37a0: 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c 69  int eType = sqli
37b0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
37c0: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e  rgv[0]);.  int n
37d0: 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  Byte = sqlite3_v
37e0: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
37f0: 30 5d 29 3b 0a 20 20 69 6e 74 20 69 53 69 7a 65  0]);.  int iSize
3800: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31 20  ;.  if( argc==1 
3810: 29 7b 0a 20 20 20 20 69 53 69 7a 65 20 3d 20 32  ){.    iSize = 2
3820: 35 36 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  56;.  }else{.   
3830: 20 69 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33   iSize = sqlite3
3840: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
3850: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 53 69  1]);.    if( iSi
3860: 7a 65 21 3d 32 32 34 20 26 26 20 69 53 69 7a 65  ze!=224 && iSize
3870: 21 3d 32 35 36 20 26 26 20 69 53 69 7a 65 21 3d  !=256 && iSize!=
3880: 33 38 34 20 26 26 20 69 53 69 7a 65 21 3d 35 31  384 && iSize!=51
3890: 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
38a0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
38b0: 63 6f 6e 74 65 78 74 2c 20 22 53 48 41 33 20 73  context, "SHA3 s
38c0: 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e  ize should be on
38d0: 65 20 6f 66 3a 20 32 32 34 20 32 35 36 20 22 0a  e of: 224 256 ".
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 20 20 20 22 33 38 34 20 35 31 32 22 2c 20 2d      "384 512", -
3910: 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
3920: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
3930: 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
3940: 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20  NULL ) return;. 
3950: 20 53 48 41 33 49 6e 69 74 28 26 63 78 2c 20 69   SHA3Init(&cx, i
3960: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 65 54 79  Size);.  if( eTy
3970: 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  pe==SQLITE_BLOB 
3980: 29 7b 0a 20 20 20 20 53 48 41 33 55 70 64 61 74  ){.    SHA3Updat
3990: 65 28 26 63 78 2c 20 73 71 6c 69 74 65 33 5f 76  e(&cx, sqlite3_v
39a0: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
39b0: 5d 29 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  ]), nByte);.  }e
39c0: 6c 73 65 7b 0a 20 20 20 20 53 48 41 33 55 70 64  lse{.    SHA3Upd
39d0: 61 74 65 28 26 63 78 2c 20 73 71 6c 69 74 65 33  ate(&cx, sqlite3
39e0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
39f0: 5b 30 5d 29 2c 20 6e 42 79 74 65 29 3b 0a 20 20  [0]), nByte);.  
3a00: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
3a10: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
3a20: 20 53 48 41 33 46 69 6e 61 6c 28 26 63 78 29 2c   SHA3Final(&cx),
3a30: 20 69 53 69 7a 65 2f 38 2c 20 53 51 4c 49 54 45   iSize/8, SQLITE
3a40: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a  _TRANSIENT);.}..
3a50: 2f 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  /* Compute a str
3a60: 69 6e 67 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ing using sqlite
3a70: 33 5f 76 73 6e 70 72 69 6e 74 66 28 29 20 77 69  3_vsnprintf() wi
3a80: 74 68 20 61 20 6d 61 78 69 6d 75 6d 20 6c 65 6e  th a maximum len
3a90: 67 74 68 0a 2a 2a 20 6f 66 20 35 30 20 62 79 74  gth.** of 50 byt
3aa0: 65 73 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f  es and add it to
3ab0: 20 74 68 65 20 68 61 73 68 2e 0a 2a 2f 0a 73 74   the hash..*/.st
3ac0: 61 74 69 63 20 76 6f 69 64 20 68 61 73 68 5f 73  atic void hash_s
3ad0: 74 65 70 5f 76 66 6f 72 6d 61 74 28 0a 20 20 53  tep_vformat(.  S
3ae0: 48 41 33 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20  HA3Context *p,  
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b00: 2a 20 41 64 64 20 63 6f 6e 74 65 6e 74 20 74 6f  * Add content to
3b10: 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f   this context */
3b20: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3b30: 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b  Format,.  ....){
3b40: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
3b50: 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 7a   int n;.  char z
3b60: 42 75 66 5b 35 30 5d 3b 0a 20 20 76 61 5f 73 74  Buf[50];.  va_st
3b70: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
3b80: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 73 6e 70  ;.  sqlite3_vsnp
3b90: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
3ba0: 66 29 2c 7a 42 75 66 2c 7a 46 6f 72 6d 61 74 2c  f),zBuf,zFormat,
3bb0: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
3bc0: 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74  );.  n = (int)st
3bd0: 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 53 48  rlen(zBuf);.  SH
3be0: 41 33 55 70 64 61 74 65 28 70 2c 20 28 75 6e 73  A3Update(p, (uns
3bf0: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75 66  igned char*)zBuf
3c00: 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , n);.}../*.** I
3c10: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
3c20: 20 74 68 65 20 73 68 61 33 5f 71 75 65 72 79 28   the sha3_query(
3c30: 53 51 4c 2c 53 49 5a 45 29 20 66 75 6e 63 74 69  SQL,SIZE) functi
3c40: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  on..**.** This f
3c50: 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69 6c 65 73  unction compiles
3c60: 20 61 6e 64 20 72 75 6e 73 20 74 68 65 20 53 51   and runs the SQ
3c70: 4c 20 73 74 61 74 65 6d 65 6e 74 28 73 29 20 67  L statement(s) g
3c80: 69 76 65 6e 20 69 6e 20 74 68 65 0a 2a 2a 20 61  iven in the.** a
3c90: 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 72 65 73  rgument. The res
3ca0: 75 6c 74 73 20 61 72 65 20 68 61 73 68 65 64 20  ults are hashed 
3cb0: 75 73 69 6e 67 20 61 20 53 49 5a 45 2d 62 69 74  using a SIZE-bit
3cc0: 20 53 48 41 33 2e 20 20 54 68 65 20 64 65 66 61   SHA3.  The defa
3cd0: 75 6c 74 0a 2a 2a 20 73 69 7a 65 20 69 73 20 32  ult.** size is 2
3ce0: 35 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  56..**.** The fo
3cf0: 72 6d 61 74 20 6f 66 20 74 68 65 20 62 79 74 65  rmat of the byte
3d00: 20 73 74 72 65 61 6d 20 74 68 61 74 20 69 73 20   stream that is 
3d10: 68 61 73 68 65 64 20 69 73 20 73 75 6d 6d 61 72  hashed is summar
3d20: 69 7a 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ized as follows:
3d30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 3c 6e  .**.**       S<n
3d40: 3e 3a 3c 73 71 6c 3e 0a 2a 2a 20 20 20 20 20 20  >:<sql>.**      
3d50: 20 52 0a 2a 2a 20 20 20 20 20 20 20 4e 0a 2a 2a   R.**       N.**
3d60: 20 20 20 20 20 20 20 49 3c 69 6e 74 3e 0a 2a 2a         I<int>.**
3d70: 20 20 20 20 20 20 20 46 3c 69 65 65 65 2d 66 6c         F<ieee-fl
3d80: 6f 61 74 3e 0a 2a 2a 20 20 20 20 20 20 20 42 3c  oat>.**       B<
3d90: 73 69 7a 65 3e 3a 3c 62 79 74 65 73 3e 0a 2a 2a  size>:<bytes>.**
3da0: 20 20 20 20 20 20 20 54 3c 73 69 7a 65 3e 3a 3c         T<size>:<
3db0: 74 65 78 74 3e 0a 2a 2a 0a 2a 2a 20 3c 73 71 6c  text>.**.** <sql
3dc0: 3e 20 69 73 20 74 68 65 20 6f 72 69 67 69 6e 61  > is the origina
3dd0: 6c 20 53 51 4c 20 74 65 78 74 20 66 6f 72 20 65  l SQL text for e
3de0: 61 63 68 20 73 74 61 74 65 6d 65 6e 74 20 72 75  ach statement ru
3df0: 6e 20 61 6e 64 20 3c 6e 3e 20 69 73 0a 2a 2a 20  n and <n> is.** 
3e00: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 61 74  the size of that
3e10: 20 74 65 78 74 2e 20 20 54 68 65 20 53 51 4c 20   text.  The SQL 
3e20: 74 65 78 74 20 69 73 20 55 54 46 2d 38 2e 20 20  text is UTF-8.  
3e30: 41 20 73 69 6e 67 6c 65 20 52 20 63 68 61 72 61  A single R chara
3e40: 63 74 65 72 0a 2a 2a 20 6f 63 63 75 72 73 20 62  cter.** occurs b
3e50: 65 66 6f 72 65 20 74 68 65 20 73 74 61 72 74 20  efore the start 
3e60: 6f 66 20 65 61 63 68 20 72 6f 77 2e 20 20 4e 20  of each row.  N 
3e70: 6d 65 61 6e 73 20 61 20 4e 55 4c 4c 20 76 61 6c  means a NULL val
3e80: 75 65 2e 0a 2a 2a 20 49 20 6d 65 61 6e 20 61 6e  ue..** I mean an
3e90: 20 38 2d 62 79 74 65 20 6c 69 74 74 6c 65 2d 65   8-byte little-e
3ea0: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 3c 69  ndian integer <i
3eb0: 6e 74 3e 2e 20 20 46 20 69 73 20 61 20 66 6c 6f  nt>.  F is a flo
3ec0: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 6e  ating point.** n
3ed0: 75 6d 62 65 72 20 77 69 74 68 20 61 6e 20 38 2d  umber with an 8-
3ee0: 62 79 74 65 20 6c 69 74 74 6c 65 2d 65 6e 64 69  byte little-endi
3ef0: 61 6e 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  an IEEE floating
3f00: 20 70 6f 69 6e 74 20 76 61 6c 75 65 20 3c 69 65   point value <ie
3f10: 65 65 2d 66 6c 6f 61 74 3e 2e 0a 2a 2a 20 42 20  ee-float>..** B 
3f20: 6d 65 61 6e 73 20 62 6c 6f 62 73 20 6f 66 20 3c  means blobs of <
3f30: 73 69 7a 65 3e 20 62 79 74 65 73 2e 20 20 54 20  size> bytes.  T 
3f40: 6d 65 61 6e 73 20 74 65 78 74 20 72 65 6e 64 65  means text rende
3f50: 72 65 64 20 61 73 20 3c 73 69 7a 65 3e 0a 2a 2a  red as <size>.**
3f60: 20 62 79 74 65 73 20 6f 66 20 55 54 46 2d 38 2e   bytes of UTF-8.
3f70: 20 20 54 68 65 20 3c 6e 3e 20 61 6e 64 20 3c 73    The <n> and <s
3f80: 69 7a 65 3e 20 76 61 6c 75 65 73 20 61 72 65 20  ize> values are 
3f90: 65 78 70 72 65 73 73 65 64 20 61 73 20 61 6e 20  expressed as an 
3fa0: 41 53 43 49 49 0a 2a 2a 20 74 65 78 74 20 69 6e  ASCII.** text in
3fb0: 74 65 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  tegers..**.** Fo
3fc0: 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
3fd0: 6d 65 6e 74 20 69 6e 20 74 68 65 20 58 20 69 6e  ment in the X in
3fe0: 70 75 74 2c 20 74 68 65 72 65 20 69 73 20 6f 6e  put, there is on
3ff0: 65 20 53 20 73 65 67 6d 65 6e 74 2e 20 20 45 61  e S segment.  Ea
4000: 63 68 0a 2a 2a 20 53 20 73 65 67 6d 65 6e 74 20  ch.** S segment 
4010: 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a  is followed by z
4020: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 52 20 73 65  ero or more R se
4030: 67 6d 65 6e 74 73 2c 20 6f 6e 65 20 66 6f 72 20  gments, one for 
4040: 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 0a  each row in the.
4050: 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  ** result set.  
4060: 41 66 74 65 72 20 65 61 63 68 20 52 2c 20 74 68  After each R, th
4070: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
4080: 6f 72 65 20 4e 2c 20 49 2c 20 46 2c 20 42 2c 20  ore N, I, F, B, 
4090: 6f 72 20 54 20 73 65 67 6d 65 6e 74 73 2c 0a 2a  or T segments,.*
40a0: 2a 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 63  * one for each c
40b0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
40c0: 75 6c 74 20 73 65 74 2e 20 20 53 65 67 6d 65 6e  ult set.  Segmen
40d0: 74 73 20 61 72 65 20 63 6f 6e 63 61 74 65 6e 74  ts are concatent
40e0: 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a  ated directly.**
40f0: 20 77 69 74 68 20 6e 6f 20 64 65 6c 69 6d 69 74   with no delimit
4100: 65 72 73 20 6f 66 20 61 6e 79 20 6b 69 6e 64 2e  ers of any kind.
4110: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4120: 73 68 61 33 51 75 65 72 79 46 75 6e 63 28 0a 20  sha3QueryFunc(. 
4130: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
4140: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
4150: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
4160: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
4170: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4180: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
4190: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
41a0: 78 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  xt);.  const cha
41b0: 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74  r *zSql = (const
41c0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
41d0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
41e0: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ]);.  sqlite3_st
41f0: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
4200: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4220: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
4230: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
4240: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  set */.  int i; 
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4260: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
4270: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
4280: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  ;.  int n;.  con
4290: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 53 48  st char *z;.  SH
42a0: 41 33 43 6f 6e 74 65 78 74 20 63 78 3b 0a 20 20  A3Context cx;.  
42b0: 69 6e 74 20 69 53 69 7a 65 3b 0a 0a 20 20 69 66  int iSize;..  if
42c0: 28 20 61 72 67 63 3d 3d 31 20 29 7b 0a 20 20 20  ( argc==1 ){.   
42d0: 20 69 53 69 7a 65 20 3d 20 32 35 36 3b 0a 20 20   iSize = 256;.  
42e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 53 69 7a 65  }else{.    iSize
42f0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4300: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  _int(argv[1]);. 
4310: 20 20 20 69 66 28 20 69 53 69 7a 65 21 3d 32 32     if( iSize!=22
4320: 34 20 26 26 20 69 53 69 7a 65 21 3d 32 35 36 20  4 && iSize!=256 
4330: 26 26 20 69 53 69 7a 65 21 3d 33 38 34 20 26 26  && iSize!=384 &&
4340: 20 69 53 69 7a 65 21 3d 35 31 32 20 29 7b 0a 20   iSize!=512 ){. 
4350: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
4360: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
4370: 74 2c 20 22 53 48 41 33 20 73 69 7a 65 20 73 68  t, "SHA3 size sh
4380: 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20  ould be one of: 
4390: 32 32 34 20 32 35 36 20 22 0a 20 20 20 20 20 20  224 256 ".      
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 33                "3
43c0: 38 34 20 35 31 32 22 2c 20 2d 31 29 3b 0a 20 20  84 512", -1);.  
43d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
43e0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 71 6c  }.  }.  if( zSql
43f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4400: 53 48 41 33 49 6e 69 74 28 26 63 78 2c 20 69 53  SHA3Init(&cx, iS
4410: 69 7a 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a  ize);.  while( z
4420: 53 71 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63  Sql[0] ){.    rc
4430: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
4440: 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v2(db, zSql, 
4450: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 53 71  -1, &pStmt, &zSq
4460: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
4470: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d  {.      char *zM
4480: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
4490: 69 6e 74 66 28 22 65 72 72 6f 72 20 53 51 4c 20  intf("error SQL 
44a0: 73 74 61 74 65 6d 65 6e 74 20 5b 25 73 5d 3a 20  statement [%s]: 
44b0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 20 20 20 20 20 20 7a 53 71 6c 2c 20 73 71          zSql, sq
44e0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
44f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4500: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
4510: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4520: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
4530: 74 65 78 74 2c 20 7a 4d 73 67 2c 20 2d 31 29 3b  text, zMsg, -1);
4540: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
4550: 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20 20 20 20  ree(zMsg);.     
4560: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
4570: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f     if( !sqlite3_
4580: 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53  stmt_readonly(pS
4590: 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63 68  tmt) ){.      ch
45a0: 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
45b0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 6e 2d  e3_mprintf("non-
45c0: 71 75 65 72 79 3a 20 5b 25 73 5d 22 2c 20 73 71  query: [%s]", sq
45d0: 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
45e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
45f0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
4600: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4610: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
4620: 74 65 78 74 2c 20 7a 4d 73 67 2c 20 2d 31 29 3b  text, zMsg, -1);
4630: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
4640: 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20 20 20 20  ree(zMsg);.     
4650: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
4660: 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
4670: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
4680: 53 74 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73  Stmt);.    z = s
4690: 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
46a0: 29 3b 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74 29  );.    n = (int)
46b0: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 68  strlen(z);.    h
46c0: 61 73 68 5f 73 74 65 70 5f 76 66 6f 72 6d 61 74  ash_step_vformat
46d0: 28 26 63 78 2c 22 53 25 64 3a 22 2c 6e 29 3b 0a  (&cx,"S%d:",n);.
46e0: 20 20 20 20 53 48 41 33 55 70 64 61 74 65 28 26      SHA3Update(&
46f0: 63 78 2c 28 75 6e 73 69 67 6e 65 64 20 63 68 61  cx,(unsigned cha
4700: 72 2a 29 7a 2c 6e 29 3b 0a 0a 20 20 20 20 2f 2a  r*)z,n);..    /*
4710: 20 43 6f 6d 70 75 74 65 20 61 20 68 61 73 68 20   Compute a hash 
4720: 6f 76 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  over the result 
4730: 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
4740: 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54      while( SQLIT
4750: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
4760: 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
4770: 20 20 20 20 53 48 41 33 55 70 64 61 74 65 28 26      SHA3Update(&
4780: 63 78 2c 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  cx,(const unsign
4790: 65 64 20 63 68 61 72 2a 29 22 52 22 2c 31 29 3b  ed char*)"R",1);
47a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
47b0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
47c0: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71        switch( sq
47d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
47e0: 65 28 70 53 74 6d 74 2c 69 29 20 29 7b 0a 20 20  e(pStmt,i) ){.  
47f0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
4800: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
4810: 20 20 20 20 20 20 20 20 53 48 41 33 55 70 64 61          SHA3Upda
4820: 74 65 28 26 63 78 2c 20 28 63 6f 6e 73 74 20 75  te(&cx, (const u
4830: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 22 4e  nsigned char*)"N
4840: 22 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",1);.          
4850: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4860: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
4870: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
4880: 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ER: {.          
4890: 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34    sqlite3_uint64
48a0: 20 75 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   u;.            
48b0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  int j;.         
48c0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
48d0: 20 78 5b 39 5d 3b 0a 20 20 20 20 20 20 20 20 20   x[9];.         
48e0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
48f0: 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   v = sqlite3_col
4900: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
4910: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
4920: 6d 65 6d 63 70 79 28 26 75 2c 20 26 76 2c 20 38  memcpy(&u, &v, 8
4930: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
4940: 6f 72 28 6a 3d 38 3b 20 6a 3e 3d 31 3b 20 6a 2d  or(j=8; j>=1; j-
4950: 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
4960: 20 20 78 5b 6a 5d 20 3d 20 75 20 26 20 30 78 66    x[j] = u & 0xf
4970: 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f;.             
4980: 20 75 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 20 20   u >>= 8;.      
4990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
49a0: 20 20 20 20 78 5b 30 5d 20 3d 20 27 49 27 3b 0a      x[0] = 'I';.
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 33              SHA3
49c0: 55 70 64 61 74 65 28 26 63 78 2c 20 78 2c 20 39  Update(&cx, x, 9
49d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
49e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
49f0: 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  }.          case
4a00: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
4a10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
4a20: 69 74 65 33 5f 75 69 6e 74 36 34 20 75 3b 0a 20  ite3_uint64 u;. 
4a30: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
4a40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e  ;.            un
4a50: 73 69 67 6e 65 64 20 63 68 61 72 20 78 5b 39 5d  signed char x[9]
4a60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 6f  ;.            do
4a70: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
4a80: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
4a90: 53 74 6d 74 2c 69 29 3b 0a 20 20 20 20 20 20 20  Stmt,i);.       
4aa0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 75 2c 20       memcpy(&u, 
4ab0: 26 72 2c 20 38 29 3b 0a 20 20 20 20 20 20 20 20  &r, 8);.        
4ac0: 20 20 20 20 66 6f 72 28 6a 3d 38 3b 20 6a 3e 3d      for(j=8; j>=
4ad0: 31 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 20  1; j--){.       
4ae0: 20 20 20 20 20 20 20 78 5b 6a 5d 20 3d 20 75 20         x[j] = u 
4af0: 26 20 30 78 66 66 3b 0a 20 20 20 20 20 20 20 20  & 0xff;.        
4b00: 20 20 20 20 20 20 75 20 3e 3e 3d 20 38 3b 0a 20        u >>= 8;. 
4b10: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4b20: 20 20 20 20 20 20 20 20 20 78 5b 30 5d 20 3d 20           x[0] = 
4b30: 27 46 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  'F';.           
4b40: 20 53 48 41 33 55 70 64 61 74 65 28 26 63 78 2c   SHA3Update(&cx,
4b50: 78 2c 39 29 3b 0a 20 20 20 20 20 20 20 20 20 20  x,9);.          
4b60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4b70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
4b80: 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
4b90: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
4ba0: 6e 74 20 6e 32 20 3d 20 73 71 6c 69 74 65 33 5f  nt n2 = sqlite3_
4bb0: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
4bc0: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
4bd0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
4be0: 65 64 20 63 68 61 72 20 2a 7a 32 20 3d 20 73 71  ed char *z2 = sq
4bf0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
4c00: 74 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  t(pStmt, i);.   
4c10: 20 20 20 20 20 20 20 20 20 68 61 73 68 5f 73 74           hash_st
4c20: 65 70 5f 76 66 6f 72 6d 61 74 28 26 63 78 2c 22  ep_vformat(&cx,"
4c30: 54 25 64 3a 22 2c 6e 32 29 3b 0a 20 20 20 20 20  T%d:",n2);.     
4c40: 20 20 20 20 20 20 20 53 48 41 33 55 70 64 61 74         SHA3Updat
4c50: 65 28 26 63 78 2c 20 7a 32 2c 20 6e 32 29 3b 0a  e(&cx, z2, n2);.
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4c70: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
4c80: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
4c90: 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
4ca0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 32 20           int n2 
4cb0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
4cc0: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 29  _bytes(pStmt, i)
4cd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  ;.            co
4ce0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4cf0: 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74 65 33 5f  r *z2 = sqlite3_
4d00: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
4d10: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
4d20: 20 20 20 68 61 73 68 5f 73 74 65 70 5f 76 66 6f     hash_step_vfo
4d30: 72 6d 61 74 28 26 63 78 2c 22 42 25 64 3a 22 2c  rmat(&cx,"B%d:",
4d40: 6e 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n2);.           
4d50: 20 53 48 41 33 55 70 64 61 74 65 28 26 63 78 2c   SHA3Update(&cx,
4d60: 20 7a 32 2c 20 6e 32 29 3b 0a 20 20 20 20 20 20   z2, n2);.      
4d70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4d80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4d90: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
4da0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
4db0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
4dc0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
4dd0: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
4de0: 20 53 48 41 33 46 69 6e 61 6c 28 26 63 78 29 2c   SHA3Final(&cx),
4df0: 20 69 53 69 7a 65 2f 38 2c 20 53 51 4c 49 54 45   iSize/8, SQLITE
4e00: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a  _TRANSIENT);.}..
4e10: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74  /*.** Register t
4e20: 68 65 20 53 48 41 33 20 66 75 6e 63 74 69 6f 6e  he SHA3 function
4e30: 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  s on the databas
4e40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  e connection db.
4e50: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 79 20 65  .** Return any e
4e60: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
4e70: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
4e80: 33 53 68 61 33 49 6e 69 74 28 73 71 6c 69 74 65  3Sha3Init(sqlite
4e90: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63  3 *db){.  int rc
4ea0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4eb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
4ec0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
4ed0: 20 22 73 68 61 33 22 2c 20 31 2c 20 53 51 4c 49   "sha3", 1, SQLI
4ee0: 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 20 20 20 20 20 20 20 20 20 20 20 73 68 61 33 46             sha3F
4f10: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  unc, 0, 0);.  if
4f20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4f30: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4f40: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
4f50: 69 6f 6e 28 64 62 2c 20 22 73 68 61 33 22 2c 20  ion(db, "sha3", 
4f60: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
4f70: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f90: 20 20 20 20 73 68 61 33 46 75 6e 63 2c 20 30 2c      sha3Func, 0,
4fa0: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
4fb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4fc0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4fd0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
4fe0: 28 64 62 2c 20 22 73 68 61 33 5f 71 75 65 72 79  (db, "sha3_query
4ff0: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
5000: 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 20 20 20 20 73 68 61 33 51 75 65 72 79         sha3Query
5030: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Func, 0, 0);.  }
5040: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5050: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
5060: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
5070: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73 68  function(db, "sh
5080: 61 33 5f 71 75 65 72 79 22 2c 20 32 2c 20 53 51  a3_query", 2, SQ
5090: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
50c0: 68 61 33 51 75 65 72 79 46 75 6e 63 2c 20 30 2c  ha3QueryFunc, 0,
50d0: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
50e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
50f0: 65 67 69 73 74 72 61 74 69 6f 6e 20 65 6e 74 72  egistration entr
5100: 79 20 70 6f 69 6e 74 20 66 6f 72 20 77 68 65 6e  y point for when
5110: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   this module is 
5120: 63 6f 6d 70 69 6c 65 64 20 61 73 20 61 20 73 68  compiled as a sh
5130: 61 72 65 64 0a 2a 2a 20 6c 69 62 72 61 72 79 2e  ared.** library.
5140: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
5150: 54 45 5f 43 4f 52 45 0a 23 69 66 64 65 66 20 5f  TE_CORE.#ifdef _
5160: 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63  WIN32.__declspec
5170: 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64  (dllexport).#end
5180: 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  if.int sqlite3_s
5190: 68 61 74 68 72 65 65 5f 69 6e 69 74 28 0a 20 20  hathree_init(.  
51a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
51b0: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 0a  har **pzErrMsg,.
51c0: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
51d0: 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41  api_routines *pA
51e0: 70 69 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pi.){.  int rc =
51f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 51   SQLITE_OK;.  SQ
5200: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
5210: 4e 49 54 32 28 70 41 70 69 29 3b 0a 20 20 28 76  NIT2(pApi);.  (v
5220: 6f 69 64 29 70 7a 45 72 72 4d 73 67 3b 20 20 2f  oid)pzErrMsg;  /
5230: 2a 20 55 6e 75 73 65 64 20 70 61 72 61 6d 65 74  * Unused paramet
5240: 65 72 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  er */.  return s
5250: 71 6c 69 74 65 33 53 68 61 33 49 6e 69 74 28 64  qlite3Sha3Init(d
5260: 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  b);.}.#endif /* 
5270: 53 51 4c 49 54 45 5f 43 4f 52 45 20 2a 2f 0a 23  SQLITE_CORE */.#
5280: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
5290: 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c  d(SQLITE_CORE) |
52a0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
52b0: 5f 45 4e 41 42 4c 45 5f 53 48 41 33 29 20 2a 2f  _ENABLE_SHA3) */
52c0: 0a                                               .