modernc.org/cc@v1.0.1/v2/testdata/_sqlite/ext/misc/shathree.c (about)

     1  /*
     2  ** 2017-03-08
     3  **
     4  ** The author disclaims copyright to this source code.  In place of
     5  ** a legal notice, here is a blessing:
     6  **
     7  **    May you do good and not evil.
     8  **    May you find forgiveness for yourself and forgive others.
     9  **    May you share freely, never taking more than you give.
    10  **
    11  ******************************************************************************
    12  **
    13  ** This SQLite extension implements a functions that compute SHA1 hashes.
    14  ** Two SQL functions are implemented:
    15  **
    16  **     sha3(X,SIZE)
    17  **     sha3_query(Y,SIZE)
    18  **
    19  ** The sha3(X) function computes the SHA3 hash of the input X, or NULL if
    20  ** X is NULL.
    21  **
    22  ** The sha3_query(Y) function evalutes all queries in the SQL statements of Y
    23  ** and returns a hash of their results.
    24  **
    25  ** The SIZE argument is optional.  If omitted, the SHA3-256 hash algorithm
    26  ** is used.  If SIZE is included it must be one of the integers 224, 256,
    27  ** 384, or 512, to determine SHA3 hash variant that is computed.
    28  */
    29  #include "sqlite3ext.h"
    30  SQLITE_EXTENSION_INIT1
    31  #include <assert.h>
    32  #include <string.h>
    33  #include <stdarg.h>
    34  typedef sqlite3_uint64 u64;
    35  
    36  /******************************************************************************
    37  ** The Hash Engine
    38  */
    39  /*
    40  ** Macros to determine whether the machine is big or little endian,
    41  ** and whether or not that determination is run-time or compile-time.
    42  **
    43  ** For best performance, an attempt is made to guess at the byte-order
    44  ** using C-preprocessor macros.  If that is unsuccessful, or if
    45  ** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
    46  ** at run-time.
    47  */
    48  #ifndef SHA3_BYTEORDER
    49  # if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
    50       defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
    51       defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
    52       defined(__arm__)
    53  #   define SHA3_BYTEORDER    1234
    54  # elif defined(sparc)    || defined(__ppc__)
    55  #   define SHA3_BYTEORDER    4321
    56  # else
    57  #   define SHA3_BYTEORDER 0
    58  # endif
    59  #endif
    60  
    61  
    62  /*
    63  ** State structure for a SHA3 hash in progress
    64  */
    65  typedef struct SHA3Context SHA3Context;
    66  struct SHA3Context {
    67    union {
    68      u64 s[25];                /* Keccak state. 5x5 lines of 64 bits each */
    69      unsigned char x[1600];    /* ... or 1600 bytes */
    70    } u;
    71    unsigned nRate;        /* Bytes of input accepted per Keccak iteration */
    72    unsigned nLoaded;      /* Input bytes loaded into u.x[] so far this cycle */
    73    unsigned ixMask;       /* Insert next input into u.x[nLoaded^ixMask]. */
    74  };
    75  
    76  /*
    77  ** A single step of the Keccak mixing function for a 1600-bit state
    78  */
    79  static void KeccakF1600Step(SHA3Context *p){
    80    int i;
    81    u64 B0, B1, B2, B3, B4;
    82    u64 C0, C1, C2, C3, C4;
    83    u64 D0, D1, D2, D3, D4;
    84    static const u64 RC[] = {
    85      0x0000000000000001ULL,  0x0000000000008082ULL,
    86      0x800000000000808aULL,  0x8000000080008000ULL,
    87      0x000000000000808bULL,  0x0000000080000001ULL,
    88      0x8000000080008081ULL,  0x8000000000008009ULL,
    89      0x000000000000008aULL,  0x0000000000000088ULL,
    90      0x0000000080008009ULL,  0x000000008000000aULL,
    91      0x000000008000808bULL,  0x800000000000008bULL,
    92      0x8000000000008089ULL,  0x8000000000008003ULL,
    93      0x8000000000008002ULL,  0x8000000000000080ULL,
    94      0x000000000000800aULL,  0x800000008000000aULL,
    95      0x8000000080008081ULL,  0x8000000000008080ULL,
    96      0x0000000080000001ULL,  0x8000000080008008ULL
    97    };
    98  # define A00 (p->u.s[0])
    99  # define A01 (p->u.s[1])
   100  # define A02 (p->u.s[2])
   101  # define A03 (p->u.s[3])
   102  # define A04 (p->u.s[4])
   103  # define A10 (p->u.s[5])
   104  # define A11 (p->u.s[6])
   105  # define A12 (p->u.s[7])
   106  # define A13 (p->u.s[8])
   107  # define A14 (p->u.s[9])
   108  # define A20 (p->u.s[10])
   109  # define A21 (p->u.s[11])
   110  # define A22 (p->u.s[12])
   111  # define A23 (p->u.s[13])
   112  # define A24 (p->u.s[14])
   113  # define A30 (p->u.s[15])
   114  # define A31 (p->u.s[16])
   115  # define A32 (p->u.s[17])
   116  # define A33 (p->u.s[18])
   117  # define A34 (p->u.s[19])
   118  # define A40 (p->u.s[20])
   119  # define A41 (p->u.s[21])
   120  # define A42 (p->u.s[22])
   121  # define A43 (p->u.s[23])
   122  # define A44 (p->u.s[24])
   123  # define ROL64(a,x) ((a<<x)|(a>>(64-x)))
   124  
   125    for(i=0; i<24; i+=4){
   126      C0 = A00^A10^A20^A30^A40;
   127      C1 = A01^A11^A21^A31^A41;
   128      C2 = A02^A12^A22^A32^A42;
   129      C3 = A03^A13^A23^A33^A43;
   130      C4 = A04^A14^A24^A34^A44;
   131      D0 = C4^ROL64(C1, 1);
   132      D1 = C0^ROL64(C2, 1);
   133      D2 = C1^ROL64(C3, 1);
   134      D3 = C2^ROL64(C4, 1);
   135      D4 = C3^ROL64(C0, 1);
   136  
   137      B0 = (A00^D0);
   138      B1 = ROL64((A11^D1), 44);
   139      B2 = ROL64((A22^D2), 43);
   140      B3 = ROL64((A33^D3), 21);
   141      B4 = ROL64((A44^D4), 14);
   142      A00 =   B0 ^((~B1)&  B2 );
   143      A00 ^= RC[i];
   144      A11 =   B1 ^((~B2)&  B3 );
   145      A22 =   B2 ^((~B3)&  B4 );
   146      A33 =   B3 ^((~B4)&  B0 );
   147      A44 =   B4 ^((~B0)&  B1 );
   148  
   149      B2 = ROL64((A20^D0), 3);
   150      B3 = ROL64((A31^D1), 45);
   151      B4 = ROL64((A42^D2), 61);
   152      B0 = ROL64((A03^D3), 28);
   153      B1 = ROL64((A14^D4), 20);
   154      A20 =   B0 ^((~B1)&  B2 );
   155      A31 =   B1 ^((~B2)&  B3 );
   156      A42 =   B2 ^((~B3)&  B4 );
   157      A03 =   B3 ^((~B4)&  B0 );
   158      A14 =   B4 ^((~B0)&  B1 );
   159  
   160      B4 = ROL64((A40^D0), 18);
   161      B0 = ROL64((A01^D1), 1);
   162      B1 = ROL64((A12^D2), 6);
   163      B2 = ROL64((A23^D3), 25);
   164      B3 = ROL64((A34^D4), 8);
   165      A40 =   B0 ^((~B1)&  B2 );
   166      A01 =   B1 ^((~B2)&  B3 );
   167      A12 =   B2 ^((~B3)&  B4 );
   168      A23 =   B3 ^((~B4)&  B0 );
   169      A34 =   B4 ^((~B0)&  B1 );
   170  
   171      B1 = ROL64((A10^D0), 36);
   172      B2 = ROL64((A21^D1), 10);
   173      B3 = ROL64((A32^D2), 15);
   174      B4 = ROL64((A43^D3), 56);
   175      B0 = ROL64((A04^D4), 27);
   176      A10 =   B0 ^((~B1)&  B2 );
   177      A21 =   B1 ^((~B2)&  B3 );
   178      A32 =   B2 ^((~B3)&  B4 );
   179      A43 =   B3 ^((~B4)&  B0 );
   180      A04 =   B4 ^((~B0)&  B1 );
   181  
   182      B3 = ROL64((A30^D0), 41);
   183      B4 = ROL64((A41^D1), 2);
   184      B0 = ROL64((A02^D2), 62);
   185      B1 = ROL64((A13^D3), 55);
   186      B2 = ROL64((A24^D4), 39);
   187      A30 =   B0 ^((~B1)&  B2 );
   188      A41 =   B1 ^((~B2)&  B3 );
   189      A02 =   B2 ^((~B3)&  B4 );
   190      A13 =   B3 ^((~B4)&  B0 );
   191      A24 =   B4 ^((~B0)&  B1 );
   192  
   193      C0 = A00^A20^A40^A10^A30;
   194      C1 = A11^A31^A01^A21^A41;
   195      C2 = A22^A42^A12^A32^A02;
   196      C3 = A33^A03^A23^A43^A13;
   197      C4 = A44^A14^A34^A04^A24;
   198      D0 = C4^ROL64(C1, 1);
   199      D1 = C0^ROL64(C2, 1);
   200      D2 = C1^ROL64(C3, 1);
   201      D3 = C2^ROL64(C4, 1);
   202      D4 = C3^ROL64(C0, 1);
   203  
   204      B0 = (A00^D0);
   205      B1 = ROL64((A31^D1), 44);
   206      B2 = ROL64((A12^D2), 43);
   207      B3 = ROL64((A43^D3), 21);
   208      B4 = ROL64((A24^D4), 14);
   209      A00 =   B0 ^((~B1)&  B2 );
   210      A00 ^= RC[i+1];
   211      A31 =   B1 ^((~B2)&  B3 );
   212      A12 =   B2 ^((~B3)&  B4 );
   213      A43 =   B3 ^((~B4)&  B0 );
   214      A24 =   B4 ^((~B0)&  B1 );
   215  
   216      B2 = ROL64((A40^D0), 3);
   217      B3 = ROL64((A21^D1), 45);
   218      B4 = ROL64((A02^D2), 61);
   219      B0 = ROL64((A33^D3), 28);
   220      B1 = ROL64((A14^D4), 20);
   221      A40 =   B0 ^((~B1)&  B2 );
   222      A21 =   B1 ^((~B2)&  B3 );
   223      A02 =   B2 ^((~B3)&  B4 );
   224      A33 =   B3 ^((~B4)&  B0 );
   225      A14 =   B4 ^((~B0)&  B1 );
   226  
   227      B4 = ROL64((A30^D0), 18);
   228      B0 = ROL64((A11^D1), 1);
   229      B1 = ROL64((A42^D2), 6);
   230      B2 = ROL64((A23^D3), 25);
   231      B3 = ROL64((A04^D4), 8);
   232      A30 =   B0 ^((~B1)&  B2 );
   233      A11 =   B1 ^((~B2)&  B3 );
   234      A42 =   B2 ^((~B3)&  B4 );
   235      A23 =   B3 ^((~B4)&  B0 );
   236      A04 =   B4 ^((~B0)&  B1 );
   237  
   238      B1 = ROL64((A20^D0), 36);
   239      B2 = ROL64((A01^D1), 10);
   240      B3 = ROL64((A32^D2), 15);
   241      B4 = ROL64((A13^D3), 56);
   242      B0 = ROL64((A44^D4), 27);
   243      A20 =   B0 ^((~B1)&  B2 );
   244      A01 =   B1 ^((~B2)&  B3 );
   245      A32 =   B2 ^((~B3)&  B4 );
   246      A13 =   B3 ^((~B4)&  B0 );
   247      A44 =   B4 ^((~B0)&  B1 );
   248  
   249      B3 = ROL64((A10^D0), 41);
   250      B4 = ROL64((A41^D1), 2);
   251      B0 = ROL64((A22^D2), 62);
   252      B1 = ROL64((A03^D3), 55);
   253      B2 = ROL64((A34^D4), 39);
   254      A10 =   B0 ^((~B1)&  B2 );
   255      A41 =   B1 ^((~B2)&  B3 );
   256      A22 =   B2 ^((~B3)&  B4 );
   257      A03 =   B3 ^((~B4)&  B0 );
   258      A34 =   B4 ^((~B0)&  B1 );
   259  
   260      C0 = A00^A40^A30^A20^A10;
   261      C1 = A31^A21^A11^A01^A41;
   262      C2 = A12^A02^A42^A32^A22;
   263      C3 = A43^A33^A23^A13^A03;
   264      C4 = A24^A14^A04^A44^A34;
   265      D0 = C4^ROL64(C1, 1);
   266      D1 = C0^ROL64(C2, 1);
   267      D2 = C1^ROL64(C3, 1);
   268      D3 = C2^ROL64(C4, 1);
   269      D4 = C3^ROL64(C0, 1);
   270  
   271      B0 = (A00^D0);
   272      B1 = ROL64((A21^D1), 44);
   273      B2 = ROL64((A42^D2), 43);
   274      B3 = ROL64((A13^D3), 21);
   275      B4 = ROL64((A34^D4), 14);
   276      A00 =   B0 ^((~B1)&  B2 );
   277      A00 ^= RC[i+2];
   278      A21 =   B1 ^((~B2)&  B3 );
   279      A42 =   B2 ^((~B3)&  B4 );
   280      A13 =   B3 ^((~B4)&  B0 );
   281      A34 =   B4 ^((~B0)&  B1 );
   282  
   283      B2 = ROL64((A30^D0), 3);
   284      B3 = ROL64((A01^D1), 45);
   285      B4 = ROL64((A22^D2), 61);
   286      B0 = ROL64((A43^D3), 28);
   287      B1 = ROL64((A14^D4), 20);
   288      A30 =   B0 ^((~B1)&  B2 );
   289      A01 =   B1 ^((~B2)&  B3 );
   290      A22 =   B2 ^((~B3)&  B4 );
   291      A43 =   B3 ^((~B4)&  B0 );
   292      A14 =   B4 ^((~B0)&  B1 );
   293  
   294      B4 = ROL64((A10^D0), 18);
   295      B0 = ROL64((A31^D1), 1);
   296      B1 = ROL64((A02^D2), 6);
   297      B2 = ROL64((A23^D3), 25);
   298      B3 = ROL64((A44^D4), 8);
   299      A10 =   B0 ^((~B1)&  B2 );
   300      A31 =   B1 ^((~B2)&  B3 );
   301      A02 =   B2 ^((~B3)&  B4 );
   302      A23 =   B3 ^((~B4)&  B0 );
   303      A44 =   B4 ^((~B0)&  B1 );
   304  
   305      B1 = ROL64((A40^D0), 36);
   306      B2 = ROL64((A11^D1), 10);
   307      B3 = ROL64((A32^D2), 15);
   308      B4 = ROL64((A03^D3), 56);
   309      B0 = ROL64((A24^D4), 27);
   310      A40 =   B0 ^((~B1)&  B2 );
   311      A11 =   B1 ^((~B2)&  B3 );
   312      A32 =   B2 ^((~B3)&  B4 );
   313      A03 =   B3 ^((~B4)&  B0 );
   314      A24 =   B4 ^((~B0)&  B1 );
   315  
   316      B3 = ROL64((A20^D0), 41);
   317      B4 = ROL64((A41^D1), 2);
   318      B0 = ROL64((A12^D2), 62);
   319      B1 = ROL64((A33^D3), 55);
   320      B2 = ROL64((A04^D4), 39);
   321      A20 =   B0 ^((~B1)&  B2 );
   322      A41 =   B1 ^((~B2)&  B3 );
   323      A12 =   B2 ^((~B3)&  B4 );
   324      A33 =   B3 ^((~B4)&  B0 );
   325      A04 =   B4 ^((~B0)&  B1 );
   326  
   327      C0 = A00^A30^A10^A40^A20;
   328      C1 = A21^A01^A31^A11^A41;
   329      C2 = A42^A22^A02^A32^A12;
   330      C3 = A13^A43^A23^A03^A33;
   331      C4 = A34^A14^A44^A24^A04;
   332      D0 = C4^ROL64(C1, 1);
   333      D1 = C0^ROL64(C2, 1);
   334      D2 = C1^ROL64(C3, 1);
   335      D3 = C2^ROL64(C4, 1);
   336      D4 = C3^ROL64(C0, 1);
   337  
   338      B0 = (A00^D0);
   339      B1 = ROL64((A01^D1), 44);
   340      B2 = ROL64((A02^D2), 43);
   341      B3 = ROL64((A03^D3), 21);
   342      B4 = ROL64((A04^D4), 14);
   343      A00 =   B0 ^((~B1)&  B2 );
   344      A00 ^= RC[i+3];
   345      A01 =   B1 ^((~B2)&  B3 );
   346      A02 =   B2 ^((~B3)&  B4 );
   347      A03 =   B3 ^((~B4)&  B0 );
   348      A04 =   B4 ^((~B0)&  B1 );
   349  
   350      B2 = ROL64((A10^D0), 3);
   351      B3 = ROL64((A11^D1), 45);
   352      B4 = ROL64((A12^D2), 61);
   353      B0 = ROL64((A13^D3), 28);
   354      B1 = ROL64((A14^D4), 20);
   355      A10 =   B0 ^((~B1)&  B2 );
   356      A11 =   B1 ^((~B2)&  B3 );
   357      A12 =   B2 ^((~B3)&  B4 );
   358      A13 =   B3 ^((~B4)&  B0 );
   359      A14 =   B4 ^((~B0)&  B1 );
   360  
   361      B4 = ROL64((A20^D0), 18);
   362      B0 = ROL64((A21^D1), 1);
   363      B1 = ROL64((A22^D2), 6);
   364      B2 = ROL64((A23^D3), 25);
   365      B3 = ROL64((A24^D4), 8);
   366      A20 =   B0 ^((~B1)&  B2 );
   367      A21 =   B1 ^((~B2)&  B3 );
   368      A22 =   B2 ^((~B3)&  B4 );
   369      A23 =   B3 ^((~B4)&  B0 );
   370      A24 =   B4 ^((~B0)&  B1 );
   371  
   372      B1 = ROL64((A30^D0), 36);
   373      B2 = ROL64((A31^D1), 10);
   374      B3 = ROL64((A32^D2), 15);
   375      B4 = ROL64((A33^D3), 56);
   376      B0 = ROL64((A34^D4), 27);
   377      A30 =   B0 ^((~B1)&  B2 );
   378      A31 =   B1 ^((~B2)&  B3 );
   379      A32 =   B2 ^((~B3)&  B4 );
   380      A33 =   B3 ^((~B4)&  B0 );
   381      A34 =   B4 ^((~B0)&  B1 );
   382  
   383      B3 = ROL64((A40^D0), 41);
   384      B4 = ROL64((A41^D1), 2);
   385      B0 = ROL64((A42^D2), 62);
   386      B1 = ROL64((A43^D3), 55);
   387      B2 = ROL64((A44^D4), 39);
   388      A40 =   B0 ^((~B1)&  B2 );
   389      A41 =   B1 ^((~B2)&  B3 );
   390      A42 =   B2 ^((~B3)&  B4 );
   391      A43 =   B3 ^((~B4)&  B0 );
   392      A44 =   B4 ^((~B0)&  B1 );
   393    }
   394  }
   395  
   396  /*
   397  ** Initialize a new hash.  iSize determines the size of the hash
   398  ** in bits and should be one of 224, 256, 384, or 512.  Or iSize
   399  ** can be zero to use the default hash size of 256 bits.
   400  */
   401  static void SHA3Init(SHA3Context *p, int iSize){
   402    memset(p, 0, sizeof(*p));
   403    if( iSize>=128 && iSize<=512 ){
   404      p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
   405    }else{
   406      p->nRate = (1600 - 2*256)/8;
   407    }
   408  #if SHA3_BYTEORDER==1234
   409    /* Known to be little-endian at compile-time. No-op */
   410  #elif SHA3_BYTEORDER==4321
   411    p->ixMask = 7;  /* Big-endian */
   412  #else
   413    {
   414      static unsigned int one = 1;
   415      if( 1==*(unsigned char*)&one ){
   416        /* Little endian.  No byte swapping. */
   417        p->ixMask = 0;
   418      }else{
   419        /* Big endian.  Byte swap. */
   420        p->ixMask = 7;
   421      }
   422    }
   423  #endif
   424  }
   425  
   426  /*
   427  ** Make consecutive calls to the SHA3Update function to add new content
   428  ** to the hash
   429  */
   430  static void SHA3Update(
   431    SHA3Context *p,
   432    const unsigned char *aData,
   433    unsigned int nData
   434  ){
   435    unsigned int i = 0;
   436  #if SHA3_BYTEORDER==1234
   437    if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
   438      for(; i+7<nData; i+=8){
   439        p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
   440        p->nLoaded += 8;
   441        if( p->nLoaded>=p->nRate ){
   442          KeccakF1600Step(p);
   443          p->nLoaded = 0;
   444        }
   445      }
   446    }
   447  #endif
   448    for(; i<nData; i++){
   449  #if SHA3_BYTEORDER==1234
   450      p->u.x[p->nLoaded] ^= aData[i];
   451  #elif SHA3_BYTEORDER==4321
   452      p->u.x[p->nLoaded^0x07] ^= aData[i];
   453  #else
   454      p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
   455  #endif
   456      p->nLoaded++;
   457      if( p->nLoaded==p->nRate ){
   458        KeccakF1600Step(p);
   459        p->nLoaded = 0;
   460      }
   461    }
   462  }
   463  
   464  /*
   465  ** After all content has been added, invoke SHA3Final() to compute
   466  ** the final hash.  The function returns a pointer to the binary
   467  ** hash value.
   468  */
   469  static unsigned char *SHA3Final(SHA3Context *p){
   470    unsigned int i;
   471    if( p->nLoaded==p->nRate-1 ){
   472      const unsigned char c1 = 0x86;
   473      SHA3Update(p, &c1, 1);
   474    }else{
   475      const unsigned char c2 = 0x06;
   476      const unsigned char c3 = 0x80;
   477      SHA3Update(p, &c2, 1);
   478      p->nLoaded = p->nRate - 1;
   479      SHA3Update(p, &c3, 1);
   480    }
   481    for(i=0; i<p->nRate; i++){
   482      p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
   483    }
   484    return &p->u.x[p->nRate];
   485  }
   486  /* End of the hashing logic
   487  *****************************************************************************/
   488  
   489  /*
   490  ** Implementation of the sha3(X,SIZE) function.
   491  **
   492  ** Return a BLOB which is the SIZE-bit SHA3 hash of X.  The default
   493  ** size is 256.  If X is a BLOB, it is hashed as is.  
   494  ** For all other non-NULL types of input, X is converted into a UTF-8 string
   495  ** and the string is hashed without the trailing 0x00 terminator.  The hash
   496  ** of a NULL value is NULL.
   497  */
   498  static void sha3Func(
   499    sqlite3_context *context,
   500    int argc,
   501    sqlite3_value **argv
   502  ){
   503    SHA3Context cx;
   504    int eType = sqlite3_value_type(argv[0]);
   505    int nByte = sqlite3_value_bytes(argv[0]);
   506    int iSize;
   507    if( argc==1 ){
   508      iSize = 256;
   509    }else{
   510      iSize = sqlite3_value_int(argv[1]);
   511      if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
   512        sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
   513                                      "384 512", -1);
   514        return;
   515      }
   516    }
   517    if( eType==SQLITE_NULL ) return;
   518    SHA3Init(&cx, iSize);
   519    if( eType==SQLITE_BLOB ){
   520      SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
   521    }else{
   522      SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
   523    }
   524    sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
   525  }
   526  
   527  /* Compute a string using sqlite3_vsnprintf() with a maximum length
   528  ** of 50 bytes and add it to the hash.
   529  */
   530  static void hash_step_vformat(
   531    SHA3Context *p,                 /* Add content to this context */
   532    const char *zFormat,
   533    ...
   534  ){
   535    va_list ap;
   536    int n;
   537    char zBuf[50];
   538    va_start(ap, zFormat);
   539    sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
   540    va_end(ap);
   541    n = (int)strlen(zBuf);
   542    SHA3Update(p, (unsigned char*)zBuf, n);
   543  }
   544  
   545  /*
   546  ** Implementation of the sha3_query(SQL,SIZE) function.
   547  **
   548  ** This function compiles and runs the SQL statement(s) given in the
   549  ** argument. The results are hashed using a SIZE-bit SHA3.  The default
   550  ** size is 256.
   551  **
   552  ** The format of the byte stream that is hashed is summarized as follows:
   553  **
   554  **       S<n>:<sql>
   555  **       R
   556  **       N
   557  **       I<int>
   558  **       F<ieee-float>
   559  **       B<size>:<bytes>
   560  **       T<size>:<text>
   561  **
   562  ** <sql> is the original SQL text for each statement run and <n> is
   563  ** the size of that text.  The SQL text is UTF-8.  A single R character
   564  ** occurs before the start of each row.  N means a NULL value.
   565  ** I mean an 8-byte little-endian integer <int>.  F is a floating point
   566  ** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
   567  ** B means blobs of <size> bytes.  T means text rendered as <size>
   568  ** bytes of UTF-8.  The <n> and <size> values are expressed as an ASCII
   569  ** text integers.
   570  **
   571  ** For each SQL statement in the X input, there is one S segment.  Each
   572  ** S segment is followed by zero or more R segments, one for each row in the
   573  ** result set.  After each R, there are one or more N, I, F, B, or T segments,
   574  ** one for each column in the result set.  Segments are concatentated directly
   575  ** with no delimiters of any kind.
   576  */
   577  static void sha3QueryFunc(
   578    sqlite3_context *context,
   579    int argc,
   580    sqlite3_value **argv
   581  ){
   582    sqlite3 *db = sqlite3_context_db_handle(context);
   583    const char *zSql = (const char*)sqlite3_value_text(argv[0]);
   584    sqlite3_stmt *pStmt = 0;
   585    int nCol;                   /* Number of columns in the result set */
   586    int i;                      /* Loop counter */
   587    int rc;
   588    int n;
   589    const char *z;
   590    SHA3Context cx;
   591    int iSize;
   592  
   593    if( argc==1 ){
   594      iSize = 256;
   595    }else{
   596      iSize = sqlite3_value_int(argv[1]);
   597      if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
   598        sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
   599                                      "384 512", -1);
   600        return;
   601      }
   602    }
   603    if( zSql==0 ) return;
   604    SHA3Init(&cx, iSize);
   605    while( zSql[0] ){
   606      rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
   607      if( rc ){
   608        char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
   609                                     zSql, sqlite3_errmsg(db));
   610        sqlite3_finalize(pStmt);
   611        sqlite3_result_error(context, zMsg, -1);
   612        sqlite3_free(zMsg);
   613        return;
   614      }
   615      if( !sqlite3_stmt_readonly(pStmt) ){
   616        char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
   617        sqlite3_finalize(pStmt);
   618        sqlite3_result_error(context, zMsg, -1);
   619        sqlite3_free(zMsg);
   620        return;
   621      }
   622      nCol = sqlite3_column_count(pStmt);
   623      z = sqlite3_sql(pStmt);
   624      n = (int)strlen(z);
   625      hash_step_vformat(&cx,"S%d:",n);
   626      SHA3Update(&cx,(unsigned char*)z,n);
   627  
   628      /* Compute a hash over the result of the query */
   629      while( SQLITE_ROW==sqlite3_step(pStmt) ){
   630        SHA3Update(&cx,(const unsigned char*)"R",1);
   631        for(i=0; i<nCol; i++){
   632          switch( sqlite3_column_type(pStmt,i) ){
   633            case SQLITE_NULL: {
   634              SHA3Update(&cx, (const unsigned char*)"N",1);
   635              break;
   636            }
   637            case SQLITE_INTEGER: {
   638              sqlite3_uint64 u;
   639              int j;
   640              unsigned char x[9];
   641              sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
   642              memcpy(&u, &v, 8);
   643              for(j=8; j>=1; j--){
   644                x[j] = u & 0xff;
   645                u >>= 8;
   646              }
   647              x[0] = 'I';
   648              SHA3Update(&cx, x, 9);
   649              break;
   650            }
   651            case SQLITE_FLOAT: {
   652              sqlite3_uint64 u;
   653              int j;
   654              unsigned char x[9];
   655              double r = sqlite3_column_double(pStmt,i);
   656              memcpy(&u, &r, 8);
   657              for(j=8; j>=1; j--){
   658                x[j] = u & 0xff;
   659                u >>= 8;
   660              }
   661              x[0] = 'F';
   662              SHA3Update(&cx,x,9);
   663              break;
   664            }
   665            case SQLITE_TEXT: {
   666              int n2 = sqlite3_column_bytes(pStmt, i);
   667              const unsigned char *z2 = sqlite3_column_text(pStmt, i);
   668              hash_step_vformat(&cx,"T%d:",n2);
   669              SHA3Update(&cx, z2, n2);
   670              break;
   671            }
   672            case SQLITE_BLOB: {
   673              int n2 = sqlite3_column_bytes(pStmt, i);
   674              const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
   675              hash_step_vformat(&cx,"B%d:",n2);
   676              SHA3Update(&cx, z2, n2);
   677              break;
   678            }
   679          }
   680        }
   681      }
   682      sqlite3_finalize(pStmt);
   683    }
   684    sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
   685  }
   686  
   687  
   688  #ifdef _WIN32
   689  __declspec(dllexport)
   690  #endif
   691  int sqlite3_shathree_init(
   692    sqlite3 *db,
   693    char **pzErrMsg,
   694    const sqlite3_api_routines *pApi
   695  ){
   696    int rc = SQLITE_OK;
   697    SQLITE_EXTENSION_INIT2(pApi);
   698    (void)pzErrMsg;  /* Unused parameter */
   699    rc = sqlite3_create_function(db, "sha3", 1, SQLITE_UTF8, 0,
   700                                 sha3Func, 0, 0);
   701    if( rc==SQLITE_OK ){
   702      rc = sqlite3_create_function(db, "sha3", 2, SQLITE_UTF8, 0,
   703                                   sha3Func, 0, 0);
   704    }
   705    if( rc==SQLITE_OK ){
   706      rc = sqlite3_create_function(db, "sha3_query", 1, SQLITE_UTF8, 0,
   707                                   sha3QueryFunc, 0, 0);
   708    }
   709    if( rc==SQLITE_OK ){
   710      rc = sqlite3_create_function(db, "sha3_query", 2, SQLITE_UTF8, 0,
   711                                   sha3QueryFunc, 0, 0);
   712    }
   713    return rc;
   714  }