SQLite
Hex Artifact Content
Not logged in

Artifact fa185d7aee0ad0aca5e091b4a2db7baff11796170e5793b5de99e511a13af448:


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 61 20 66 75   implements a fu
01a0: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 63 6f 6d  nctions that com
01b0: 70 75 74 65 20 53 48 41 31 20 68 61 73 68 65 73  pute SHA1 hashes
01c0: 2e 0a 2a 2a 20 54 77 6f 20 53 51 4c 20 66 75 6e  ..** Two SQL fun
01d0: 63 74 69 6f 6e 73 20 61 72 65 20 69 6d 70 6c 65  ctions are imple
01e0: 6d 65 6e 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  mented:.**.**   
01f0: 20 20 73 68 61 33 28 58 2c 53 49 5a 45 29 0a 2a    sha3(X,SIZE).*
0200: 2a 20 20 20 20 20 73 68 61 33 5f 71 75 65 72 79  *     sha3_query
0210: 28 59 2c 53 49 5a 45 29 0a 2a 2a 0a 2a 2a 20 54  (Y,SIZE).**.** T
0220: 68 65 20 73 68 61 33 28 58 29 20 66 75 6e 63 74  he sha3(X) funct
0230: 69 6f 6e 20 63 6f 6d 70 75 74 65 73 20 74 68 65  ion computes the
0240: 20 53 48 41 33 20 68 61 73 68 20 6f 66 20 74 68   SHA3 hash of th
0250: 65 20 69 6e 70 75 74 20 58 2c 20 6f 72 20 4e 55  e input X, or NU
0260: 4c 4c 20 69 66 0a 2a 2a 20 58 20 69 73 20 4e 55  LL if.** X is NU
0270: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 68  LL..**.** The sh
0280: 61 33 5f 71 75 65 72 79 28 59 29 20 66 75 6e 63  a3_query(Y) func
0290: 74 69 6f 6e 20 65 76 61 6c 75 74 65 73 20 61 6c  tion evalutes al
02a0: 6c 20 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  l queries in the
02b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
02c0: 6f 66 20 59 0a 2a 2a 20 61 6e 64 20 72 65 74 75  of Y.** and retu
02d0: 72 6e 73 20 61 20 68 61 73 68 20 6f 66 20 74 68  rns a hash of th
02e0: 65 69 72 20 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a  eir results..**.
02f0: 2a 2a 20 54 68 65 20 53 49 5a 45 20 61 72 67 75  ** The SIZE argu
0300: 6d 65 6e 74 20 69 73 20 6f 70 74 69 6f 6e 61 6c  ment is optional
0310: 2e 20 20 49 66 20 6f 6d 69 74 74 65 64 2c 20 74  .  If omitted, t
0320: 68 65 20 53 48 41 33 2d 32 35 36 20 68 61 73 68  he SHA3-256 hash
0330: 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 69 73   algorithm.** is
0340: 20 75 73 65 64 2e 20 20 49 66 20 53 49 5a 45 20   used.  If SIZE 
0350: 69 73 20 69 6e 63 6c 75 64 65 64 20 69 74 20 6d  is included it m
0360: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68  ust be one of th
0370: 65 20 69 6e 74 65 67 65 72 73 20 32 32 34 2c 20  e integers 224, 
0380: 32 35 36 2c 0a 2a 2a 20 33 38 34 2c 20 6f 72 20  256,.** 384, or 
0390: 35 31 32 2c 20 74 6f 20 64 65 74 65 72 6d 69 6e  512, to determin
03a0: 65 20 53 48 41 33 20 68 61 73 68 20 76 61 72 69  e SHA3 hash vari
03b0: 61 6e 74 20 74 68 61 74 20 69 73 20 63 6f 6d 70  ant that is comp
03c0: 75 74 65 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  uted..*/.#includ
03d0: 65 20 22 73 71 6c 69 74 65 33 65 78 74 2e 68 22  e "sqlite3ext.h"
03e0: 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f  .SQLITE_EXTENSIO
03f0: 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c 75 64 65  N_INIT1.#include
0400: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
0410: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
0420: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67  #include <stdarg
0430: 2e 68 3e 0a 74 79 70 65 64 65 66 20 73 71 6c 69  .h>.typedef sqli
0440: 74 65 33 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a  te3_uint64 u64;.
0450: 0a 2f 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 2a 2a  ****************
04a0: 0a 2a 2a 20 54 68 65 20 48 61 73 68 20 45 6e 67  .** The Hash Eng
04b0: 69 6e 65 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 63  ine.*/./*.** Mac
04c0: 72 6f 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ros to determine
04d0: 20 77 68 65 74 68 65 72 20 74 68 65 20 6d 61 63   whether the mac
04e0: 68 69 6e 65 20 69 73 20 62 69 67 20 6f 72 20 6c  hine is big or l
04f0: 69 74 74 6c 65 20 65 6e 64 69 61 6e 2c 0a 2a 2a  ittle endian,.**
0500: 20 61 6e 64 20 77 68 65 74 68 65 72 20 6f 72 20   and whether or 
0510: 6e 6f 74 20 74 68 61 74 20 64 65 74 65 72 6d 69  not that determi
0520: 6e 61 74 69 6f 6e 20 69 73 20 72 75 6e 2d 74 69  nation is run-ti
0530: 6d 65 20 6f 72 20 63 6f 6d 70 69 6c 65 2d 74 69  me or compile-ti
0540: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 62 65  me..**.** For be
0550: 73 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  st performance, 
0560: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
0570: 64 65 20 74 6f 20 67 75 65 73 73 20 61 74 20 74  de to guess at t
0580: 68 65 20 62 79 74 65 2d 6f 72 64 65 72 0a 2a 2a  he byte-order.**
0590: 20 75 73 69 6e 67 20 43 2d 70 72 65 70 72 6f 63   using C-preproc
05a0: 65 73 73 6f 72 20 6d 61 63 72 6f 73 2e 20 20 49  essor macros.  I
05b0: 66 20 74 68 61 74 20 69 73 20 75 6e 73 75 63 63  f that is unsucc
05c0: 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 0a 2a 2a  essful, or if.**
05d0: 20 2d 44 53 48 41 33 5f 42 59 54 45 4f 52 44 45   -DSHA3_BYTEORDE
05e0: 52 3d 30 20 69 73 20 73 65 74 2c 20 74 68 65 6e  R=0 is set, then
05f0: 20 62 79 74 65 2d 6f 72 64 65 72 20 69 73 20 64   byte-order is d
0600: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 61 74 20  etermined.** at 
0610: 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2f 0a 23 69 66  run-time..*/.#if
0620: 6e 64 65 66 20 53 48 41 33 5f 42 59 54 45 4f 52  ndef SHA3_BYTEOR
0630: 44 45 52 0a 23 20 69 66 20 64 65 66 69 6e 65 64  DER.# if defined
0640: 28 69 33 38 36 29 20 20 20 20 20 7c 7c 20 64 65  (i386)     || de
0650: 66 69 6e 65 64 28 5f 5f 69 33 38 36 5f 5f 29 20  fined(__i386__) 
0660: 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 4d 5f    || defined(_M_
0670: 49 58 38 36 29 20 7c 7c 20 20 20 20 5c 0a 20 20  IX86) ||    \.  
0680: 20 20 20 64 65 66 69 6e 65 64 28 5f 5f 78 38 36     defined(__x86
0690: 5f 36 34 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  _64) || defined(
06a0: 5f 5f 78 38 36 5f 36 34 5f 5f 29 20 7c 7c 20 64  __x86_64__) || d
06b0: 65 66 69 6e 65 64 28 5f 4d 5f 58 36 34 29 20 20  efined(_M_X64)  
06c0: 7c 7c 20 20 20 20 5c 0a 20 20 20 20 20 64 65 66  ||    \.     def
06d0: 69 6e 65 64 28 5f 4d 5f 41 4d 44 36 34 29 20 7c  ined(_M_AMD64) |
06e0: 7c 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d  | defined(_M_ARM
06f0: 29 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64  )     || defined
0700: 28 5f 5f 78 38 36 29 20 20 20 7c 7c 20 20 20 20  (__x86)   ||    
0710: 5c 0a 20 20 20 20 20 64 65 66 69 6e 65 64 28 5f  \.     defined(_
0720: 5f 61 72 6d 5f 5f 29 0a 23 20 20 20 64 65 66 69  _arm__).#   defi
0730: 6e 65 20 53 48 41 33 5f 42 59 54 45 4f 52 44 45  ne SHA3_BYTEORDE
0740: 52 20 20 20 20 31 32 33 34 0a 23 20 65 6c 69 66  R    1234.# elif
0750: 20 64 65 66 69 6e 65 64 28 73 70 61 72 63 29 20   defined(sparc) 
0760: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f     || defined(__
0770: 70 70 63 5f 5f 29 0a 23 20 20 20 64 65 66 69 6e  ppc__).#   defin
0780: 65 20 53 48 41 33 5f 42 59 54 45 4f 52 44 45 52  e SHA3_BYTEORDER
0790: 20 20 20 20 34 33 32 31 0a 23 20 65 6c 73 65 0a      4321.# else.
07a0: 23 20 20 20 64 65 66 69 6e 65 20 53 48 41 33 5f  #   define SHA3_
07b0: 42 59 54 45 4f 52 44 45 52 20 30 0a 23 20 65 6e  BYTEORDER 0.# en
07c0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  dif.#endif.../*.
07d0: 2a 2a 20 53 74 61 74 65 20 73 74 72 75 63 74 75  ** State structu
07e0: 72 65 20 66 6f 72 20 61 20 53 48 41 33 20 68 61  re for a SHA3 ha
07f0: 73 68 20 69 6e 20 70 72 6f 67 72 65 73 73 0a 2a  sh in progress.*
0800: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0810: 20 53 48 41 33 43 6f 6e 74 65 78 74 20 53 48 41   SHA3Context SHA
0820: 33 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  3Context;.struct
0830: 20 53 48 41 33 43 6f 6e 74 65 78 74 20 7b 0a 20   SHA3Context {. 
0840: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
0850: 20 73 5b 32 35 5d 3b 20 20 20 20 20 20 20 20 20   s[25];         
0860: 20 20 20 20 20 20 20 2f 2a 20 4b 65 63 63 61 6b         /* Keccak
0870: 20 73 74 61 74 65 2e 20 35 78 35 20 6c 69 6e 65   state. 5x5 line
0880: 73 20 6f 66 20 36 34 20 62 69 74 73 20 65 61 63  s of 64 bits eac
0890: 68 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  h */.    unsigne
08a0: 64 20 63 68 61 72 20 78 5b 31 36 30 30 5d 3b 20  d char x[1600]; 
08b0: 20 20 20 2f 2a 20 2e 2e 2e 20 6f 72 20 31 36 30     /* ... or 160
08c0: 30 20 62 79 74 65 73 20 2a 2f 0a 20 20 7d 20 75  0 bytes */.  } u
08d0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6e 52 61  ;.  unsigned nRa
08e0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 79  te;        /* By
08f0: 74 65 73 20 6f 66 20 69 6e 70 75 74 20 61 63 63  tes of input acc
0900: 65 70 74 65 64 20 70 65 72 20 4b 65 63 63 61 6b  epted per Keccak
0910: 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
0920: 75 6e 73 69 67 6e 65 64 20 6e 4c 6f 61 64 65 64  unsigned nLoaded
0930: 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20  ;      /* Input 
0940: 62 79 74 65 73 20 6c 6f 61 64 65 64 20 69 6e 74  bytes loaded int
0950: 6f 20 75 2e 78 5b 5d 20 73 6f 20 66 61 72 20 74  o u.x[] so far t
0960: 68 69 73 20 63 79 63 6c 65 20 2a 2f 0a 20 20 75  his cycle */.  u
0970: 6e 73 69 67 6e 65 64 20 69 78 4d 61 73 6b 3b 20  nsigned ixMask; 
0980: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
0990: 6e 65 78 74 20 69 6e 70 75 74 20 69 6e 74 6f 20  next input into 
09a0: 75 2e 78 5b 6e 4c 6f 61 64 65 64 5e 69 78 4d 61  u.x[nLoaded^ixMa
09b0: 73 6b 5d 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  sk]. */.};../*.*
09c0: 2a 20 41 20 73 69 6e 67 6c 65 20 73 74 65 70 20  * A single step 
09d0: 6f 66 20 74 68 65 20 4b 65 63 63 61 6b 20 6d 69  of the Keccak mi
09e0: 78 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f  xing function fo
09f0: 72 20 61 20 31 36 30 30 2d 62 69 74 20 73 74 61  r a 1600-bit sta
0a00: 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  te.*/.static voi
0a10: 64 20 4b 65 63 63 61 6b 46 31 36 30 30 53 74 65  d KeccakF1600Ste
0a20: 70 28 53 48 41 33 43 6f 6e 74 65 78 74 20 2a 70  p(SHA3Context *p
0a30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36  ){.  int i;.  u6
0a40: 34 20 42 30 2c 20 42 31 2c 20 42 32 2c 20 42 33  4 B0, B1, B2, B3
0a50: 2c 20 42 34 3b 0a 20 20 75 36 34 20 43 30 2c 20  , B4;.  u64 C0, 
0a60: 43 31 2c 20 43 32 2c 20 43 33 2c 20 43 34 3b 0a  C1, C2, C3, C4;.
0a70: 20 20 75 36 34 20 44 30 2c 20 44 31 2c 20 44 32    u64 D0, D1, D2
0a80: 2c 20 44 33 2c 20 44 34 3b 0a 20 20 73 74 61 74  , D3, D4;.  stat
0a90: 69 63 20 63 6f 6e 73 74 20 75 36 34 20 52 43 5b  ic const u64 RC[
0aa0: 5d 20 3d 20 7b 0a 20 20 20 20 30 78 30 30 30 30  ] = {.    0x0000
0ab0: 30 30 30 30 30 30 30 30 30 30 30 31 55 4c 4c 2c  000000000001ULL,
0ac0: 20 20 30 78 30 30 30 30 30 30 30 30 30 30 30 30    0x000000000000
0ad0: 38 30 38 32 55 4c 4c 2c 0a 20 20 20 20 30 78 38  8082ULL,.    0x8
0ae0: 30 30 30 30 30 30 30 30 30 30 30 38 30 38 61 55  00000000000808aU
0af0: 4c 4c 2c 20 20 30 78 38 30 30 30 30 30 30 30 38  LL,  0x800000008
0b00: 30 30 30 38 30 30 30 55 4c 4c 2c 0a 20 20 20 20  0008000ULL,.    
0b10: 30 78 30 30 30 30 30 30 30 30 30 30 30 30 38 30  0x00000000000080
0b20: 38 62 55 4c 4c 2c 20 20 30 78 30 30 30 30 30 30  8bULL,  0x000000
0b30: 30 30 38 30 30 30 30 30 30 31 55 4c 4c 2c 0a 20  0080000001ULL,. 
0b40: 20 20 20 30 78 38 30 30 30 30 30 30 30 38 30 30     0x80000000800
0b50: 30 38 30 38 31 55 4c 4c 2c 20 20 30 78 38 30 30  08081ULL,  0x800
0b60: 30 30 30 30 30 30 30 30 30 38 30 30 39 55 4c 4c  0000000008009ULL
0b70: 2c 0a 20 20 20 20 30 78 30 30 30 30 30 30 30 30  ,.    0x00000000
0b80: 30 30 30 30 30 30 38 61 55 4c 4c 2c 20 20 30 78  0000008aULL,  0x
0b90: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 38  0000000000000088
0ba0: 55 4c 4c 2c 0a 20 20 20 20 30 78 30 30 30 30 30  ULL,.    0x00000
0bb0: 30 30 30 38 30 30 30 38 30 30 39 55 4c 4c 2c 20  00080008009ULL, 
0bc0: 20 30 78 30 30 30 30 30 30 30 30 38 30 30 30 30   0x0000000080000
0bd0: 30 30 61 55 4c 4c 2c 0a 20 20 20 20 30 78 30 30  00aULL,.    0x00
0be0: 30 30 30 30 30 30 38 30 30 30 38 30 38 62 55 4c  0000008000808bUL
0bf0: 4c 2c 20 20 30 78 38 30 30 30 30 30 30 30 30 30  L,  0x8000000000
0c00: 30 30 30 30 38 62 55 4c 4c 2c 0a 20 20 20 20 30  00008bULL,.    0
0c10: 78 38 30 30 30 30 30 30 30 30 30 30 30 38 30 38  x800000000000808
0c20: 39 55 4c 4c 2c 20 20 30 78 38 30 30 30 30 30 30  9ULL,  0x8000000
0c30: 30 30 30 30 30 38 30 30 33 55 4c 4c 2c 0a 20 20  000008003ULL,.  
0c40: 20 20 30 78 38 30 30 30 30 30 30 30 30 30 30 30    0x800000000000
0c50: 38 30 30 32 55 4c 4c 2c 20 20 30 78 38 30 30 30  8002ULL,  0x8000
0c60: 30 30 30 30 30 30 30 30 30 30 38 30 55 4c 4c 2c  000000000080ULL,
0c70: 0a 20 20 20 20 30 78 30 30 30 30 30 30 30 30 30  .    0x000000000
0c80: 30 30 30 38 30 30 61 55 4c 4c 2c 20 20 30 78 38  000800aULL,  0x8
0c90: 30 30 30 30 30 30 30 38 30 30 30 30 30 30 61 55  00000008000000aU
0ca0: 4c 4c 2c 0a 20 20 20 20 30 78 38 30 30 30 30 30  LL,.    0x800000
0cb0: 30 30 38 30 30 30 38 30 38 31 55 4c 4c 2c 20 20  0080008081ULL,  
0cc0: 30 78 38 30 30 30 30 30 30 30 30 30 30 30 38 30  0x80000000000080
0cd0: 38 30 55 4c 4c 2c 0a 20 20 20 20 30 78 30 30 30  80ULL,.    0x000
0ce0: 30 30 30 30 30 38 30 30 30 30 30 30 31 55 4c 4c  0000080000001ULL
0cf0: 2c 20 20 30 78 38 30 30 30 30 30 30 30 38 30 30  ,  0x80000000800
0d00: 30 38 30 30 38 55 4c 4c 0a 20 20 7d 3b 0a 23 20  08008ULL.  };.# 
0d10: 64 65 66 69 6e 65 20 41 30 30 20 28 70 2d 3e 75  define A00 (p->u
0d20: 2e 73 5b 30 5d 29 0a 23 20 64 65 66 69 6e 65 20  .s[0]).# define 
0d30: 41 30 31 20 28 70 2d 3e 75 2e 73 5b 31 5d 29 0a  A01 (p->u.s[1]).
0d40: 23 20 64 65 66 69 6e 65 20 41 30 32 20 28 70 2d  # define A02 (p-
0d50: 3e 75 2e 73 5b 32 5d 29 0a 23 20 64 65 66 69 6e  >u.s[2]).# defin
0d60: 65 20 41 30 33 20 28 70 2d 3e 75 2e 73 5b 33 5d  e A03 (p->u.s[3]
0d70: 29 0a 23 20 64 65 66 69 6e 65 20 41 30 34 20 28  ).# define A04 (
0d80: 70 2d 3e 75 2e 73 5b 34 5d 29 0a 23 20 64 65 66  p->u.s[4]).# def
0d90: 69 6e 65 20 41 31 30 20 28 70 2d 3e 75 2e 73 5b  ine A10 (p->u.s[
0da0: 35 5d 29 0a 23 20 64 65 66 69 6e 65 20 41 31 31  5]).# define A11
0db0: 20 28 70 2d 3e 75 2e 73 5b 36 5d 29 0a 23 20 64   (p->u.s[6]).# d
0dc0: 65 66 69 6e 65 20 41 31 32 20 28 70 2d 3e 75 2e  efine A12 (p->u.
0dd0: 73 5b 37 5d 29 0a 23 20 64 65 66 69 6e 65 20 41  s[7]).# define A
0de0: 31 33 20 28 70 2d 3e 75 2e 73 5b 38 5d 29 0a 23  13 (p->u.s[8]).#
0df0: 20 64 65 66 69 6e 65 20 41 31 34 20 28 70 2d 3e   define A14 (p->
0e00: 75 2e 73 5b 39 5d 29 0a 23 20 64 65 66 69 6e 65  u.s[9]).# define
0e10: 20 41 32 30 20 28 70 2d 3e 75 2e 73 5b 31 30 5d   A20 (p->u.s[10]
0e20: 29 0a 23 20 64 65 66 69 6e 65 20 41 32 31 20 28  ).# define A21 (
0e30: 70 2d 3e 75 2e 73 5b 31 31 5d 29 0a 23 20 64 65  p->u.s[11]).# de
0e40: 66 69 6e 65 20 41 32 32 20 28 70 2d 3e 75 2e 73  fine A22 (p->u.s
0e50: 5b 31 32 5d 29 0a 23 20 64 65 66 69 6e 65 20 41  [12]).# define A
0e60: 32 33 20 28 70 2d 3e 75 2e 73 5b 31 33 5d 29 0a  23 (p->u.s[13]).
0e70: 23 20 64 65 66 69 6e 65 20 41 32 34 20 28 70 2d  # define A24 (p-
0e80: 3e 75 2e 73 5b 31 34 5d 29 0a 23 20 64 65 66 69  >u.s[14]).# defi
0e90: 6e 65 20 41 33 30 20 28 70 2d 3e 75 2e 73 5b 31  ne A30 (p->u.s[1
0ea0: 35 5d 29 0a 23 20 64 65 66 69 6e 65 20 41 33 31  5]).# define A31
0eb0: 20 28 70 2d 3e 75 2e 73 5b 31 36 5d 29 0a 23 20   (p->u.s[16]).# 
0ec0: 64 65 66 69 6e 65 20 41 33 32 20 28 70 2d 3e 75  define A32 (p->u
0ed0: 2e 73 5b 31 37 5d 29 0a 23 20 64 65 66 69 6e 65  .s[17]).# define
0ee0: 20 41 33 33 20 28 70 2d 3e 75 2e 73 5b 31 38 5d   A33 (p->u.s[18]
0ef0: 29 0a 23 20 64 65 66 69 6e 65 20 41 33 34 20 28  ).# define A34 (
0f00: 70 2d 3e 75 2e 73 5b 31 39 5d 29 0a 23 20 64 65  p->u.s[19]).# de
0f10: 66 69 6e 65 20 41 34 30 20 28 70 2d 3e 75 2e 73  fine A40 (p->u.s
0f20: 5b 32 30 5d 29 0a 23 20 64 65 66 69 6e 65 20 41  [20]).# define A
0f30: 34 31 20 28 70 2d 3e 75 2e 73 5b 32 31 5d 29 0a  41 (p->u.s[21]).
0f40: 23 20 64 65 66 69 6e 65 20 41 34 32 20 28 70 2d  # define A42 (p-
0f50: 3e 75 2e 73 5b 32 32 5d 29 0a 23 20 64 65 66 69  >u.s[22]).# defi
0f60: 6e 65 20 41 34 33 20 28 70 2d 3e 75 2e 73 5b 32  ne A43 (p->u.s[2
0f70: 33 5d 29 0a 23 20 64 65 66 69 6e 65 20 41 34 34  3]).# define A44
0f80: 20 28 70 2d 3e 75 2e 73 5b 32 34 5d 29 0a 23 20   (p->u.s[24]).# 
0f90: 64 65 66 69 6e 65 20 52 4f 4c 36 34 28 61 2c 78  define ROL64(a,x
0fa0: 29 20 28 28 61 3c 3c 78 29 7c 28 61 3e 3e 28 36  ) ((a<<x)|(a>>(6
0fb0: 34 2d 78 29 29 29 0a 0a 20 20 66 6f 72 28 69 3d  4-x)))..  for(i=
0fc0: 30 3b 20 69 3c 32 34 3b 20 69 2b 3d 34 29 7b 0a  0; i<24; i+=4){.
0fd0: 20 20 20 20 43 30 20 3d 20 41 30 30 5e 41 31 30      C0 = A00^A10
0fe0: 5e 41 32 30 5e 41 33 30 5e 41 34 30 3b 0a 20 20  ^A20^A30^A40;.  
0ff0: 20 20 43 31 20 3d 20 41 30 31 5e 41 31 31 5e 41    C1 = A01^A11^A
1000: 32 31 5e 41 33 31 5e 41 34 31 3b 0a 20 20 20 20  21^A31^A41;.    
1010: 43 32 20 3d 20 41 30 32 5e 41 31 32 5e 41 32 32  C2 = A02^A12^A22
1020: 5e 41 33 32 5e 41 34 32 3b 0a 20 20 20 20 43 33  ^A32^A42;.    C3
1030: 20 3d 20 41 30 33 5e 41 31 33 5e 41 32 33 5e 41   = A03^A13^A23^A
1040: 33 33 5e 41 34 33 3b 0a 20 20 20 20 43 34 20 3d  33^A43;.    C4 =
1050: 20 41 30 34 5e 41 31 34 5e 41 32 34 5e 41 33 34   A04^A14^A24^A34
1060: 5e 41 34 34 3b 0a 20 20 20 20 44 30 20 3d 20 43  ^A44;.    D0 = C
1070: 34 5e 52 4f 4c 36 34 28 43 31 2c 20 31 29 3b 0a  4^ROL64(C1, 1);.
1080: 20 20 20 20 44 31 20 3d 20 43 30 5e 52 4f 4c 36      D1 = C0^ROL6
1090: 34 28 43 32 2c 20 31 29 3b 0a 20 20 20 20 44 32  4(C2, 1);.    D2
10a0: 20 3d 20 43 31 5e 52 4f 4c 36 34 28 43 33 2c 20   = C1^ROL64(C3, 
10b0: 31 29 3b 0a 20 20 20 20 44 33 20 3d 20 43 32 5e  1);.    D3 = C2^
10c0: 52 4f 4c 36 34 28 43 34 2c 20 31 29 3b 0a 20 20  ROL64(C4, 1);.  
10d0: 20 20 44 34 20 3d 20 43 33 5e 52 4f 4c 36 34 28    D4 = C3^ROL64(
10e0: 43 30 2c 20 31 29 3b 0a 0a 20 20 20 20 42 30 20  C0, 1);..    B0 
10f0: 3d 20 28 41 30 30 5e 44 30 29 3b 0a 20 20 20 20  = (A00^D0);.    
1100: 42 31 20 3d 20 52 4f 4c 36 34 28 28 41 31 31 5e  B1 = ROL64((A11^
1110: 44 31 29 2c 20 34 34 29 3b 0a 20 20 20 20 42 32  D1), 44);.    B2
1120: 20 3d 20 52 4f 4c 36 34 28 28 41 32 32 5e 44 32   = ROL64((A22^D2
1130: 29 2c 20 34 33 29 3b 0a 20 20 20 20 42 33 20 3d  ), 43);.    B3 =
1140: 20 52 4f 4c 36 34 28 28 41 33 33 5e 44 33 29 2c   ROL64((A33^D3),
1150: 20 32 31 29 3b 0a 20 20 20 20 42 34 20 3d 20 52   21);.    B4 = R
1160: 4f 4c 36 34 28 28 41 34 34 5e 44 34 29 2c 20 31  OL64((A44^D4), 1
1170: 34 29 3b 0a 20 20 20 20 41 30 30 20 3d 20 20 20  4);.    A00 =   
1180: 42 30 20 5e 28 28 7e 42 31 29 26 20 20 42 32 20  B0 ^((~B1)&  B2 
1190: 29 3b 0a 20 20 20 20 41 30 30 20 5e 3d 20 52 43  );.    A00 ^= RC
11a0: 5b 69 5d 3b 0a 20 20 20 20 41 31 31 20 3d 20 20  [i];.    A11 =  
11b0: 20 42 31 20 5e 28 28 7e 42 32 29 26 20 20 42 33   B1 ^((~B2)&  B3
11c0: 20 29 3b 0a 20 20 20 20 41 32 32 20 3d 20 20 20   );.    A22 =   
11d0: 42 32 20 5e 28 28 7e 42 33 29 26 20 20 42 34 20  B2 ^((~B3)&  B4 
11e0: 29 3b 0a 20 20 20 20 41 33 33 20 3d 20 20 20 42  );.    A33 =   B
11f0: 33 20 5e 28 28 7e 42 34 29 26 20 20 42 30 20 29  3 ^((~B4)&  B0 )
1200: 3b 0a 20 20 20 20 41 34 34 20 3d 20 20 20 42 34  ;.    A44 =   B4
1210: 20 5e 28 28 7e 42 30 29 26 20 20 42 31 20 29 3b   ^((~B0)&  B1 );
1220: 0a 0a 20 20 20 20 42 32 20 3d 20 52 4f 4c 36 34  ..    B2 = ROL64
1230: 28 28 41 32 30 5e 44 30 29 2c 20 33 29 3b 0a 20  ((A20^D0), 3);. 
1240: 20 20 20 42 33 20 3d 20 52 4f 4c 36 34 28 28 41     B3 = ROL64((A
1250: 33 31 5e 44 31 29 2c 20 34 35 29 3b 0a 20 20 20  31^D1), 45);.   
1260: 20 42 34 20 3d 20 52 4f 4c 36 34 28 28 41 34 32   B4 = ROL64((A42
1270: 5e 44 32 29 2c 20 36 31 29 3b 0a 20 20 20 20 42  ^D2), 61);.    B
1280: 30 20 3d 20 52 4f 4c 36 34 28 28 41 30 33 5e 44  0 = ROL64((A03^D
1290: 33 29 2c 20 32 38 29 3b 0a 20 20 20 20 42 31 20  3), 28);.    B1 
12a0: 3d 20 52 4f 4c 36 34 28 28 41 31 34 5e 44 34 29  = ROL64((A14^D4)
12b0: 2c 20 32 30 29 3b 0a 20 20 20 20 41 32 30 20 3d  , 20);.    A20 =
12c0: 20 20 20 42 30 20 5e 28 28 7e 42 31 29 26 20 20     B0 ^((~B1)&  
12d0: 42 32 20 29 3b 0a 20 20 20 20 41 33 31 20 3d 20  B2 );.    A31 = 
12e0: 20 20 42 31 20 5e 28 28 7e 42 32 29 26 20 20 42    B1 ^((~B2)&  B
12f0: 33 20 29 3b 0a 20 20 20 20 41 34 32 20 3d 20 20  3 );.    A42 =  
1300: 20 42 32 20 5e 28 28 7e 42 33 29 26 20 20 42 34   B2 ^((~B3)&  B4
1310: 20 29 3b 0a 20 20 20 20 41 30 33 20 3d 20 20 20   );.    A03 =   
1320: 42 33 20 5e 28 28 7e 42 34 29 26 20 20 42 30 20  B3 ^((~B4)&  B0 
1330: 29 3b 0a 20 20 20 20 41 31 34 20 3d 20 20 20 42  );.    A14 =   B
1340: 34 20 5e 28 28 7e 42 30 29 26 20 20 42 31 20 29  4 ^((~B0)&  B1 )
1350: 3b 0a 0a 20 20 20 20 42 34 20 3d 20 52 4f 4c 36  ;..    B4 = ROL6
1360: 34 28 28 41 34 30 5e 44 30 29 2c 20 31 38 29 3b  4((A40^D0), 18);
1370: 0a 20 20 20 20 42 30 20 3d 20 52 4f 4c 36 34 28  .    B0 = ROL64(
1380: 28 41 30 31 5e 44 31 29 2c 20 31 29 3b 0a 20 20  (A01^D1), 1);.  
1390: 20 20 42 31 20 3d 20 52 4f 4c 36 34 28 28 41 31    B1 = ROL64((A1
13a0: 32 5e 44 32 29 2c 20 36 29 3b 0a 20 20 20 20 42  2^D2), 6);.    B
13b0: 32 20 3d 20 52 4f 4c 36 34 28 28 41 32 33 5e 44  2 = ROL64((A23^D
13c0: 33 29 2c 20 32 35 29 3b 0a 20 20 20 20 42 33 20  3), 25);.    B3 
13d0: 3d 20 52 4f 4c 36 34 28 28 41 33 34 5e 44 34 29  = ROL64((A34^D4)
13e0: 2c 20 38 29 3b 0a 20 20 20 20 41 34 30 20 3d 20  , 8);.    A40 = 
13f0: 20 20 42 30 20 5e 28 28 7e 42 31 29 26 20 20 42    B0 ^((~B1)&  B
1400: 32 20 29 3b 0a 20 20 20 20 41 30 31 20 3d 20 20  2 );.    A01 =  
1410: 20 42 31 20 5e 28 28 7e 42 32 29 26 20 20 42 33   B1 ^((~B2)&  B3
1420: 20 29 3b 0a 20 20 20 20 41 31 32 20 3d 20 20 20   );.    A12 =   
1430: 42 32 20 5e 28 28 7e 42 33 29 26 20 20 42 34 20  B2 ^((~B3)&  B4 
1440: 29 3b 0a 20 20 20 20 41 32 33 20 3d 20 20 20 42  );.    A23 =   B
1450: 33 20 5e 28 28 7e 42 34 29 26 20 20 42 30 20 29  3 ^((~B4)&  B0 )
1460: 3b 0a 20 20 20 20 41 33 34 20 3d 20 20 20 42 34  ;.    A34 =   B4
1470: 20 5e 28 28 7e 42 30 29 26 20 20 42 31 20 29 3b   ^((~B0)&  B1 );
1480: 0a 0a 20 20 20 20 42 31 20 3d 20 52 4f 4c 36 34  ..    B1 = ROL64
1490: 28 28 41 31 30 5e 44 30 29 2c 20 33 36 29 3b 0a  ((A10^D0), 36);.
14a0: 20 20 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28      B2 = ROL64((
14b0: 41 32 31 5e 44 31 29 2c 20 31 30 29 3b 0a 20 20  A21^D1), 10);.  
14c0: 20 20 42 33 20 3d 20 52 4f 4c 36 34 28 28 41 33    B3 = ROL64((A3
14d0: 32 5e 44 32 29 2c 20 31 35 29 3b 0a 20 20 20 20  2^D2), 15);.    
14e0: 42 34 20 3d 20 52 4f 4c 36 34 28 28 41 34 33 5e  B4 = ROL64((A43^
14f0: 44 33 29 2c 20 35 36 29 3b 0a 20 20 20 20 42 30  D3), 56);.    B0
1500: 20 3d 20 52 4f 4c 36 34 28 28 41 30 34 5e 44 34   = ROL64((A04^D4
1510: 29 2c 20 32 37 29 3b 0a 20 20 20 20 41 31 30 20  ), 27);.    A10 
1520: 3d 20 20 20 42 30 20 5e 28 28 7e 42 31 29 26 20  =   B0 ^((~B1)& 
1530: 20 42 32 20 29 3b 0a 20 20 20 20 41 32 31 20 3d   B2 );.    A21 =
1540: 20 20 20 42 31 20 5e 28 28 7e 42 32 29 26 20 20     B1 ^((~B2)&  
1550: 42 33 20 29 3b 0a 20 20 20 20 41 33 32 20 3d 20  B3 );.    A32 = 
1560: 20 20 42 32 20 5e 28 28 7e 42 33 29 26 20 20 42    B2 ^((~B3)&  B
1570: 34 20 29 3b 0a 20 20 20 20 41 34 33 20 3d 20 20  4 );.    A43 =  
1580: 20 42 33 20 5e 28 28 7e 42 34 29 26 20 20 42 30   B3 ^((~B4)&  B0
1590: 20 29 3b 0a 20 20 20 20 41 30 34 20 3d 20 20 20   );.    A04 =   
15a0: 42 34 20 5e 28 28 7e 42 30 29 26 20 20 42 31 20  B4 ^((~B0)&  B1 
15b0: 29 3b 0a 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c  );..    B3 = ROL
15c0: 36 34 28 28 41 33 30 5e 44 30 29 2c 20 34 31 29  64((A30^D0), 41)
15d0: 3b 0a 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34  ;.    B4 = ROL64
15e0: 28 28 41 34 31 5e 44 31 29 2c 20 32 29 3b 0a 20  ((A41^D1), 2);. 
15f0: 20 20 20 42 30 20 3d 20 52 4f 4c 36 34 28 28 41     B0 = ROL64((A
1600: 30 32 5e 44 32 29 2c 20 36 32 29 3b 0a 20 20 20  02^D2), 62);.   
1610: 20 42 31 20 3d 20 52 4f 4c 36 34 28 28 41 31 33   B1 = ROL64((A13
1620: 5e 44 33 29 2c 20 35 35 29 3b 0a 20 20 20 20 42  ^D3), 55);.    B
1630: 32 20 3d 20 52 4f 4c 36 34 28 28 41 32 34 5e 44  2 = ROL64((A24^D
1640: 34 29 2c 20 33 39 29 3b 0a 20 20 20 20 41 33 30  4), 39);.    A30
1650: 20 3d 20 20 20 42 30 20 5e 28 28 7e 42 31 29 26   =   B0 ^((~B1)&
1660: 20 20 42 32 20 29 3b 0a 20 20 20 20 41 34 31 20    B2 );.    A41 
1670: 3d 20 20 20 42 31 20 5e 28 28 7e 42 32 29 26 20  =   B1 ^((~B2)& 
1680: 20 42 33 20 29 3b 0a 20 20 20 20 41 30 32 20 3d   B3 );.    A02 =
1690: 20 20 20 42 32 20 5e 28 28 7e 42 33 29 26 20 20     B2 ^((~B3)&  
16a0: 42 34 20 29 3b 0a 20 20 20 20 41 31 33 20 3d 20  B4 );.    A13 = 
16b0: 20 20 42 33 20 5e 28 28 7e 42 34 29 26 20 20 42    B3 ^((~B4)&  B
16c0: 30 20 29 3b 0a 20 20 20 20 41 32 34 20 3d 20 20  0 );.    A24 =  
16d0: 20 42 34 20 5e 28 28 7e 42 30 29 26 20 20 42 31   B4 ^((~B0)&  B1
16e0: 20 29 3b 0a 0a 20 20 20 20 43 30 20 3d 20 41 30   );..    C0 = A0
16f0: 30 5e 41 32 30 5e 41 34 30 5e 41 31 30 5e 41 33  0^A20^A40^A10^A3
1700: 30 3b 0a 20 20 20 20 43 31 20 3d 20 41 31 31 5e  0;.    C1 = A11^
1710: 41 33 31 5e 41 30 31 5e 41 32 31 5e 41 34 31 3b  A31^A01^A21^A41;
1720: 0a 20 20 20 20 43 32 20 3d 20 41 32 32 5e 41 34  .    C2 = A22^A4
1730: 32 5e 41 31 32 5e 41 33 32 5e 41 30 32 3b 0a 20  2^A12^A32^A02;. 
1740: 20 20 20 43 33 20 3d 20 41 33 33 5e 41 30 33 5e     C3 = A33^A03^
1750: 41 32 33 5e 41 34 33 5e 41 31 33 3b 0a 20 20 20  A23^A43^A13;.   
1760: 20 43 34 20 3d 20 41 34 34 5e 41 31 34 5e 41 33   C4 = A44^A14^A3
1770: 34 5e 41 30 34 5e 41 32 34 3b 0a 20 20 20 20 44  4^A04^A24;.    D
1780: 30 20 3d 20 43 34 5e 52 4f 4c 36 34 28 43 31 2c  0 = C4^ROL64(C1,
1790: 20 31 29 3b 0a 20 20 20 20 44 31 20 3d 20 43 30   1);.    D1 = C0
17a0: 5e 52 4f 4c 36 34 28 43 32 2c 20 31 29 3b 0a 20  ^ROL64(C2, 1);. 
17b0: 20 20 20 44 32 20 3d 20 43 31 5e 52 4f 4c 36 34     D2 = C1^ROL64
17c0: 28 43 33 2c 20 31 29 3b 0a 20 20 20 20 44 33 20  (C3, 1);.    D3 
17d0: 3d 20 43 32 5e 52 4f 4c 36 34 28 43 34 2c 20 31  = C2^ROL64(C4, 1
17e0: 29 3b 0a 20 20 20 20 44 34 20 3d 20 43 33 5e 52  );.    D4 = C3^R
17f0: 4f 4c 36 34 28 43 30 2c 20 31 29 3b 0a 0a 20 20  OL64(C0, 1);..  
1800: 20 20 42 30 20 3d 20 28 41 30 30 5e 44 30 29 3b    B0 = (A00^D0);
1810: 0a 20 20 20 20 42 31 20 3d 20 52 4f 4c 36 34 28  .    B1 = ROL64(
1820: 28 41 33 31 5e 44 31 29 2c 20 34 34 29 3b 0a 20  (A31^D1), 44);. 
1830: 20 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28 41     B2 = ROL64((A
1840: 31 32 5e 44 32 29 2c 20 34 33 29 3b 0a 20 20 20  12^D2), 43);.   
1850: 20 42 33 20 3d 20 52 4f 4c 36 34 28 28 41 34 33   B3 = ROL64((A43
1860: 5e 44 33 29 2c 20 32 31 29 3b 0a 20 20 20 20 42  ^D3), 21);.    B
1870: 34 20 3d 20 52 4f 4c 36 34 28 28 41 32 34 5e 44  4 = ROL64((A24^D
1880: 34 29 2c 20 31 34 29 3b 0a 20 20 20 20 41 30 30  4), 14);.    A00
1890: 20 3d 20 20 20 42 30 20 5e 28 28 7e 42 31 29 26   =   B0 ^((~B1)&
18a0: 20 20 42 32 20 29 3b 0a 20 20 20 20 41 30 30 20    B2 );.    A00 
18b0: 5e 3d 20 52 43 5b 69 2b 31 5d 3b 0a 20 20 20 20  ^= RC[i+1];.    
18c0: 41 33 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42  A31 =   B1 ^((~B
18d0: 32 29 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41  2)&  B3 );.    A
18e0: 31 32 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33  12 =   B2 ^((~B3
18f0: 29 26 20 20 42 34 20 29 3b 0a 20 20 20 20 41 34  )&  B4 );.    A4
1900: 33 20 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29  3 =   B3 ^((~B4)
1910: 26 20 20 42 30 20 29 3b 0a 20 20 20 20 41 32 34  &  B0 );.    A24
1920: 20 3d 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26   =   B4 ^((~B0)&
1930: 20 20 42 31 20 29 3b 0a 0a 20 20 20 20 42 32 20    B1 );..    B2 
1940: 3d 20 52 4f 4c 36 34 28 28 41 34 30 5e 44 30 29  = ROL64((A40^D0)
1950: 2c 20 33 29 3b 0a 20 20 20 20 42 33 20 3d 20 52  , 3);.    B3 = R
1960: 4f 4c 36 34 28 28 41 32 31 5e 44 31 29 2c 20 34  OL64((A21^D1), 4
1970: 35 29 3b 0a 20 20 20 20 42 34 20 3d 20 52 4f 4c  5);.    B4 = ROL
1980: 36 34 28 28 41 30 32 5e 44 32 29 2c 20 36 31 29  64((A02^D2), 61)
1990: 3b 0a 20 20 20 20 42 30 20 3d 20 52 4f 4c 36 34  ;.    B0 = ROL64
19a0: 28 28 41 33 33 5e 44 33 29 2c 20 32 38 29 3b 0a  ((A33^D3), 28);.
19b0: 20 20 20 20 42 31 20 3d 20 52 4f 4c 36 34 28 28      B1 = ROL64((
19c0: 41 31 34 5e 44 34 29 2c 20 32 30 29 3b 0a 20 20  A14^D4), 20);.  
19d0: 20 20 41 34 30 20 3d 20 20 20 42 30 20 5e 28 28    A40 =   B0 ^((
19e0: 7e 42 31 29 26 20 20 42 32 20 29 3b 0a 20 20 20  ~B1)&  B2 );.   
19f0: 20 41 32 31 20 3d 20 20 20 42 31 20 5e 28 28 7e   A21 =   B1 ^((~
1a00: 42 32 29 26 20 20 42 33 20 29 3b 0a 20 20 20 20  B2)&  B3 );.    
1a10: 41 30 32 20 3d 20 20 20 42 32 20 5e 28 28 7e 42  A02 =   B2 ^((~B
1a20: 33 29 26 20 20 42 34 20 29 3b 0a 20 20 20 20 41  3)&  B4 );.    A
1a30: 33 33 20 3d 20 20 20 42 33 20 5e 28 28 7e 42 34  33 =   B3 ^((~B4
1a40: 29 26 20 20 42 30 20 29 3b 0a 20 20 20 20 41 31  )&  B0 );.    A1
1a50: 34 20 3d 20 20 20 42 34 20 5e 28 28 7e 42 30 29  4 =   B4 ^((~B0)
1a60: 26 20 20 42 31 20 29 3b 0a 0a 20 20 20 20 42 34  &  B1 );..    B4
1a70: 20 3d 20 52 4f 4c 36 34 28 28 41 33 30 5e 44 30   = ROL64((A30^D0
1a80: 29 2c 20 31 38 29 3b 0a 20 20 20 20 42 30 20 3d  ), 18);.    B0 =
1a90: 20 52 4f 4c 36 34 28 28 41 31 31 5e 44 31 29 2c   ROL64((A11^D1),
1aa0: 20 31 29 3b 0a 20 20 20 20 42 31 20 3d 20 52 4f   1);.    B1 = RO
1ab0: 4c 36 34 28 28 41 34 32 5e 44 32 29 2c 20 36 29  L64((A42^D2), 6)
1ac0: 3b 0a 20 20 20 20 42 32 20 3d 20 52 4f 4c 36 34  ;.    B2 = ROL64
1ad0: 28 28 41 32 33 5e 44 33 29 2c 20 32 35 29 3b 0a  ((A23^D3), 25);.
1ae0: 20 20 20 20 42 33 20 3d 20 52 4f 4c 36 34 28 28      B3 = ROL64((
1af0: 41 30 34 5e 44 34 29 2c 20 38 29 3b 0a 20 20 20  A04^D4), 8);.   
1b00: 20 41 33 30 20 3d 20 20 20 42 30 20 5e 28 28 7e   A30 =   B0 ^((~
1b10: 42 31 29 26 20 20 42 32 20 29 3b 0a 20 20 20 20  B1)&  B2 );.    
1b20: 41 31 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42  A11 =   B1 ^((~B
1b30: 32 29 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41  2)&  B3 );.    A
1b40: 34 32 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33  42 =   B2 ^((~B3
1b50: 29 26 20 20 42 34 20 29 3b 0a 20 20 20 20 41 32  )&  B4 );.    A2
1b60: 33 20 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29  3 =   B3 ^((~B4)
1b70: 26 20 20 42 30 20 29 3b 0a 20 20 20 20 41 30 34  &  B0 );.    A04
1b80: 20 3d 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26   =   B4 ^((~B0)&
1b90: 20 20 42 31 20 29 3b 0a 0a 20 20 20 20 42 31 20    B1 );..    B1 
1ba0: 3d 20 52 4f 4c 36 34 28 28 41 32 30 5e 44 30 29  = ROL64((A20^D0)
1bb0: 2c 20 33 36 29 3b 0a 20 20 20 20 42 32 20 3d 20  , 36);.    B2 = 
1bc0: 52 4f 4c 36 34 28 28 41 30 31 5e 44 31 29 2c 20  ROL64((A01^D1), 
1bd0: 31 30 29 3b 0a 20 20 20 20 42 33 20 3d 20 52 4f  10);.    B3 = RO
1be0: 4c 36 34 28 28 41 33 32 5e 44 32 29 2c 20 31 35  L64((A32^D2), 15
1bf0: 29 3b 0a 20 20 20 20 42 34 20 3d 20 52 4f 4c 36  );.    B4 = ROL6
1c00: 34 28 28 41 31 33 5e 44 33 29 2c 20 35 36 29 3b  4((A13^D3), 56);
1c10: 0a 20 20 20 20 42 30 20 3d 20 52 4f 4c 36 34 28  .    B0 = ROL64(
1c20: 28 41 34 34 5e 44 34 29 2c 20 32 37 29 3b 0a 20  (A44^D4), 27);. 
1c30: 20 20 20 41 32 30 20 3d 20 20 20 42 30 20 5e 28     A20 =   B0 ^(
1c40: 28 7e 42 31 29 26 20 20 42 32 20 29 3b 0a 20 20  (~B1)&  B2 );.  
1c50: 20 20 41 30 31 20 3d 20 20 20 42 31 20 5e 28 28    A01 =   B1 ^((
1c60: 7e 42 32 29 26 20 20 42 33 20 29 3b 0a 20 20 20  ~B2)&  B3 );.   
1c70: 20 41 33 32 20 3d 20 20 20 42 32 20 5e 28 28 7e   A32 =   B2 ^((~
1c80: 42 33 29 26 20 20 42 34 20 29 3b 0a 20 20 20 20  B3)&  B4 );.    
1c90: 41 31 33 20 3d 20 20 20 42 33 20 5e 28 28 7e 42  A13 =   B3 ^((~B
1ca0: 34 29 26 20 20 42 30 20 29 3b 0a 20 20 20 20 41  4)&  B0 );.    A
1cb0: 34 34 20 3d 20 20 20 42 34 20 5e 28 28 7e 42 30  44 =   B4 ^((~B0
1cc0: 29 26 20 20 42 31 20 29 3b 0a 0a 20 20 20 20 42  )&  B1 );..    B
1cd0: 33 20 3d 20 52 4f 4c 36 34 28 28 41 31 30 5e 44  3 = ROL64((A10^D
1ce0: 30 29 2c 20 34 31 29 3b 0a 20 20 20 20 42 34 20  0), 41);.    B4 
1cf0: 3d 20 52 4f 4c 36 34 28 28 41 34 31 5e 44 31 29  = ROL64((A41^D1)
1d00: 2c 20 32 29 3b 0a 20 20 20 20 42 30 20 3d 20 52  , 2);.    B0 = R
1d10: 4f 4c 36 34 28 28 41 32 32 5e 44 32 29 2c 20 36  OL64((A22^D2), 6
1d20: 32 29 3b 0a 20 20 20 20 42 31 20 3d 20 52 4f 4c  2);.    B1 = ROL
1d30: 36 34 28 28 41 30 33 5e 44 33 29 2c 20 35 35 29  64((A03^D3), 55)
1d40: 3b 0a 20 20 20 20 42 32 20 3d 20 52 4f 4c 36 34  ;.    B2 = ROL64
1d50: 28 28 41 33 34 5e 44 34 29 2c 20 33 39 29 3b 0a  ((A34^D4), 39);.
1d60: 20 20 20 20 41 31 30 20 3d 20 20 20 42 30 20 5e      A10 =   B0 ^
1d70: 28 28 7e 42 31 29 26 20 20 42 32 20 29 3b 0a 20  ((~B1)&  B2 );. 
1d80: 20 20 20 41 34 31 20 3d 20 20 20 42 31 20 5e 28     A41 =   B1 ^(
1d90: 28 7e 42 32 29 26 20 20 42 33 20 29 3b 0a 20 20  (~B2)&  B3 );.  
1da0: 20 20 41 32 32 20 3d 20 20 20 42 32 20 5e 28 28    A22 =   B2 ^((
1db0: 7e 42 33 29 26 20 20 42 34 20 29 3b 0a 20 20 20  ~B3)&  B4 );.   
1dc0: 20 41 30 33 20 3d 20 20 20 42 33 20 5e 28 28 7e   A03 =   B3 ^((~
1dd0: 42 34 29 26 20 20 42 30 20 29 3b 0a 20 20 20 20  B4)&  B0 );.    
1de0: 41 33 34 20 3d 20 20 20 42 34 20 5e 28 28 7e 42  A34 =   B4 ^((~B
1df0: 30 29 26 20 20 42 31 20 29 3b 0a 0a 20 20 20 20  0)&  B1 );..    
1e00: 43 30 20 3d 20 41 30 30 5e 41 34 30 5e 41 33 30  C0 = A00^A40^A30
1e10: 5e 41 32 30 5e 41 31 30 3b 0a 20 20 20 20 43 31  ^A20^A10;.    C1
1e20: 20 3d 20 41 33 31 5e 41 32 31 5e 41 31 31 5e 41   = A31^A21^A11^A
1e30: 30 31 5e 41 34 31 3b 0a 20 20 20 20 43 32 20 3d  01^A41;.    C2 =
1e40: 20 41 31 32 5e 41 30 32 5e 41 34 32 5e 41 33 32   A12^A02^A42^A32
1e50: 5e 41 32 32 3b 0a 20 20 20 20 43 33 20 3d 20 41  ^A22;.    C3 = A
1e60: 34 33 5e 41 33 33 5e 41 32 33 5e 41 31 33 5e 41  43^A33^A23^A13^A
1e70: 30 33 3b 0a 20 20 20 20 43 34 20 3d 20 41 32 34  03;.    C4 = A24
1e80: 5e 41 31 34 5e 41 30 34 5e 41 34 34 5e 41 33 34  ^A14^A04^A44^A34
1e90: 3b 0a 20 20 20 20 44 30 20 3d 20 43 34 5e 52 4f  ;.    D0 = C4^RO
1ea0: 4c 36 34 28 43 31 2c 20 31 29 3b 0a 20 20 20 20  L64(C1, 1);.    
1eb0: 44 31 20 3d 20 43 30 5e 52 4f 4c 36 34 28 43 32  D1 = C0^ROL64(C2
1ec0: 2c 20 31 29 3b 0a 20 20 20 20 44 32 20 3d 20 43  , 1);.    D2 = C
1ed0: 31 5e 52 4f 4c 36 34 28 43 33 2c 20 31 29 3b 0a  1^ROL64(C3, 1);.
1ee0: 20 20 20 20 44 33 20 3d 20 43 32 5e 52 4f 4c 36      D3 = C2^ROL6
1ef0: 34 28 43 34 2c 20 31 29 3b 0a 20 20 20 20 44 34  4(C4, 1);.    D4
1f00: 20 3d 20 43 33 5e 52 4f 4c 36 34 28 43 30 2c 20   = C3^ROL64(C0, 
1f10: 31 29 3b 0a 0a 20 20 20 20 42 30 20 3d 20 28 41  1);..    B0 = (A
1f20: 30 30 5e 44 30 29 3b 0a 20 20 20 20 42 31 20 3d  00^D0);.    B1 =
1f30: 20 52 4f 4c 36 34 28 28 41 32 31 5e 44 31 29 2c   ROL64((A21^D1),
1f40: 20 34 34 29 3b 0a 20 20 20 20 42 32 20 3d 20 52   44);.    B2 = R
1f50: 4f 4c 36 34 28 28 41 34 32 5e 44 32 29 2c 20 34  OL64((A42^D2), 4
1f60: 33 29 3b 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c  3);.    B3 = ROL
1f70: 36 34 28 28 41 31 33 5e 44 33 29 2c 20 32 31 29  64((A13^D3), 21)
1f80: 3b 0a 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34  ;.    B4 = ROL64
1f90: 28 28 41 33 34 5e 44 34 29 2c 20 31 34 29 3b 0a  ((A34^D4), 14);.
1fa0: 20 20 20 20 41 30 30 20 3d 20 20 20 42 30 20 5e      A00 =   B0 ^
1fb0: 28 28 7e 42 31 29 26 20 20 42 32 20 29 3b 0a 20  ((~B1)&  B2 );. 
1fc0: 20 20 20 41 30 30 20 5e 3d 20 52 43 5b 69 2b 32     A00 ^= RC[i+2
1fd0: 5d 3b 0a 20 20 20 20 41 32 31 20 3d 20 20 20 42  ];.    A21 =   B
1fe0: 31 20 5e 28 28 7e 42 32 29 26 20 20 42 33 20 29  1 ^((~B2)&  B3 )
1ff0: 3b 0a 20 20 20 20 41 34 32 20 3d 20 20 20 42 32  ;.    A42 =   B2
2000: 20 5e 28 28 7e 42 33 29 26 20 20 42 34 20 29 3b   ^((~B3)&  B4 );
2010: 0a 20 20 20 20 41 31 33 20 3d 20 20 20 42 33 20  .    A13 =   B3 
2020: 5e 28 28 7e 42 34 29 26 20 20 42 30 20 29 3b 0a  ^((~B4)&  B0 );.
2030: 20 20 20 20 41 33 34 20 3d 20 20 20 42 34 20 5e      A34 =   B4 ^
2040: 28 28 7e 42 30 29 26 20 20 42 31 20 29 3b 0a 0a  ((~B0)&  B1 );..
2050: 20 20 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28      B2 = ROL64((
2060: 41 33 30 5e 44 30 29 2c 20 33 29 3b 0a 20 20 20  A30^D0), 3);.   
2070: 20 42 33 20 3d 20 52 4f 4c 36 34 28 28 41 30 31   B3 = ROL64((A01
2080: 5e 44 31 29 2c 20 34 35 29 3b 0a 20 20 20 20 42  ^D1), 45);.    B
2090: 34 20 3d 20 52 4f 4c 36 34 28 28 41 32 32 5e 44  4 = ROL64((A22^D
20a0: 32 29 2c 20 36 31 29 3b 0a 20 20 20 20 42 30 20  2), 61);.    B0 
20b0: 3d 20 52 4f 4c 36 34 28 28 41 34 33 5e 44 33 29  = ROL64((A43^D3)
20c0: 2c 20 32 38 29 3b 0a 20 20 20 20 42 31 20 3d 20  , 28);.    B1 = 
20d0: 52 4f 4c 36 34 28 28 41 31 34 5e 44 34 29 2c 20  ROL64((A14^D4), 
20e0: 32 30 29 3b 0a 20 20 20 20 41 33 30 20 3d 20 20  20);.    A30 =  
20f0: 20 42 30 20 5e 28 28 7e 42 31 29 26 20 20 42 32   B0 ^((~B1)&  B2
2100: 20 29 3b 0a 20 20 20 20 41 30 31 20 3d 20 20 20   );.    A01 =   
2110: 42 31 20 5e 28 28 7e 42 32 29 26 20 20 42 33 20  B1 ^((~B2)&  B3 
2120: 29 3b 0a 20 20 20 20 41 32 32 20 3d 20 20 20 42  );.    A22 =   B
2130: 32 20 5e 28 28 7e 42 33 29 26 20 20 42 34 20 29  2 ^((~B3)&  B4 )
2140: 3b 0a 20 20 20 20 41 34 33 20 3d 20 20 20 42 33  ;.    A43 =   B3
2150: 20 5e 28 28 7e 42 34 29 26 20 20 42 30 20 29 3b   ^((~B4)&  B0 );
2160: 0a 20 20 20 20 41 31 34 20 3d 20 20 20 42 34 20  .    A14 =   B4 
2170: 5e 28 28 7e 42 30 29 26 20 20 42 31 20 29 3b 0a  ^((~B0)&  B1 );.
2180: 0a 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34 28  .    B4 = ROL64(
2190: 28 41 31 30 5e 44 30 29 2c 20 31 38 29 3b 0a 20  (A10^D0), 18);. 
21a0: 20 20 20 42 30 20 3d 20 52 4f 4c 36 34 28 28 41     B0 = ROL64((A
21b0: 33 31 5e 44 31 29 2c 20 31 29 3b 0a 20 20 20 20  31^D1), 1);.    
21c0: 42 31 20 3d 20 52 4f 4c 36 34 28 28 41 30 32 5e  B1 = ROL64((A02^
21d0: 44 32 29 2c 20 36 29 3b 0a 20 20 20 20 42 32 20  D2), 6);.    B2 
21e0: 3d 20 52 4f 4c 36 34 28 28 41 32 33 5e 44 33 29  = ROL64((A23^D3)
21f0: 2c 20 32 35 29 3b 0a 20 20 20 20 42 33 20 3d 20  , 25);.    B3 = 
2200: 52 4f 4c 36 34 28 28 41 34 34 5e 44 34 29 2c 20  ROL64((A44^D4), 
2210: 38 29 3b 0a 20 20 20 20 41 31 30 20 3d 20 20 20  8);.    A10 =   
2220: 42 30 20 5e 28 28 7e 42 31 29 26 20 20 42 32 20  B0 ^((~B1)&  B2 
2230: 29 3b 0a 20 20 20 20 41 33 31 20 3d 20 20 20 42  );.    A31 =   B
2240: 31 20 5e 28 28 7e 42 32 29 26 20 20 42 33 20 29  1 ^((~B2)&  B3 )
2250: 3b 0a 20 20 20 20 41 30 32 20 3d 20 20 20 42 32  ;.    A02 =   B2
2260: 20 5e 28 28 7e 42 33 29 26 20 20 42 34 20 29 3b   ^((~B3)&  B4 );
2270: 0a 20 20 20 20 41 32 33 20 3d 20 20 20 42 33 20  .    A23 =   B3 
2280: 5e 28 28 7e 42 34 29 26 20 20 42 30 20 29 3b 0a  ^((~B4)&  B0 );.
2290: 20 20 20 20 41 34 34 20 3d 20 20 20 42 34 20 5e      A44 =   B4 ^
22a0: 28 28 7e 42 30 29 26 20 20 42 31 20 29 3b 0a 0a  ((~B0)&  B1 );..
22b0: 20 20 20 20 42 31 20 3d 20 52 4f 4c 36 34 28 28      B1 = ROL64((
22c0: 41 34 30 5e 44 30 29 2c 20 33 36 29 3b 0a 20 20  A40^D0), 36);.  
22d0: 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28 41 31    B2 = ROL64((A1
22e0: 31 5e 44 31 29 2c 20 31 30 29 3b 0a 20 20 20 20  1^D1), 10);.    
22f0: 42 33 20 3d 20 52 4f 4c 36 34 28 28 41 33 32 5e  B3 = ROL64((A32^
2300: 44 32 29 2c 20 31 35 29 3b 0a 20 20 20 20 42 34  D2), 15);.    B4
2310: 20 3d 20 52 4f 4c 36 34 28 28 41 30 33 5e 44 33   = ROL64((A03^D3
2320: 29 2c 20 35 36 29 3b 0a 20 20 20 20 42 30 20 3d  ), 56);.    B0 =
2330: 20 52 4f 4c 36 34 28 28 41 32 34 5e 44 34 29 2c   ROL64((A24^D4),
2340: 20 32 37 29 3b 0a 20 20 20 20 41 34 30 20 3d 20   27);.    A40 = 
2350: 20 20 42 30 20 5e 28 28 7e 42 31 29 26 20 20 42    B0 ^((~B1)&  B
2360: 32 20 29 3b 0a 20 20 20 20 41 31 31 20 3d 20 20  2 );.    A11 =  
2370: 20 42 31 20 5e 28 28 7e 42 32 29 26 20 20 42 33   B1 ^((~B2)&  B3
2380: 20 29 3b 0a 20 20 20 20 41 33 32 20 3d 20 20 20   );.    A32 =   
2390: 42 32 20 5e 28 28 7e 42 33 29 26 20 20 42 34 20  B2 ^((~B3)&  B4 
23a0: 29 3b 0a 20 20 20 20 41 30 33 20 3d 20 20 20 42  );.    A03 =   B
23b0: 33 20 5e 28 28 7e 42 34 29 26 20 20 42 30 20 29  3 ^((~B4)&  B0 )
23c0: 3b 0a 20 20 20 20 41 32 34 20 3d 20 20 20 42 34  ;.    A24 =   B4
23d0: 20 5e 28 28 7e 42 30 29 26 20 20 42 31 20 29 3b   ^((~B0)&  B1 );
23e0: 0a 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c 36 34  ..    B3 = ROL64
23f0: 28 28 41 32 30 5e 44 30 29 2c 20 34 31 29 3b 0a  ((A20^D0), 41);.
2400: 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34 28 28      B4 = ROL64((
2410: 41 34 31 5e 44 31 29 2c 20 32 29 3b 0a 20 20 20  A41^D1), 2);.   
2420: 20 42 30 20 3d 20 52 4f 4c 36 34 28 28 41 31 32   B0 = ROL64((A12
2430: 5e 44 32 29 2c 20 36 32 29 3b 0a 20 20 20 20 42  ^D2), 62);.    B
2440: 31 20 3d 20 52 4f 4c 36 34 28 28 41 33 33 5e 44  1 = ROL64((A33^D
2450: 33 29 2c 20 35 35 29 3b 0a 20 20 20 20 42 32 20  3), 55);.    B2 
2460: 3d 20 52 4f 4c 36 34 28 28 41 30 34 5e 44 34 29  = ROL64((A04^D4)
2470: 2c 20 33 39 29 3b 0a 20 20 20 20 41 32 30 20 3d  , 39);.    A20 =
2480: 20 20 20 42 30 20 5e 28 28 7e 42 31 29 26 20 20     B0 ^((~B1)&  
2490: 42 32 20 29 3b 0a 20 20 20 20 41 34 31 20 3d 20  B2 );.    A41 = 
24a0: 20 20 42 31 20 5e 28 28 7e 42 32 29 26 20 20 42    B1 ^((~B2)&  B
24b0: 33 20 29 3b 0a 20 20 20 20 41 31 32 20 3d 20 20  3 );.    A12 =  
24c0: 20 42 32 20 5e 28 28 7e 42 33 29 26 20 20 42 34   B2 ^((~B3)&  B4
24d0: 20 29 3b 0a 20 20 20 20 41 33 33 20 3d 20 20 20   );.    A33 =   
24e0: 42 33 20 5e 28 28 7e 42 34 29 26 20 20 42 30 20  B3 ^((~B4)&  B0 
24f0: 29 3b 0a 20 20 20 20 41 30 34 20 3d 20 20 20 42  );.    A04 =   B
2500: 34 20 5e 28 28 7e 42 30 29 26 20 20 42 31 20 29  4 ^((~B0)&  B1 )
2510: 3b 0a 0a 20 20 20 20 43 30 20 3d 20 41 30 30 5e  ;..    C0 = A00^
2520: 41 33 30 5e 41 31 30 5e 41 34 30 5e 41 32 30 3b  A30^A10^A40^A20;
2530: 0a 20 20 20 20 43 31 20 3d 20 41 32 31 5e 41 30  .    C1 = A21^A0
2540: 31 5e 41 33 31 5e 41 31 31 5e 41 34 31 3b 0a 20  1^A31^A11^A41;. 
2550: 20 20 20 43 32 20 3d 20 41 34 32 5e 41 32 32 5e     C2 = A42^A22^
2560: 41 30 32 5e 41 33 32 5e 41 31 32 3b 0a 20 20 20  A02^A32^A12;.   
2570: 20 43 33 20 3d 20 41 31 33 5e 41 34 33 5e 41 32   C3 = A13^A43^A2
2580: 33 5e 41 30 33 5e 41 33 33 3b 0a 20 20 20 20 43  3^A03^A33;.    C
2590: 34 20 3d 20 41 33 34 5e 41 31 34 5e 41 34 34 5e  4 = A34^A14^A44^
25a0: 41 32 34 5e 41 30 34 3b 0a 20 20 20 20 44 30 20  A24^A04;.    D0 
25b0: 3d 20 43 34 5e 52 4f 4c 36 34 28 43 31 2c 20 31  = C4^ROL64(C1, 1
25c0: 29 3b 0a 20 20 20 20 44 31 20 3d 20 43 30 5e 52  );.    D1 = C0^R
25d0: 4f 4c 36 34 28 43 32 2c 20 31 29 3b 0a 20 20 20  OL64(C2, 1);.   
25e0: 20 44 32 20 3d 20 43 31 5e 52 4f 4c 36 34 28 43   D2 = C1^ROL64(C
25f0: 33 2c 20 31 29 3b 0a 20 20 20 20 44 33 20 3d 20  3, 1);.    D3 = 
2600: 43 32 5e 52 4f 4c 36 34 28 43 34 2c 20 31 29 3b  C2^ROL64(C4, 1);
2610: 0a 20 20 20 20 44 34 20 3d 20 43 33 5e 52 4f 4c  .    D4 = C3^ROL
2620: 36 34 28 43 30 2c 20 31 29 3b 0a 0a 20 20 20 20  64(C0, 1);..    
2630: 42 30 20 3d 20 28 41 30 30 5e 44 30 29 3b 0a 20  B0 = (A00^D0);. 
2640: 20 20 20 42 31 20 3d 20 52 4f 4c 36 34 28 28 41     B1 = ROL64((A
2650: 30 31 5e 44 31 29 2c 20 34 34 29 3b 0a 20 20 20  01^D1), 44);.   
2660: 20 42 32 20 3d 20 52 4f 4c 36 34 28 28 41 30 32   B2 = ROL64((A02
2670: 5e 44 32 29 2c 20 34 33 29 3b 0a 20 20 20 20 42  ^D2), 43);.    B
2680: 33 20 3d 20 52 4f 4c 36 34 28 28 41 30 33 5e 44  3 = ROL64((A03^D
2690: 33 29 2c 20 32 31 29 3b 0a 20 20 20 20 42 34 20  3), 21);.    B4 
26a0: 3d 20 52 4f 4c 36 34 28 28 41 30 34 5e 44 34 29  = ROL64((A04^D4)
26b0: 2c 20 31 34 29 3b 0a 20 20 20 20 41 30 30 20 3d  , 14);.    A00 =
26c0: 20 20 20 42 30 20 5e 28 28 7e 42 31 29 26 20 20     B0 ^((~B1)&  
26d0: 42 32 20 29 3b 0a 20 20 20 20 41 30 30 20 5e 3d  B2 );.    A00 ^=
26e0: 20 52 43 5b 69 2b 33 5d 3b 0a 20 20 20 20 41 30   RC[i+3];.    A0
26f0: 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42 32 29  1 =   B1 ^((~B2)
2700: 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41 30 32  &  B3 );.    A02
2710: 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33 29 26   =   B2 ^((~B3)&
2720: 20 20 42 34 20 29 3b 0a 20 20 20 20 41 30 33 20    B4 );.    A03 
2730: 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29 26 20  =   B3 ^((~B4)& 
2740: 20 42 30 20 29 3b 0a 20 20 20 20 41 30 34 20 3d   B0 );.    A04 =
2750: 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26 20 20     B4 ^((~B0)&  
2760: 42 31 20 29 3b 0a 0a 20 20 20 20 42 32 20 3d 20  B1 );..    B2 = 
2770: 52 4f 4c 36 34 28 28 41 31 30 5e 44 30 29 2c 20  ROL64((A10^D0), 
2780: 33 29 3b 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c  3);.    B3 = ROL
2790: 36 34 28 28 41 31 31 5e 44 31 29 2c 20 34 35 29  64((A11^D1), 45)
27a0: 3b 0a 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34  ;.    B4 = ROL64
27b0: 28 28 41 31 32 5e 44 32 29 2c 20 36 31 29 3b 0a  ((A12^D2), 61);.
27c0: 20 20 20 20 42 30 20 3d 20 52 4f 4c 36 34 28 28      B0 = ROL64((
27d0: 41 31 33 5e 44 33 29 2c 20 32 38 29 3b 0a 20 20  A13^D3), 28);.  
27e0: 20 20 42 31 20 3d 20 52 4f 4c 36 34 28 28 41 31    B1 = ROL64((A1
27f0: 34 5e 44 34 29 2c 20 32 30 29 3b 0a 20 20 20 20  4^D4), 20);.    
2800: 41 31 30 20 3d 20 20 20 42 30 20 5e 28 28 7e 42  A10 =   B0 ^((~B
2810: 31 29 26 20 20 42 32 20 29 3b 0a 20 20 20 20 41  1)&  B2 );.    A
2820: 31 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42 32  11 =   B1 ^((~B2
2830: 29 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41 31  )&  B3 );.    A1
2840: 32 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33 29  2 =   B2 ^((~B3)
2850: 26 20 20 42 34 20 29 3b 0a 20 20 20 20 41 31 33  &  B4 );.    A13
2860: 20 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29 26   =   B3 ^((~B4)&
2870: 20 20 42 30 20 29 3b 0a 20 20 20 20 41 31 34 20    B0 );.    A14 
2880: 3d 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26 20  =   B4 ^((~B0)& 
2890: 20 42 31 20 29 3b 0a 0a 20 20 20 20 42 34 20 3d   B1 );..    B4 =
28a0: 20 52 4f 4c 36 34 28 28 41 32 30 5e 44 30 29 2c   ROL64((A20^D0),
28b0: 20 31 38 29 3b 0a 20 20 20 20 42 30 20 3d 20 52   18);.    B0 = R
28c0: 4f 4c 36 34 28 28 41 32 31 5e 44 31 29 2c 20 31  OL64((A21^D1), 1
28d0: 29 3b 0a 20 20 20 20 42 31 20 3d 20 52 4f 4c 36  );.    B1 = ROL6
28e0: 34 28 28 41 32 32 5e 44 32 29 2c 20 36 29 3b 0a  4((A22^D2), 6);.
28f0: 20 20 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28      B2 = ROL64((
2900: 41 32 33 5e 44 33 29 2c 20 32 35 29 3b 0a 20 20  A23^D3), 25);.  
2910: 20 20 42 33 20 3d 20 52 4f 4c 36 34 28 28 41 32    B3 = ROL64((A2
2920: 34 5e 44 34 29 2c 20 38 29 3b 0a 20 20 20 20 41  4^D4), 8);.    A
2930: 32 30 20 3d 20 20 20 42 30 20 5e 28 28 7e 42 31  20 =   B0 ^((~B1
2940: 29 26 20 20 42 32 20 29 3b 0a 20 20 20 20 41 32  )&  B2 );.    A2
2950: 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42 32 29  1 =   B1 ^((~B2)
2960: 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41 32 32  &  B3 );.    A22
2970: 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33 29 26   =   B2 ^((~B3)&
2980: 20 20 42 34 20 29 3b 0a 20 20 20 20 41 32 33 20    B4 );.    A23 
2990: 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29 26 20  =   B3 ^((~B4)& 
29a0: 20 42 30 20 29 3b 0a 20 20 20 20 41 32 34 20 3d   B0 );.    A24 =
29b0: 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26 20 20     B4 ^((~B0)&  
29c0: 42 31 20 29 3b 0a 0a 20 20 20 20 42 31 20 3d 20  B1 );..    B1 = 
29d0: 52 4f 4c 36 34 28 28 41 33 30 5e 44 30 29 2c 20  ROL64((A30^D0), 
29e0: 33 36 29 3b 0a 20 20 20 20 42 32 20 3d 20 52 4f  36);.    B2 = RO
29f0: 4c 36 34 28 28 41 33 31 5e 44 31 29 2c 20 31 30  L64((A31^D1), 10
2a00: 29 3b 0a 20 20 20 20 42 33 20 3d 20 52 4f 4c 36  );.    B3 = ROL6
2a10: 34 28 28 41 33 32 5e 44 32 29 2c 20 31 35 29 3b  4((A32^D2), 15);
2a20: 0a 20 20 20 20 42 34 20 3d 20 52 4f 4c 36 34 28  .    B4 = ROL64(
2a30: 28 41 33 33 5e 44 33 29 2c 20 35 36 29 3b 0a 20  (A33^D3), 56);. 
2a40: 20 20 20 42 30 20 3d 20 52 4f 4c 36 34 28 28 41     B0 = ROL64((A
2a50: 33 34 5e 44 34 29 2c 20 32 37 29 3b 0a 20 20 20  34^D4), 27);.   
2a60: 20 41 33 30 20 3d 20 20 20 42 30 20 5e 28 28 7e   A30 =   B0 ^((~
2a70: 42 31 29 26 20 20 42 32 20 29 3b 0a 20 20 20 20  B1)&  B2 );.    
2a80: 41 33 31 20 3d 20 20 20 42 31 20 5e 28 28 7e 42  A31 =   B1 ^((~B
2a90: 32 29 26 20 20 42 33 20 29 3b 0a 20 20 20 20 41  2)&  B3 );.    A
2aa0: 33 32 20 3d 20 20 20 42 32 20 5e 28 28 7e 42 33  32 =   B2 ^((~B3
2ab0: 29 26 20 20 42 34 20 29 3b 0a 20 20 20 20 41 33  )&  B4 );.    A3
2ac0: 33 20 3d 20 20 20 42 33 20 5e 28 28 7e 42 34 29  3 =   B3 ^((~B4)
2ad0: 26 20 20 42 30 20 29 3b 0a 20 20 20 20 41 33 34  &  B0 );.    A34
2ae0: 20 3d 20 20 20 42 34 20 5e 28 28 7e 42 30 29 26   =   B4 ^((~B0)&
2af0: 20 20 42 31 20 29 3b 0a 0a 20 20 20 20 42 33 20    B1 );..    B3 
2b00: 3d 20 52 4f 4c 36 34 28 28 41 34 30 5e 44 30 29  = ROL64((A40^D0)
2b10: 2c 20 34 31 29 3b 0a 20 20 20 20 42 34 20 3d 20  , 41);.    B4 = 
2b20: 52 4f 4c 36 34 28 28 41 34 31 5e 44 31 29 2c 20  ROL64((A41^D1), 
2b30: 32 29 3b 0a 20 20 20 20 42 30 20 3d 20 52 4f 4c  2);.    B0 = ROL
2b40: 36 34 28 28 41 34 32 5e 44 32 29 2c 20 36 32 29  64((A42^D2), 62)
2b50: 3b 0a 20 20 20 20 42 31 20 3d 20 52 4f 4c 36 34  ;.    B1 = ROL64
2b60: 28 28 41 34 33 5e 44 33 29 2c 20 35 35 29 3b 0a  ((A43^D3), 55);.
2b70: 20 20 20 20 42 32 20 3d 20 52 4f 4c 36 34 28 28      B2 = ROL64((
2b80: 41 34 34 5e 44 34 29 2c 20 33 39 29 3b 0a 20 20  A44^D4), 39);.  
2b90: 20 20 41 34 30 20 3d 20 20 20 42 30 20 5e 28 28    A40 =   B0 ^((
2ba0: 7e 42 31 29 26 20 20 42 32 20 29 3b 0a 20 20 20  ~B1)&  B2 );.   
2bb0: 20 41 34 31 20 3d 20 20 20 42 31 20 5e 28 28 7e   A41 =   B1 ^((~
2bc0: 42 32 29 26 20 20 42 33 20 29 3b 0a 20 20 20 20  B2)&  B3 );.    
2bd0: 41 34 32 20 3d 20 20 20 42 32 20 5e 28 28 7e 42  A42 =   B2 ^((~B
2be0: 33 29 26 20 20 42 34 20 29 3b 0a 20 20 20 20 41  3)&  B4 );.    A
2bf0: 34 33 20 3d 20 20 20 42 33 20 5e 28 28 7e 42 34  43 =   B3 ^((~B4
2c00: 29 26 20 20 42 30 20 29 3b 0a 20 20 20 20 41 34  )&  B0 );.    A4
2c10: 34 20 3d 20 20 20 42 34 20 5e 28 28 7e 42 30 29  4 =   B4 ^((~B0)
2c20: 26 20 20 42 31 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  &  B1 );.  }.}..
2c30: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
2c40: 20 61 20 6e 65 77 20 68 61 73 68 2e 20 20 69 53   a new hash.  iS
2c50: 69 7a 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74  ize determines t
2c60: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
2c70: 61 73 68 0a 2a 2a 20 69 6e 20 62 69 74 73 20 61  ash.** in bits a
2c80: 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65  nd should be one
2c90: 20 6f 66 20 32 32 34 2c 20 32 35 36 2c 20 33 38   of 224, 256, 38
2ca0: 34 2c 20 6f 72 20 35 31 32 2e 20 20 4f 72 20 69  4, or 512.  Or i
2cb0: 53 69 7a 65 0a 2a 2a 20 63 61 6e 20 62 65 20 7a  Size.** can be z
2cc0: 65 72 6f 20 74 6f 20 75 73 65 20 74 68 65 20 64  ero to use the d
2cd0: 65 66 61 75 6c 74 20 68 61 73 68 20 73 69 7a 65  efault hash size
2ce0: 20 6f 66 20 32 35 36 20 62 69 74 73 2e 0a 2a 2f   of 256 bits..*/
2cf0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 48 41  .static void SHA
2d00: 33 49 6e 69 74 28 53 48 41 33 43 6f 6e 74 65 78  3Init(SHA3Contex
2d10: 74 20 2a 70 2c 20 69 6e 74 20 69 53 69 7a 65 29  t *p, int iSize)
2d20: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
2d30: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2d40: 69 66 28 20 69 53 69 7a 65 3e 3d 31 32 38 20 26  if( iSize>=128 &
2d50: 26 20 69 53 69 7a 65 3c 3d 35 31 32 20 29 7b 0a  & iSize<=512 ){.
2d60: 20 20 20 20 70 2d 3e 6e 52 61 74 65 20 3d 20 28      p->nRate = (
2d70: 31 36 30 30 20 2d 20 28 28 69 53 69 7a 65 20 2b  1600 - ((iSize +
2d80: 20 33 31 29 26 7e 33 31 29 2a 32 29 2f 38 3b 0a   31)&~31)*2)/8;.
2d90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
2da0: 6e 52 61 74 65 20 3d 20 28 31 36 30 30 20 2d 20  nRate = (1600 - 
2db0: 32 2a 32 35 36 29 2f 38 3b 0a 20 20 7d 0a 23 69  2*256)/8;.  }.#i
2dc0: 66 20 53 48 41 33 5f 42 59 54 45 4f 52 44 45 52  f SHA3_BYTEORDER
2dd0: 3d 3d 31 32 33 34 0a 20 20 2f 2a 20 4b 6e 6f 77  ==1234.  /* Know
2de0: 6e 20 74 6f 20 62 65 20 6c 69 74 74 6c 65 2d 65  n to be little-e
2df0: 6e 64 69 61 6e 20 61 74 20 63 6f 6d 70 69 6c 65  ndian at compile
2e00: 2d 74 69 6d 65 2e 20 4e 6f 2d 6f 70 20 2a 2f 0a  -time. No-op */.
2e10: 23 65 6c 69 66 20 53 48 41 33 5f 42 59 54 45 4f  #elif SHA3_BYTEO
2e20: 52 44 45 52 3d 3d 34 33 32 31 0a 20 20 70 2d 3e  RDER==4321.  p->
2e30: 69 78 4d 61 73 6b 20 3d 20 37 3b 20 20 2f 2a 20  ixMask = 7;  /* 
2e40: 42 69 67 2d 65 6e 64 69 61 6e 20 2a 2f 0a 23 65  Big-endian */.#e
2e50: 6c 73 65 0a 20 20 7b 0a 20 20 20 20 73 74 61 74  lse.  {.    stat
2e60: 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ic unsigned int 
2e70: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  one = 1;.    if(
2e80: 20 31 3d 3d 2a 28 75 6e 73 69 67 6e 65 64 20 63   1==*(unsigned c
2e90: 68 61 72 2a 29 26 6f 6e 65 20 29 7b 0a 20 20 20  har*)&one ){.   
2ea0: 20 20 20 2f 2a 20 4c 69 74 74 6c 65 20 65 6e 64     /* Little end
2eb0: 69 61 6e 2e 20 20 4e 6f 20 62 79 74 65 20 73 77  ian.  No byte sw
2ec0: 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  apping. */.     
2ed0: 20 70 2d 3e 69 78 4d 61 73 6b 20 3d 20 30 3b 0a   p->ixMask = 0;.
2ee0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ef0: 20 2f 2a 20 42 69 67 20 65 6e 64 69 61 6e 2e 20   /* Big endian. 
2f00: 20 42 79 74 65 20 73 77 61 70 2e 20 2a 2f 0a 20   Byte swap. */. 
2f10: 20 20 20 20 20 70 2d 3e 69 78 4d 61 73 6b 20 3d       p->ixMask =
2f20: 20 37 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   7;.    }.  }.#e
2f30: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
2f40: 6b 65 20 63 6f 6e 73 65 63 75 74 69 76 65 20 63  ke consecutive c
2f50: 61 6c 6c 73 20 74 6f 20 74 68 65 20 53 48 41 33  alls to the SHA3
2f60: 55 70 64 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  Update function 
2f70: 74 6f 20 61 64 64 20 6e 65 77 20 63 6f 6e 74 65  to add new conte
2f80: 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 68 61 73  nt.** to the has
2f90: 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  h.*/.static void
2fa0: 20 53 48 41 33 55 70 64 61 74 65 28 0a 20 20 53   SHA3Update(.  S
2fb0: 48 41 33 43 6f 6e 74 65 78 74 20 2a 70 2c 0a 20  HA3Context *p,. 
2fc0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
2fd0: 63 68 61 72 20 2a 61 44 61 74 61 2c 0a 20 20 75  char *aData,.  u
2fe0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 44 61 74  nsigned int nDat
2ff0: 61 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  a.){.  unsigned 
3000: 69 6e 74 20 69 20 3d 20 30 3b 0a 23 69 66 20 53  int i = 0;.#if S
3010: 48 41 33 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31  HA3_BYTEORDER==1
3020: 32 33 34 0a 20 20 69 66 28 20 28 70 2d 3e 6e 4c  234.  if( (p->nL
3030: 6f 61 64 65 64 20 25 20 38 29 3d 3d 30 20 26 26  oaded % 8)==0 &&
3040: 20 28 28 61 44 61 74 61 20 2d 20 28 63 6f 6e 73   ((aData - (cons
3050: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  t unsigned char*
3060: 29 30 29 26 37 29 3d 3d 30 20 29 7b 0a 20 20 20  )0)&7)==0 ){.   
3070: 20 66 6f 72 28 3b 20 69 2b 37 3c 6e 44 61 74 61   for(; i+7<nData
3080: 3b 20 69 2b 3d 38 29 7b 0a 20 20 20 20 20 20 70  ; i+=8){.      p
3090: 2d 3e 75 2e 73 5b 70 2d 3e 6e 4c 6f 61 64 65 64  ->u.s[p->nLoaded
30a0: 2f 38 5d 20 5e 3d 20 2a 28 75 36 34 2a 29 26 61  /8] ^= *(u64*)&a
30b0: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 20 20 70  Data[i];.      p
30c0: 2d 3e 6e 4c 6f 61 64 65 64 20 2b 3d 20 38 3b 0a  ->nLoaded += 8;.
30d0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 6f        if( p->nLo
30e0: 61 64 65 64 3e 3d 70 2d 3e 6e 52 61 74 65 20 29  aded>=p->nRate )
30f0: 7b 0a 20 20 20 20 20 20 20 20 4b 65 63 63 61 6b  {.        Keccak
3100: 46 31 36 30 30 53 74 65 70 28 70 29 3b 0a 20 20  F1600Step(p);.  
3110: 20 20 20 20 20 20 70 2d 3e 6e 4c 6f 61 64 65 64        p->nLoaded
3120: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
3130: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
3140: 20 66 6f 72 28 3b 20 69 3c 6e 44 61 74 61 3b 20   for(; i<nData; 
3150: 69 2b 2b 29 7b 0a 23 69 66 20 53 48 41 33 5f 42  i++){.#if SHA3_B
3160: 59 54 45 4f 52 44 45 52 3d 3d 31 32 33 34 0a 20  YTEORDER==1234. 
3170: 20 20 20 70 2d 3e 75 2e 78 5b 70 2d 3e 6e 4c 6f     p->u.x[p->nLo
3180: 61 64 65 64 5d 20 5e 3d 20 61 44 61 74 61 5b 69  aded] ^= aData[i
3190: 5d 3b 0a 23 65 6c 69 66 20 53 48 41 33 5f 42 59  ];.#elif SHA3_BY
31a0: 54 45 4f 52 44 45 52 3d 3d 34 33 32 31 0a 20 20  TEORDER==4321.  
31b0: 20 20 70 2d 3e 75 2e 78 5b 70 2d 3e 6e 4c 6f 61    p->u.x[p->nLoa
31c0: 64 65 64 5e 30 78 30 37 5d 20 5e 3d 20 61 44 61  ded^0x07] ^= aDa
31d0: 74 61 5b 69 5d 3b 0a 23 65 6c 73 65 0a 20 20 20  ta[i];.#else.   
31e0: 20 70 2d 3e 75 2e 78 5b 70 2d 3e 6e 4c 6f 61 64   p->u.x[p->nLoad
31f0: 65 64 5e 70 2d 3e 69 78 4d 61 73 6b 5d 20 5e 3d  ed^p->ixMask] ^=
3200: 20 61 44 61 74 61 5b 69 5d 3b 0a 23 65 6e 64 69   aData[i];.#endi
3210: 66 0a 20 20 20 20 70 2d 3e 6e 4c 6f 61 64 65 64  f.    p->nLoaded
3220: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  ++;.    if( p->n
3230: 4c 6f 61 64 65 64 3d 3d 70 2d 3e 6e 52 61 74 65  Loaded==p->nRate
3240: 20 29 7b 0a 20 20 20 20 20 20 4b 65 63 63 61 6b   ){.      Keccak
3250: 46 31 36 30 30 53 74 65 70 28 70 29 3b 0a 20 20  F1600Step(p);.  
3260: 20 20 20 20 70 2d 3e 6e 4c 6f 61 64 65 64 20 3d      p->nLoaded =
3270: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
3280: 0a 2f 2a 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c  ./*.** After all
3290: 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
32a0: 6e 20 61 64 64 65 64 2c 20 69 6e 76 6f 6b 65 20  n added, invoke 
32b0: 53 48 41 33 46 69 6e 61 6c 28 29 20 74 6f 20 63  SHA3Final() to c
32c0: 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 66 69  ompute.** the fi
32d0: 6e 61 6c 20 68 61 73 68 2e 20 20 54 68 65 20 66  nal hash.  The f
32e0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
32f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
3300: 20 62 69 6e 61 72 79 0a 2a 2a 20 68 61 73 68 20   binary.** hash 
3310: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
3320: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3330: 53 48 41 33 46 69 6e 61 6c 28 53 48 41 33 43 6f  SHA3Final(SHA3Co
3340: 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 75 6e 73  ntext *p){.  uns
3350: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69  igned int i;.  i
3360: 66 28 20 70 2d 3e 6e 4c 6f 61 64 65 64 3d 3d 70  f( p->nLoaded==p
3370: 2d 3e 6e 52 61 74 65 2d 31 20 29 7b 0a 20 20 20  ->nRate-1 ){.   
3380: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
3390: 63 68 61 72 20 63 31 20 3d 20 30 78 38 36 3b 0a  char c1 = 0x86;.
33a0: 20 20 20 20 53 48 41 33 55 70 64 61 74 65 28 70      SHA3Update(p
33b0: 2c 20 26 63 31 2c 20 31 29 3b 0a 20 20 7d 65 6c  , &c1, 1);.  }el
33c0: 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  se{.    const un
33d0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 32 20 3d  signed char c2 =
33e0: 20 30 78 30 36 3b 0a 20 20 20 20 63 6f 6e 73 74   0x06;.    const
33f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
3400: 33 20 3d 20 30 78 38 30 3b 0a 20 20 20 20 53 48  3 = 0x80;.    SH
3410: 41 33 55 70 64 61 74 65 28 70 2c 20 26 63 32 2c  A3Update(p, &c2,
3420: 20 31 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c 6f 61   1);.    p->nLoa
3430: 64 65 64 20 3d 20 70 2d 3e 6e 52 61 74 65 20 2d  ded = p->nRate -
3440: 20 31 3b 0a 20 20 20 20 53 48 41 33 55 70 64 61   1;.    SHA3Upda
3450: 74 65 28 70 2c 20 26 63 33 2c 20 31 29 3b 0a 20  te(p, &c3, 1);. 
3460: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
3470: 70 2d 3e 6e 52 61 74 65 3b 20 69 2b 2b 29 7b 0a  p->nRate; i++){.
3480: 20 20 20 20 70 2d 3e 75 2e 78 5b 69 2b 70 2d 3e      p->u.x[i+p->
3490: 6e 52 61 74 65 5d 20 3d 20 70 2d 3e 75 2e 78 5b  nRate] = p->u.x[
34a0: 69 5e 70 2d 3e 69 78 4d 61 73 6b 5d 3b 0a 20 20  i^p->ixMask];.  
34b0: 7d 0a 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 75  }.  return &p->u
34c0: 2e 78 5b 70 2d 3e 6e 52 61 74 65 5d 3b 0a 7d 0a  .x[p->nRate];.}.
34d0: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 68 61  /* End of the ha
34e0: 73 68 69 6e 67 20 6c 6f 67 69 63 0a 2a 2a 2a 2a  shing 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 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
3540: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
3550: 20 6f 66 20 74 68 65 20 73 68 61 33 28 58 2c 53   of the sha3(X,S
3560: 49 5a 45 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  IZE) function..*
3570: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 42 4c  *.** Return a BL
3580: 4f 42 20 77 68 69 63 68 20 69 73 20 74 68 65 20  OB which is the 
3590: 53 49 5a 45 2d 62 69 74 20 53 48 41 33 20 68 61  SIZE-bit SHA3 ha
35a0: 73 68 20 6f 66 20 58 2e 20 20 54 68 65 20 64 65  sh of X.  The de
35b0: 66 61 75 6c 74 0a 2a 2a 20 73 69 7a 65 20 69 73  fault.** size is
35c0: 20 32 35 36 2e 20 20 49 66 20 58 20 69 73 20 61   256.  If X is a
35d0: 20 42 4c 4f 42 2c 20 69 74 20 69 73 20 68 61 73   BLOB, it is has
35e0: 68 65 64 20 61 73 20 69 73 2e 20 20 0a 2a 2a 20  hed as is.  .** 
35f0: 46 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20 6e 6f  For all other no
3600: 6e 2d 4e 55 4c 4c 20 74 79 70 65 73 20 6f 66 20  n-NULL types of 
3610: 69 6e 70 75 74 2c 20 58 20 69 73 20 63 6f 6e 76  input, X is conv
3620: 65 72 74 65 64 20 69 6e 74 6f 20 61 20 55 54 46  erted into a UTF
3630: 2d 38 20 73 74 72 69 6e 67 0a 2a 2a 20 61 6e 64  -8 string.** and
3640: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 68   the string is h
3650: 61 73 68 65 64 20 77 69 74 68 6f 75 74 20 74 68  ashed without th
3660: 65 20 74 72 61 69 6c 69 6e 67 20 30 78 30 30 20  e trailing 0x00 
3670: 74 65 72 6d 69 6e 61 74 6f 72 2e 20 20 54 68 65  terminator.  The
3680: 20 68 61 73 68 0a 2a 2a 20 6f 66 20 61 20 4e 55   hash.** of a NU
3690: 4c 4c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  LL value is NULL
36a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
36b0: 20 73 68 61 33 46 75 6e 63 28 0a 20 20 73 71 6c   sha3Func(.  sql
36c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
36d0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
36e0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
36f0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 53  ue **argv.){.  S
3700: 48 41 33 43 6f 6e 74 65 78 74 20 63 78 3b 0a 20  HA3Context cx;. 
3710: 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c   int eType = sql
3720: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
3730: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 20  argv[0]);.  int 
3740: 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  nByte = sqlite3_
3750: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
3760: 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 69 53 69 7a  [0]);.  int iSiz
3770: 65 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31  e;.  if( argc==1
3780: 20 29 7b 0a 20 20 20 20 69 53 69 7a 65 20 3d 20   ){.    iSize = 
3790: 32 35 36 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  256;.  }else{.  
37a0: 20 20 69 53 69 7a 65 20 3d 20 73 71 6c 69 74 65    iSize = sqlite
37b0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
37c0: 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 53  [1]);.    if( iS
37d0: 69 7a 65 21 3d 32 32 34 20 26 26 20 69 53 69 7a  ize!=224 && iSiz
37e0: 65 21 3d 32 35 36 20 26 26 20 69 53 69 7a 65 21  e!=256 && iSize!
37f0: 3d 33 38 34 20 26 26 20 69 53 69 7a 65 21 3d 35  =384 && iSize!=5
3800: 31 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  12 ){.      sqli
3810: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
3820: 28 63 6f 6e 74 65 78 74 2c 20 22 53 48 41 33 20  (context, "SHA3 
3830: 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 20 6f  size should be o
3840: 6e 65 20 6f 66 3a 20 32 32 34 20 32 35 36 20 22  ne of: 224 256 "
3850: 0a 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 20 20 22 33 38 34 20 35 31 32 22 2c 20       "384 512", 
3880: 2d 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  -1);.      retur
3890: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
38a0: 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
38b0: 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a  _NULL ) return;.
38c0: 20 20 53 48 41 33 49 6e 69 74 28 26 63 78 2c 20    SHA3Init(&cx, 
38d0: 69 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 65 54  iSize);.  if( eT
38e0: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
38f0: 20 29 7b 0a 20 20 20 20 53 48 41 33 55 70 64 61   ){.    SHA3Upda
3900: 74 65 28 26 63 78 2c 20 73 71 6c 69 74 65 33 5f  te(&cx, sqlite3_
3910: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
3920: 30 5d 29 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  0]), nByte);.  }
3930: 65 6c 73 65 7b 0a 20 20 20 20 53 48 41 33 55 70  else{.    SHA3Up
3940: 64 61 74 65 28 26 63 78 2c 20 73 71 6c 69 74 65  date(&cx, sqlite
3950: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
3960: 76 5b 30 5d 29 2c 20 6e 42 79 74 65 29 3b 0a 20  v[0]), nByte);. 
3970: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
3980: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
3990: 2c 20 53 48 41 33 46 69 6e 61 6c 28 26 63 78 29  , SHA3Final(&cx)
39a0: 2c 20 69 53 69 7a 65 2f 38 2c 20 53 51 4c 49 54  , iSize/8, SQLIT
39b0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
39c0: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  ./* Compute a st
39d0: 72 69 6e 67 20 75 73 69 6e 67 20 73 71 6c 69 74  ring using sqlit
39e0: 65 33 5f 76 73 6e 70 72 69 6e 74 66 28 29 20 77  e3_vsnprintf() w
39f0: 69 74 68 20 61 20 6d 61 78 69 6d 75 6d 20 6c 65  ith a maximum le
3a00: 6e 67 74 68 0a 2a 2a 20 6f 66 20 35 30 20 62 79  ngth.** of 50 by
3a10: 74 65 73 20 61 6e 64 20 61 64 64 20 69 74 20 74  tes and add it t
3a20: 6f 20 74 68 65 20 68 61 73 68 2e 0a 2a 2f 0a 73  o the hash..*/.s
3a30: 74 61 74 69 63 20 76 6f 69 64 20 68 61 73 68 5f  tatic void hash_
3a40: 73 74 65 70 5f 76 66 6f 72 6d 61 74 28 0a 20 20  step_vformat(.  
3a50: 53 48 41 33 43 6f 6e 74 65 78 74 20 2a 70 2c 20  SHA3Context *p, 
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a70: 2f 2a 20 41 64 64 20 63 6f 6e 74 65 6e 74 20 74  /* Add content t
3a80: 6f 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20 2a  o this context *
3a90: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3aa0: 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29  zFormat,.  ....)
3ab0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
3ac0: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20    int n;.  char 
3ad0: 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 76 61 5f 73  zBuf[50];.  va_s
3ae0: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
3af0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 73 6e  );.  sqlite3_vsn
3b00: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
3b10: 75 66 29 2c 7a 42 75 66 2c 7a 46 6f 72 6d 61 74  uf),zBuf,zFormat
3b20: 2c 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61  ,ap);.  va_end(a
3b30: 70 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73  p);.  n = (int)s
3b40: 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 53  trlen(zBuf);.  S
3b50: 48 41 33 55 70 64 61 74 65 28 70 2c 20 28 75 6e  HA3Update(p, (un
3b60: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75  signed char*)zBu
3b70: 66 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, n);.}../*.** 
3b80: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
3b90: 66 20 74 68 65 20 73 68 61 33 5f 71 75 65 72 79  f the sha3_query
3ba0: 28 53 51 4c 2c 53 49 5a 45 29 20 66 75 6e 63 74  (SQL,SIZE) funct
3bb0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
3bc0: 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69 6c 65  function compile
3bd0: 73 20 61 6e 64 20 72 75 6e 73 20 74 68 65 20 53  s and runs the S
3be0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 28 73 29 20  QL statement(s) 
3bf0: 67 69 76 65 6e 20 69 6e 20 74 68 65 0a 2a 2a 20  given in the.** 
3c00: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 72 65  argument. The re
3c10: 73 75 6c 74 73 20 61 72 65 20 68 61 73 68 65 64  sults are hashed
3c20: 20 75 73 69 6e 67 20 61 20 53 49 5a 45 2d 62 69   using a SIZE-bi
3c30: 74 20 53 48 41 33 2e 20 20 54 68 65 20 64 65 66  t SHA3.  The def
3c40: 61 75 6c 74 0a 2a 2a 20 73 69 7a 65 20 69 73 20  ault.** size is 
3c50: 32 35 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  256..**.** The f
3c60: 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 62 79 74  ormat of the byt
3c70: 65 20 73 74 72 65 61 6d 20 74 68 61 74 20 69 73  e stream that is
3c80: 20 68 61 73 68 65 64 20 69 73 20 73 75 6d 6d 61   hashed is summa
3c90: 72 69 7a 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  rized as follows
3ca0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 3c  :.**.**       S<
3cb0: 6e 3e 3a 3c 73 71 6c 3e 0a 2a 2a 20 20 20 20 20  n>:<sql>.**     
3cc0: 20 20 52 0a 2a 2a 20 20 20 20 20 20 20 4e 0a 2a    R.**       N.*
3cd0: 2a 20 20 20 20 20 20 20 49 3c 69 6e 74 3e 0a 2a  *       I<int>.*
3ce0: 2a 20 20 20 20 20 20 20 46 3c 69 65 65 65 2d 66  *       F<ieee-f
3cf0: 6c 6f 61 74 3e 0a 2a 2a 20 20 20 20 20 20 20 42  loat>.**       B
3d00: 3c 73 69 7a 65 3e 3a 3c 62 79 74 65 73 3e 0a 2a  <size>:<bytes>.*
3d10: 2a 20 20 20 20 20 20 20 54 3c 73 69 7a 65 3e 3a  *       T<size>:
3d20: 3c 74 65 78 74 3e 0a 2a 2a 0a 2a 2a 20 3c 73 71  <text>.**.** <sq
3d30: 6c 3e 20 69 73 20 74 68 65 20 6f 72 69 67 69 6e  l> is the origin
3d40: 61 6c 20 53 51 4c 20 74 65 78 74 20 66 6f 72 20  al SQL text for 
3d50: 65 61 63 68 20 73 74 61 74 65 6d 65 6e 74 20 72  each statement r
3d60: 75 6e 20 61 6e 64 20 3c 6e 3e 20 69 73 0a 2a 2a  un and <n> is.**
3d70: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 61   the size of tha
3d80: 74 20 74 65 78 74 2e 20 20 54 68 65 20 53 51 4c  t text.  The SQL
3d90: 20 74 65 78 74 20 69 73 20 55 54 46 2d 38 2e 20   text is UTF-8. 
3da0: 20 41 20 73 69 6e 67 6c 65 20 52 20 63 68 61 72   A single R char
3db0: 61 63 74 65 72 0a 2a 2a 20 6f 63 63 75 72 73 20  acter.** occurs 
3dc0: 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 72 74  before the start
3dd0: 20 6f 66 20 65 61 63 68 20 72 6f 77 2e 20 20 4e   of each row.  N
3de0: 20 6d 65 61 6e 73 20 61 20 4e 55 4c 4c 20 76 61   means a NULL va
3df0: 6c 75 65 2e 0a 2a 2a 20 49 20 6d 65 61 6e 20 61  lue..** I mean a
3e00: 6e 20 38 2d 62 79 74 65 20 6c 69 74 74 6c 65 2d  n 8-byte little-
3e10: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 3c  endian integer <
3e20: 69 6e 74 3e 2e 20 20 46 20 69 73 20 61 20 66 6c  int>.  F is a fl
3e30: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
3e40: 6e 75 6d 62 65 72 20 77 69 74 68 20 61 6e 20 38  number with an 8
3e50: 2d 62 79 74 65 20 6c 69 74 74 6c 65 2d 65 6e 64  -byte little-end
3e60: 69 61 6e 20 49 45 45 45 20 66 6c 6f 61 74 69 6e  ian IEEE floatin
3e70: 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 20 3c 69  g point value <i
3e80: 65 65 65 2d 66 6c 6f 61 74 3e 2e 0a 2a 2a 20 42  eee-float>..** B
3e90: 20 6d 65 61 6e 73 20 62 6c 6f 62 73 20 6f 66 20   means blobs of 
3ea0: 3c 73 69 7a 65 3e 20 62 79 74 65 73 2e 20 20 54  <size> bytes.  T
3eb0: 20 6d 65 61 6e 73 20 74 65 78 74 20 72 65 6e 64   means text rend
3ec0: 65 72 65 64 20 61 73 20 3c 73 69 7a 65 3e 0a 2a  ered as <size>.*
3ed0: 2a 20 62 79 74 65 73 20 6f 66 20 55 54 46 2d 38  * bytes of UTF-8
3ee0: 2e 20 20 54 68 65 20 3c 6e 3e 20 61 6e 64 20 3c  .  The <n> and <
3ef0: 73 69 7a 65 3e 20 76 61 6c 75 65 73 20 61 72 65  size> values are
3f00: 20 65 78 70 72 65 73 73 65 64 20 61 73 20 61 6e   expressed as an
3f10: 20 41 53 43 49 49 0a 2a 2a 20 74 65 78 74 20 69   ASCII.** text i
3f20: 6e 74 65 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 46  ntegers..**.** F
3f30: 6f 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  or each SQL stat
3f40: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 58 20 69  ement in the X i
3f50: 6e 70 75 74 2c 20 74 68 65 72 65 20 69 73 20 6f  nput, there is o
3f60: 6e 65 20 53 20 73 65 67 6d 65 6e 74 2e 20 20 45  ne S segment.  E
3f70: 61 63 68 0a 2a 2a 20 53 20 73 65 67 6d 65 6e 74  ach.** S segment
3f80: 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   is followed by 
3f90: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 52 20 73  zero or more R s
3fa0: 65 67 6d 65 6e 74 73 2c 20 6f 6e 65 20 66 6f 72  egments, one for
3fb0: 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65   each row in the
3fc0: 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 2e 20  .** result set. 
3fd0: 20 41 66 74 65 72 20 65 61 63 68 20 52 2c 20 74   After each R, t
3fe0: 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
3ff0: 6d 6f 72 65 20 4e 2c 20 49 2c 20 46 2c 20 42 2c  more N, I, F, B,
4000: 20 6f 72 20 54 20 73 65 67 6d 65 6e 74 73 2c 0a   or T segments,.
4010: 2a 2a 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20  ** one for each 
4020: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
4030: 73 75 6c 74 20 73 65 74 2e 20 20 53 65 67 6d 65  sult set.  Segme
4040: 6e 74 73 20 61 72 65 20 63 6f 6e 63 61 74 65 6e  nts are concaten
4050: 74 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a  tated directly.*
4060: 2a 20 77 69 74 68 20 6e 6f 20 64 65 6c 69 6d 69  * with no delimi
4070: 74 65 72 73 20 6f 66 20 61 6e 79 20 6b 69 6e 64  ters of any kind
4080: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4090: 20 73 68 61 33 51 75 65 72 79 46 75 6e 63 28 0a   sha3QueryFunc(.
40a0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
40b0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
40c0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
40d0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
40e0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
40f0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
4100: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
4110: 65 78 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ext);.  const ch
4120: 61 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73  ar *zSql = (cons
4130: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
4140: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
4150: 30 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  0]);.  sqlite3_s
4160: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
4170: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4190: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
41a0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
41b0: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b   set */.  int i;
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41d0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
41e0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
41f0: 63 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  c;.  int n;.  co
4200: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 53  nst char *z;.  S
4210: 48 41 33 43 6f 6e 74 65 78 74 20 63 78 3b 0a 20  HA3Context cx;. 
4220: 20 69 6e 74 20 69 53 69 7a 65 3b 0a 0a 20 20 69   int iSize;..  i
4230: 66 28 20 61 72 67 63 3d 3d 31 20 29 7b 0a 20 20  f( argc==1 ){.  
4240: 20 20 69 53 69 7a 65 20 3d 20 32 35 36 3b 0a 20    iSize = 256;. 
4250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 53 69 7a   }else{.    iSiz
4260: 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
4270: 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a  e_int(argv[1]);.
4280: 20 20 20 20 69 66 28 20 69 53 69 7a 65 21 3d 32      if( iSize!=2
4290: 32 34 20 26 26 20 69 53 69 7a 65 21 3d 32 35 36  24 && iSize!=256
42a0: 20 26 26 20 69 53 69 7a 65 21 3d 33 38 34 20 26   && iSize!=384 &
42b0: 26 20 69 53 69 7a 65 21 3d 35 31 32 20 29 7b 0a  & iSize!=512 ){.
42c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
42d0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
42e0: 78 74 2c 20 22 53 48 41 33 20 73 69 7a 65 20 73  xt, "SHA3 size s
42f0: 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a  hould be one of:
4300: 20 32 32 34 20 32 35 36 20 22 0a 20 20 20 20 20   224 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 20 20 22                 "
4330: 33 38 34 20 35 31 32 22 2c 20 2d 31 29 3b 0a 20  384 512", -1);. 
4340: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
4350: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 71   }.  }.  if( zSq
4360: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  l==0 ) return;. 
4370: 20 53 48 41 33 49 6e 69 74 28 26 63 78 2c 20 69   SHA3Init(&cx, i
4380: 53 69 7a 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  Size);.  while( 
4390: 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 72  zSql[0] ){.    r
43a0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
43b0: 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
43c0: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 53   -1, &pStmt, &zS
43d0: 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ql);.    if( rc 
43e0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
43f0: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
4400: 72 69 6e 74 66 28 22 65 72 72 6f 72 20 53 51 4c  rintf("error SQL
4410: 20 73 74 61 74 65 6d 65 6e 74 20 5b 25 73 5d 3a   statement [%s]:
4420: 20 25 73 22 2c 0a 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 20 20 7a 53 71 6c 2c 20 73           zSql, s
4450: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
4460: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
4470: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
4480: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4490: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
44a0: 6e 74 65 78 74 2c 20 7a 4d 73 67 2c 20 2d 31 29  ntext, zMsg, -1)
44b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
44c0: 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20 20 20  free(zMsg);.    
44d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
44e0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
44f0: 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70  _stmt_readonly(p
4500: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63  Stmt) ){.      c
4510: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
4520: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 6e  te3_mprintf("non
4530: 2d 71 75 65 72 79 3a 20 5b 25 73 5d 22 2c 20 73  -query: [%s]", s
4540: 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
4550: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
4560: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
4570: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4580: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
4590: 6e 74 65 78 74 2c 20 7a 4d 73 67 2c 20 2d 31 29  ntext, zMsg, -1)
45a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
45b0: 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20 20 20  free(zMsg);.    
45c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
45d0: 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74      nCol = sqlit
45e0: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
45f0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20  pStmt);.    z = 
4600: 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
4610: 74 29 3b 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74  t);.    n = (int
4620: 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20  )strlen(z);.    
4630: 68 61 73 68 5f 73 74 65 70 5f 76 66 6f 72 6d 61  hash_step_vforma
4640: 74 28 26 63 78 2c 22 53 25 64 3a 22 2c 6e 29 3b  t(&cx,"S%d:",n);
4650: 0a 20 20 20 20 53 48 41 33 55 70 64 61 74 65 28  .    SHA3Update(
4660: 26 63 78 2c 28 75 6e 73 69 67 6e 65 64 20 63 68  &cx,(unsigned ch
4670: 61 72 2a 29 7a 2c 6e 29 3b 0a 0a 20 20 20 20 2f  ar*)z,n);..    /
4680: 2a 20 43 6f 6d 70 75 74 65 20 61 20 68 61 73 68  * Compute a hash
4690: 20 6f 76 65 72 20 74 68 65 20 72 65 73 75 6c 74   over the result
46a0: 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
46b0: 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49  .    while( SQLI
46c0: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
46d0: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
46e0: 20 20 20 20 20 53 48 41 33 55 70 64 61 74 65 28       SHA3Update(
46f0: 26 63 78 2c 28 63 6f 6e 73 74 20 75 6e 73 69 67  &cx,(const unsig
4700: 6e 65 64 20 63 68 61 72 2a 29 22 52 22 2c 31 29  ned char*)"R",1)
4710: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
4720: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
4730: 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73         switch( s
4740: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
4750: 70 65 28 70 53 74 6d 74 2c 69 29 20 29 7b 0a 20  pe(pStmt,i) ){. 
4760: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
4770: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
4780: 20 20 20 20 20 20 20 20 20 53 48 41 33 55 70 64           SHA3Upd
4790: 61 74 65 28 26 63 78 2c 20 28 63 6f 6e 73 74 20  ate(&cx, (const 
47a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 22  unsigned char*)"
47b0: 4e 22 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 20  N",1);.         
47c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
47d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
47e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
47f0: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  GER: {.         
4800: 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
4810: 34 20 75 3b 0a 20 20 20 20 20 20 20 20 20 20 20  4 u;.           
4820: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
4830: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
4840: 72 20 78 5b 39 5d 3b 0a 20 20 20 20 20 20 20 20  r x[9];.        
4850: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
4860: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  4 v = sqlite3_co
4870: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
4880: 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,i);.           
4890: 20 6d 65 6d 63 70 79 28 26 75 2c 20 26 76 2c 20   memcpy(&u, &v, 
48a0: 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  8);.            
48b0: 66 6f 72 28 6a 3d 38 3b 20 6a 3e 3d 31 3b 20 6a  for(j=8; j>=1; j
48c0: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
48d0: 20 20 20 78 5b 6a 5d 20 3d 20 75 20 26 20 30 78     x[j] = u & 0x
48e0: 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ff;.            
48f0: 20 20 75 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 20    u >>= 8;.     
4900: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4910: 20 20 20 20 20 78 5b 30 5d 20 3d 20 27 49 27 3b       x[0] = 'I';
4920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41  .            SHA
4930: 33 55 70 64 61 74 65 28 26 63 78 2c 20 78 2c 20  3Update(&cx, x, 
4940: 39 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  9);.            
4950: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
4960: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
4970: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
4980: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
4990: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75 3b 0a  lite3_uint64 u;.
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
49b0: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  j;.            u
49c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 78 5b 39  nsigned char x[9
49d0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ];.            d
49e0: 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
49f0: 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
4a00: 70 53 74 6d 74 2c 69 29 3b 0a 20 20 20 20 20 20  pStmt,i);.      
4a10: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 75 2c        memcpy(&u,
4a20: 20 26 72 2c 20 38 29 3b 0a 20 20 20 20 20 20 20   &r, 8);.       
4a30: 20 20 20 20 20 66 6f 72 28 6a 3d 38 3b 20 6a 3e       for(j=8; j>
4a40: 3d 31 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =1; j--){.      
4a50: 20 20 20 20 20 20 20 20 78 5b 6a 5d 20 3d 20 75          x[j] = u
4a60: 20 26 20 30 78 66 66 3b 0a 20 20 20 20 20 20 20   & 0xff;.       
4a70: 20 20 20 20 20 20 20 75 20 3e 3e 3d 20 38 3b 0a         u >>= 8;.
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
4a90: 20 20 20 20 20 20 20 20 20 20 78 5b 30 5d 20 3d            x[0] =
4aa0: 20 27 46 27 3b 0a 20 20 20 20 20 20 20 20 20 20   'F';.          
4ab0: 20 20 53 48 41 33 55 70 64 61 74 65 28 26 63 78    SHA3Update(&cx
4ac0: 2c 78 2c 39 29 3b 0a 20 20 20 20 20 20 20 20 20  ,x,9);.         
4ad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4ae0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4af0: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54  case SQLITE_TEXT
4b00: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
4b10: 69 6e 74 20 6e 32 20 3d 20 73 71 6c 69 74 65 33  int n2 = sqlite3
4b20: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
4b30: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
4b40: 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67       const unsig
4b50: 6e 65 64 20 63 68 61 72 20 2a 7a 32 20 3d 20 73  ned char *z2 = s
4b60: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4b70: 78 74 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  xt(pStmt, i);.  
4b80: 20 20 20 20 20 20 20 20 20 20 68 61 73 68 5f 73            hash_s
4b90: 74 65 70 5f 76 66 6f 72 6d 61 74 28 26 63 78 2c  tep_vformat(&cx,
4ba0: 22 54 25 64 3a 22 2c 6e 32 29 3b 0a 20 20 20 20  "T%d:",n2);.    
4bb0: 20 20 20 20 20 20 20 20 53 48 41 33 55 70 64 61          SHA3Upda
4bc0: 74 65 28 26 63 78 2c 20 7a 32 2c 20 6e 32 29 3b  te(&cx, z2, n2);
4bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
4be0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
4bf0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
4c00: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
4c10: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 32            int n2
4c20: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
4c30: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69  n_bytes(pStmt, i
4c40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  );.            c
4c50: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4c60: 61 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74 65 33  ar *z2 = sqlite3
4c70: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
4c80: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
4c90: 20 20 20 20 68 61 73 68 5f 73 74 65 70 5f 76 66      hash_step_vf
4ca0: 6f 72 6d 61 74 28 26 63 78 2c 22 42 25 64 3a 22  ormat(&cx,"B%d:"
4cb0: 2c 6e 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ,n2);.          
4cc0: 20 20 53 48 41 33 55 70 64 61 74 65 28 26 63 78    SHA3Update(&cx
4cd0: 2c 20 7a 32 2c 20 6e 32 29 3b 0a 20 20 20 20 20  , z2, n2);.     
4ce0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4cf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4d00: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4d10: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
4d20: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
4d30: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
4d40: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
4d50: 2c 20 53 48 41 33 46 69 6e 61 6c 28 26 63 78 29  , SHA3Final(&cx)
4d60: 2c 20 69 53 69 7a 65 2f 38 2c 20 53 51 4c 49 54  , iSize/8, SQLIT
4d70: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
4d80: 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a  ..#ifdef _WIN32.
4d90: 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78  __declspec(dllex
4da0: 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74  port).#endif.int
4db0: 20 73 71 6c 69 74 65 33 5f 73 68 61 74 68 72 65   sqlite3_shathre
4dc0: 65 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65  e_init(.  sqlite
4dd0: 33 20 2a 64 62 2c 0a 20 20 63 68 61 72 20 2a 2a  3 *db,.  char **
4de0: 70 7a 45 72 72 4d 73 67 2c 0a 20 20 63 6f 6e 73  pzErrMsg,.  cons
4df0: 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
4e00: 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a  utines *pApi.){.
4e10: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4e20: 45 5f 4f 4b 3b 0a 20 20 53 51 4c 49 54 45 5f 45  E_OK;.  SQLITE_E
4e30: 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 70  XTENSION_INIT2(p
4e40: 41 70 69 29 3b 0a 20 20 28 76 6f 69 64 29 70 7a  Api);.  (void)pz
4e50: 45 72 72 4d 73 67 3b 20 20 2f 2a 20 55 6e 75 73  ErrMsg;  /* Unus
4e60: 65 64 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  ed parameter */.
4e70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
4e80: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
4e90: 62 2c 20 22 73 68 61 33 22 2c 20 31 2c 20 53 51  b, "sha3", 1, SQ
4ea0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_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 20 20 73 68 61               sha
4ed0: 33 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  3Func, 0, 0);.  
4ee0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4ef0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
4f00: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
4f10: 63 74 69 6f 6e 28 64 62 2c 20 22 73 68 61 33 22  ction(db, "sha3"
4f20: 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
4f30: 2c 20 30 2c 0a 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 20 20 73 68 61 33 46 75 6e 63 2c 20        sha3Func, 
4f60: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
4f70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4f80: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
4f90: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
4fa0: 6f 6e 28 64 62 2c 20 22 73 68 61 33 5f 71 75 65  on(db, "sha3_que
4fb0: 72 79 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  ry", 1, SQLITE_U
4fc0: 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 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 20 20 73 68 61 33 51 75 65           sha3Que
4ff0: 72 79 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  ryFunc, 0, 0);. 
5000: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
5010: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
5020: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
5030: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
5040: 73 68 61 33 5f 71 75 65 72 79 22 2c 20 32 2c 20  sha3_query", 2, 
5050: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_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 20                  
5080: 20 73 68 61 33 51 75 65 72 79 46 75 6e 63 2c 20   sha3QueryFunc, 
5090: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, 0);.  }.  ret
50a0: 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.