/ Hex Artifact Content
Login

Artifact b2e4eb8e26f09701ec15548395baf698f00e5895:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 2d 30 31 2d 32 37  /*.** 2017-01-27
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 31 28 58 29 0a 2a 2a 20 20 20 20    sha1(X).**    
0200: 20 73 68 61 31 5f 71 75 65 72 79 28 59 29 0a 2a   sha1_query(Y).*
0210: 2a 0a 2a 2a 20 54 68 65 20 73 68 61 31 28 58 29  *.** The sha1(X)
0220: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 75 74   function comput
0230: 65 73 20 74 68 65 20 53 48 41 31 20 68 61 73 68  es the SHA1 hash
0240: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 58 2c   of the input X,
0250: 20 6f 72 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 58   or NULL if.** X
0260: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
0270: 54 68 65 20 73 68 61 31 5f 71 75 65 72 79 28 59  The sha1_query(Y
0280: 29 20 66 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75  ) function evalu
0290: 74 65 73 20 61 6c 6c 20 71 75 65 72 69 65 73 20  tes all queries 
02a0: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  in the SQL state
02b0: 6d 65 6e 74 73 20 6f 66 20 59 0a 2a 2a 20 61 6e  ments of Y.** an
02c0: 64 20 72 65 74 75 72 6e 73 20 61 20 68 61 73 68  d returns a hash
02d0: 20 6f 66 20 74 68 65 69 72 20 72 65 73 75 6c 74   of their result
02e0: 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  s..*/.#include "
02f0: 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 53 51  sqlite3ext.h".SQ
0300: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
0310: 4e 49 54 31 0a 23 69 6e 63 6c 75 64 65 20 3c 61  NIT1.#include <a
0320: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0330: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e  e <string.h>.#in
0340: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0350: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 0a 2a 2a 20 54 68 65 20 48 61 73 68 20 45 6e  *.** The Hash En
03b0: 67 69 6e 65 0a 2a 2f 0a 2f 2a 20 43 6f 6e 74 65  gine.*/./* Conte
03c0: 78 74 20 66 6f 72 20 74 68 65 20 53 48 41 31 20  xt for the SHA1 
03d0: 68 61 73 68 20 2a 2f 0a 74 79 70 65 64 65 66 20  hash */.typedef 
03e0: 73 74 72 75 63 74 20 53 48 41 31 43 6f 6e 74 65  struct SHA1Conte
03f0: 78 74 20 53 48 41 31 43 6f 6e 74 65 78 74 3b 0a  xt SHA1Context;.
0400: 73 74 72 75 63 74 20 53 48 41 31 43 6f 6e 74 65  struct SHA1Conte
0410: 78 74 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  xt {.  unsigned 
0420: 69 6e 74 20 73 74 61 74 65 5b 35 5d 3b 0a 20 20  int state[5];.  
0430: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 6f 75  unsigned int cou
0440: 6e 74 5b 32 5d 3b 0a 20 20 75 6e 73 69 67 6e 65  nt[2];.  unsigne
0450: 64 20 63 68 61 72 20 62 75 66 66 65 72 5b 36 34  d char buffer[64
0460: 5d 3b 0a 7d 3b 0a 0a 0a 23 69 66 20 5f 5f 47 4e  ];.};...#if __GN
0470: 55 43 5f 5f 20 26 26 20 28 64 65 66 69 6e 65 64  UC__ && (defined
0480: 28 5f 5f 69 33 38 36 5f 5f 29 20 7c 7c 20 64 65  (__i386__) || de
0490: 66 69 6e 65 64 28 5f 5f 78 38 36 5f 36 34 5f 5f  fined(__x86_64__
04a0: 29 29 0a 2f 2a 0a 20 2a 20 47 43 43 20 62 79 20  ))./*. * GCC by 
04b0: 69 74 73 65 6c 66 20 6f 6e 6c 79 20 67 65 6e 65  itself only gene
04c0: 72 61 74 65 73 20 6c 65 66 74 20 72 6f 74 61 74  rates left rotat
04d0: 65 73 2e 20 20 55 73 65 20 72 69 67 68 74 20 72  es.  Use right r
04e0: 6f 74 61 74 65 73 20 69 66 0a 20 2a 20 70 6f 73  otates if. * pos
04f0: 73 69 62 6c 65 20 74 6f 20 62 65 20 6b 69 6e 64  sible to be kind
0500: 65 72 20 74 6f 20 64 69 6e 6b 79 20 69 6d 70 6c  er to dinky impl
0510: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 77 69 74 68  ementations with
0520: 20 69 74 65 72 61 74 69 76 65 20 72 6f 74 61 74   iterative rotat
0530: 65 0a 20 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e  e. * instruction
0540: 73 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  s.. */.#define S
0550: 48 41 5f 52 4f 54 28 6f 70 2c 20 78 2c 20 6b 29  HA_ROT(op, x, k)
0560: 20 5c 0a 20 20 20 20 20 20 20 20 28 7b 20 75 6e   \.        ({ un
0570: 73 69 67 6e 65 64 20 69 6e 74 20 79 3b 20 61 73  signed int y; as
0580: 6d 28 6f 70 20 22 20 25 31 2c 25 30 22 20 3a 20  m(op " %1,%0" : 
0590: 22 3d 72 22 20 28 79 29 20 3a 20 22 49 22 20 28  "=r" (y) : "I" (
05a0: 6b 29 2c 20 22 30 22 20 28 78 29 29 3b 20 79 3b  k), "0" (x)); y;
05b0: 20 7d 29 0a 23 64 65 66 69 6e 65 20 72 6f 6c 28   }).#define rol(
05c0: 78 2c 6b 29 20 53 48 41 5f 52 4f 54 28 22 72 6f  x,k) SHA_ROT("ro
05d0: 6c 6c 22 2c 20 78 2c 20 6b 29 0a 23 64 65 66 69  ll", x, k).#defi
05e0: 6e 65 20 72 6f 72 28 78 2c 6b 29 20 53 48 41 5f  ne ror(x,k) SHA_
05f0: 52 4f 54 28 22 72 6f 72 6c 22 2c 20 78 2c 20 6b  ROT("rorl", x, k
0600: 29 0a 0a 23 65 6c 73 65 0a 2f 2a 20 47 65 6e 65  )..#else./* Gene
0610: 72 69 63 20 43 20 65 71 75 69 76 61 6c 65 6e 74  ric C equivalent
0620: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 41 5f   */.#define SHA_
0630: 52 4f 54 28 78 2c 6c 2c 72 29 20 28 28 78 29 20  ROT(x,l,r) ((x) 
0640: 3c 3c 20 28 6c 29 20 7c 20 28 78 29 20 3e 3e 20  << (l) | (x) >> 
0650: 28 72 29 29 0a 23 64 65 66 69 6e 65 20 72 6f 6c  (r)).#define rol
0660: 28 78 2c 6b 29 20 53 48 41 5f 52 4f 54 28 78 2c  (x,k) SHA_ROT(x,
0670: 6b 2c 33 32 2d 28 6b 29 29 0a 23 64 65 66 69 6e  k,32-(k)).#defin
0680: 65 20 72 6f 72 28 78 2c 6b 29 20 53 48 41 5f 52  e ror(x,k) SHA_R
0690: 4f 54 28 78 2c 33 32 2d 28 6b 29 2c 6b 29 0a 23  OT(x,32-(k),k).#
06a0: 65 6e 64 69 66 0a 0a 0a 23 64 65 66 69 6e 65 20  endif...#define 
06b0: 62 6c 6b 30 6c 65 28 69 29 20 28 62 6c 6f 63 6b  blk0le(i) (block
06c0: 5b 69 5d 20 3d 20 28 72 6f 72 28 62 6c 6f 63 6b  [i] = (ror(block
06d0: 5b 69 5d 2c 38 29 26 30 78 46 46 30 30 46 46 30  [i],8)&0xFF00FF0
06e0: 30 29 20 5c 0a 20 20 20 20 7c 28 72 6f 6c 28 62  0) \.    |(rol(b
06f0: 6c 6f 63 6b 5b 69 5d 2c 38 29 26 30 78 30 30 46  lock[i],8)&0x00F
0700: 46 30 30 46 46 29 29 0a 23 64 65 66 69 6e 65 20  F00FF)).#define 
0710: 62 6c 6b 30 62 65 28 69 29 20 62 6c 6f 63 6b 5b  blk0be(i) block[
0720: 69 5d 0a 23 64 65 66 69 6e 65 20 62 6c 6b 28 69  i].#define blk(i
0730: 29 20 28 62 6c 6f 63 6b 5b 69 26 31 35 5d 20 3d  ) (block[i&15] =
0740: 20 72 6f 6c 28 62 6c 6f 63 6b 5b 28 69 2b 31 33   rol(block[(i+13
0750: 29 26 31 35 5d 5e 62 6c 6f 63 6b 5b 28 69 2b 38  )&15]^block[(i+8
0760: 29 26 31 35 5d 20 5c 0a 20 20 20 20 5e 62 6c 6f  )&15] \.    ^blo
0770: 63 6b 5b 28 69 2b 32 29 26 31 35 5d 5e 62 6c 6f  ck[(i+2)&15]^blo
0780: 63 6b 5b 69 26 31 35 5d 2c 31 29 29 0a 0a 2f 2a  ck[i&15],1))../*
0790: 0a 20 2a 20 28 52 30 2b 52 31 29 2c 20 52 32 2c  . * (R0+R1), R2,
07a0: 20 52 33 2c 20 52 34 20 61 72 65 20 74 68 65 20   R3, R4 are the 
07b0: 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74  different operat
07c0: 69 6f 6e 73 20 28 72 6f 75 6e 64 73 29 20 75 73  ions (rounds) us
07d0: 65 64 20 69 6e 20 53 48 41 31 0a 20 2a 0a 20 2a  ed in SHA1. *. *
07e0: 20 52 6c 30 28 29 20 66 6f 72 20 6c 69 74 74 6c   Rl0() for littl
07f0: 65 2d 65 6e 64 69 61 6e 20 61 6e 64 20 52 62 30  e-endian and Rb0
0800: 28 29 20 66 6f 72 20 62 69 67 2d 65 6e 64 69 61  () for big-endia
0810: 6e 2e 20 20 45 6e 64 69 61 6e 6e 65 73 73 20 69  n.  Endianness i
0820: 73 0a 20 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  s. * determined 
0830: 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 20 2a 2f  at run-time.. */
0840: 0a 23 64 65 66 69 6e 65 20 52 6c 30 28 76 2c 77  .#define Rl0(v,w
0850: 2c 78 2c 79 2c 7a 2c 69 29 20 5c 0a 20 20 20 20  ,x,y,z,i) \.    
0860: 7a 2b 3d 28 28 77 26 28 78 5e 79 29 29 5e 79 29  z+=((w&(x^y))^y)
0870: 2b 62 6c 6b 30 6c 65 28 69 29 2b 30 78 35 41 38  +blk0le(i)+0x5A8
0880: 32 37 39 39 39 2b 72 6f 6c 28 76 2c 35 29 3b 77  27999+rol(v,5);w
0890: 3d 72 6f 72 28 77 2c 32 29 3b 0a 23 64 65 66 69  =ror(w,2);.#defi
08a0: 6e 65 20 52 62 30 28 76 2c 77 2c 78 2c 79 2c 7a  ne Rb0(v,w,x,y,z
08b0: 2c 69 29 20 5c 0a 20 20 20 20 7a 2b 3d 28 28 77  ,i) \.    z+=((w
08c0: 26 28 78 5e 79 29 29 5e 79 29 2b 62 6c 6b 30 62  &(x^y))^y)+blk0b
08d0: 65 28 69 29 2b 30 78 35 41 38 32 37 39 39 39 2b  e(i)+0x5A827999+
08e0: 72 6f 6c 28 76 2c 35 29 3b 77 3d 72 6f 72 28 77  rol(v,5);w=ror(w
08f0: 2c 32 29 3b 0a 23 64 65 66 69 6e 65 20 52 31 28  ,2);.#define R1(
0900: 76 2c 77 2c 78 2c 79 2c 7a 2c 69 29 20 5c 0a 20  v,w,x,y,z,i) \. 
0910: 20 20 20 7a 2b 3d 28 28 77 26 28 78 5e 79 29 29     z+=((w&(x^y))
0920: 5e 79 29 2b 62 6c 6b 28 69 29 2b 30 78 35 41 38  ^y)+blk(i)+0x5A8
0930: 32 37 39 39 39 2b 72 6f 6c 28 76 2c 35 29 3b 77  27999+rol(v,5);w
0940: 3d 72 6f 72 28 77 2c 32 29 3b 0a 23 64 65 66 69  =ror(w,2);.#defi
0950: 6e 65 20 52 32 28 76 2c 77 2c 78 2c 79 2c 7a 2c  ne R2(v,w,x,y,z,
0960: 69 29 20 5c 0a 20 20 20 20 7a 2b 3d 28 77 5e 78  i) \.    z+=(w^x
0970: 5e 79 29 2b 62 6c 6b 28 69 29 2b 30 78 36 45 44  ^y)+blk(i)+0x6ED
0980: 39 45 42 41 31 2b 72 6f 6c 28 76 2c 35 29 3b 77  9EBA1+rol(v,5);w
0990: 3d 72 6f 72 28 77 2c 32 29 3b 0a 23 64 65 66 69  =ror(w,2);.#defi
09a0: 6e 65 20 52 33 28 76 2c 77 2c 78 2c 79 2c 7a 2c  ne R3(v,w,x,y,z,
09b0: 69 29 20 5c 0a 20 20 20 20 7a 2b 3d 28 28 28 77  i) \.    z+=(((w
09c0: 7c 78 29 26 79 29 7c 28 77 26 78 29 29 2b 62 6c  |x)&y)|(w&x))+bl
09d0: 6b 28 69 29 2b 30 78 38 46 31 42 42 43 44 43 2b  k(i)+0x8F1BBCDC+
09e0: 72 6f 6c 28 76 2c 35 29 3b 77 3d 72 6f 72 28 77  rol(v,5);w=ror(w
09f0: 2c 32 29 3b 0a 23 64 65 66 69 6e 65 20 52 34 28  ,2);.#define R4(
0a00: 76 2c 77 2c 78 2c 79 2c 7a 2c 69 29 20 5c 0a 20  v,w,x,y,z,i) \. 
0a10: 20 20 20 7a 2b 3d 28 77 5e 78 5e 79 29 2b 62 6c     z+=(w^x^y)+bl
0a20: 6b 28 69 29 2b 30 78 43 41 36 32 43 31 44 36 2b  k(i)+0xCA62C1D6+
0a30: 72 6f 6c 28 76 2c 35 29 3b 77 3d 72 6f 72 28 77  rol(v,5);w=ror(w
0a40: 2c 32 29 3b 0a 0a 2f 2a 0a 20 2a 20 48 61 73 68  ,2);../*. * Hash
0a50: 20 61 20 73 69 6e 67 6c 65 20 35 31 32 2d 62 69   a single 512-bi
0a60: 74 20 62 6c 6f 63 6b 2e 20 54 68 69 73 20 69 73  t block. This is
0a70: 20 74 68 65 20 63 6f 72 65 20 6f 66 20 74 68 65   the core of the
0a80: 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 2a 2f 0a   algorithm.. */.
0a90: 23 64 65 66 69 6e 65 20 61 20 71 71 5b 30 5d 0a  #define a qq[0].
0aa0: 23 64 65 66 69 6e 65 20 62 20 71 71 5b 31 5d 0a  #define b qq[1].
0ab0: 23 64 65 66 69 6e 65 20 63 20 71 71 5b 32 5d 0a  #define c qq[2].
0ac0: 23 64 65 66 69 6e 65 20 64 20 71 71 5b 33 5d 0a  #define d qq[3].
0ad0: 23 64 65 66 69 6e 65 20 65 20 71 71 5b 34 5d 0a  #define e qq[4].
0ae0: 0a 76 6f 69 64 20 53 48 41 31 54 72 61 6e 73 66  .void SHA1Transf
0af0: 6f 72 6d 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  orm(unsigned int
0b00: 20 73 74 61 74 65 5b 35 5d 2c 20 63 6f 6e 73 74   state[5], const
0b10: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62   unsigned char b
0b20: 75 66 66 65 72 5b 36 34 5d 29 7b 0a 20 20 75 6e  uffer[64]){.  un
0b30: 73 69 67 6e 65 64 20 69 6e 74 20 71 71 5b 35 5d  signed int qq[5]
0b40: 3b 20 2f 2a 20 61 2c 20 62 2c 20 63 2c 20 64 2c  ; /* a, b, c, d,
0b50: 20 65 3b 20 2a 2f 0a 20 20 73 74 61 74 69 63 20   e; */.  static 
0b60: 69 6e 74 20 6f 6e 65 20 3d 20 31 3b 0a 20 20 75  int one = 1;.  u
0b70: 6e 73 69 67 6e 65 64 20 69 6e 74 20 62 6c 6f 63  nsigned int bloc
0b80: 6b 5b 31 36 5d 3b 0a 20 20 6d 65 6d 63 70 79 28  k[16];.  memcpy(
0b90: 62 6c 6f 63 6b 2c 20 62 75 66 66 65 72 2c 20 36  block, buffer, 6
0ba0: 34 29 3b 0a 20 20 6d 65 6d 63 70 79 28 71 71 2c  4);.  memcpy(qq,
0bb0: 73 74 61 74 65 2c 35 2a 73 69 7a 65 6f 66 28 75  state,5*sizeof(u
0bc0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 29 3b 0a 0a  nsigned int));..
0bd0: 20 20 2f 2a 20 43 6f 70 79 20 70 2d 3e 73 74 61    /* Copy p->sta
0be0: 74 65 5b 5d 20 74 6f 20 77 6f 72 6b 69 6e 67 20  te[] to working 
0bf0: 76 61 72 73 20 2a 2f 0a 20 20 2f 2a 0a 20 20 61  vars */.  /*.  a
0c00: 20 3d 20 73 74 61 74 65 5b 30 5d 3b 0a 20 20 62   = state[0];.  b
0c10: 20 3d 20 73 74 61 74 65 5b 31 5d 3b 0a 20 20 63   = state[1];.  c
0c20: 20 3d 20 73 74 61 74 65 5b 32 5d 3b 0a 20 20 64   = state[2];.  d
0c30: 20 3d 20 73 74 61 74 65 5b 33 5d 3b 0a 20 20 65   = state[3];.  e
0c40: 20 3d 20 73 74 61 74 65 5b 34 5d 3b 0a 20 20 2a   = state[4];.  *
0c50: 2f 0a 0a 20 20 2f 2a 20 34 20 72 6f 75 6e 64 73  /..  /* 4 rounds
0c60: 20 6f 66 20 32 30 20 6f 70 65 72 61 74 69 6f 6e   of 20 operation
0c70: 73 20 65 61 63 68 2e 20 4c 6f 6f 70 20 75 6e 72  s each. Loop unr
0c80: 6f 6c 6c 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  olled. */.  if( 
0c90: 31 20 3d 3d 20 2a 28 75 6e 73 69 67 6e 65 64 20  1 == *(unsigned 
0ca0: 63 68 61 72 2a 29 26 6f 6e 65 20 29 7b 0a 20 20  char*)&one ){.  
0cb0: 20 20 52 6c 30 28 61 2c 62 2c 63 2c 64 2c 65 2c    Rl0(a,b,c,d,e,
0cc0: 20 30 29 3b 20 52 6c 30 28 65 2c 61 2c 62 2c 63   0); Rl0(e,a,b,c
0cd0: 2c 64 2c 20 31 29 3b 20 52 6c 30 28 64 2c 65 2c  ,d, 1); Rl0(d,e,
0ce0: 61 2c 62 2c 63 2c 20 32 29 3b 20 52 6c 30 28 63  a,b,c, 2); Rl0(c
0cf0: 2c 64 2c 65 2c 61 2c 62 2c 20 33 29 3b 0a 20 20  ,d,e,a,b, 3);.  
0d00: 20 20 52 6c 30 28 62 2c 63 2c 64 2c 65 2c 61 2c    Rl0(b,c,d,e,a,
0d10: 20 34 29 3b 20 52 6c 30 28 61 2c 62 2c 63 2c 64   4); Rl0(a,b,c,d
0d20: 2c 65 2c 20 35 29 3b 20 52 6c 30 28 65 2c 61 2c  ,e, 5); Rl0(e,a,
0d30: 62 2c 63 2c 64 2c 20 36 29 3b 20 52 6c 30 28 64  b,c,d, 6); Rl0(d
0d40: 2c 65 2c 61 2c 62 2c 63 2c 20 37 29 3b 0a 20 20  ,e,a,b,c, 7);.  
0d50: 20 20 52 6c 30 28 63 2c 64 2c 65 2c 61 2c 62 2c    Rl0(c,d,e,a,b,
0d60: 20 38 29 3b 20 52 6c 30 28 62 2c 63 2c 64 2c 65   8); Rl0(b,c,d,e
0d70: 2c 61 2c 20 39 29 3b 20 52 6c 30 28 61 2c 62 2c  ,a, 9); Rl0(a,b,
0d80: 63 2c 64 2c 65 2c 31 30 29 3b 20 52 6c 30 28 65  c,d,e,10); Rl0(e
0d90: 2c 61 2c 62 2c 63 2c 64 2c 31 31 29 3b 0a 20 20  ,a,b,c,d,11);.  
0da0: 20 20 52 6c 30 28 64 2c 65 2c 61 2c 62 2c 63 2c    Rl0(d,e,a,b,c,
0db0: 31 32 29 3b 20 52 6c 30 28 63 2c 64 2c 65 2c 61  12); Rl0(c,d,e,a
0dc0: 2c 62 2c 31 33 29 3b 20 52 6c 30 28 62 2c 63 2c  ,b,13); Rl0(b,c,
0dd0: 64 2c 65 2c 61 2c 31 34 29 3b 20 52 6c 30 28 61  d,e,a,14); Rl0(a
0de0: 2c 62 2c 63 2c 64 2c 65 2c 31 35 29 3b 0a 20 20  ,b,c,d,e,15);.  
0df0: 7d 65 6c 73 65 7b 0a 20 20 20 20 52 62 30 28 61  }else{.    Rb0(a
0e00: 2c 62 2c 63 2c 64 2c 65 2c 20 30 29 3b 20 52 62  ,b,c,d,e, 0); Rb
0e10: 30 28 65 2c 61 2c 62 2c 63 2c 64 2c 20 31 29 3b  0(e,a,b,c,d, 1);
0e20: 20 52 62 30 28 64 2c 65 2c 61 2c 62 2c 63 2c 20   Rb0(d,e,a,b,c, 
0e30: 32 29 3b 20 52 62 30 28 63 2c 64 2c 65 2c 61 2c  2); Rb0(c,d,e,a,
0e40: 62 2c 20 33 29 3b 0a 20 20 20 20 52 62 30 28 62  b, 3);.    Rb0(b
0e50: 2c 63 2c 64 2c 65 2c 61 2c 20 34 29 3b 20 52 62  ,c,d,e,a, 4); Rb
0e60: 30 28 61 2c 62 2c 63 2c 64 2c 65 2c 20 35 29 3b  0(a,b,c,d,e, 5);
0e70: 20 52 62 30 28 65 2c 61 2c 62 2c 63 2c 64 2c 20   Rb0(e,a,b,c,d, 
0e80: 36 29 3b 20 52 62 30 28 64 2c 65 2c 61 2c 62 2c  6); Rb0(d,e,a,b,
0e90: 63 2c 20 37 29 3b 0a 20 20 20 20 52 62 30 28 63  c, 7);.    Rb0(c
0ea0: 2c 64 2c 65 2c 61 2c 62 2c 20 38 29 3b 20 52 62  ,d,e,a,b, 8); Rb
0eb0: 30 28 62 2c 63 2c 64 2c 65 2c 61 2c 20 39 29 3b  0(b,c,d,e,a, 9);
0ec0: 20 52 62 30 28 61 2c 62 2c 63 2c 64 2c 65 2c 31   Rb0(a,b,c,d,e,1
0ed0: 30 29 3b 20 52 62 30 28 65 2c 61 2c 62 2c 63 2c  0); Rb0(e,a,b,c,
0ee0: 64 2c 31 31 29 3b 0a 20 20 20 20 52 62 30 28 64  d,11);.    Rb0(d
0ef0: 2c 65 2c 61 2c 62 2c 63 2c 31 32 29 3b 20 52 62  ,e,a,b,c,12); Rb
0f00: 30 28 63 2c 64 2c 65 2c 61 2c 62 2c 31 33 29 3b  0(c,d,e,a,b,13);
0f10: 20 52 62 30 28 62 2c 63 2c 64 2c 65 2c 61 2c 31   Rb0(b,c,d,e,a,1
0f20: 34 29 3b 20 52 62 30 28 61 2c 62 2c 63 2c 64 2c  4); Rb0(a,b,c,d,
0f30: 65 2c 31 35 29 3b 0a 20 20 7d 0a 20 20 52 31 28  e,15);.  }.  R1(
0f40: 65 2c 61 2c 62 2c 63 2c 64 2c 31 36 29 3b 20 52  e,a,b,c,d,16); R
0f50: 31 28 64 2c 65 2c 61 2c 62 2c 63 2c 31 37 29 3b  1(d,e,a,b,c,17);
0f60: 20 52 31 28 63 2c 64 2c 65 2c 61 2c 62 2c 31 38   R1(c,d,e,a,b,18
0f70: 29 3b 20 52 31 28 62 2c 63 2c 64 2c 65 2c 61 2c  ); R1(b,c,d,e,a,
0f80: 31 39 29 3b 0a 20 20 52 32 28 61 2c 62 2c 63 2c  19);.  R2(a,b,c,
0f90: 64 2c 65 2c 32 30 29 3b 20 52 32 28 65 2c 61 2c  d,e,20); R2(e,a,
0fa0: 62 2c 63 2c 64 2c 32 31 29 3b 20 52 32 28 64 2c  b,c,d,21); R2(d,
0fb0: 65 2c 61 2c 62 2c 63 2c 32 32 29 3b 20 52 32 28  e,a,b,c,22); R2(
0fc0: 63 2c 64 2c 65 2c 61 2c 62 2c 32 33 29 3b 0a 20  c,d,e,a,b,23);. 
0fd0: 20 52 32 28 62 2c 63 2c 64 2c 65 2c 61 2c 32 34   R2(b,c,d,e,a,24
0fe0: 29 3b 20 52 32 28 61 2c 62 2c 63 2c 64 2c 65 2c  ); R2(a,b,c,d,e,
0ff0: 32 35 29 3b 20 52 32 28 65 2c 61 2c 62 2c 63 2c  25); R2(e,a,b,c,
1000: 64 2c 32 36 29 3b 20 52 32 28 64 2c 65 2c 61 2c  d,26); R2(d,e,a,
1010: 62 2c 63 2c 32 37 29 3b 0a 20 20 52 32 28 63 2c  b,c,27);.  R2(c,
1020: 64 2c 65 2c 61 2c 62 2c 32 38 29 3b 20 52 32 28  d,e,a,b,28); R2(
1030: 62 2c 63 2c 64 2c 65 2c 61 2c 32 39 29 3b 20 52  b,c,d,e,a,29); R
1040: 32 28 61 2c 62 2c 63 2c 64 2c 65 2c 33 30 29 3b  2(a,b,c,d,e,30);
1050: 20 52 32 28 65 2c 61 2c 62 2c 63 2c 64 2c 33 31   R2(e,a,b,c,d,31
1060: 29 3b 0a 20 20 52 32 28 64 2c 65 2c 61 2c 62 2c  );.  R2(d,e,a,b,
1070: 63 2c 33 32 29 3b 20 52 32 28 63 2c 64 2c 65 2c  c,32); R2(c,d,e,
1080: 61 2c 62 2c 33 33 29 3b 20 52 32 28 62 2c 63 2c  a,b,33); R2(b,c,
1090: 64 2c 65 2c 61 2c 33 34 29 3b 20 52 32 28 61 2c  d,e,a,34); R2(a,
10a0: 62 2c 63 2c 64 2c 65 2c 33 35 29 3b 0a 20 20 52  b,c,d,e,35);.  R
10b0: 32 28 65 2c 61 2c 62 2c 63 2c 64 2c 33 36 29 3b  2(e,a,b,c,d,36);
10c0: 20 52 32 28 64 2c 65 2c 61 2c 62 2c 63 2c 33 37   R2(d,e,a,b,c,37
10d0: 29 3b 20 52 32 28 63 2c 64 2c 65 2c 61 2c 62 2c  ); R2(c,d,e,a,b,
10e0: 33 38 29 3b 20 52 32 28 62 2c 63 2c 64 2c 65 2c  38); R2(b,c,d,e,
10f0: 61 2c 33 39 29 3b 0a 20 20 52 33 28 61 2c 62 2c  a,39);.  R3(a,b,
1100: 63 2c 64 2c 65 2c 34 30 29 3b 20 52 33 28 65 2c  c,d,e,40); R3(e,
1110: 61 2c 62 2c 63 2c 64 2c 34 31 29 3b 20 52 33 28  a,b,c,d,41); R3(
1120: 64 2c 65 2c 61 2c 62 2c 63 2c 34 32 29 3b 20 52  d,e,a,b,c,42); R
1130: 33 28 63 2c 64 2c 65 2c 61 2c 62 2c 34 33 29 3b  3(c,d,e,a,b,43);
1140: 0a 20 20 52 33 28 62 2c 63 2c 64 2c 65 2c 61 2c  .  R3(b,c,d,e,a,
1150: 34 34 29 3b 20 52 33 28 61 2c 62 2c 63 2c 64 2c  44); R3(a,b,c,d,
1160: 65 2c 34 35 29 3b 20 52 33 28 65 2c 61 2c 62 2c  e,45); R3(e,a,b,
1170: 63 2c 64 2c 34 36 29 3b 20 52 33 28 64 2c 65 2c  c,d,46); R3(d,e,
1180: 61 2c 62 2c 63 2c 34 37 29 3b 0a 20 20 52 33 28  a,b,c,47);.  R3(
1190: 63 2c 64 2c 65 2c 61 2c 62 2c 34 38 29 3b 20 52  c,d,e,a,b,48); R
11a0: 33 28 62 2c 63 2c 64 2c 65 2c 61 2c 34 39 29 3b  3(b,c,d,e,a,49);
11b0: 20 52 33 28 61 2c 62 2c 63 2c 64 2c 65 2c 35 30   R3(a,b,c,d,e,50
11c0: 29 3b 20 52 33 28 65 2c 61 2c 62 2c 63 2c 64 2c  ); R3(e,a,b,c,d,
11d0: 35 31 29 3b 0a 20 20 52 33 28 64 2c 65 2c 61 2c  51);.  R3(d,e,a,
11e0: 62 2c 63 2c 35 32 29 3b 20 52 33 28 63 2c 64 2c  b,c,52); R3(c,d,
11f0: 65 2c 61 2c 62 2c 35 33 29 3b 20 52 33 28 62 2c  e,a,b,53); R3(b,
1200: 63 2c 64 2c 65 2c 61 2c 35 34 29 3b 20 52 33 28  c,d,e,a,54); R3(
1210: 61 2c 62 2c 63 2c 64 2c 65 2c 35 35 29 3b 0a 20  a,b,c,d,e,55);. 
1220: 20 52 33 28 65 2c 61 2c 62 2c 63 2c 64 2c 35 36   R3(e,a,b,c,d,56
1230: 29 3b 20 52 33 28 64 2c 65 2c 61 2c 62 2c 63 2c  ); R3(d,e,a,b,c,
1240: 35 37 29 3b 20 52 33 28 63 2c 64 2c 65 2c 61 2c  57); R3(c,d,e,a,
1250: 62 2c 35 38 29 3b 20 52 33 28 62 2c 63 2c 64 2c  b,58); R3(b,c,d,
1260: 65 2c 61 2c 35 39 29 3b 0a 20 20 52 34 28 61 2c  e,a,59);.  R4(a,
1270: 62 2c 63 2c 64 2c 65 2c 36 30 29 3b 20 52 34 28  b,c,d,e,60); R4(
1280: 65 2c 61 2c 62 2c 63 2c 64 2c 36 31 29 3b 20 52  e,a,b,c,d,61); R
1290: 34 28 64 2c 65 2c 61 2c 62 2c 63 2c 36 32 29 3b  4(d,e,a,b,c,62);
12a0: 20 52 34 28 63 2c 64 2c 65 2c 61 2c 62 2c 36 33   R4(c,d,e,a,b,63
12b0: 29 3b 0a 20 20 52 34 28 62 2c 63 2c 64 2c 65 2c  );.  R4(b,c,d,e,
12c0: 61 2c 36 34 29 3b 20 52 34 28 61 2c 62 2c 63 2c  a,64); R4(a,b,c,
12d0: 64 2c 65 2c 36 35 29 3b 20 52 34 28 65 2c 61 2c  d,e,65); R4(e,a,
12e0: 62 2c 63 2c 64 2c 36 36 29 3b 20 52 34 28 64 2c  b,c,d,66); R4(d,
12f0: 65 2c 61 2c 62 2c 63 2c 36 37 29 3b 0a 20 20 52  e,a,b,c,67);.  R
1300: 34 28 63 2c 64 2c 65 2c 61 2c 62 2c 36 38 29 3b  4(c,d,e,a,b,68);
1310: 20 52 34 28 62 2c 63 2c 64 2c 65 2c 61 2c 36 39   R4(b,c,d,e,a,69
1320: 29 3b 20 52 34 28 61 2c 62 2c 63 2c 64 2c 65 2c  ); R4(a,b,c,d,e,
1330: 37 30 29 3b 20 52 34 28 65 2c 61 2c 62 2c 63 2c  70); R4(e,a,b,c,
1340: 64 2c 37 31 29 3b 0a 20 20 52 34 28 64 2c 65 2c  d,71);.  R4(d,e,
1350: 61 2c 62 2c 63 2c 37 32 29 3b 20 52 34 28 63 2c  a,b,c,72); R4(c,
1360: 64 2c 65 2c 61 2c 62 2c 37 33 29 3b 20 52 34 28  d,e,a,b,73); R4(
1370: 62 2c 63 2c 64 2c 65 2c 61 2c 37 34 29 3b 20 52  b,c,d,e,a,74); R
1380: 34 28 61 2c 62 2c 63 2c 64 2c 65 2c 37 35 29 3b  4(a,b,c,d,e,75);
1390: 0a 20 20 52 34 28 65 2c 61 2c 62 2c 63 2c 64 2c  .  R4(e,a,b,c,d,
13a0: 37 36 29 3b 20 52 34 28 64 2c 65 2c 61 2c 62 2c  76); R4(d,e,a,b,
13b0: 63 2c 37 37 29 3b 20 52 34 28 63 2c 64 2c 65 2c  c,77); R4(c,d,e,
13c0: 61 2c 62 2c 37 38 29 3b 20 52 34 28 62 2c 63 2c  a,b,78); R4(b,c,
13d0: 64 2c 65 2c 61 2c 37 39 29 3b 0a 0a 20 20 2f 2a  d,e,a,79);..  /*
13e0: 20 41 64 64 20 74 68 65 20 77 6f 72 6b 69 6e 67   Add the working
13f0: 20 76 61 72 73 20 62 61 63 6b 20 69 6e 74 6f 20   vars back into 
1400: 63 6f 6e 74 65 78 74 2e 73 74 61 74 65 5b 5d 20  context.state[] 
1410: 2a 2f 0a 20 20 73 74 61 74 65 5b 30 5d 20 2b 3d  */.  state[0] +=
1420: 20 61 3b 0a 20 20 73 74 61 74 65 5b 31 5d 20 2b   a;.  state[1] +
1430: 3d 20 62 3b 0a 20 20 73 74 61 74 65 5b 32 5d 20  = b;.  state[2] 
1440: 2b 3d 20 63 3b 0a 20 20 73 74 61 74 65 5b 33 5d  += c;.  state[3]
1450: 20 2b 3d 20 64 3b 0a 20 20 73 74 61 74 65 5b 34   += d;.  state[4
1460: 5d 20 2b 3d 20 65 3b 0a 7d 0a 0a 0a 2f 2a 20 49  ] += e;.}.../* I
1470: 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 48 41 31  nitialize a SHA1
1480: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 73 74 61 74   context */.stat
1490: 69 63 20 76 6f 69 64 20 68 61 73 68 5f 69 6e 69  ic void hash_ini
14a0: 74 28 53 48 41 31 43 6f 6e 74 65 78 74 20 2a 70  t(SHA1Context *p
14b0: 29 7b 0a 20 20 2f 2a 20 53 48 41 31 20 69 6e 69  ){.  /* SHA1 ini
14c0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e 73  tialization cons
14d0: 74 61 6e 74 73 20 2a 2f 0a 20 20 70 2d 3e 73 74  tants */.  p->st
14e0: 61 74 65 5b 30 5d 20 3d 20 30 78 36 37 34 35 32  ate[0] = 0x67452
14f0: 33 30 31 3b 0a 20 20 70 2d 3e 73 74 61 74 65 5b  301;.  p->state[
1500: 31 5d 20 3d 20 30 78 45 46 43 44 41 42 38 39 3b  1] = 0xEFCDAB89;
1510: 0a 20 20 70 2d 3e 73 74 61 74 65 5b 32 5d 20 3d  .  p->state[2] =
1520: 20 30 78 39 38 42 41 44 43 46 45 3b 0a 20 20 70   0x98BADCFE;.  p
1530: 2d 3e 73 74 61 74 65 5b 33 5d 20 3d 20 30 78 31  ->state[3] = 0x1
1540: 30 33 32 35 34 37 36 3b 0a 20 20 70 2d 3e 73 74  0325476;.  p->st
1550: 61 74 65 5b 34 5d 20 3d 20 30 78 43 33 44 32 45  ate[4] = 0xC3D2E
1560: 31 46 30 3b 0a 20 20 70 2d 3e 63 6f 75 6e 74 5b  1F0;.  p->count[
1570: 30 5d 20 3d 20 70 2d 3e 63 6f 75 6e 74 5b 31 5d  0] = p->count[1]
1580: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20   = 0;.}../* Add 
1590: 6e 65 77 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74  new content to t
15a0: 68 65 20 53 48 41 31 20 68 61 73 68 20 2a 2f 0a  he SHA1 hash */.
15b0: 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 73 68  static void hash
15c0: 5f 73 74 65 70 28 0a 20 20 53 48 41 31 43 6f 6e  _step(.  SHA1Con
15d0: 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20 20 20  text *p,        
15e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
15f0: 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 69 73 20  content to this 
1600: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e  context */.  con
1610: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1620: 20 2a 64 61 74 61 2c 20 20 20 20 20 20 2f 2a 20   *data,      /* 
1630: 44 61 74 61 20 74 6f 20 62 65 20 61 64 64 65 64  Data to be added
1640: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
1650: 6e 74 20 6c 65 6e 20 20 20 20 20 20 20 20 20 20  nt len          
1660: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1670: 6f 66 20 62 79 74 65 73 20 69 6e 20 64 61 74 61  of bytes in data
1680: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
1690: 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 6a  d int i, j;..  j
16a0: 20 3d 20 70 2d 3e 63 6f 75 6e 74 5b 30 5d 3b 0a   = p->count[0];.
16b0: 20 20 69 66 28 20 28 70 2d 3e 63 6f 75 6e 74 5b    if( (p->count[
16c0: 30 5d 20 2b 3d 20 6c 65 6e 20 3c 3c 20 33 29 20  0] += len << 3) 
16d0: 3c 20 6a 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6f  < j ){.    p->co
16e0: 75 6e 74 5b 31 5d 20 2b 3d 20 28 6c 65 6e 3e 3e  unt[1] += (len>>
16f0: 32 39 29 2b 31 3b 0a 20 20 7d 0a 20 20 6a 20 3d  29)+1;.  }.  j =
1700: 20 28 6a 20 3e 3e 20 33 29 20 26 20 36 33 3b 0a   (j >> 3) & 63;.
1710: 20 20 69 66 28 20 28 6a 20 2b 20 6c 65 6e 29 20    if( (j + len) 
1720: 3e 20 36 33 20 29 7b 0a 20 20 20 20 28 76 6f 69  > 63 ){.    (voi
1730: 64 29 6d 65 6d 63 70 79 28 26 70 2d 3e 62 75 66  d)memcpy(&p->buf
1740: 66 65 72 5b 6a 5d 2c 20 64 61 74 61 2c 20 28 69  fer[j], data, (i
1750: 20 3d 20 36 34 2d 6a 29 29 3b 0a 20 20 20 20 53   = 64-j));.    S
1760: 48 41 31 54 72 61 6e 73 66 6f 72 6d 28 70 2d 3e  HA1Transform(p->
1770: 73 74 61 74 65 2c 20 70 2d 3e 62 75 66 66 65 72  state, p->buffer
1780: 29 3b 0a 20 20 20 20 66 6f 72 28 3b 20 69 20 2b  );.    for(; i +
1790: 20 36 33 20 3c 20 6c 65 6e 3b 20 69 20 2b 3d 20   63 < len; i += 
17a0: 36 34 29 7b 0a 20 20 20 20 20 20 53 48 41 31 54  64){.      SHA1T
17b0: 72 61 6e 73 66 6f 72 6d 28 70 2d 3e 73 74 61 74  ransform(p->stat
17c0: 65 2c 20 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20  e, &data[i]);.  
17d0: 20 20 7d 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20    }.    j = 0;. 
17e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
17f0: 30 3b 0a 20 20 7d 0a 20 20 28 76 6f 69 64 29 6d  0;.  }.  (void)m
1800: 65 6d 63 70 79 28 26 70 2d 3e 62 75 66 66 65 72  emcpy(&p->buffer
1810: 5b 6a 5d 2c 20 26 64 61 74 61 5b 69 5d 2c 20 6c  [j], &data[i], l
1820: 65 6e 20 2d 20 69 29 3b 0a 7d 0a 0a 2f 2a 20 43  en - i);.}../* C
1830: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
1840: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 73  using sqlite3_vs
1850: 6e 70 72 69 6e 74 66 28 29 20 61 6e 64 20 68 61  nprintf() and ha
1860: 73 68 20 69 74 20 2a 2f 0a 73 74 61 74 69 63 20  sh it */.static 
1870: 76 6f 69 64 20 68 61 73 68 5f 73 74 65 70 5f 76  void hash_step_v
1880: 66 6f 72 6d 61 74 28 0a 20 20 53 48 41 31 43 6f  format(.  SHA1Co
1890: 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20 20  ntext *p,       
18a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
18b0: 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 69 73   content to this
18c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f   context */.  co
18d0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
18e0: 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61  t,.  ....){.  va
18f0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20  _list ap;.  int 
1900: 6e 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  n;.  char zBuf[5
1910: 30 5d 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  0];.  va_start(a
1920: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 73  p, zFormat);.  s
1930: 71 6c 69 74 65 33 5f 76 73 6e 70 72 69 6e 74 66  qlite3_vsnprintf
1940: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42  (sizeof(zBuf),zB
1950: 75 66 2c 7a 46 6f 72 6d 61 74 2c 61 70 29 3b 0a  uf,zFormat,ap);.
1960: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
1970: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
1980: 7a 42 75 66 29 3b 0a 20 20 68 61 73 68 5f 73 74  zBuf);.  hash_st
1990: 65 70 28 70 2c 20 28 75 6e 73 69 67 6e 65 64 20  ep(p, (unsigned 
19a0: 63 68 61 72 2a 29 7a 42 75 66 2c 20 6e 29 3b 0a  char*)zBuf, n);.
19b0: 7d 0a 0a 0a 2f 2a 20 41 64 64 20 70 61 64 64 69  }.../* Add paddi
19c0: 6e 67 20 61 6e 64 20 63 6f 6d 70 75 74 65 20 74  ng and compute t
19d0: 68 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  he message diges
19e0: 74 2e 20 20 52 65 6e 64 65 72 20 74 68 65 0a 2a  t.  Render the.*
19f0: 2a 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  * message digest
1a00: 20 61 73 20 6c 6f 77 65 72 2d 63 61 73 65 20 68   as lower-case h
1a10: 65 78 61 64 65 63 69 6d 61 6c 20 61 6e 64 20 70  exadecimal and p
1a20: 75 74 20 69 74 20 69 6e 74 6f 0a 2a 2a 20 7a 4f  ut it into.** zO
1a30: 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 6d 75  ut[].  zOut[] mu
1a40: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34  st be at least 4
1a50: 31 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20 2a 2f  1 bytes long. */
1a60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 73  .static void has
1a70: 68 5f 66 69 6e 69 73 68 28 0a 20 20 53 48 41 31  h_finish(.  SHA1
1a80: 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20  Context *p,     
1a90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 48 41        /* The SHA
1aa0: 31 20 63 6f 6e 74 65 78 74 20 74 6f 20 66 69 6e  1 context to fin
1ab0: 69 73 68 20 61 6e 64 20 72 65 6e 64 65 72 20 2a  ish and render *
1ac0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20  /.  char *zOut  
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ae0: 20 53 74 6f 72 65 20 68 65 78 61 64 65 63 69 6d   Store hexadecim
1af0: 61 6c 20 68 61 73 68 20 68 65 72 65 20 2a 2f 0a  al hash here */.
1b00: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
1b10: 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
1b20: 63 68 61 72 20 66 69 6e 61 6c 63 6f 75 6e 74 5b  char finalcount[
1b30: 38 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  8];.  unsigned c
1b40: 68 61 72 20 64 69 67 65 73 74 5b 32 30 5d 3b 0a  har digest[20];.
1b50: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1b60: 68 61 72 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20  har zEncode[] = 
1b70: 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
1b80: 66 22 3b 0a 0a 20 20 66 6f 72 20 28 69 20 3d 20  f";..  for (i = 
1b90: 30 3b 20 69 20 3c 20 38 3b 20 69 2b 2b 29 7b 0a  0; i < 8; i++){.
1ba0: 20 20 20 20 66 69 6e 61 6c 63 6f 75 6e 74 5b 69      finalcount[i
1bb0: 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ] = (unsigned ch
1bc0: 61 72 29 28 28 70 2d 3e 63 6f 75 6e 74 5b 28 69  ar)((p->count[(i
1bd0: 20 3e 3d 20 34 20 3f 20 30 20 3a 20 31 29 5d 0a   >= 4 ? 0 : 1)].
1be0: 20 20 20 20 20 20 20 3e 3e 20 28 28 33 2d 28 69         >> ((3-(i
1bf0: 20 26 20 33 29 29 20 2a 20 38 29 20 29 20 26 20   & 3)) * 8) ) & 
1c00: 32 35 35 29 3b 20 2f 2a 20 45 6e 64 69 61 6e 20  255); /* Endian 
1c10: 69 6e 64 65 70 65 6e 64 65 6e 74 20 2a 2f 0a 20  independent */. 
1c20: 20 7d 0a 20 20 68 61 73 68 5f 73 74 65 70 28 70   }.  hash_step(p
1c30: 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
1c40: 64 20 63 68 61 72 20 2a 29 22 5c 32 30 30 22 2c  d char *)"\200",
1c50: 20 31 29 3b 0a 20 20 77 68 69 6c 65 20 28 28 70   1);.  while ((p
1c60: 2d 3e 63 6f 75 6e 74 5b 30 5d 20 26 20 35 30 34  ->count[0] & 504
1c70: 29 20 21 3d 20 34 34 38 29 7b 0a 20 20 20 20 68  ) != 448){.    h
1c80: 61 73 68 5f 73 74 65 70 28 70 2c 20 28 63 6f 6e  ash_step(p, (con
1c90: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1ca0: 20 2a 29 22 5c 30 22 2c 20 31 29 3b 0a 20 20 7d   *)"\0", 1);.  }
1cb0: 0a 20 20 68 61 73 68 5f 73 74 65 70 28 70 2c 20  .  hash_step(p, 
1cc0: 66 69 6e 61 6c 63 6f 75 6e 74 2c 20 38 29 3b 20  finalcount, 8); 
1cd0: 20 2f 2a 20 53 68 6f 75 6c 64 20 63 61 75 73 65   /* Should cause
1ce0: 20 61 20 53 48 41 31 54 72 61 6e 73 66 6f 72 6d   a SHA1Transform
1cf0: 28 29 20 2a 2f 0a 20 20 66 6f 72 20 28 69 20 3d  () */.  for (i =
1d00: 20 30 3b 20 69 20 3c 20 32 30 3b 20 69 2b 2b 29   0; i < 20; i++)
1d10: 7b 0a 20 20 20 20 64 69 67 65 73 74 5b 69 5d 20  {.    digest[i] 
1d20: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
1d30: 29 28 28 70 2d 3e 73 74 61 74 65 5b 69 3e 3e 32  )((p->state[i>>2
1d40: 5d 20 3e 3e 20 28 28 33 2d 28 69 20 26 20 33 29  ] >> ((3-(i & 3)
1d50: 29 20 2a 20 38 29 20 29 20 26 20 32 35 35 29 3b  ) * 8) ) & 255);
1d60: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1d70: 69 3c 32 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<20; i++){.    
1d80: 7a 4f 75 74 5b 69 2a 32 5d 20 3d 20 7a 45 6e 63  zOut[i*2] = zEnc
1d90: 6f 64 65 5b 28 64 69 67 65 73 74 5b 69 5d 3e 3e  ode[(digest[i]>>
1da0: 34 29 26 30 78 66 5d 3b 0a 20 20 20 20 7a 4f 75  4)&0xf];.    zOu
1db0: 74 5b 69 2a 32 2b 31 5d 20 3d 20 7a 45 6e 63 6f  t[i*2+1] = zEnco
1dc0: 64 65 5b 64 69 67 65 73 74 5b 69 5d 20 26 20 30  de[digest[i] & 0
1dd0: 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a 4f 75 74 5b  xf];.  }.  zOut[
1de0: 69 2a 32 5d 3d 20 30 3b 0a 7d 0a 2f 2a 20 45 6e  i*2]= 0;.}./* En
1df0: 64 20 6f 66 20 74 68 65 20 68 61 73 68 69 6e 67  d of the hashing
1e00: 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a   logic.*********
1e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e50: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  ****/../*.** Imp
1e60: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1e70: 68 65 20 73 68 61 31 28 58 29 20 66 75 6e 63 74  he sha1(X) funct
1e80: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ion..**.** Retur
1e90: 6e 20 61 20 6c 6f 77 65 72 2d 63 61 73 65 20 68  n a lower-case h
1ea0: 65 78 61 64 65 63 69 6d 61 6c 20 72 65 6e 64 65  exadecimal rende
1eb0: 72 69 6e 67 20 6f 66 20 74 68 65 20 53 48 41 31  ring of the SHA1
1ec0: 20 68 61 73 68 20 6f 66 20 74 68 65 0a 2a 2a 20   hash of the.** 
1ed0: 61 72 67 75 6d 65 6e 74 20 58 2e 20 20 49 66 20  argument X.  If 
1ee0: 58 20 69 73 20 61 20 42 4c 4f 42 2c 20 69 74 20  X is a BLOB, it 
1ef0: 69 73 20 68 61 73 68 65 64 20 61 73 20 69 73 2e  is hashed as is.
1f00: 20 20 46 6f 72 20 61 6c 6c 20 6f 74 68 65 72 0a    For all other.
1f10: 2a 2a 20 74 79 70 65 73 20 6f 66 20 69 6e 70 75  ** types of inpu
1f20: 74 2c 20 58 20 69 73 20 63 6f 6e 76 65 72 74 65  t, X is converte
1f30: 64 20 69 6e 74 6f 20 61 20 55 54 46 2d 38 20 73  d into a UTF-8 s
1f40: 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 73 74  tring and the st
1f50: 72 69 6e 67 0a 2a 2a 20 69 73 20 68 61 73 68 20  ring.** is hash 
1f60: 77 69 74 68 6f 75 74 20 74 68 65 20 74 72 61 69  without the trai
1f70: 6c 69 6e 67 20 30 78 30 30 20 74 65 72 6d 69 6e  ling 0x00 termin
1f80: 61 74 6f 72 2e 20 20 54 68 65 20 68 61 73 68 20  ator.  The hash 
1f90: 6f 66 20 61 20 4e 55 4c 4c 0a 2a 2a 20 76 61 6c  of a NULL.** val
1fa0: 75 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  ue is NULL..*/.s
1fb0: 74 61 74 69 63 20 76 6f 69 64 20 73 68 61 31 46  tatic void sha1F
1fc0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1fd0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1fe0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
1ff0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2000: 72 67 76 0a 29 7b 0a 20 20 53 48 41 31 43 6f 6e  rgv.){.  SHA1Con
2010: 74 65 78 74 20 63 78 3b 0a 20 20 69 6e 74 20 65  text cx;.  int e
2020: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  Type = sqlite3_v
2030: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
2040: 5d 29 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  ]);.  int nByte 
2050: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
2060: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
2070: 20 20 63 68 61 72 20 7a 4f 75 74 5b 34 34 5d 3b    char zOut[44];
2080: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53  ..  if( eType==S
2090: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74  QLITE_NULL ) ret
20a0: 75 72 6e 3b 0a 20 20 68 61 73 68 5f 69 6e 69 74  urn;.  hash_init
20b0: 28 26 63 78 29 3b 0a 20 20 69 66 28 20 65 54 79  (&cx);.  if( eTy
20c0: 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  pe==SQLITE_BLOB 
20d0: 29 7b 0a 20 20 20 20 68 61 73 68 5f 73 74 65 70  ){.    hash_step
20e0: 28 26 63 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  (&cx, sqlite3_va
20f0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
2100: 29 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  ), nByte);.  }el
2110: 73 65 7b 0a 20 20 20 20 68 61 73 68 5f 73 74 65  se{.    hash_ste
2120: 70 28 26 63 78 2c 20 73 71 6c 69 74 65 33 5f 76  p(&cx, sqlite3_v
2130: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
2140: 5d 29 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ]), nByte);.  }.
2150: 20 20 68 61 73 68 5f 66 69 6e 69 73 68 28 26 63    hash_finish(&c
2160: 78 2c 20 7a 4f 75 74 29 3b 0a 20 20 73 71 6c 69  x, zOut);.  sqli
2170: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
2180: 63 6f 6e 74 65 78 74 2c 20 7a 4f 75 74 2c 20 34  context, zOut, 4
2190: 30 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  0, SQLITE_TRANSI
21a0: 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ENT);.}../*.** I
21b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
21c0: 20 74 68 65 20 73 68 61 31 5f 71 75 65 72 79 28   the sha1_query(
21d0: 53 51 4c 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  SQL) function..*
21e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21f0: 6f 6e 20 63 6f 6d 70 69 6c 65 73 20 61 6e 64 20  on compiles and 
2200: 72 75 6e 73 20 74 68 65 20 53 51 4c 20 73 74 61  runs the SQL sta
2210: 74 65 6d 65 6e 74 28 73 29 20 67 69 76 65 6e 20  tement(s) given 
2220: 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  in the.** argume
2230: 6e 74 2e 20 54 68 65 20 72 65 73 75 6c 74 73 20  nt. The results 
2240: 61 72 65 20 68 61 73 68 65 64 20 75 73 69 6e 67  are hashed using
2250: 20 53 48 41 31 20 61 6e 64 20 74 68 61 74 20 68   SHA1 and that h
2260: 61 73 68 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ash is returned.
2270: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
2280: 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 69 73 20  nal SQL text is 
2290: 69 6e 63 6c 75 64 65 64 20 61 73 20 70 61 72 74  included as part
22a0: 20 6f 66 20 74 68 65 20 68 61 73 68 2e 0a 2a 2a   of the hash..**
22b0: 0a 2a 2a 20 54 68 65 20 68 61 73 68 20 69 73 20  .** The hash is 
22c0: 6e 6f 74 20 6a 75 73 74 20 61 20 63 6f 6e 63 61  not just a conca
22d0: 74 65 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  tenation of the 
22e0: 6f 75 74 70 75 74 73 2e 20 20 45 61 63 68 20 71  outputs.  Each q
22f0: 75 65 72 79 0a 2a 2a 20 69 73 20 64 65 6c 69 6d  uery.** is delim
2300: 69 74 65 64 20 61 6e 64 20 65 61 63 68 20 72 6f  ited and each ro
2310: 77 20 61 6e 64 20 76 61 6c 75 65 20 77 69 74 68  w and value with
2320: 69 6e 20 74 68 65 20 71 75 65 72 79 20 69 73 20  in the query is 
2330: 64 65 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 77 69  delimited,.** wi
2340: 74 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65  th all values be
2350: 69 6e 67 20 6d 61 72 6b 65 64 20 77 69 74 68 20  ing marked with 
2360: 74 68 65 69 72 20 64 61 74 61 74 79 70 65 73 2e  their datatypes.
2370: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2380: 73 68 61 31 51 75 65 72 79 46 75 6e 63 28 0a 20  sha1QueryFunc(. 
2390: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
23a0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
23b0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
23c0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
23d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
23e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
23f0: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
2400: 78 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  xt);.  const cha
2410: 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74  r *zSql = (const
2420: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
2430: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
2440: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ]);.  sqlite3_st
2450: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
2460: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2480: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
2490: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
24a0: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  set */.  int i; 
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
24d0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
24e0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  ;.  int n;.  con
24f0: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 53 48  st char *z;.  SH
2500: 41 31 43 6f 6e 74 65 78 74 20 63 78 3b 0a 20 20  A1Context cx;.  
2510: 63 68 61 72 20 7a 4f 75 74 5b 34 34 5d 3b 0a 0a  char zOut[44];..
2520: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
2530: 72 65 74 75 72 6e 3b 0a 20 20 68 61 73 68 5f 69  return;.  hash_i
2540: 6e 69 74 28 26 63 78 29 3b 0a 20 20 77 68 69 6c  nit(&cx);.  whil
2550: 65 28 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20 20  e( zSql[0] ){.  
2560: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
2570: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
2580: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
2590: 26 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  &zSql);.    if( 
25a0: 72 63 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  rc ){.      char
25b0: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
25c0: 5f 6d 70 72 69 6e 74 66 28 22 65 72 72 6f 72 20  _mprintf("error 
25d0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 5b 25  SQL statement [%
25e0: 73 5d 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  s]: %s",.       
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c              zSql
2610: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
2620: 28 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  (db));.      sql
2630: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2640: 74 6d 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tmt);.      sqli
2650: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
2660: 28 63 6f 6e 74 65 78 74 2c 20 7a 4d 73 67 2c 20  (context, zMsg, 
2670: 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
2680: 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20  e3_free(zMsg);. 
2690: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
26a0: 20 7d 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69   }.    if( !sqli
26b0: 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c  te3_stmt_readonl
26c0: 79 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  y(pStmt) ){.    
26d0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
26e0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
26f0: 6e 6f 6e 2d 71 75 65 72 79 3a 20 5b 25 73 5d 22  non-query: [%s]"
2700: 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  , sqlite3_sql(pS
2710: 74 6d 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  tmt));.      sql
2720: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2730: 74 6d 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tmt);.      sqli
2740: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
2750: 28 63 6f 6e 74 65 78 74 2c 20 7a 4d 73 67 2c 20  (context, zMsg, 
2760: 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
2770: 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20  e3_free(zMsg);. 
2780: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2790: 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71   }.    nCol = sq
27a0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
27b0: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a  nt(pStmt);.    z
27c0: 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   = sqlite3_sql(p
27d0: 53 74 6d 74 29 3b 0a 20 20 20 20 6e 20 3d 20 28  Stmt);.    n = (
27e0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20  int)strlen(z);. 
27f0: 20 20 20 68 61 73 68 5f 73 74 65 70 5f 76 66 6f     hash_step_vfo
2800: 72 6d 61 74 28 26 63 78 2c 22 53 25 64 3a 22 2c  rmat(&cx,"S%d:",
2810: 6e 29 3b 0a 20 20 20 20 68 61 73 68 5f 73 74 65  n);.    hash_ste
2820: 70 28 26 63 78 2c 28 75 6e 73 69 67 6e 65 64 20  p(&cx,(unsigned 
2830: 63 68 61 72 2a 29 7a 2c 6e 29 3b 0a 0a 20 20 20  char*)z,n);..   
2840: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 20 68 61   /* Compute a ha
2850: 73 68 20 6f 76 65 72 20 74 68 65 20 72 65 73 75  sh over the resu
2860: 6c 74 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  lt of the query 
2870: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51  */.    while( SQ
2880: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
2890: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
28a0: 0a 20 20 20 20 20 20 68 61 73 68 5f 73 74 65 70  .      hash_step
28b0: 28 26 63 78 2c 28 63 6f 6e 73 74 20 75 6e 73 69  (&cx,(const unsi
28c0: 67 6e 65 64 20 63 68 61 72 2a 29 22 52 22 2c 31  gned char*)"R",1
28d0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
28e0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
28f0: 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
2900: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2910: 79 70 65 28 70 53 74 6d 74 2c 69 29 20 29 7b 0a  ype(pStmt,i) ){.
2920: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
2930: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
2940: 20 20 20 20 20 20 20 20 20 20 68 61 73 68 5f 73            hash_s
2950: 74 65 70 28 26 63 78 2c 20 28 63 6f 6e 73 74 20  tep(&cx, (const 
2960: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 22  unsigned char*)"
2970: 4e 22 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 20  N",1);.         
2980: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2990: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
29b0: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  GER: {.         
29c0: 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
29d0: 34 20 75 3b 0a 20 20 20 20 20 20 20 20 20 20 20  4 u;.           
29e0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
29f0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2a00: 72 20 78 5b 39 5d 3b 0a 20 20 20 20 20 20 20 20  r x[9];.        
2a10: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
2a20: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  4 v = sqlite3_co
2a30: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
2a40: 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,i);.           
2a50: 20 6d 65 6d 63 70 79 28 26 75 2c 20 26 76 2c 20   memcpy(&u, &v, 
2a60: 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  8);.            
2a70: 66 6f 72 28 6a 3d 38 3b 20 6a 3e 3d 31 3b 20 6a  for(j=8; j>=1; j
2a80: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
2a90: 20 20 20 78 5b 6a 5d 20 3d 20 75 20 26 20 30 78     x[j] = u & 0x
2aa0: 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ff;.            
2ab0: 20 20 75 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 20    u >>= 8;.     
2ac0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ad0: 20 20 20 20 20 78 5b 30 5d 20 3d 20 27 49 27 3b       x[0] = 'I';
2ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 68 61 73  .            has
2af0: 68 5f 73 74 65 70 28 26 63 78 2c 20 78 2c 20 39  h_step(&cx, x, 9
2b00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
2b10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2b20: 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  }.          case
2b30: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
2b40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2b50: 69 74 65 33 5f 75 69 6e 74 36 34 20 75 3b 0a 20  ite3_uint64 u;. 
2b60: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
2b70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e  ;.            un
2b80: 73 69 67 6e 65 64 20 63 68 61 72 20 78 5b 38 5d  signed char x[8]
2b90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 6f  ;.            do
2ba0: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
2bb0: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
2bc0: 53 74 6d 74 2c 69 29 3b 0a 20 20 20 20 20 20 20  Stmt,i);.       
2bd0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 75 2c 20       memcpy(&u, 
2be0: 26 72 2c 20 38 29 3b 0a 20 20 20 20 20 20 20 20  &r, 8);.        
2bf0: 20 20 20 20 66 6f 72 28 6a 3d 38 3b 20 6a 3e 3d      for(j=8; j>=
2c00: 31 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 20  1; j--){.       
2c10: 20 20 20 20 20 20 20 78 5b 6a 5d 20 3d 20 75 20         x[j] = u 
2c20: 26 20 30 78 66 66 3b 0a 20 20 20 20 20 20 20 20  & 0xff;.        
2c30: 20 20 20 20 20 20 75 20 3e 3e 3d 20 38 3b 0a 20        u >>= 8;. 
2c40: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c50: 20 20 20 20 20 20 20 20 20 78 5b 30 5d 20 3d 20           x[0] = 
2c60: 27 46 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  'F';.           
2c70: 20 68 61 73 68 5f 73 74 65 70 28 26 63 78 2c 78   hash_step(&cx,x
2c80: 2c 39 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,9);.           
2c90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2ca0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
2cb0: 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20  se SQLITE_TEXT: 
2cc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2cd0: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  t n = sqlite3_co
2ce0: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
2cf0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
2d00: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
2d10: 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
2d20: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
2d30: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
2d40: 20 20 20 20 20 20 68 61 73 68 5f 73 74 65 70 5f        hash_step_
2d50: 76 66 6f 72 6d 61 74 28 26 63 78 2c 22 54 25 64  vformat(&cx,"T%d
2d60: 3a 22 2c 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  :",n);.         
2d70: 20 20 20 68 61 73 68 5f 73 74 65 70 28 26 63 78     hash_step(&cx
2d80: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  , z, n);.       
2d90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2db0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
2dc0: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  OB: {.          
2dd0: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
2de0: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
2df0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
2e00: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
2e10: 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 73  gned char *z = s
2e20: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
2e30: 6f 62 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  ob(pStmt, i);.  
2e40: 20 20 20 20 20 20 20 20 20 20 68 61 73 68 5f 73            hash_s
2e50: 74 65 70 5f 76 66 6f 72 6d 61 74 28 26 63 78 2c  tep_vformat(&cx,
2e60: 22 42 25 64 3a 22 2c 6e 29 3b 0a 20 20 20 20 20  "B%d:",n);.     
2e70: 20 20 20 20 20 20 20 68 61 73 68 5f 73 74 65 70         hash_step
2e80: 28 26 63 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  (&cx, z, n);.   
2e90: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2ea0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2eb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2ec0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2ed0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2ee0: 0a 20 20 7d 0a 20 20 68 61 73 68 5f 66 69 6e 69  .  }.  hash_fini
2ef0: 73 68 28 26 63 78 2c 20 7a 4f 75 74 29 3b 0a 20  sh(&cx, zOut);. 
2f00: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2f10: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 4f  text(context, zO
2f20: 75 74 2c 20 34 30 2c 20 53 51 4c 49 54 45 5f 54  ut, 40, SQLITE_T
2f30: 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 0a 23  RANSIENT);.}...#
2f40: 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64  ifdef _WIN32.__d
2f50: 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72  eclspec(dllexpor
2f60: 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73 71  t).#endif.int sq
2f70: 6c 69 74 65 33 5f 73 68 61 5f 69 6e 69 74 28 0a  lite3_sha_init(.
2f80: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
2f90: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
2fa0: 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  g, .  const sqli
2fb0: 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
2fc0: 20 2a 70 41 70 69 0a 29 7b 0a 20 20 69 6e 74 20   *pApi.){.  int 
2fd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2fe0: 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49    SQLITE_EXTENSI
2ff0: 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a  ON_INIT2(pApi);.
3000: 20 20 28 76 6f 69 64 29 70 7a 45 72 72 4d 73 67    (void)pzErrMsg
3010: 3b 20 20 2f 2a 20 55 6e 75 73 65 64 20 70 61 72  ;  /* Unused par
3020: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 72 63 20 3d  ameter */.  rc =
3030: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
3040: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73 68  function(db, "sh
3050: 61 31 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  a1", 1, SQLITE_U
3060: 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 20 20 20 20 20 20 20 73 68 61 31 46 75 6e 63 2c         sha1Func,
3090: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
30a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
30c0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
30d0: 64 62 2c 20 22 73 68 61 31 5f 71 75 65 72 79 22  db, "sha1_query"
30e0: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
30f0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3110: 20 20 20 20 20 20 73 68 61 31 51 75 65 72 79 46        sha1QueryF
3120: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
3130: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a       return rc;.}.