/ Hex Artifact Content
Login

Artifact 22ba7ca84a433d6466a7d05dcc876910b435a715da8cc462517db9351412b8c8:


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 6e 63 6c 75 64 65 20  ed..*/.#include 
03d0: 22 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 53  "sqlite3ext.h".S
03e0: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
03f0: 49 4e 49 54 31 0a 23 69 6e 63 6c 75 64 65 20 3c  INIT1.#include <
0400: 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75  assert.h>.#inclu
0410: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69  de <string.h>.#i
0420: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
0430: 3e 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65  >.typedef sqlite
0440: 33 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 0a 2f  3_uint64 u64;../
0450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
04a0: 2a 20 54 68 65 20 48 61 73 68 20 45 6e 67 69 6e  * The Hash Engin
04b0: 65 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f  e.*/./*.** Macro
04c0: 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  s to determine w
04d0: 68 65 74 68 65 72 20 74 68 65 20 6d 61 63 68 69  hether the machi
04e0: 6e 65 20 69 73 20 62 69 67 20 6f 72 20 6c 69 74  ne is big or lit
04f0: 74 6c 65 20 65 6e 64 69 61 6e 2c 0a 2a 2a 20 61  tle endian,.** a
0500: 6e 64 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  nd whether or no
0510: 74 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 61  t that determina
0520: 74 69 6f 6e 20 69 73 20 72 75 6e 2d 74 69 6d 65  tion is run-time
0530: 20 6f 72 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   or compile-time
0540: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 62 65 73 74  ..**.** For best
0550: 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 61 6e   performance, an
0560: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
0570: 20 74 6f 20 67 75 65 73 73 20 61 74 20 74 68 65   to guess at the
0580: 20 62 79 74 65 2d 6f 72 64 65 72 0a 2a 2a 20 75   byte-order.** u
0590: 73 69 6e 67 20 43 2d 70 72 65 70 72 6f 63 65 73  sing C-preproces
05a0: 73 6f 72 20 6d 61 63 72 6f 73 2e 20 20 49 66 20  sor macros.  If 
05b0: 74 68 61 74 20 69 73 20 75 6e 73 75 63 63 65 73  that is unsucces
05c0: 73 66 75 6c 2c 20 6f 72 20 69 66 0a 2a 2a 20 2d  sful, or if.** -
05d0: 44 53 48 41 33 5f 42 59 54 45 4f 52 44 45 52 3d  DSHA3_BYTEORDER=
05e0: 30 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 62  0 is set, then b
05f0: 79 74 65 2d 6f 72 64 65 72 20 69 73 20 64 65 74  yte-order is det
0600: 65 72 6d 69 6e 65 64 0a 2a 2a 20 61 74 20 72 75  ermined.** at ru
0610: 6e 2d 74 69 6d 65 2e 0a 2a 2f 0a 23 69 66 6e 64  n-time..*/.#ifnd
0620: 65 66 20 53 48 41 33 5f 42 59 54 45 4f 52 44 45  ef SHA3_BYTEORDE
0630: 52 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28 69  R.# if defined(i
0640: 33 38 36 29 20 20 20 20 20 7c 7c 20 64 65 66 69  386)     || defi
0650: 6e 65 64 28 5f 5f 69 33 38 36 5f 5f 29 20 20 20  ned(__i386__)   
0660: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 4d 5f 49 58  || defined(_M_IX
0670: 38 36 29 20 7c 7c 20 20 20 20 5c 0a 20 20 20 20  86) ||    \.    
0680: 20 64 65 66 69 6e 65 64 28 5f 5f 78 38 36 5f 36   defined(__x86_6
0690: 34 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  4) || defined(__
06a0: 78 38 36 5f 36 34 5f 5f 29 20 7c 7c 20 64 65 66  x86_64__) || def
06b0: 69 6e 65 64 28 5f 4d 5f 58 36 34 29 20 20 7c 7c  ined(_M_X64)  ||
06c0: 20 20 20 20 5c 0a 20 20 20 20 20 64 65 66 69 6e      \.     defin
06d0: 65 64 28 5f 4d 5f 41 4d 44 36 34 29 20 7c 7c 20  ed(_M_AMD64) || 
06e0: 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 20  defined(_M_ARM) 
06f0: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f      || defined(_
0700: 5f 78 38 36 29 20 20 20 7c 7c 20 20 20 20 5c 0a  _x86)   ||    \.
0710: 20 20 20 20 20 64 65 66 69 6e 65 64 28 5f 5f 61       defined(__a
0720: 72 6d 5f 5f 29 0a 23 20 20 20 64 65 66 69 6e 65  rm__).#   define
0730: 20 53 48 41 33 5f 42 59 54 45 4f 52 44 45 52 20   SHA3_BYTEORDER 
0740: 20 20 20 31 32 33 34 0a 23 20 65 6c 69 66 20 64     1234.# elif d
0750: 65 66 69 6e 65 64 28 73 70 61 72 63 29 20 20 20  efined(sparc)   
0760: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 70 70   || defined(__pp
0770: 63 5f 5f 29 0a 23 20 20 20 64 65 66 69 6e 65 20  c__).#   define 
0780: 53 48 41 33 5f 42 59 54 45 4f 52 44 45 52 20 20  SHA3_BYTEORDER  
0790: 20 20 34 33 32 31 0a 23 20 65 6c 73 65 0a 23 20    4321.# else.# 
07a0: 20 20 64 65 66 69 6e 65 20 53 48 41 33 5f 42 59    define SHA3_BY
07b0: 54 45 4f 52 44 45 52 20 30 0a 23 20 65 6e 64 69  TEORDER 0.# endi
07c0: 66 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  f.#endif.../*.**
07d0: 20 53 74 61 74 65 20 73 74 72 75 63 74 75 72 65   State structure
07e0: 20 66 6f 72 20 61 20 53 48 41 33 20 68 61 73 68   for a SHA3 hash
07f0: 20 69 6e 20 70 72 6f 67 72 65 73 73 0a 2a 2f 0a   in progress.*/.
0800: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0810: 48 41 33 43 6f 6e 74 65 78 74 20 53 48 41 33 43  HA3Context SHA3C
0820: 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 53  ontext;.struct S
0830: 48 41 33 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  HA3Context {.  u
0840: 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 73  nion {.    u64 s
0850: 5b 32 35 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [25];           
0860: 20 20 20 20 20 2f 2a 20 4b 65 63 63 61 6b 20 73       /* Keccak s
0870: 74 61 74 65 2e 20 35 78 35 20 6c 69 6e 65 73 20  tate. 5x5 lines 
0880: 6f 66 20 36 34 20 62 69 74 73 20 65 61 63 68 20  of 64 bits each 
0890: 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
08a0: 63 68 61 72 20 78 5b 31 36 30 30 5d 3b 20 20 20  char x[1600];   
08b0: 20 2f 2a 20 2e 2e 2e 20 6f 72 20 31 36 30 30 20   /* ... or 1600 
08c0: 62 79 74 65 73 20 2a 2f 0a 20 20 7d 20 75 3b 0a  bytes */.  } u;.
08d0: 20 20 75 6e 73 69 67 6e 65 64 20 6e 52 61 74 65    unsigned nRate
08e0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  ;        /* Byte
08f0: 73 20 6f 66 20 69 6e 70 75 74 20 61 63 63 65 70  s of input accep
0900: 74 65 64 20 70 65 72 20 4b 65 63 63 61 6b 20 69  ted per Keccak i
0910: 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e  teration */.  un
0920: 73 69 67 6e 65 64 20 6e 4c 6f 61 64 65 64 3b 20  signed nLoaded; 
0930: 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 62 79       /* Input by
0940: 74 65 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  tes loaded into 
0950: 75 2e 78 5b 5d 20 73 6f 20 66 61 72 20 74 68 69  u.x[] so far thi
0960: 73 20 63 79 63 6c 65 20 2a 2f 0a 20 20 75 6e 73  s cycle */.  uns
0970: 69 67 6e 65 64 20 69 78 4d 61 73 6b 3b 20 20 20  igned ixMask;   
0980: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 6e 65      /* Insert ne
0990: 78 74 20 69 6e 70 75 74 20 69 6e 74 6f 20 75 2e  xt input into u.
09a0: 78 5b 6e 4c 6f 61 64 65 64 5e 69 78 4d 61 73 6b  x[nLoaded^ixMask
09b0: 5d 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ]. */.};../*.** 
09c0: 41 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  A single step of
09d0: 20 74 68 65 20 4b 65 63 63 61 6b 20 6d 69 78 69   the Keccak mixi
09e0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ng function for 
09f0: 61 20 31 36 30 30 2d 62 69 74 20 73 74 61 74 65  a 1600-bit state
0a00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0a10: 4b 65 63 63 61 6b 46 31 36 30 30 53 74 65 70 28  KeccakF1600Step(
0a20: 53 48 41 33 43 6f 6e 74 65 78 74 20 2a 70 29 7b  SHA3Context *p){
0a30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20  .  int i;.  u64 
0a40: 62 30 2c 20 62 31 2c 20 62 32 2c 20 62 33 2c 20  b0, b1, b2, b3, 
0a50: 62 34 3b 0a 20 20 75 36 34 20 63 30 2c 20 63 31  b4;.  u64 c0, c1
0a60: 2c 20 63 32 2c 20 63 33 2c 20 63 34 3b 0a 20 20  , c2, c3, c4;.  
0a70: 75 36 34 20 64 30 2c 20 64 31 2c 20 64 32 2c 20  u64 d0, d1, d2, 
0a80: 64 33 2c 20 64 34 3b 0a 20 20 73 74 61 74 69 63  d3, d4;.  static
0a90: 20 63 6f 6e 73 74 20 75 36 34 20 52 43 5b 5d 20   const u64 RC[] 
0aa0: 3d 20 7b 0a 20 20 20 20 30 78 30 30 30 30 30 30  = {.    0x000000
0ab0: 30 30 30 30 30 30 30 30 30 31 55 4c 4c 2c 20 20  0000000001ULL,  
0ac0: 30 78 30 30 30 30 30 30 30 30 30 30 30 30 38 30  0x00000000000080
0ad0: 38 32 55 4c 4c 2c 0a 20 20 20 20 30 78 38 30 30  82ULL,.    0x800
0ae0: 30 30 30 30 30 30 30 30 30 38 30 38 61 55 4c 4c  000000000808aULL
0af0: 2c 20 20 30 78 38 30 30 30 30 30 30 30 38 30 30  ,  0x80000000800
0b00: 30 38 30 30 30 55 4c 4c 2c 0a 20 20 20 20 30 78  08000ULL,.    0x
0b10: 30 30 30 30 30 30 30 30 30 30 30 30 38 30 38 62  000000000000808b
0b20: 55 4c 4c 2c 20 20 30 78 30 30 30 30 30 30 30 30  ULL,  0x00000000
0b30: 38 30 30 30 30 30 30 31 55 4c 4c 2c 0a 20 20 20  80000001ULL,.   
0b40: 20 30 78 38 30 30 30 30 30 30 30 38 30 30 30 38   0x8000000080008
0b50: 30 38 31 55 4c 4c 2c 20 20 30 78 38 30 30 30 30  081ULL,  0x80000
0b60: 30 30 30 30 30 30 30 38 30 30 39 55 4c 4c 2c 0a  00000008009ULL,.
0b70: 20 20 20 20 30 78 30 30 30 30 30 30 30 30 30 30      0x0000000000
0b80: 30 30 30 30 38 61 55 4c 4c 2c 20 20 30 78 30 30  00008aULL,  0x00
0b90: 30 30 30 30 30 30 30 30 30 30 30 30 38 38 55 4c  00000000000088UL
0ba0: 4c 2c 0a 20 20 20 20 30 78 30 30 30 30 30 30 30  L,.    0x0000000
0bb0: 30 38 30 30 30 38 30 30 39 55 4c 4c 2c 20 20 30  080008009ULL,  0
0bc0: 78 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30  x000000008000000
0bd0: 61 55 4c 4c 2c 0a 20 20 20 20 30 78 30 30 30 30  aULL,.    0x0000
0be0: 30 30 30 30 38 30 30 30 38 30 38 62 55 4c 4c 2c  00008000808bULL,
0bf0: 20 20 30 78 38 30 30 30 30 30 30 30 30 30 30 30    0x800000000000
0c00: 30 30 38 62 55 4c 4c 2c 0a 20 20 20 20 30 78 38  008bULL,.    0x8
0c10: 30 30 30 30 30 30 30 30 30 30 30 38 30 38 39 55  000000000008089U
0c20: 4c 4c 2c 20 20 30 78 38 30 30 30 30 30 30 30 30  LL,  0x800000000
0c30: 30 30 30 38 30 30 33 55 4c 4c 2c 0a 20 20 20 20  0008003ULL,.    
0c40: 30 78 38 30 30 30 30 30 30 30 30 30 30 30 38 30  0x80000000000080
0c50: 30 32 55 4c 4c 2c 20 20 30 78 38 30 30 30 30 30  02ULL,  0x800000
0c60: 30 30 30 30 30 30 30 30 38 30 55 4c 4c 2c 0a 20  0000000080ULL,. 
0c70: 20 20 20 30 78 30 30 30 30 30 30 30 30 30 30 30     0x00000000000
0c80: 30 38 30 30 61 55 4c 4c 2c 20 20 30 78 38 30 30  0800aULL,  0x800
0c90: 30 30 30 30 30 38 30 30 30 30 30 30 61 55 4c 4c  000008000000aULL
0ca0: 2c 0a 20 20 20 20 30 78 38 30 30 30 30 30 30 30  ,.    0x80000000
0cb0: 38 30 30 30 38 30 38 31 55 4c 4c 2c 20 20 30 78  80008081ULL,  0x
0cc0: 38 30 30 30 30 30 30 30 30 30 30 30 38 30 38 30  8000000000008080
0cd0: 55 4c 4c 2c 0a 20 20 20 20 30 78 30 30 30 30 30  ULL,.    0x00000
0ce0: 30 30 30 38 30 30 30 30 30 30 31 55 4c 4c 2c 20  00080000001ULL, 
0cf0: 20 30 78 38 30 30 30 30 30 30 30 38 30 30 30 38   0x8000000080008
0d00: 30 30 38 55 4c 4c 0a 20 20 7d 3b 0a 23 20 64 65  008ULL.  };.# de
0d10: 66 69 6e 65 20 61 30 30 20 28 70 2d 3e 75 2e 73  fine a00 (p->u.s
0d20: 5b 30 5d 29 0a 23 20 64 65 66 69 6e 65 20 61 30  [0]).# define a0
0d30: 31 20 28 70 2d 3e 75 2e 73 5b 31 5d 29 0a 23 20  1 (p->u.s[1]).# 
0d40: 64 65 66 69 6e 65 20 61 30 32 20 28 70 2d 3e 75  define a02 (p->u
0d50: 2e 73 5b 32 5d 29 0a 23 20 64 65 66 69 6e 65 20  .s[2]).# define 
0d60: 61 30 33 20 28 70 2d 3e 75 2e 73 5b 33 5d 29 0a  a03 (p->u.s[3]).
0d70: 23 20 64 65 66 69 6e 65 20 61 30 34 20 28 70 2d  # define a04 (p-
0d80: 3e 75 2e 73 5b 34 5d 29 0a 23 20 64 65 66 69 6e  >u.s[4]).# defin
0d90: 65 20 61 31 30 20 28 70 2d 3e 75 2e 73 5b 35 5d  e a10 (p->u.s[5]
0da0: 29 0a 23 20 64 65 66 69 6e 65 20 61 31 31 20 28  ).# define a11 (
0db0: 70 2d 3e 75 2e 73 5b 36 5d 29 0a 23 20 64 65 66  p->u.s[6]).# def
0dc0: 69 6e 65 20 61 31 32 20 28 70 2d 3e 75 2e 73 5b  ine a12 (p->u.s[
0dd0: 37 5d 29 0a 23 20 64 65 66 69 6e 65 20 61 31 33  7]).# define a13
0de0: 20 28 70 2d 3e 75 2e 73 5b 38 5d 29 0a 23 20 64   (p->u.s[8]).# d
0df0: 65 66 69 6e 65 20 61 31 34 20 28 70 2d 3e 75 2e  efine a14 (p->u.
0e00: 73 5b 39 5d 29 0a 23 20 64 65 66 69 6e 65 20 61  s[9]).# define a
0e10: 32 30 20 28 70 2d 3e 75 2e 73 5b 31 30 5d 29 0a  20 (p->u.s[10]).
0e20: 23 20 64 65 66 69 6e 65 20 61 32 31 20 28 70 2d  # define a21 (p-
0e30: 3e 75 2e 73 5b 31 31 5d 29 0a 23 20 64 65 66 69  >u.s[11]).# defi
0e40: 6e 65 20 61 32 32 20 28 70 2d 3e 75 2e 73 5b 31  ne a22 (p->u.s[1
0e50: 32 5d 29 0a 23 20 64 65 66 69 6e 65 20 61 32 33  2]).# define a23
0e60: 20 28 70 2d 3e 75 2e 73 5b 31 33 5d 29 0a 23 20   (p->u.s[13]).# 
0e70: 64 65 66 69 6e 65 20 61 32 34 20 28 70 2d 3e 75  define a24 (p->u
0e80: 2e 73 5b 31 34 5d 29 0a 23 20 64 65 66 69 6e 65  .s[14]).# define
0e90: 20 61 33 30 20 28 70 2d 3e 75 2e 73 5b 31 35 5d   a30 (p->u.s[15]
0ea0: 29 0a 23 20 64 65 66 69 6e 65 20 61 33 31 20 28  ).# define a31 (
0eb0: 70 2d 3e 75 2e 73 5b 31 36 5d 29 0a 23 20 64 65  p->u.s[16]).# de
0ec0: 66 69 6e 65 20 61 33 32 20 28 70 2d 3e 75 2e 73  fine a32 (p->u.s
0ed0: 5b 31 37 5d 29 0a 23 20 64 65 66 69 6e 65 20 61  [17]).# define a
0ee0: 33 33 20 28 70 2d 3e 75 2e 73 5b 31 38 5d 29 0a  33 (p->u.s[18]).
0ef0: 23 20 64 65 66 69 6e 65 20 61 33 34 20 28 70 2d  # define a34 (p-
0f00: 3e 75 2e 73 5b 31 39 5d 29 0a 23 20 64 65 66 69  >u.s[19]).# defi
0f10: 6e 65 20 61 34 30 20 28 70 2d 3e 75 2e 73 5b 32  ne a40 (p->u.s[2
0f20: 30 5d 29 0a 23 20 64 65 66 69 6e 65 20 61 34 31  0]).# define a41
0f30: 20 28 70 2d 3e 75 2e 73 5b 32 31 5d 29 0a 23 20   (p->u.s[21]).# 
0f40: 64 65 66 69 6e 65 20 61 34 32 20 28 70 2d 3e 75  define a42 (p->u
0f50: 2e 73 5b 32 32 5d 29 0a 23 20 64 65 66 69 6e 65  .s[22]).# define
0f60: 20 61 34 33 20 28 70 2d 3e 75 2e 73 5b 32 33 5d   a43 (p->u.s[23]
0f70: 29 0a 23 20 64 65 66 69 6e 65 20 61 34 34 20 28  ).# define a44 (
0f80: 70 2d 3e 75 2e 73 5b 32 34 5d 29 0a 23 20 64 65  p->u.s[24]).# de
0f90: 66 69 6e 65 20 52 4f 4c 36 34 28 61 2c 78 29 20  fine ROL64(a,x) 
0fa0: 28 28 61 3c 3c 78 29 7c 28 61 3e 3e 28 36 34 2d  ((a<<x)|(a>>(64-
0fb0: 78 29 29 29 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  x)))..  for(i=0;
0fc0: 20 69 3c 32 34 3b 20 69 2b 3d 34 29 7b 0a 20 20   i<24; i+=4){.  
0fd0: 20 20 63 30 20 3d 20 61 30 30 5e 61 31 30 5e 61    c0 = a00^a10^a
0fe0: 32 30 5e 61 33 30 5e 61 34 30 3b 0a 20 20 20 20  20^a30^a40;.    
0ff0: 63 31 20 3d 20 61 30 31 5e 61 31 31 5e 61 32 31  c1 = a01^a11^a21
1000: 5e 61 33 31 5e 61 34 31 3b 0a 20 20 20 20 63 32  ^a31^a41;.    c2
1010: 20 3d 20 61 30 32 5e 61 31 32 5e 61 32 32 5e 61   = a02^a12^a22^a
1020: 33 32 5e 61 34 32 3b 0a 20 20 20 20 63 33 20 3d  32^a42;.    c3 =
1030: 20 61 30 33 5e 61 31 33 5e 61 32 33 5e 61 33 33   a03^a13^a23^a33
1040: 5e 61 34 33 3b 0a 20 20 20 20 63 34 20 3d 20 61  ^a43;.    c4 = a
1050: 30 34 5e 61 31 34 5e 61 32 34 5e 61 33 34 5e 61  04^a14^a24^a34^a
1060: 34 34 3b 0a 20 20 20 20 64 30 20 3d 20 63 34 5e  44;.    d0 = c4^
1070: 52 4f 4c 36 34 28 63 31 2c 20 31 29 3b 0a 20 20  ROL64(c1, 1);.  
1080: 20 20 64 31 20 3d 20 63 30 5e 52 4f 4c 36 34 28    d1 = c0^ROL64(
1090: 63 32 2c 20 31 29 3b 0a 20 20 20 20 64 32 20 3d  c2, 1);.    d2 =
10a0: 20 63 31 5e 52 4f 4c 36 34 28 63 33 2c 20 31 29   c1^ROL64(c3, 1)
10b0: 3b 0a 20 20 20 20 64 33 20 3d 20 63 32 5e 52 4f  ;.    d3 = c2^RO
10c0: 4c 36 34 28 63 34 2c 20 31 29 3b 0a 20 20 20 20  L64(c4, 1);.    
10d0: 64 34 20 3d 20 63 33 5e 52 4f 4c 36 34 28 63 30  d4 = c3^ROL64(c0
10e0: 2c 20 31 29 3b 0a 0a 20 20 20 20 62 30 20 3d 20  , 1);..    b0 = 
10f0: 28 61 30 30 5e 64 30 29 3b 0a 20 20 20 20 62 31  (a00^d0);.    b1
1100: 20 3d 20 52 4f 4c 36 34 28 28 61 31 31 5e 64 31   = ROL64((a11^d1
1110: 29 2c 20 34 34 29 3b 0a 20 20 20 20 62 32 20 3d  ), 44);.    b2 =
1120: 20 52 4f 4c 36 34 28 28 61 32 32 5e 64 32 29 2c   ROL64((a22^d2),
1130: 20 34 33 29 3b 0a 20 20 20 20 62 33 20 3d 20 52   43);.    b3 = R
1140: 4f 4c 36 34 28 28 61 33 33 5e 64 33 29 2c 20 32  OL64((a33^d3), 2
1150: 31 29 3b 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c  1);.    b4 = ROL
1160: 36 34 28 28 61 34 34 5e 64 34 29 2c 20 31 34 29  64((a44^d4), 14)
1170: 3b 0a 20 20 20 20 61 30 30 20 3d 20 20 20 62 30  ;.    a00 =   b0
1180: 20 5e 28 28 7e 62 31 29 26 20 20 62 32 20 29 3b   ^((~b1)&  b2 );
1190: 0a 20 20 20 20 61 30 30 20 5e 3d 20 52 43 5b 69  .    a00 ^= RC[i
11a0: 5d 3b 0a 20 20 20 20 61 31 31 20 3d 20 20 20 62  ];.    a11 =   b
11b0: 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33 20 29  1 ^((~b2)&  b3 )
11c0: 3b 0a 20 20 20 20 61 32 32 20 3d 20 20 20 62 32  ;.    a22 =   b2
11d0: 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20 29 3b   ^((~b3)&  b4 );
11e0: 0a 20 20 20 20 61 33 33 20 3d 20 20 20 62 33 20  .    a33 =   b3 
11f0: 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29 3b 0a  ^((~b4)&  b0 );.
1200: 20 20 20 20 61 34 34 20 3d 20 20 20 62 34 20 5e      a44 =   b4 ^
1210: 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b 0a 0a  ((~b0)&  b1 );..
1220: 20 20 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28      b2 = ROL64((
1230: 61 32 30 5e 64 30 29 2c 20 33 29 3b 0a 20 20 20  a20^d0), 3);.   
1240: 20 62 33 20 3d 20 52 4f 4c 36 34 28 28 61 33 31   b3 = ROL64((a31
1250: 5e 64 31 29 2c 20 34 35 29 3b 0a 20 20 20 20 62  ^d1), 45);.    b
1260: 34 20 3d 20 52 4f 4c 36 34 28 28 61 34 32 5e 64  4 = ROL64((a42^d
1270: 32 29 2c 20 36 31 29 3b 0a 20 20 20 20 62 30 20  2), 61);.    b0 
1280: 3d 20 52 4f 4c 36 34 28 28 61 30 33 5e 64 33 29  = ROL64((a03^d3)
1290: 2c 20 32 38 29 3b 0a 20 20 20 20 62 31 20 3d 20  , 28);.    b1 = 
12a0: 52 4f 4c 36 34 28 28 61 31 34 5e 64 34 29 2c 20  ROL64((a14^d4), 
12b0: 32 30 29 3b 0a 20 20 20 20 61 32 30 20 3d 20 20  20);.    a20 =  
12c0: 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62 32   b0 ^((~b1)&  b2
12d0: 20 29 3b 0a 20 20 20 20 61 33 31 20 3d 20 20 20   );.    a31 =   
12e0: 62 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33 20  b1 ^((~b2)&  b3 
12f0: 29 3b 0a 20 20 20 20 61 34 32 20 3d 20 20 20 62  );.    a42 =   b
1300: 32 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20 29  2 ^((~b3)&  b4 )
1310: 3b 0a 20 20 20 20 61 30 33 20 3d 20 20 20 62 33  ;.    a03 =   b3
1320: 20 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29 3b   ^((~b4)&  b0 );
1330: 0a 20 20 20 20 61 31 34 20 3d 20 20 20 62 34 20  .    a14 =   b4 
1340: 5e 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b 0a  ^((~b0)&  b1 );.
1350: 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34 28  .    b4 = ROL64(
1360: 28 61 34 30 5e 64 30 29 2c 20 31 38 29 3b 0a 20  (a40^d0), 18);. 
1370: 20 20 20 62 30 20 3d 20 52 4f 4c 36 34 28 28 61     b0 = ROL64((a
1380: 30 31 5e 64 31 29 2c 20 31 29 3b 0a 20 20 20 20  01^d1), 1);.    
1390: 62 31 20 3d 20 52 4f 4c 36 34 28 28 61 31 32 5e  b1 = ROL64((a12^
13a0: 64 32 29 2c 20 36 29 3b 0a 20 20 20 20 62 32 20  d2), 6);.    b2 
13b0: 3d 20 52 4f 4c 36 34 28 28 61 32 33 5e 64 33 29  = ROL64((a23^d3)
13c0: 2c 20 32 35 29 3b 0a 20 20 20 20 62 33 20 3d 20  , 25);.    b3 = 
13d0: 52 4f 4c 36 34 28 28 61 33 34 5e 64 34 29 2c 20  ROL64((a34^d4), 
13e0: 38 29 3b 0a 20 20 20 20 61 34 30 20 3d 20 20 20  8);.    a40 =   
13f0: 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62 32 20  b0 ^((~b1)&  b2 
1400: 29 3b 0a 20 20 20 20 61 30 31 20 3d 20 20 20 62  );.    a01 =   b
1410: 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33 20 29  1 ^((~b2)&  b3 )
1420: 3b 0a 20 20 20 20 61 31 32 20 3d 20 20 20 62 32  ;.    a12 =   b2
1430: 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20 29 3b   ^((~b3)&  b4 );
1440: 0a 20 20 20 20 61 32 33 20 3d 20 20 20 62 33 20  .    a23 =   b3 
1450: 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29 3b 0a  ^((~b4)&  b0 );.
1460: 20 20 20 20 61 33 34 20 3d 20 20 20 62 34 20 5e      a34 =   b4 ^
1470: 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b 0a 0a  ((~b0)&  b1 );..
1480: 20 20 20 20 62 31 20 3d 20 52 4f 4c 36 34 28 28      b1 = ROL64((
1490: 61 31 30 5e 64 30 29 2c 20 33 36 29 3b 0a 20 20  a10^d0), 36);.  
14a0: 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28 61 32    b2 = ROL64((a2
14b0: 31 5e 64 31 29 2c 20 31 30 29 3b 0a 20 20 20 20  1^d1), 10);.    
14c0: 62 33 20 3d 20 52 4f 4c 36 34 28 28 61 33 32 5e  b3 = ROL64((a32^
14d0: 64 32 29 2c 20 31 35 29 3b 0a 20 20 20 20 62 34  d2), 15);.    b4
14e0: 20 3d 20 52 4f 4c 36 34 28 28 61 34 33 5e 64 33   = ROL64((a43^d3
14f0: 29 2c 20 35 36 29 3b 0a 20 20 20 20 62 30 20 3d  ), 56);.    b0 =
1500: 20 52 4f 4c 36 34 28 28 61 30 34 5e 64 34 29 2c   ROL64((a04^d4),
1510: 20 32 37 29 3b 0a 20 20 20 20 61 31 30 20 3d 20   27);.    a10 = 
1520: 20 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62    b0 ^((~b1)&  b
1530: 32 20 29 3b 0a 20 20 20 20 61 32 31 20 3d 20 20  2 );.    a21 =  
1540: 20 62 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33   b1 ^((~b2)&  b3
1550: 20 29 3b 0a 20 20 20 20 61 33 32 20 3d 20 20 20   );.    a32 =   
1560: 62 32 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20  b2 ^((~b3)&  b4 
1570: 29 3b 0a 20 20 20 20 61 34 33 20 3d 20 20 20 62  );.    a43 =   b
1580: 33 20 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29  3 ^((~b4)&  b0 )
1590: 3b 0a 20 20 20 20 61 30 34 20 3d 20 20 20 62 34  ;.    a04 =   b4
15a0: 20 5e 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b   ^((~b0)&  b1 );
15b0: 0a 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c 36 34  ..    b3 = ROL64
15c0: 28 28 61 33 30 5e 64 30 29 2c 20 34 31 29 3b 0a  ((a30^d0), 41);.
15d0: 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34 28 28      b4 = ROL64((
15e0: 61 34 31 5e 64 31 29 2c 20 32 29 3b 0a 20 20 20  a41^d1), 2);.   
15f0: 20 62 30 20 3d 20 52 4f 4c 36 34 28 28 61 30 32   b0 = ROL64((a02
1600: 5e 64 32 29 2c 20 36 32 29 3b 0a 20 20 20 20 62  ^d2), 62);.    b
1610: 31 20 3d 20 52 4f 4c 36 34 28 28 61 31 33 5e 64  1 = ROL64((a13^d
1620: 33 29 2c 20 35 35 29 3b 0a 20 20 20 20 62 32 20  3), 55);.    b2 
1630: 3d 20 52 4f 4c 36 34 28 28 61 32 34 5e 64 34 29  = ROL64((a24^d4)
1640: 2c 20 33 39 29 3b 0a 20 20 20 20 61 33 30 20 3d  , 39);.    a30 =
1650: 20 20 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20     b0 ^((~b1)&  
1660: 62 32 20 29 3b 0a 20 20 20 20 61 34 31 20 3d 20  b2 );.    a41 = 
1670: 20 20 62 31 20 5e 28 28 7e 62 32 29 26 20 20 62    b1 ^((~b2)&  b
1680: 33 20 29 3b 0a 20 20 20 20 61 30 32 20 3d 20 20  3 );.    a02 =  
1690: 20 62 32 20 5e 28 28 7e 62 33 29 26 20 20 62 34   b2 ^((~b3)&  b4
16a0: 20 29 3b 0a 20 20 20 20 61 31 33 20 3d 20 20 20   );.    a13 =   
16b0: 62 33 20 5e 28 28 7e 62 34 29 26 20 20 62 30 20  b3 ^((~b4)&  b0 
16c0: 29 3b 0a 20 20 20 20 61 32 34 20 3d 20 20 20 62  );.    a24 =   b
16d0: 34 20 5e 28 28 7e 62 30 29 26 20 20 62 31 20 29  4 ^((~b0)&  b1 )
16e0: 3b 0a 0a 20 20 20 20 63 30 20 3d 20 61 30 30 5e  ;..    c0 = a00^
16f0: 61 32 30 5e 61 34 30 5e 61 31 30 5e 61 33 30 3b  a20^a40^a10^a30;
1700: 0a 20 20 20 20 63 31 20 3d 20 61 31 31 5e 61 33  .    c1 = a11^a3
1710: 31 5e 61 30 31 5e 61 32 31 5e 61 34 31 3b 0a 20  1^a01^a21^a41;. 
1720: 20 20 20 63 32 20 3d 20 61 32 32 5e 61 34 32 5e     c2 = a22^a42^
1730: 61 31 32 5e 61 33 32 5e 61 30 32 3b 0a 20 20 20  a12^a32^a02;.   
1740: 20 63 33 20 3d 20 61 33 33 5e 61 30 33 5e 61 32   c3 = a33^a03^a2
1750: 33 5e 61 34 33 5e 61 31 33 3b 0a 20 20 20 20 63  3^a43^a13;.    c
1760: 34 20 3d 20 61 34 34 5e 61 31 34 5e 61 33 34 5e  4 = a44^a14^a34^
1770: 61 30 34 5e 61 32 34 3b 0a 20 20 20 20 64 30 20  a04^a24;.    d0 
1780: 3d 20 63 34 5e 52 4f 4c 36 34 28 63 31 2c 20 31  = c4^ROL64(c1, 1
1790: 29 3b 0a 20 20 20 20 64 31 20 3d 20 63 30 5e 52  );.    d1 = c0^R
17a0: 4f 4c 36 34 28 63 32 2c 20 31 29 3b 0a 20 20 20  OL64(c2, 1);.   
17b0: 20 64 32 20 3d 20 63 31 5e 52 4f 4c 36 34 28 63   d2 = c1^ROL64(c
17c0: 33 2c 20 31 29 3b 0a 20 20 20 20 64 33 20 3d 20  3, 1);.    d3 = 
17d0: 63 32 5e 52 4f 4c 36 34 28 63 34 2c 20 31 29 3b  c2^ROL64(c4, 1);
17e0: 0a 20 20 20 20 64 34 20 3d 20 63 33 5e 52 4f 4c  .    d4 = c3^ROL
17f0: 36 34 28 63 30 2c 20 31 29 3b 0a 0a 20 20 20 20  64(c0, 1);..    
1800: 62 30 20 3d 20 28 61 30 30 5e 64 30 29 3b 0a 20  b0 = (a00^d0);. 
1810: 20 20 20 62 31 20 3d 20 52 4f 4c 36 34 28 28 61     b1 = ROL64((a
1820: 33 31 5e 64 31 29 2c 20 34 34 29 3b 0a 20 20 20  31^d1), 44);.   
1830: 20 62 32 20 3d 20 52 4f 4c 36 34 28 28 61 31 32   b2 = ROL64((a12
1840: 5e 64 32 29 2c 20 34 33 29 3b 0a 20 20 20 20 62  ^d2), 43);.    b
1850: 33 20 3d 20 52 4f 4c 36 34 28 28 61 34 33 5e 64  3 = ROL64((a43^d
1860: 33 29 2c 20 32 31 29 3b 0a 20 20 20 20 62 34 20  3), 21);.    b4 
1870: 3d 20 52 4f 4c 36 34 28 28 61 32 34 5e 64 34 29  = ROL64((a24^d4)
1880: 2c 20 31 34 29 3b 0a 20 20 20 20 61 30 30 20 3d  , 14);.    a00 =
1890: 20 20 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20     b0 ^((~b1)&  
18a0: 62 32 20 29 3b 0a 20 20 20 20 61 30 30 20 5e 3d  b2 );.    a00 ^=
18b0: 20 52 43 5b 69 2b 31 5d 3b 0a 20 20 20 20 61 33   RC[i+1];.    a3
18c0: 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62 32 29  1 =   b1 ^((~b2)
18d0: 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61 31 32  &  b3 );.    a12
18e0: 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33 29 26   =   b2 ^((~b3)&
18f0: 20 20 62 34 20 29 3b 0a 20 20 20 20 61 34 33 20    b4 );.    a43 
1900: 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29 26 20  =   b3 ^((~b4)& 
1910: 20 62 30 20 29 3b 0a 20 20 20 20 61 32 34 20 3d   b0 );.    a24 =
1920: 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26 20 20     b4 ^((~b0)&  
1930: 62 31 20 29 3b 0a 0a 20 20 20 20 62 32 20 3d 20  b1 );..    b2 = 
1940: 52 4f 4c 36 34 28 28 61 34 30 5e 64 30 29 2c 20  ROL64((a40^d0), 
1950: 33 29 3b 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c  3);.    b3 = ROL
1960: 36 34 28 28 61 32 31 5e 64 31 29 2c 20 34 35 29  64((a21^d1), 45)
1970: 3b 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34  ;.    b4 = ROL64
1980: 28 28 61 30 32 5e 64 32 29 2c 20 36 31 29 3b 0a  ((a02^d2), 61);.
1990: 20 20 20 20 62 30 20 3d 20 52 4f 4c 36 34 28 28      b0 = ROL64((
19a0: 61 33 33 5e 64 33 29 2c 20 32 38 29 3b 0a 20 20  a33^d3), 28);.  
19b0: 20 20 62 31 20 3d 20 52 4f 4c 36 34 28 28 61 31    b1 = ROL64((a1
19c0: 34 5e 64 34 29 2c 20 32 30 29 3b 0a 20 20 20 20  4^d4), 20);.    
19d0: 61 34 30 20 3d 20 20 20 62 30 20 5e 28 28 7e 62  a40 =   b0 ^((~b
19e0: 31 29 26 20 20 62 32 20 29 3b 0a 20 20 20 20 61  1)&  b2 );.    a
19f0: 32 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62 32  21 =   b1 ^((~b2
1a00: 29 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61 30  )&  b3 );.    a0
1a10: 32 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33 29  2 =   b2 ^((~b3)
1a20: 26 20 20 62 34 20 29 3b 0a 20 20 20 20 61 33 33  &  b4 );.    a33
1a30: 20 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29 26   =   b3 ^((~b4)&
1a40: 20 20 62 30 20 29 3b 0a 20 20 20 20 61 31 34 20    b0 );.    a14 
1a50: 3d 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26 20  =   b4 ^((~b0)& 
1a60: 20 62 31 20 29 3b 0a 0a 20 20 20 20 62 34 20 3d   b1 );..    b4 =
1a70: 20 52 4f 4c 36 34 28 28 61 33 30 5e 64 30 29 2c   ROL64((a30^d0),
1a80: 20 31 38 29 3b 0a 20 20 20 20 62 30 20 3d 20 52   18);.    b0 = R
1a90: 4f 4c 36 34 28 28 61 31 31 5e 64 31 29 2c 20 31  OL64((a11^d1), 1
1aa0: 29 3b 0a 20 20 20 20 62 31 20 3d 20 52 4f 4c 36  );.    b1 = ROL6
1ab0: 34 28 28 61 34 32 5e 64 32 29 2c 20 36 29 3b 0a  4((a42^d2), 6);.
1ac0: 20 20 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28      b2 = ROL64((
1ad0: 61 32 33 5e 64 33 29 2c 20 32 35 29 3b 0a 20 20  a23^d3), 25);.  
1ae0: 20 20 62 33 20 3d 20 52 4f 4c 36 34 28 28 61 30    b3 = ROL64((a0
1af0: 34 5e 64 34 29 2c 20 38 29 3b 0a 20 20 20 20 61  4^d4), 8);.    a
1b00: 33 30 20 3d 20 20 20 62 30 20 5e 28 28 7e 62 31  30 =   b0 ^((~b1
1b10: 29 26 20 20 62 32 20 29 3b 0a 20 20 20 20 61 31  )&  b2 );.    a1
1b20: 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62 32 29  1 =   b1 ^((~b2)
1b30: 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61 34 32  &  b3 );.    a42
1b40: 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33 29 26   =   b2 ^((~b3)&
1b50: 20 20 62 34 20 29 3b 0a 20 20 20 20 61 32 33 20    b4 );.    a23 
1b60: 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29 26 20  =   b3 ^((~b4)& 
1b70: 20 62 30 20 29 3b 0a 20 20 20 20 61 30 34 20 3d   b0 );.    a04 =
1b80: 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26 20 20     b4 ^((~b0)&  
1b90: 62 31 20 29 3b 0a 0a 20 20 20 20 62 31 20 3d 20  b1 );..    b1 = 
1ba0: 52 4f 4c 36 34 28 28 61 32 30 5e 64 30 29 2c 20  ROL64((a20^d0), 
1bb0: 33 36 29 3b 0a 20 20 20 20 62 32 20 3d 20 52 4f  36);.    b2 = RO
1bc0: 4c 36 34 28 28 61 30 31 5e 64 31 29 2c 20 31 30  L64((a01^d1), 10
1bd0: 29 3b 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c 36  );.    b3 = ROL6
1be0: 34 28 28 61 33 32 5e 64 32 29 2c 20 31 35 29 3b  4((a32^d2), 15);
1bf0: 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34 28  .    b4 = ROL64(
1c00: 28 61 31 33 5e 64 33 29 2c 20 35 36 29 3b 0a 20  (a13^d3), 56);. 
1c10: 20 20 20 62 30 20 3d 20 52 4f 4c 36 34 28 28 61     b0 = ROL64((a
1c20: 34 34 5e 64 34 29 2c 20 32 37 29 3b 0a 20 20 20  44^d4), 27);.   
1c30: 20 61 32 30 20 3d 20 20 20 62 30 20 5e 28 28 7e   a20 =   b0 ^((~
1c40: 62 31 29 26 20 20 62 32 20 29 3b 0a 20 20 20 20  b1)&  b2 );.    
1c50: 61 30 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62  a01 =   b1 ^((~b
1c60: 32 29 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61  2)&  b3 );.    a
1c70: 33 32 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33  32 =   b2 ^((~b3
1c80: 29 26 20 20 62 34 20 29 3b 0a 20 20 20 20 61 31  )&  b4 );.    a1
1c90: 33 20 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29  3 =   b3 ^((~b4)
1ca0: 26 20 20 62 30 20 29 3b 0a 20 20 20 20 61 34 34  &  b0 );.    a44
1cb0: 20 3d 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26   =   b4 ^((~b0)&
1cc0: 20 20 62 31 20 29 3b 0a 0a 20 20 20 20 62 33 20    b1 );..    b3 
1cd0: 3d 20 52 4f 4c 36 34 28 28 61 31 30 5e 64 30 29  = ROL64((a10^d0)
1ce0: 2c 20 34 31 29 3b 0a 20 20 20 20 62 34 20 3d 20  , 41);.    b4 = 
1cf0: 52 4f 4c 36 34 28 28 61 34 31 5e 64 31 29 2c 20  ROL64((a41^d1), 
1d00: 32 29 3b 0a 20 20 20 20 62 30 20 3d 20 52 4f 4c  2);.    b0 = ROL
1d10: 36 34 28 28 61 32 32 5e 64 32 29 2c 20 36 32 29  64((a22^d2), 62)
1d20: 3b 0a 20 20 20 20 62 31 20 3d 20 52 4f 4c 36 34  ;.    b1 = ROL64
1d30: 28 28 61 30 33 5e 64 33 29 2c 20 35 35 29 3b 0a  ((a03^d3), 55);.
1d40: 20 20 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28      b2 = ROL64((
1d50: 61 33 34 5e 64 34 29 2c 20 33 39 29 3b 0a 20 20  a34^d4), 39);.  
1d60: 20 20 61 31 30 20 3d 20 20 20 62 30 20 5e 28 28    a10 =   b0 ^((
1d70: 7e 62 31 29 26 20 20 62 32 20 29 3b 0a 20 20 20  ~b1)&  b2 );.   
1d80: 20 61 34 31 20 3d 20 20 20 62 31 20 5e 28 28 7e   a41 =   b1 ^((~
1d90: 62 32 29 26 20 20 62 33 20 29 3b 0a 20 20 20 20  b2)&  b3 );.    
1da0: 61 32 32 20 3d 20 20 20 62 32 20 5e 28 28 7e 62  a22 =   b2 ^((~b
1db0: 33 29 26 20 20 62 34 20 29 3b 0a 20 20 20 20 61  3)&  b4 );.    a
1dc0: 30 33 20 3d 20 20 20 62 33 20 5e 28 28 7e 62 34  03 =   b3 ^((~b4
1dd0: 29 26 20 20 62 30 20 29 3b 0a 20 20 20 20 61 33  )&  b0 );.    a3
1de0: 34 20 3d 20 20 20 62 34 20 5e 28 28 7e 62 30 29  4 =   b4 ^((~b0)
1df0: 26 20 20 62 31 20 29 3b 0a 0a 20 20 20 20 63 30  &  b1 );..    c0
1e00: 20 3d 20 61 30 30 5e 61 34 30 5e 61 33 30 5e 61   = a00^a40^a30^a
1e10: 32 30 5e 61 31 30 3b 0a 20 20 20 20 63 31 20 3d  20^a10;.    c1 =
1e20: 20 61 33 31 5e 61 32 31 5e 61 31 31 5e 61 30 31   a31^a21^a11^a01
1e30: 5e 61 34 31 3b 0a 20 20 20 20 63 32 20 3d 20 61  ^a41;.    c2 = a
1e40: 31 32 5e 61 30 32 5e 61 34 32 5e 61 33 32 5e 61  12^a02^a42^a32^a
1e50: 32 32 3b 0a 20 20 20 20 63 33 20 3d 20 61 34 33  22;.    c3 = a43
1e60: 5e 61 33 33 5e 61 32 33 5e 61 31 33 5e 61 30 33  ^a33^a23^a13^a03
1e70: 3b 0a 20 20 20 20 63 34 20 3d 20 61 32 34 5e 61  ;.    c4 = a24^a
1e80: 31 34 5e 61 30 34 5e 61 34 34 5e 61 33 34 3b 0a  14^a04^a44^a34;.
1e90: 20 20 20 20 64 30 20 3d 20 63 34 5e 52 4f 4c 36      d0 = c4^ROL6
1ea0: 34 28 63 31 2c 20 31 29 3b 0a 20 20 20 20 64 31  4(c1, 1);.    d1
1eb0: 20 3d 20 63 30 5e 52 4f 4c 36 34 28 63 32 2c 20   = c0^ROL64(c2, 
1ec0: 31 29 3b 0a 20 20 20 20 64 32 20 3d 20 63 31 5e  1);.    d2 = c1^
1ed0: 52 4f 4c 36 34 28 63 33 2c 20 31 29 3b 0a 20 20  ROL64(c3, 1);.  
1ee0: 20 20 64 33 20 3d 20 63 32 5e 52 4f 4c 36 34 28    d3 = c2^ROL64(
1ef0: 63 34 2c 20 31 29 3b 0a 20 20 20 20 64 34 20 3d  c4, 1);.    d4 =
1f00: 20 63 33 5e 52 4f 4c 36 34 28 63 30 2c 20 31 29   c3^ROL64(c0, 1)
1f10: 3b 0a 0a 20 20 20 20 62 30 20 3d 20 28 61 30 30  ;..    b0 = (a00
1f20: 5e 64 30 29 3b 0a 20 20 20 20 62 31 20 3d 20 52  ^d0);.    b1 = R
1f30: 4f 4c 36 34 28 28 61 32 31 5e 64 31 29 2c 20 34  OL64((a21^d1), 4
1f40: 34 29 3b 0a 20 20 20 20 62 32 20 3d 20 52 4f 4c  4);.    b2 = ROL
1f50: 36 34 28 28 61 34 32 5e 64 32 29 2c 20 34 33 29  64((a42^d2), 43)
1f60: 3b 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c 36 34  ;.    b3 = ROL64
1f70: 28 28 61 31 33 5e 64 33 29 2c 20 32 31 29 3b 0a  ((a13^d3), 21);.
1f80: 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34 28 28      b4 = ROL64((
1f90: 61 33 34 5e 64 34 29 2c 20 31 34 29 3b 0a 20 20  a34^d4), 14);.  
1fa0: 20 20 61 30 30 20 3d 20 20 20 62 30 20 5e 28 28    a00 =   b0 ^((
1fb0: 7e 62 31 29 26 20 20 62 32 20 29 3b 0a 20 20 20  ~b1)&  b2 );.   
1fc0: 20 61 30 30 20 5e 3d 20 52 43 5b 69 2b 32 5d 3b   a00 ^= RC[i+2];
1fd0: 0a 20 20 20 20 61 32 31 20 3d 20 20 20 62 31 20  .    a21 =   b1 
1fe0: 5e 28 28 7e 62 32 29 26 20 20 62 33 20 29 3b 0a  ^((~b2)&  b3 );.
1ff0: 20 20 20 20 61 34 32 20 3d 20 20 20 62 32 20 5e      a42 =   b2 ^
2000: 28 28 7e 62 33 29 26 20 20 62 34 20 29 3b 0a 20  ((~b3)&  b4 );. 
2010: 20 20 20 61 31 33 20 3d 20 20 20 62 33 20 5e 28     a13 =   b3 ^(
2020: 28 7e 62 34 29 26 20 20 62 30 20 29 3b 0a 20 20  (~b4)&  b0 );.  
2030: 20 20 61 33 34 20 3d 20 20 20 62 34 20 5e 28 28    a34 =   b4 ^((
2040: 7e 62 30 29 26 20 20 62 31 20 29 3b 0a 0a 20 20  ~b0)&  b1 );..  
2050: 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28 61 33    b2 = ROL64((a3
2060: 30 5e 64 30 29 2c 20 33 29 3b 0a 20 20 20 20 62  0^d0), 3);.    b
2070: 33 20 3d 20 52 4f 4c 36 34 28 28 61 30 31 5e 64  3 = ROL64((a01^d
2080: 31 29 2c 20 34 35 29 3b 0a 20 20 20 20 62 34 20  1), 45);.    b4 
2090: 3d 20 52 4f 4c 36 34 28 28 61 32 32 5e 64 32 29  = ROL64((a22^d2)
20a0: 2c 20 36 31 29 3b 0a 20 20 20 20 62 30 20 3d 20  , 61);.    b0 = 
20b0: 52 4f 4c 36 34 28 28 61 34 33 5e 64 33 29 2c 20  ROL64((a43^d3), 
20c0: 32 38 29 3b 0a 20 20 20 20 62 31 20 3d 20 52 4f  28);.    b1 = RO
20d0: 4c 36 34 28 28 61 31 34 5e 64 34 29 2c 20 32 30  L64((a14^d4), 20
20e0: 29 3b 0a 20 20 20 20 61 33 30 20 3d 20 20 20 62  );.    a30 =   b
20f0: 30 20 5e 28 28 7e 62 31 29 26 20 20 62 32 20 29  0 ^((~b1)&  b2 )
2100: 3b 0a 20 20 20 20 61 30 31 20 3d 20 20 20 62 31  ;.    a01 =   b1
2110: 20 5e 28 28 7e 62 32 29 26 20 20 62 33 20 29 3b   ^((~b2)&  b3 );
2120: 0a 20 20 20 20 61 32 32 20 3d 20 20 20 62 32 20  .    a22 =   b2 
2130: 5e 28 28 7e 62 33 29 26 20 20 62 34 20 29 3b 0a  ^((~b3)&  b4 );.
2140: 20 20 20 20 61 34 33 20 3d 20 20 20 62 33 20 5e      a43 =   b3 ^
2150: 28 28 7e 62 34 29 26 20 20 62 30 20 29 3b 0a 20  ((~b4)&  b0 );. 
2160: 20 20 20 61 31 34 20 3d 20 20 20 62 34 20 5e 28     a14 =   b4 ^(
2170: 28 7e 62 30 29 26 20 20 62 31 20 29 3b 0a 0a 20  (~b0)&  b1 );.. 
2180: 20 20 20 62 34 20 3d 20 52 4f 4c 36 34 28 28 61     b4 = ROL64((a
2190: 31 30 5e 64 30 29 2c 20 31 38 29 3b 0a 20 20 20  10^d0), 18);.   
21a0: 20 62 30 20 3d 20 52 4f 4c 36 34 28 28 61 33 31   b0 = ROL64((a31
21b0: 5e 64 31 29 2c 20 31 29 3b 0a 20 20 20 20 62 31  ^d1), 1);.    b1
21c0: 20 3d 20 52 4f 4c 36 34 28 28 61 30 32 5e 64 32   = ROL64((a02^d2
21d0: 29 2c 20 36 29 3b 0a 20 20 20 20 62 32 20 3d 20  ), 6);.    b2 = 
21e0: 52 4f 4c 36 34 28 28 61 32 33 5e 64 33 29 2c 20  ROL64((a23^d3), 
21f0: 32 35 29 3b 0a 20 20 20 20 62 33 20 3d 20 52 4f  25);.    b3 = RO
2200: 4c 36 34 28 28 61 34 34 5e 64 34 29 2c 20 38 29  L64((a44^d4), 8)
2210: 3b 0a 20 20 20 20 61 31 30 20 3d 20 20 20 62 30  ;.    a10 =   b0
2220: 20 5e 28 28 7e 62 31 29 26 20 20 62 32 20 29 3b   ^((~b1)&  b2 );
2230: 0a 20 20 20 20 61 33 31 20 3d 20 20 20 62 31 20  .    a31 =   b1 
2240: 5e 28 28 7e 62 32 29 26 20 20 62 33 20 29 3b 0a  ^((~b2)&  b3 );.
2250: 20 20 20 20 61 30 32 20 3d 20 20 20 62 32 20 5e      a02 =   b2 ^
2260: 28 28 7e 62 33 29 26 20 20 62 34 20 29 3b 0a 20  ((~b3)&  b4 );. 
2270: 20 20 20 61 32 33 20 3d 20 20 20 62 33 20 5e 28     a23 =   b3 ^(
2280: 28 7e 62 34 29 26 20 20 62 30 20 29 3b 0a 20 20  (~b4)&  b0 );.  
2290: 20 20 61 34 34 20 3d 20 20 20 62 34 20 5e 28 28    a44 =   b4 ^((
22a0: 7e 62 30 29 26 20 20 62 31 20 29 3b 0a 0a 20 20  ~b0)&  b1 );..  
22b0: 20 20 62 31 20 3d 20 52 4f 4c 36 34 28 28 61 34    b1 = ROL64((a4
22c0: 30 5e 64 30 29 2c 20 33 36 29 3b 0a 20 20 20 20  0^d0), 36);.    
22d0: 62 32 20 3d 20 52 4f 4c 36 34 28 28 61 31 31 5e  b2 = ROL64((a11^
22e0: 64 31 29 2c 20 31 30 29 3b 0a 20 20 20 20 62 33  d1), 10);.    b3
22f0: 20 3d 20 52 4f 4c 36 34 28 28 61 33 32 5e 64 32   = ROL64((a32^d2
2300: 29 2c 20 31 35 29 3b 0a 20 20 20 20 62 34 20 3d  ), 15);.    b4 =
2310: 20 52 4f 4c 36 34 28 28 61 30 33 5e 64 33 29 2c   ROL64((a03^d3),
2320: 20 35 36 29 3b 0a 20 20 20 20 62 30 20 3d 20 52   56);.    b0 = R
2330: 4f 4c 36 34 28 28 61 32 34 5e 64 34 29 2c 20 32  OL64((a24^d4), 2
2340: 37 29 3b 0a 20 20 20 20 61 34 30 20 3d 20 20 20  7);.    a40 =   
2350: 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62 32 20  b0 ^((~b1)&  b2 
2360: 29 3b 0a 20 20 20 20 61 31 31 20 3d 20 20 20 62  );.    a11 =   b
2370: 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33 20 29  1 ^((~b2)&  b3 )
2380: 3b 0a 20 20 20 20 61 33 32 20 3d 20 20 20 62 32  ;.    a32 =   b2
2390: 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20 29 3b   ^((~b3)&  b4 );
23a0: 0a 20 20 20 20 61 30 33 20 3d 20 20 20 62 33 20  .    a03 =   b3 
23b0: 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29 3b 0a  ^((~b4)&  b0 );.
23c0: 20 20 20 20 61 32 34 20 3d 20 20 20 62 34 20 5e      a24 =   b4 ^
23d0: 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b 0a 0a  ((~b0)&  b1 );..
23e0: 20 20 20 20 62 33 20 3d 20 52 4f 4c 36 34 28 28      b3 = ROL64((
23f0: 61 32 30 5e 64 30 29 2c 20 34 31 29 3b 0a 20 20  a20^d0), 41);.  
2400: 20 20 62 34 20 3d 20 52 4f 4c 36 34 28 28 61 34    b4 = ROL64((a4
2410: 31 5e 64 31 29 2c 20 32 29 3b 0a 20 20 20 20 62  1^d1), 2);.    b
2420: 30 20 3d 20 52 4f 4c 36 34 28 28 61 31 32 5e 64  0 = ROL64((a12^d
2430: 32 29 2c 20 36 32 29 3b 0a 20 20 20 20 62 31 20  2), 62);.    b1 
2440: 3d 20 52 4f 4c 36 34 28 28 61 33 33 5e 64 33 29  = ROL64((a33^d3)
2450: 2c 20 35 35 29 3b 0a 20 20 20 20 62 32 20 3d 20  , 55);.    b2 = 
2460: 52 4f 4c 36 34 28 28 61 30 34 5e 64 34 29 2c 20  ROL64((a04^d4), 
2470: 33 39 29 3b 0a 20 20 20 20 61 32 30 20 3d 20 20  39);.    a20 =  
2480: 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62 32   b0 ^((~b1)&  b2
2490: 20 29 3b 0a 20 20 20 20 61 34 31 20 3d 20 20 20   );.    a41 =   
24a0: 62 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33 20  b1 ^((~b2)&  b3 
24b0: 29 3b 0a 20 20 20 20 61 31 32 20 3d 20 20 20 62  );.    a12 =   b
24c0: 32 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20 29  2 ^((~b3)&  b4 )
24d0: 3b 0a 20 20 20 20 61 33 33 20 3d 20 20 20 62 33  ;.    a33 =   b3
24e0: 20 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29 3b   ^((~b4)&  b0 );
24f0: 0a 20 20 20 20 61 30 34 20 3d 20 20 20 62 34 20  .    a04 =   b4 
2500: 5e 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b 0a  ^((~b0)&  b1 );.
2510: 0a 20 20 20 20 63 30 20 3d 20 61 30 30 5e 61 33  .    c0 = a00^a3
2520: 30 5e 61 31 30 5e 61 34 30 5e 61 32 30 3b 0a 20  0^a10^a40^a20;. 
2530: 20 20 20 63 31 20 3d 20 61 32 31 5e 61 30 31 5e     c1 = a21^a01^
2540: 61 33 31 5e 61 31 31 5e 61 34 31 3b 0a 20 20 20  a31^a11^a41;.   
2550: 20 63 32 20 3d 20 61 34 32 5e 61 32 32 5e 61 30   c2 = a42^a22^a0
2560: 32 5e 61 33 32 5e 61 31 32 3b 0a 20 20 20 20 63  2^a32^a12;.    c
2570: 33 20 3d 20 61 31 33 5e 61 34 33 5e 61 32 33 5e  3 = a13^a43^a23^
2580: 61 30 33 5e 61 33 33 3b 0a 20 20 20 20 63 34 20  a03^a33;.    c4 
2590: 3d 20 61 33 34 5e 61 31 34 5e 61 34 34 5e 61 32  = a34^a14^a44^a2
25a0: 34 5e 61 30 34 3b 0a 20 20 20 20 64 30 20 3d 20  4^a04;.    d0 = 
25b0: 63 34 5e 52 4f 4c 36 34 28 63 31 2c 20 31 29 3b  c4^ROL64(c1, 1);
25c0: 0a 20 20 20 20 64 31 20 3d 20 63 30 5e 52 4f 4c  .    d1 = c0^ROL
25d0: 36 34 28 63 32 2c 20 31 29 3b 0a 20 20 20 20 64  64(c2, 1);.    d
25e0: 32 20 3d 20 63 31 5e 52 4f 4c 36 34 28 63 33 2c  2 = c1^ROL64(c3,
25f0: 20 31 29 3b 0a 20 20 20 20 64 33 20 3d 20 63 32   1);.    d3 = c2
2600: 5e 52 4f 4c 36 34 28 63 34 2c 20 31 29 3b 0a 20  ^ROL64(c4, 1);. 
2610: 20 20 20 64 34 20 3d 20 63 33 5e 52 4f 4c 36 34     d4 = c3^ROL64
2620: 28 63 30 2c 20 31 29 3b 0a 0a 20 20 20 20 62 30  (c0, 1);..    b0
2630: 20 3d 20 28 61 30 30 5e 64 30 29 3b 0a 20 20 20   = (a00^d0);.   
2640: 20 62 31 20 3d 20 52 4f 4c 36 34 28 28 61 30 31   b1 = ROL64((a01
2650: 5e 64 31 29 2c 20 34 34 29 3b 0a 20 20 20 20 62  ^d1), 44);.    b
2660: 32 20 3d 20 52 4f 4c 36 34 28 28 61 30 32 5e 64  2 = ROL64((a02^d
2670: 32 29 2c 20 34 33 29 3b 0a 20 20 20 20 62 33 20  2), 43);.    b3 
2680: 3d 20 52 4f 4c 36 34 28 28 61 30 33 5e 64 33 29  = ROL64((a03^d3)
2690: 2c 20 32 31 29 3b 0a 20 20 20 20 62 34 20 3d 20  , 21);.    b4 = 
26a0: 52 4f 4c 36 34 28 28 61 30 34 5e 64 34 29 2c 20  ROL64((a04^d4), 
26b0: 31 34 29 3b 0a 20 20 20 20 61 30 30 20 3d 20 20  14);.    a00 =  
26c0: 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62 32   b0 ^((~b1)&  b2
26d0: 20 29 3b 0a 20 20 20 20 61 30 30 20 5e 3d 20 52   );.    a00 ^= R
26e0: 43 5b 69 2b 33 5d 3b 0a 20 20 20 20 61 30 31 20  C[i+3];.    a01 
26f0: 3d 20 20 20 62 31 20 5e 28 28 7e 62 32 29 26 20  =   b1 ^((~b2)& 
2700: 20 62 33 20 29 3b 0a 20 20 20 20 61 30 32 20 3d   b3 );.    a02 =
2710: 20 20 20 62 32 20 5e 28 28 7e 62 33 29 26 20 20     b2 ^((~b3)&  
2720: 62 34 20 29 3b 0a 20 20 20 20 61 30 33 20 3d 20  b4 );.    a03 = 
2730: 20 20 62 33 20 5e 28 28 7e 62 34 29 26 20 20 62    b3 ^((~b4)&  b
2740: 30 20 29 3b 0a 20 20 20 20 61 30 34 20 3d 20 20  0 );.    a04 =  
2750: 20 62 34 20 5e 28 28 7e 62 30 29 26 20 20 62 31   b4 ^((~b0)&  b1
2760: 20 29 3b 0a 0a 20 20 20 20 62 32 20 3d 20 52 4f   );..    b2 = RO
2770: 4c 36 34 28 28 61 31 30 5e 64 30 29 2c 20 33 29  L64((a10^d0), 3)
2780: 3b 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c 36 34  ;.    b3 = ROL64
2790: 28 28 61 31 31 5e 64 31 29 2c 20 34 35 29 3b 0a  ((a11^d1), 45);.
27a0: 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34 28 28      b4 = ROL64((
27b0: 61 31 32 5e 64 32 29 2c 20 36 31 29 3b 0a 20 20  a12^d2), 61);.  
27c0: 20 20 62 30 20 3d 20 52 4f 4c 36 34 28 28 61 31    b0 = ROL64((a1
27d0: 33 5e 64 33 29 2c 20 32 38 29 3b 0a 20 20 20 20  3^d3), 28);.    
27e0: 62 31 20 3d 20 52 4f 4c 36 34 28 28 61 31 34 5e  b1 = ROL64((a14^
27f0: 64 34 29 2c 20 32 30 29 3b 0a 20 20 20 20 61 31  d4), 20);.    a1
2800: 30 20 3d 20 20 20 62 30 20 5e 28 28 7e 62 31 29  0 =   b0 ^((~b1)
2810: 26 20 20 62 32 20 29 3b 0a 20 20 20 20 61 31 31  &  b2 );.    a11
2820: 20 3d 20 20 20 62 31 20 5e 28 28 7e 62 32 29 26   =   b1 ^((~b2)&
2830: 20 20 62 33 20 29 3b 0a 20 20 20 20 61 31 32 20    b3 );.    a12 
2840: 3d 20 20 20 62 32 20 5e 28 28 7e 62 33 29 26 20  =   b2 ^((~b3)& 
2850: 20 62 34 20 29 3b 0a 20 20 20 20 61 31 33 20 3d   b4 );.    a13 =
2860: 20 20 20 62 33 20 5e 28 28 7e 62 34 29 26 20 20     b3 ^((~b4)&  
2870: 62 30 20 29 3b 0a 20 20 20 20 61 31 34 20 3d 20  b0 );.    a14 = 
2880: 20 20 62 34 20 5e 28 28 7e 62 30 29 26 20 20 62    b4 ^((~b0)&  b
2890: 31 20 29 3b 0a 0a 20 20 20 20 62 34 20 3d 20 52  1 );..    b4 = R
28a0: 4f 4c 36 34 28 28 61 32 30 5e 64 30 29 2c 20 31  OL64((a20^d0), 1
28b0: 38 29 3b 0a 20 20 20 20 62 30 20 3d 20 52 4f 4c  8);.    b0 = ROL
28c0: 36 34 28 28 61 32 31 5e 64 31 29 2c 20 31 29 3b  64((a21^d1), 1);
28d0: 0a 20 20 20 20 62 31 20 3d 20 52 4f 4c 36 34 28  .    b1 = ROL64(
28e0: 28 61 32 32 5e 64 32 29 2c 20 36 29 3b 0a 20 20  (a22^d2), 6);.  
28f0: 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28 61 32    b2 = ROL64((a2
2900: 33 5e 64 33 29 2c 20 32 35 29 3b 0a 20 20 20 20  3^d3), 25);.    
2910: 62 33 20 3d 20 52 4f 4c 36 34 28 28 61 32 34 5e  b3 = ROL64((a24^
2920: 64 34 29 2c 20 38 29 3b 0a 20 20 20 20 61 32 30  d4), 8);.    a20
2930: 20 3d 20 20 20 62 30 20 5e 28 28 7e 62 31 29 26   =   b0 ^((~b1)&
2940: 20 20 62 32 20 29 3b 0a 20 20 20 20 61 32 31 20    b2 );.    a21 
2950: 3d 20 20 20 62 31 20 5e 28 28 7e 62 32 29 26 20  =   b1 ^((~b2)& 
2960: 20 62 33 20 29 3b 0a 20 20 20 20 61 32 32 20 3d   b3 );.    a22 =
2970: 20 20 20 62 32 20 5e 28 28 7e 62 33 29 26 20 20     b2 ^((~b3)&  
2980: 62 34 20 29 3b 0a 20 20 20 20 61 32 33 20 3d 20  b4 );.    a23 = 
2990: 20 20 62 33 20 5e 28 28 7e 62 34 29 26 20 20 62    b3 ^((~b4)&  b
29a0: 30 20 29 3b 0a 20 20 20 20 61 32 34 20 3d 20 20  0 );.    a24 =  
29b0: 20 62 34 20 5e 28 28 7e 62 30 29 26 20 20 62 31   b4 ^((~b0)&  b1
29c0: 20 29 3b 0a 0a 20 20 20 20 62 31 20 3d 20 52 4f   );..    b1 = RO
29d0: 4c 36 34 28 28 61 33 30 5e 64 30 29 2c 20 33 36  L64((a30^d0), 36
29e0: 29 3b 0a 20 20 20 20 62 32 20 3d 20 52 4f 4c 36  );.    b2 = ROL6
29f0: 34 28 28 61 33 31 5e 64 31 29 2c 20 31 30 29 3b  4((a31^d1), 10);
2a00: 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c 36 34 28  .    b3 = ROL64(
2a10: 28 61 33 32 5e 64 32 29 2c 20 31 35 29 3b 0a 20  (a32^d2), 15);. 
2a20: 20 20 20 62 34 20 3d 20 52 4f 4c 36 34 28 28 61     b4 = ROL64((a
2a30: 33 33 5e 64 33 29 2c 20 35 36 29 3b 0a 20 20 20  33^d3), 56);.   
2a40: 20 62 30 20 3d 20 52 4f 4c 36 34 28 28 61 33 34   b0 = ROL64((a34
2a50: 5e 64 34 29 2c 20 32 37 29 3b 0a 20 20 20 20 61  ^d4), 27);.    a
2a60: 33 30 20 3d 20 20 20 62 30 20 5e 28 28 7e 62 31  30 =   b0 ^((~b1
2a70: 29 26 20 20 62 32 20 29 3b 0a 20 20 20 20 61 33  )&  b2 );.    a3
2a80: 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62 32 29  1 =   b1 ^((~b2)
2a90: 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61 33 32  &  b3 );.    a32
2aa0: 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33 29 26   =   b2 ^((~b3)&
2ab0: 20 20 62 34 20 29 3b 0a 20 20 20 20 61 33 33 20    b4 );.    a33 
2ac0: 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29 26 20  =   b3 ^((~b4)& 
2ad0: 20 62 30 20 29 3b 0a 20 20 20 20 61 33 34 20 3d   b0 );.    a34 =
2ae0: 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26 20 20     b4 ^((~b0)&  
2af0: 62 31 20 29 3b 0a 0a 20 20 20 20 62 33 20 3d 20  b1 );..    b3 = 
2b00: 52 4f 4c 36 34 28 28 61 34 30 5e 64 30 29 2c 20  ROL64((a40^d0), 
2b10: 34 31 29 3b 0a 20 20 20 20 62 34 20 3d 20 52 4f  41);.    b4 = RO
2b20: 4c 36 34 28 28 61 34 31 5e 64 31 29 2c 20 32 29  L64((a41^d1), 2)
2b30: 3b 0a 20 20 20 20 62 30 20 3d 20 52 4f 4c 36 34  ;.    b0 = ROL64
2b40: 28 28 61 34 32 5e 64 32 29 2c 20 36 32 29 3b 0a  ((a42^d2), 62);.
2b50: 20 20 20 20 62 31 20 3d 20 52 4f 4c 36 34 28 28      b1 = ROL64((
2b60: 61 34 33 5e 64 33 29 2c 20 35 35 29 3b 0a 20 20  a43^d3), 55);.  
2b70: 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28 61 34    b2 = ROL64((a4
2b80: 34 5e 64 34 29 2c 20 33 39 29 3b 0a 20 20 20 20  4^d4), 39);.    
2b90: 61 34 30 20 3d 20 20 20 62 30 20 5e 28 28 7e 62  a40 =   b0 ^((~b
2ba0: 31 29 26 20 20 62 32 20 29 3b 0a 20 20 20 20 61  1)&  b2 );.    a
2bb0: 34 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62 32  41 =   b1 ^((~b2
2bc0: 29 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61 34  )&  b3 );.    a4
2bd0: 32 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33 29  2 =   b2 ^((~b3)
2be0: 26 20 20 62 34 20 29 3b 0a 20 20 20 20 61 34 33  &  b4 );.    a43
2bf0: 20 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29 26   =   b3 ^((~b4)&
2c00: 20 20 62 30 20 29 3b 0a 20 20 20 20 61 34 34 20    b0 );.    a44 
2c10: 3d 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26 20  =   b4 ^((~b0)& 
2c20: 20 62 31 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   b1 );.  }.}../*
2c30: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2c40: 20 6e 65 77 20 68 61 73 68 2e 20 20 69 53 69 7a   new hash.  iSiz
2c50: 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  e determines the
2c60: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 61 73   size of the has
2c70: 68 0a 2a 2a 20 69 6e 20 62 69 74 73 20 61 6e 64  h.** in bits and
2c80: 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f   should be one o
2c90: 66 20 32 32 34 2c 20 32 35 36 2c 20 33 38 34 2c  f 224, 256, 384,
2ca0: 20 6f 72 20 35 31 32 2e 20 20 4f 72 20 69 53 69   or 512.  Or iSi
2cb0: 7a 65 0a 2a 2a 20 63 61 6e 20 62 65 20 7a 65 72  ze.** can be zer
2cc0: 6f 20 74 6f 20 75 73 65 20 74 68 65 20 64 65 66  o to use the def
2cd0: 61 75 6c 74 20 68 61 73 68 20 73 69 7a 65 20 6f  ault hash size o
2ce0: 66 20 32 35 36 20 62 69 74 73 2e 0a 2a 2f 0a 73  f 256 bits..*/.s
2cf0: 74 61 74 69 63 20 76 6f 69 64 20 53 48 41 33 49  tatic void SHA3I
2d00: 6e 69 74 28 53 48 41 33 43 6f 6e 74 65 78 74 20  nit(SHA3Context 
2d10: 2a 70 2c 20 69 6e 74 20 69 53 69 7a 65 29 7b 0a  *p, int iSize){.
2d20: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
2d30: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2d40: 28 20 69 53 69 7a 65 3e 3d 31 32 38 20 26 26 20  ( iSize>=128 && 
2d50: 69 53 69 7a 65 3c 3d 35 31 32 20 29 7b 0a 20 20  iSize<=512 ){.  
2d60: 20 20 70 2d 3e 6e 52 61 74 65 20 3d 20 28 31 36    p->nRate = (16
2d70: 30 30 20 2d 20 28 28 69 53 69 7a 65 20 2b 20 33  00 - ((iSize + 3
2d80: 31 29 26 7e 33 31 29 2a 32 29 2f 38 3b 0a 20 20  1)&~31)*2)/8;.  
2d90: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 52  }else{.    p->nR
2da0: 61 74 65 20 3d 20 28 31 36 30 30 20 2d 20 32 2a  ate = (1600 - 2*
2db0: 32 35 36 29 2f 38 3b 0a 20 20 7d 0a 23 69 66 20  256)/8;.  }.#if 
2dc0: 53 48 41 33 5f 42 59 54 45 4f 52 44 45 52 3d 3d  SHA3_BYTEORDER==
2dd0: 31 32 33 34 0a 20 20 2f 2a 20 4b 6e 6f 77 6e 20  1234.  /* Known 
2de0: 74 6f 20 62 65 20 6c 69 74 74 6c 65 2d 65 6e 64  to be little-end
2df0: 69 61 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ian at compile-t
2e00: 69 6d 65 2e 20 4e 6f 2d 6f 70 20 2a 2f 0a 23 65  ime. No-op */.#e
2e10: 6c 69 66 20 53 48 41 33 5f 42 59 54 45 4f 52 44  lif SHA3_BYTEORD
2e20: 45 52 3d 3d 34 33 32 31 0a 20 20 70 2d 3e 69 78  ER==4321.  p->ix
2e30: 4d 61 73 6b 20 3d 20 37 3b 20 20 2f 2a 20 42 69  Mask = 7;  /* Bi
2e40: 67 2d 65 6e 64 69 61 6e 20 2a 2f 0a 23 65 6c 73  g-endian */.#els
2e50: 65 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63  e.  {.    static
2e60: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6f 6e   unsigned int on
2e70: 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 31  e = 1;.    if( 1
2e80: 3d 3d 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ==*(unsigned cha
2e90: 72 2a 29 26 6f 6e 65 20 29 7b 0a 20 20 20 20 20  r*)&one ){.     
2ea0: 20 2f 2a 20 4c 69 74 74 6c 65 20 65 6e 64 69 61   /* Little endia
2eb0: 6e 2e 20 20 4e 6f 20 62 79 74 65 20 73 77 61 70  n.  No byte swap
2ec0: 70 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ping. */.      p
2ed0: 2d 3e 69 78 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  ->ixMask = 0;.  
2ee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2ef0: 2a 20 42 69 67 20 65 6e 64 69 61 6e 2e 20 20 42  * Big endian.  B
2f00: 79 74 65 20 73 77 61 70 2e 20 2a 2f 0a 20 20 20  yte swap. */.   
2f10: 20 20 20 70 2d 3e 69 78 4d 61 73 6b 20 3d 20 37     p->ixMask = 7
2f20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2f30: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
2f40: 20 63 6f 6e 73 65 63 75 74 69 76 65 20 63 61 6c   consecutive cal
2f50: 6c 73 20 74 6f 20 74 68 65 20 53 48 41 33 55 70  ls to the SHA3Up
2f60: 64 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f  date function to
2f70: 20 61 64 64 20 6e 65 77 20 63 6f 6e 74 65 6e 74   add new content
2f80: 0a 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 0a  .** to the hash.
2f90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
2fa0: 48 41 33 55 70 64 61 74 65 28 0a 20 20 53 48 41  HA3Update(.  SHA
2fb0: 33 43 6f 6e 74 65 78 74 20 2a 70 2c 0a 20 20 63  3Context *p,.  c
2fc0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2fd0: 61 72 20 2a 61 44 61 74 61 2c 0a 20 20 75 6e 73  ar *aData,.  uns
2fe0: 69 67 6e 65 64 20 69 6e 74 20 6e 44 61 74 61 0a  igned int nData.
2ff0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
3000: 74 20 69 20 3d 20 30 3b 0a 23 69 66 20 53 48 41  t i = 0;.#if SHA
3010: 33 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31 32 33  3_BYTEORDER==123
3020: 34 0a 20 20 69 66 28 20 28 70 2d 3e 6e 4c 6f 61  4.  if( (p->nLoa
3030: 64 65 64 20 25 20 38 29 3d 3d 30 20 26 26 20 28  ded % 8)==0 && (
3040: 28 61 44 61 74 61 20 2d 20 28 63 6f 6e 73 74 20  (aData - (const 
3050: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 30  unsigned char*)0
3060: 29 26 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  )&7)==0 ){.    f
3070: 6f 72 28 3b 20 69 2b 37 3c 6e 44 61 74 61 3b 20  or(; i+7<nData; 
3080: 69 2b 3d 38 29 7b 0a 20 20 20 20 20 20 70 2d 3e  i+=8){.      p->
3090: 75 2e 73 5b 70 2d 3e 6e 4c 6f 61 64 65 64 2f 38  u.s[p->nLoaded/8
30a0: 5d 20 5e 3d 20 2a 28 75 36 34 2a 29 26 61 44 61  ] ^= *(u64*)&aDa
30b0: 74 61 5b 69 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  ta[i];.      p->
30c0: 6e 4c 6f 61 64 65 64 20 2b 3d 20 38 3b 0a 20 20  nLoaded += 8;.  
30d0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 61 64      if( p->nLoad
30e0: 65 64 3e 3d 70 2d 3e 6e 52 61 74 65 20 29 7b 0a  ed>=p->nRate ){.
30f0: 20 20 20 20 20 20 20 20 4b 65 63 63 61 6b 46 31          KeccakF1
3100: 36 30 30 53 74 65 70 28 70 29 3b 0a 20 20 20 20  600Step(p);.    
3110: 20 20 20 20 70 2d 3e 6e 4c 6f 61 64 65 64 20 3d      p->nLoaded =
3120: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
3130: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66  }.  }.#endif.  f
3140: 6f 72 28 3b 20 69 3c 6e 44 61 74 61 3b 20 69 2b  or(; i<nData; i+
3150: 2b 29 7b 0a 23 69 66 20 53 48 41 33 5f 42 59 54  +){.#if SHA3_BYT
3160: 45 4f 52 44 45 52 3d 3d 31 32 33 34 0a 20 20 20  EORDER==1234.   
3170: 20 70 2d 3e 75 2e 78 5b 70 2d 3e 6e 4c 6f 61 64   p->u.x[p->nLoad
3180: 65 64 5d 20 5e 3d 20 61 44 61 74 61 5b 69 5d 3b  ed] ^= aData[i];
3190: 0a 23 65 6c 69 66 20 53 48 41 33 5f 42 59 54 45  .#elif SHA3_BYTE
31a0: 4f 52 44 45 52 3d 3d 34 33 32 31 0a 20 20 20 20  ORDER==4321.    
31b0: 70 2d 3e 75 2e 78 5b 70 2d 3e 6e 4c 6f 61 64 65  p->u.x[p->nLoade
31c0: 64 5e 30 78 30 37 5d 20 5e 3d 20 61 44 61 74 61  d^0x07] ^= aData
31d0: 5b 69 5d 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70  [i];.#else.    p
31e0: 2d 3e 75 2e 78 5b 70 2d 3e 6e 4c 6f 61 64 65 64  ->u.x[p->nLoaded
31f0: 5e 70 2d 3e 69 78 4d 61 73 6b 5d 20 5e 3d 20 61  ^p->ixMask] ^= a
3200: 44 61 74 61 5b 69 5d 3b 0a 23 65 6e 64 69 66 0a  Data[i];.#endif.
3210: 20 20 20 20 70 2d 3e 6e 4c 6f 61 64 65 64 2b 2b      p->nLoaded++
3220: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 6f  ;.    if( p->nLo
3230: 61 64 65 64 3d 3d 70 2d 3e 6e 52 61 74 65 20 29  aded==p->nRate )
3240: 7b 0a 20 20 20 20 20 20 4b 65 63 63 61 6b 46 31  {.      KeccakF1
3250: 36 30 30 53 74 65 70 28 70 29 3b 0a 20 20 20 20  600Step(p);.    
3260: 20 20 70 2d 3e 6e 4c 6f 61 64 65 64 20 3d 20 30    p->nLoaded = 0
3270: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
3280: 2a 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 63  *.** After all c
3290: 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
32a0: 61 64 64 65 64 2c 20 69 6e 76 6f 6b 65 20 53 48  added, invoke SH
32b0: 41 33 46 69 6e 61 6c 28 29 20 74 6f 20 63 6f 6d  A3Final() to com
32c0: 70 75 74 65 0a 2a 2a 20 74 68 65 20 66 69 6e 61  pute.** the fina
32d0: 6c 20 68 61 73 68 2e 20 20 54 68 65 20 66 75 6e  l hash.  The fun
32e0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
32f0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
3300: 69 6e 61 72 79 0a 2a 2a 20 68 61 73 68 20 76 61  inary.** hash va
3310: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lue..*/.static u
3320: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 53 48  nsigned char *SH
3330: 41 33 46 69 6e 61 6c 28 53 48 41 33 43 6f 6e 74  A3Final(SHA3Cont
3340: 65 78 74 20 2a 70 29 7b 0a 20 20 75 6e 73 69 67  ext *p){.  unsig
3350: 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ned int i;.  if(
3360: 20 70 2d 3e 6e 4c 6f 61 64 65 64 3d 3d 70 2d 3e   p->nLoaded==p->
3370: 6e 52 61 74 65 2d 31 20 29 7b 0a 20 20 20 20 63  nRate-1 ){.    c
3380: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
3390: 61 72 20 63 31 20 3d 20 30 78 38 36 3b 0a 20 20  ar c1 = 0x86;.  
33a0: 20 20 53 48 41 33 55 70 64 61 74 65 28 70 2c 20    SHA3Update(p, 
33b0: 26 63 31 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  &c1, 1);.  }else
33c0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  {.    const unsi
33d0: 67 6e 65 64 20 63 68 61 72 20 63 32 20 3d 20 30  gned char c2 = 0
33e0: 78 30 36 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  x06;.    const u
33f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 33 20  nsigned char c3 
3400: 3d 20 30 78 38 30 3b 0a 20 20 20 20 53 48 41 33  = 0x80;.    SHA3
3410: 55 70 64 61 74 65 28 70 2c 20 26 63 32 2c 20 31  Update(p, &c2, 1
3420: 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c 6f 61 64 65  );.    p->nLoade
3430: 64 20 3d 20 70 2d 3e 6e 52 61 74 65 20 2d 20 31  d = p->nRate - 1
3440: 3b 0a 20 20 20 20 53 48 41 33 55 70 64 61 74 65  ;.    SHA3Update
3450: 28 70 2c 20 26 63 33 2c 20 31 29 3b 0a 20 20 7d  (p, &c3, 1);.  }
3460: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
3470: 3e 6e 52 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  >nRate; i++){.  
3480: 20 20 70 2d 3e 75 2e 78 5b 69 2b 70 2d 3e 6e 52    p->u.x[i+p->nR
3490: 61 74 65 5d 20 3d 20 70 2d 3e 75 2e 78 5b 69 5e  ate] = p->u.x[i^
34a0: 70 2d 3e 69 78 4d 61 73 6b 5d 3b 0a 20 20 7d 0a  p->ixMask];.  }.
34b0: 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 75 2e 78    return &p->u.x
34c0: 5b 70 2d 3e 6e 52 61 74 65 5d 3b 0a 7d 0a 2f 2a  [p->nRate];.}./*
34d0: 20 45 6e 64 20 6f 66 20 74 68 65 20 68 61 73 68   End of the hash
34e0: 69 6e 67 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a  ing logic.******
34f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3530: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
3540: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
3550: 66 20 74 68 65 20 73 68 61 33 28 58 2c 53 49 5a  f the sha3(X,SIZ
3560: 45 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  E) function..**.
3570: 2a 2a 20 52 65 74 75 72 6e 20 61 20 42 4c 4f 42  ** Return a BLOB
3580: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 53 49   which is the SI
3590: 5a 45 2d 62 69 74 20 53 48 41 33 20 68 61 73 68  ZE-bit SHA3 hash
35a0: 20 6f 66 20 58 2e 20 20 54 68 65 20 64 65 66 61   of X.  The defa
35b0: 75 6c 74 0a 2a 2a 20 73 69 7a 65 20 69 73 20 32  ult.** size is 2
35c0: 35 36 2e 20 20 49 66 20 58 20 69 73 20 61 20 42  56.  If X is a B
35d0: 4c 4f 42 2c 20 69 74 20 69 73 20 68 61 73 68 65  LOB, it is hashe
35e0: 64 20 61 73 20 69 73 2e 20 20 0a 2a 2a 20 46 6f  d as is.  .** Fo
35f0: 72 20 61 6c 6c 20 6f 74 68 65 72 20 6e 6f 6e 2d  r all other non-
3600: 4e 55 4c 4c 20 74 79 70 65 73 20 6f 66 20 69 6e  NULL types of in
3610: 70 75 74 2c 20 58 20 69 73 20 63 6f 6e 76 65 72  put, X is conver
3620: 74 65 64 20 69 6e 74 6f 20 61 20 55 54 46 2d 38  ted into a UTF-8
3630: 20 73 74 72 69 6e 67 0a 2a 2a 20 61 6e 64 20 74   string.** and t
3640: 68 65 20 73 74 72 69 6e 67 20 69 73 20 68 61 73  he string is has
3650: 68 65 64 20 77 69 74 68 6f 75 74 20 74 68 65 20  hed without the 
3660: 74 72 61 69 6c 69 6e 67 20 30 78 30 30 20 74 65  trailing 0x00 te
3670: 72 6d 69 6e 61 74 6f 72 2e 20 20 54 68 65 20 68  rminator.  The h
3680: 61 73 68 0a 2a 2a 20 6f 66 20 61 20 4e 55 4c 4c  ash.** of a NULL
3690: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 0a   value is NULL..
36a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
36b0: 68 61 33 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ha3Func(.  sqlit
36c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
36d0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
36e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
36f0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 53 48 41   **argv.){.  SHA
3700: 33 43 6f 6e 74 65 78 74 20 63 78 3b 0a 20 20 69  3Context cx;.  i
3710: 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  nt eType = sqlit
3720: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
3730: 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 42  gv[0]);.  int nB
3740: 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  yte = sqlite3_va
3750: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
3760: 5d 29 3b 0a 20 20 69 6e 74 20 69 53 69 7a 65 3b  ]);.  int iSize;
3770: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31 20 29  .  if( argc==1 )
3780: 7b 0a 20 20 20 20 69 53 69 7a 65 20 3d 20 32 35  {.    iSize = 25
3790: 36 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  6;.  }else{.    
37a0: 69 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 5f  iSize = sqlite3_
37b0: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31  value_int(argv[1
37c0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 53 69 7a  ]);.    if( iSiz
37d0: 65 21 3d 32 32 34 20 26 26 20 69 53 69 7a 65 21  e!=224 && iSize!
37e0: 3d 32 35 36 20 26 26 20 69 53 69 7a 65 21 3d 33  =256 && iSize!=3
37f0: 38 34 20 26 26 20 69 53 69 7a 65 21 3d 35 31 32  84 && iSize!=512
3800: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3810: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
3820: 6f 6e 74 65 78 74 2c 20 22 53 48 41 33 20 73 69  ontext, "SHA3 si
3830: 7a 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65  ze should be one
3840: 20 6f 66 3a 20 32 32 34 20 32 35 36 20 22 0a 20   of: 224 256 ". 
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3870: 20 20 20 22 33 38 34 20 35 31 32 22 2c 20 2d 31     "384 512", -1
3880: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
3890: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
38a0: 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e   eType==SQLITE_N
38b0: 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ULL ) return;.  
38c0: 53 48 41 33 49 6e 69 74 28 26 63 78 2c 20 69 53  SHA3Init(&cx, iS
38d0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 65 54 79 70  ize);.  if( eTyp
38e0: 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
38f0: 7b 0a 20 20 20 20 53 48 41 33 55 70 64 61 74 65  {.    SHA3Update
3900: 28 26 63 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  (&cx, sqlite3_va
3910: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
3920: 29 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  ), nByte);.  }el
3930: 73 65 7b 0a 20 20 20 20 53 48 41 33 55 70 64 61  se{.    SHA3Upda
3940: 74 65 28 26 63 78 2c 20 73 71 6c 69 74 65 33 5f  te(&cx, sqlite3_
3950: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
3960: 30 5d 29 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  0]), nByte);.  }
3970: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
3980: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
3990: 53 48 41 33 46 69 6e 61 6c 28 26 63 78 29 2c 20  SHA3Final(&cx), 
39a0: 69 53 69 7a 65 2f 38 2c 20 53 51 4c 49 54 45 5f  iSize/8, SQLITE_
39b0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 2f  TRANSIENT);.}../
39c0: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
39d0: 6e 67 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ng using sqlite3
39e0: 5f 76 73 6e 70 72 69 6e 74 66 28 29 20 77 69 74  _vsnprintf() wit
39f0: 68 20 61 20 6d 61 78 69 6d 75 6d 20 6c 65 6e 67  h a maximum leng
3a00: 74 68 0a 2a 2a 20 6f 66 20 35 30 20 62 79 74 65  th.** of 50 byte
3a10: 73 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f 20  s and add it to 
3a20: 74 68 65 20 68 61 73 68 2e 0a 2a 2f 0a 73 74 61  the hash..*/.sta
3a30: 74 69 63 20 76 6f 69 64 20 68 61 73 68 5f 73 74  tic void hash_st
3a40: 65 70 5f 76 66 6f 72 6d 61 74 28 0a 20 20 53 48  ep_vformat(.  SH
3a50: 41 33 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20  A3Context *p,   
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a70: 20 41 64 64 20 63 6f 6e 74 65 6e 74 20 74 6f 20   Add content to 
3a80: 74 68 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  this context */.
3a90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
3aa0: 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a  ormat,.  ....){.
3ab0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
3ac0: 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 7a 42  int n;.  char zB
3ad0: 75 66 5b 35 30 5d 3b 0a 20 20 76 61 5f 73 74 61  uf[50];.  va_sta
3ae0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
3af0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 73 6e 70 72  .  sqlite3_vsnpr
3b00: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
3b10: 29 2c 7a 42 75 66 2c 7a 46 6f 72 6d 61 74 2c 61  ),zBuf,zFormat,a
3b20: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
3b30: 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72  ;.  n = (int)str
3b40: 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 53 48 41  len(zBuf);.  SHA
3b50: 33 55 70 64 61 74 65 28 70 2c 20 28 75 6e 73 69  3Update(p, (unsi
3b60: 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75 66 2c  gned char*)zBuf,
3b70: 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   n);.}../*.** Im
3b80: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
3b90: 74 68 65 20 73 68 61 33 5f 71 75 65 72 79 28 53  the sha3_query(S
3ba0: 51 4c 2c 53 49 5a 45 29 20 66 75 6e 63 74 69 6f  QL,SIZE) functio
3bb0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  n..**.** This fu
3bc0: 6e 63 74 69 6f 6e 20 63 6f 6d 70 69 6c 65 73 20  nction compiles 
3bd0: 61 6e 64 20 72 75 6e 73 20 74 68 65 20 53 51 4c  and runs the SQL
3be0: 20 73 74 61 74 65 6d 65 6e 74 28 73 29 20 67 69   statement(s) gi
3bf0: 76 65 6e 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ven in the.** ar
3c00: 67 75 6d 65 6e 74 2e 20 54 68 65 20 72 65 73 75  gument. The resu
3c10: 6c 74 73 20 61 72 65 20 68 61 73 68 65 64 20 75  lts are hashed u
3c20: 73 69 6e 67 20 61 20 53 49 5a 45 2d 62 69 74 20  sing a SIZE-bit 
3c30: 53 48 41 33 2e 20 20 54 68 65 20 64 65 66 61 75  SHA3.  The defau
3c40: 6c 74 0a 2a 2a 20 73 69 7a 65 20 69 73 20 32 35  lt.** size is 25
3c50: 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  6..**.** The for
3c60: 6d 61 74 20 6f 66 20 74 68 65 20 62 79 74 65 20  mat of the byte 
3c70: 73 74 72 65 61 6d 20 74 68 61 74 20 69 73 20 68  stream that is h
3c80: 61 73 68 65 64 20 69 73 20 73 75 6d 6d 61 72 69  ashed is summari
3c90: 7a 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  zed as follows:.
3ca0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 3c 6e 3e  **.**       S<n>
3cb0: 3a 3c 73 71 6c 3e 0a 2a 2a 20 20 20 20 20 20 20  :<sql>.**       
3cc0: 52 0a 2a 2a 20 20 20 20 20 20 20 4e 0a 2a 2a 20  R.**       N.** 
3cd0: 20 20 20 20 20 20 49 3c 69 6e 74 3e 0a 2a 2a 20        I<int>.** 
3ce0: 20 20 20 20 20 20 46 3c 69 65 65 65 2d 66 6c 6f        F<ieee-flo
3cf0: 61 74 3e 0a 2a 2a 20 20 20 20 20 20 20 42 3c 73  at>.**       B<s
3d00: 69 7a 65 3e 3a 3c 62 79 74 65 73 3e 0a 2a 2a 20  ize>:<bytes>.** 
3d10: 20 20 20 20 20 20 54 3c 73 69 7a 65 3e 3a 3c 74        T<size>:<t
3d20: 65 78 74 3e 0a 2a 2a 0a 2a 2a 20 3c 73 71 6c 3e  ext>.**.** <sql>
3d30: 20 69 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   is the original
3d40: 20 53 51 4c 20 74 65 78 74 20 66 6f 72 20 65 61   SQL text for ea
3d50: 63 68 20 73 74 61 74 65 6d 65 6e 74 20 72 75 6e  ch statement run
3d60: 20 61 6e 64 20 3c 6e 3e 20 69 73 0a 2a 2a 20 74   and <n> is.** t
3d70: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 61 74 20  he size of that 
3d80: 74 65 78 74 2e 20 20 54 68 65 20 53 51 4c 20 74  text.  The SQL t
3d90: 65 78 74 20 69 73 20 55 54 46 2d 38 2e 20 20 41  ext is UTF-8.  A
3da0: 20 73 69 6e 67 6c 65 20 52 20 63 68 61 72 61 63   single R charac
3db0: 74 65 72 0a 2a 2a 20 6f 63 63 75 72 73 20 62 65  ter.** occurs be
3dc0: 66 6f 72 65 20 74 68 65 20 73 74 61 72 74 20 6f  fore the start o
3dd0: 66 20 65 61 63 68 20 72 6f 77 2e 20 20 4e 20 6d  f each row.  N m
3de0: 65 61 6e 73 20 61 20 4e 55 4c 4c 20 76 61 6c 75  eans a NULL valu
3df0: 65 2e 0a 2a 2a 20 49 20 6d 65 61 6e 20 61 6e 20  e..** I mean an 
3e00: 38 2d 62 79 74 65 20 6c 69 74 74 6c 65 2d 65 6e  8-byte little-en
3e10: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 3c 69 6e  dian integer <in
3e20: 74 3e 2e 20 20 46 20 69 73 20 61 20 66 6c 6f 61  t>.  F is a floa
3e30: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 6e 75  ting point.** nu
3e40: 6d 62 65 72 20 77 69 74 68 20 61 6e 20 38 2d 62  mber with an 8-b
3e50: 79 74 65 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61  yte little-endia
3e60: 6e 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20  n IEEE floating 
3e70: 70 6f 69 6e 74 20 76 61 6c 75 65 20 3c 69 65 65  point value <iee
3e80: 65 2d 66 6c 6f 61 74 3e 2e 0a 2a 2a 20 42 20 6d  e-float>..** B m
3e90: 65 61 6e 73 20 62 6c 6f 62 73 20 6f 66 20 3c 73  eans blobs of <s
3ea0: 69 7a 65 3e 20 62 79 74 65 73 2e 20 20 54 20 6d  ize> bytes.  T m
3eb0: 65 61 6e 73 20 74 65 78 74 20 72 65 6e 64 65 72  eans text render
3ec0: 65 64 20 61 73 20 3c 73 69 7a 65 3e 0a 2a 2a 20  ed as <size>.** 
3ed0: 62 79 74 65 73 20 6f 66 20 55 54 46 2d 38 2e 20  bytes of UTF-8. 
3ee0: 20 54 68 65 20 3c 6e 3e 20 61 6e 64 20 3c 73 69   The <n> and <si
3ef0: 7a 65 3e 20 76 61 6c 75 65 73 20 61 72 65 20 65  ze> values are e
3f00: 78 70 72 65 73 73 65 64 20 61 73 20 61 6e 20 41  xpressed as an A
3f10: 53 43 49 49 0a 2a 2a 20 74 65 78 74 20 69 6e 74  SCII.** text int
3f20: 65 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  egers..**.** For
3f30: 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
3f40: 65 6e 74 20 69 6e 20 74 68 65 20 58 20 69 6e 70  ent in the X inp
3f50: 75 74 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65  ut, there is one
3f60: 20 53 20 73 65 67 6d 65 6e 74 2e 20 20 45 61 63   S segment.  Eac
3f70: 68 0a 2a 2a 20 53 20 73 65 67 6d 65 6e 74 20 69  h.** S segment i
3f80: 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65  s followed by ze
3f90: 72 6f 20 6f 72 20 6d 6f 72 65 20 52 20 73 65 67  ro or more R seg
3fa0: 6d 65 6e 74 73 2c 20 6f 6e 65 20 66 6f 72 20 65  ments, one for e
3fb0: 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 0a 2a  ach row in the.*
3fc0: 2a 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41  * result set.  A
3fd0: 66 74 65 72 20 65 61 63 68 20 52 2c 20 74 68 65  fter each R, the
3fe0: 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  re are one or mo
3ff0: 72 65 20 4e 2c 20 49 2c 20 46 2c 20 42 2c 20 6f  re N, I, F, B, o
4000: 72 20 54 20 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a  r T segments,.**
4010: 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 63 6f   one for each co
4020: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
4030: 6c 74 20 73 65 74 2e 20 20 53 65 67 6d 65 6e 74  lt set.  Segment
4040: 73 20 61 72 65 20 63 6f 6e 63 61 74 65 6e 74 61  s are concatenta
4050: 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20  ted directly.** 
4060: 77 69 74 68 20 6e 6f 20 64 65 6c 69 6d 69 74 65  with no delimite
4070: 72 73 20 6f 66 20 61 6e 79 20 6b 69 6e 64 2e 0a  rs of any kind..
4080: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
4090: 68 61 33 51 75 65 72 79 46 75 6e 63 28 0a 20 20  ha3QueryFunc(.  
40a0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
40b0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
40c0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
40d0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
40e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
40f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
4100: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
4110: 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t);.  const char
4120: 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20   *zSql = (const 
4130: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
4140: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
4150: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  );.  sqlite3_stm
4160: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
4170: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
4180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4190: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
41a0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
41b0: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  et */.  int i;  
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41d0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
41e0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
41f0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
4200: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 53 48 41  t char *z;.  SHA
4210: 33 43 6f 6e 74 65 78 74 20 63 78 3b 0a 20 20 69  3Context cx;.  i
4220: 6e 74 20 69 53 69 7a 65 3b 0a 0a 20 20 69 66 28  nt iSize;..  if(
4230: 20 61 72 67 63 3d 3d 31 20 29 7b 0a 20 20 20 20   argc==1 ){.    
4240: 69 53 69 7a 65 20 3d 20 32 35 36 3b 0a 20 20 7d  iSize = 256;.  }
4250: 65 6c 73 65 7b 0a 20 20 20 20 69 53 69 7a 65 20  else{.    iSize 
4260: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4270: 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  int(argv[1]);.  
4280: 20 20 69 66 28 20 69 53 69 7a 65 21 3d 32 32 34    if( iSize!=224
4290: 20 26 26 20 69 53 69 7a 65 21 3d 32 35 36 20 26   && iSize!=256 &
42a0: 26 20 69 53 69 7a 65 21 3d 33 38 34 20 26 26 20  & iSize!=384 && 
42b0: 69 53 69 7a 65 21 3d 35 31 32 20 29 7b 0a 20 20  iSize!=512 ){.  
42c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
42d0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
42e0: 2c 20 22 53 48 41 33 20 73 69 7a 65 20 73 68 6f  , "SHA3 size sho
42f0: 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 32  uld be one of: 2
4300: 32 34 20 32 35 36 20 22 0a 20 20 20 20 20 20 20  24 256 ".       
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 33 38               "38
4330: 34 20 35 31 32 22 2c 20 2d 31 29 3b 0a 20 20 20  4 512", -1);.   
4340: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
4350: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 71 6c 3d  .  }.  if( zSql=
4360: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 53  =0 ) return;.  S
4370: 48 41 33 49 6e 69 74 28 26 63 78 2c 20 69 53 69  HA3Init(&cx, iSi
4380: 7a 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 53  ze);.  while( zS
4390: 71 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20  ql[0] ){.    rc 
43a0: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
43b0: 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  e_v2(db, zSql, -
43c0: 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 53 71 6c  1, &pStmt, &zSql
43d0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
43e0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  .      char *zMs
43f0: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
4400: 6e 74 66 28 22 65 72 72 6f 72 20 53 51 4c 20 73  ntf("error SQL s
4410: 74 61 74 65 6d 65 6e 74 20 5b 25 73 5d 3a 20 25  tatement [%s]: %
4420: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 20 20 20 20 20 20 7a 53 71 6c 2c 20 73 71 6c         zSql, sql
4450: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
4460: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4470: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
4480: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
4490: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
44a0: 65 78 74 2c 20 7a 4d 73 67 2c 20 2d 31 29 3b 0a  ext, zMsg, -1);.
44b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
44c0: 65 65 28 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ee(zMsg);.      
44d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
44e0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 73    if( !sqlite3_s
44f0: 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53 74  tmt_readonly(pSt
4500: 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  mt) ){.      cha
4510: 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
4520: 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 6e 2d 71  3_mprintf("non-q
4530: 75 65 72 79 3a 20 5b 25 73 5d 22 2c 20 73 71 6c  uery: [%s]", sql
4540: 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 29  ite3_sql(pStmt))
4550: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4560: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
4570: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
4580: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
4590: 65 78 74 2c 20 7a 4d 73 67 2c 20 2d 31 29 3b 0a  ext, zMsg, -1);.
45a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
45b0: 65 65 28 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ee(zMsg);.      
45c0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
45d0: 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    nCol = sqlite3
45e0: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
45f0: 74 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71  tmt);.    z = sq
4600: 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
4610: 3b 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 73  ;.    n = (int)s
4620: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 68 61  trlen(z);.    ha
4630: 73 68 5f 73 74 65 70 5f 76 66 6f 72 6d 61 74 28  sh_step_vformat(
4640: 26 63 78 2c 22 53 25 64 3a 22 2c 6e 29 3b 0a 20  &cx,"S%d:",n);. 
4650: 20 20 20 53 48 41 33 55 70 64 61 74 65 28 26 63     SHA3Update(&c
4660: 78 2c 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  x,(unsigned char
4670: 2a 29 7a 2c 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  *)z,n);..    /* 
4680: 43 6f 6d 70 75 74 65 20 61 20 68 61 73 68 20 6f  Compute a hash o
4690: 76 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 6f  ver the result o
46a0: 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
46b0: 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
46c0: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
46d0: 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
46e0: 20 20 20 53 48 41 33 55 70 64 61 74 65 28 26 63     SHA3Update(&c
46f0: 78 2c 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  x,(const unsigne
4700: 64 20 63 68 61 72 2a 29 22 52 22 2c 31 29 3b 0a  d char*)"R",1);.
4710: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
4720: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
4730: 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
4740: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
4750: 28 70 53 74 6d 74 2c 69 29 20 29 7b 0a 20 20 20  (pStmt,i) ){.   
4760: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
4770: 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TE_NULL: {.     
4780: 20 20 20 20 20 20 20 53 48 41 33 55 70 64 61 74         SHA3Updat
4790: 65 28 26 63 78 2c 20 28 63 6f 6e 73 74 20 75 6e  e(&cx, (const un
47a0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 22 4e 22  signed char*)"N"
47b0: 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,1);.           
47c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
47d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
47e0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
47f0: 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  R: {.           
4800: 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
4810: 75 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  u;.            i
4820: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
4830: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4840: 78 5b 39 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  x[9];.          
4850: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
4860: 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  v = sqlite3_colu
4870: 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 69  mn_int64(pStmt,i
4880: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  );.            m
4890: 65 6d 63 70 79 28 26 75 2c 20 26 76 2c 20 38 29  emcpy(&u, &v, 8)
48a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
48b0: 72 28 6a 3d 38 3b 20 6a 3e 3d 31 3b 20 6a 2d 2d  r(j=8; j>=1; j--
48c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
48d0: 20 78 5b 6a 5d 20 3d 20 75 20 26 20 30 78 66 66   x[j] = u & 0xff
48e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
48f0: 75 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 20 20 20  u >>= 8;.       
4900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4910: 20 20 20 78 5b 30 5d 20 3d 20 27 49 27 3b 0a 20     x[0] = 'I';. 
4920: 20 20 20 20 20 20 20 20 20 20 20 53 48 41 33 55             SHA3U
4930: 70 64 61 74 65 28 26 63 78 2c 20 78 2c 20 39 29  pdate(&cx, x, 9)
4940: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
4950: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
4960: 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
4970: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a  SQLITE_FLOAT: {.
4980: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
4990: 74 65 33 5f 75 69 6e 74 36 34 20 75 3b 0a 20 20  te3_uint64 u;.  
49a0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
49b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73  .            uns
49c0: 69 67 6e 65 64 20 63 68 61 72 20 78 5b 39 5d 3b  igned char x[9];
49d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75  .            dou
49e0: 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ble r = sqlite3_
49f0: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53  column_double(pS
4a00: 74 6d 74 2c 69 29 3b 0a 20 20 20 20 20 20 20 20  tmt,i);.        
4a10: 20 20 20 20 6d 65 6d 63 70 79 28 26 75 2c 20 26      memcpy(&u, &
4a20: 72 2c 20 38 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 8);.         
4a30: 20 20 20 66 6f 72 28 6a 3d 38 3b 20 6a 3e 3d 31     for(j=8; j>=1
4a40: 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  ; j--){.        
4a50: 20 20 20 20 20 20 78 5b 6a 5d 20 3d 20 75 20 26        x[j] = u &
4a60: 20 30 78 66 66 3b 0a 20 20 20 20 20 20 20 20 20   0xff;.         
4a70: 20 20 20 20 20 75 20 3e 3e 3d 20 38 3b 0a 20 20       u >>= 8;.  
4a80: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4a90: 20 20 20 20 20 20 20 20 78 5b 30 5d 20 3d 20 27          x[0] = '
4aa0: 46 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  F';.            
4ab0: 53 48 41 33 55 70 64 61 74 65 28 26 63 78 2c 78  SHA3Update(&cx,x
4ac0: 2c 39 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,9);.           
4ad0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4ae0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
4af0: 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20  se SQLITE_TEXT: 
4b00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
4b10: 74 20 6e 32 20 3d 20 73 71 6c 69 74 65 33 5f 63  t n2 = sqlite3_c
4b20: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
4b30: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
4b40: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
4b50: 64 20 63 68 61 72 20 2a 7a 32 20 3d 20 73 71 6c  d char *z2 = sql
4b60: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
4b70: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
4b80: 20 20 20 20 20 20 20 20 68 61 73 68 5f 73 74 65          hash_ste
4b90: 70 5f 76 66 6f 72 6d 61 74 28 26 63 78 2c 22 54  p_vformat(&cx,"T
4ba0: 25 64 3a 22 2c 6e 32 29 3b 0a 20 20 20 20 20 20  %d:",n2);.      
4bb0: 20 20 20 20 20 20 53 48 41 33 55 70 64 61 74 65        SHA3Update
4bc0: 28 26 63 78 2c 20 7a 32 2c 20 6e 32 29 3b 0a 20  (&cx, z2, n2);. 
4bd0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
4be0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4bf0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
4c00: 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
4c10: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 32 20 3d          int n2 =
4c20: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
4c30: 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 29 3b  bytes(pStmt, i);
4c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
4c50: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4c60: 20 2a 7a 32 20 3d 20 73 71 6c 69 74 65 33 5f 63   *z2 = sqlite3_c
4c70: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
4c80: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
4c90: 20 20 68 61 73 68 5f 73 74 65 70 5f 76 66 6f 72    hash_step_vfor
4ca0: 6d 61 74 28 26 63 78 2c 22 42 25 64 3a 22 2c 6e  mat(&cx,"B%d:",n
4cb0: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
4cc0: 53 48 41 33 55 70 64 61 74 65 28 26 63 78 2c 20  SHA3Update(&cx, 
4cd0: 7a 32 2c 20 6e 32 29 3b 0a 20 20 20 20 20 20 20  z2, n2);.       
4ce0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4d00: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
4d10: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
4d20: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d  lize(pStmt);.  }
4d30: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
4d40: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
4d50: 53 48 41 33 46 69 6e 61 6c 28 26 63 78 29 2c 20  SHA3Final(&cx), 
4d60: 69 53 69 7a 65 2f 38 2c 20 53 51 4c 49 54 45 5f  iSize/8, SQLITE_
4d70: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 0a  TRANSIENT);.}...
4d80: 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f  #ifdef _WIN32.__
4d90: 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f  declspec(dllexpo
4da0: 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73  rt).#endif.int s
4db0: 71 6c 69 74 65 33 5f 73 68 61 74 68 72 65 65 5f  qlite3_shathree_
4dc0: 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20  init(.  sqlite3 
4dd0: 2a 64 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  *db,.  char **pz
4de0: 45 72 72 4d 73 67 2c 0a 20 20 63 6f 6e 73 74 20  ErrMsg,.  const 
4df0: 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
4e00: 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20  ines *pApi.){.  
4e10: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4e20: 4f 4b 3b 0a 20 20 53 51 4c 49 54 45 5f 45 58 54  OK;.  SQLITE_EXT
4e30: 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70  ENSION_INIT2(pAp
4e40: 69 29 3b 0a 20 20 28 76 6f 69 64 29 70 7a 45 72  i);.  (void)pzEr
4e50: 72 4d 73 67 3b 20 20 2f 2a 20 55 6e 75 73 65 64  rMsg;  /* Unused
4e60: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
4e70: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
4e80: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
4e90: 20 22 73 68 61 33 22 2c 20 31 2c 20 53 51 4c 49   "sha3", 1, SQLI
4ea0: 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 20 20 20 20 20 20 73 68 61 33 46             sha3F
4ed0: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  unc, 0, 0);.  if
4ee0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4ef0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4f00: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
4f10: 69 6f 6e 28 64 62 2c 20 22 73 68 61 33 22 2c 20  ion(db, "sha3", 
4f20: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
4f30: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f50: 20 20 20 20 73 68 61 33 46 75 6e 63 2c 20 30 2c      sha3Func, 0,
4f60: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
4f70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4f80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4f90: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
4fa0: 28 64 62 2c 20 22 73 68 61 33 5f 71 75 65 72 79  (db, "sha3_query
4fb0: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
4fc0: 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 20 20 20 20 20 20 20 73 68 61 33 51 75 65 72 79         sha3Query
4ff0: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Func, 0, 0);.  }
5000: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5010: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
5020: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
5030: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73 68  function(db, "sh
5040: 61 33 5f 71 75 65 72 79 22 2c 20 32 2c 20 53 51  a3_query", 2, SQ
5050: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
5080: 68 61 33 51 75 65 72 79 46 75 6e 63 2c 20 30 2c  ha3QueryFunc, 0,
5090: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
50a0: 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.