System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact e613b104f569d4d4a5adcd6c490309dc66856a8d:


0000: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
0010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 41 44 4f  *********. * ADO
0040: 2e 4e 45 54 20 32 2e 30 20 44 61 74 61 20 50 72  .NET 2.0 Data Pr
0050: 6f 76 69 64 65 72 20 66 6f 72 20 53 51 4c 69 74  ovider for SQLit
0060: 65 20 56 65 72 73 69 6f 6e 20 33 2e 58 0a 20 2a  e Version 3.X. *
0070: 20 57 72 69 74 74 65 6e 20 62 79 20 52 6f 62 65   Written by Robe
0080: 72 74 20 53 69 6d 70 73 6f 6e 20 28 72 6f 62 65  rt Simpson (robe
0090: 72 74 40 62 6c 61 63 6b 63 61 73 74 6c 65 73 6f  rt@blackcastleso
00a0: 66 74 2e 63 6f 6d 29 0a 20 2a 0a 20 2a 20 52 65  ft.com). *. * Re
00b0: 6c 65 61 73 65 64 20 74 6f 20 74 68 65 20 70 75  leased to the pu
00c0: 62 6c 69 63 20 64 6f 6d 61 69 6e 2c 20 75 73 65  blic domain, use
00d0: 20 61 74 20 79 6f 75 72 20 6f 77 6e 20 72 69 73   at your own ris
00e0: 6b 21 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  k!. ************
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23  ************/..#
0120: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0130: 49 54 5f 44 49 53 4b 49 4f 0a 23 69 66 64 65 66  IT_DISKIO.#ifdef
0140: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
0150: 43 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e  C..#include <win
0160: 64 6f 77 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  dows.h>.#include
0170: 20 3c 77 69 6e 63 72 79 70 74 2e 68 3e 0a 0a 2f   <wincrypt.h>../
0180: 2a 20 45 78 74 72 61 20 70 61 64 64 69 6e 67 20  * Extra padding 
0190: 62 65 66 6f 72 65 20 61 6e 64 20 61 66 74 65 72  before and after
01a0: 20 74 68 65 20 63 72 79 70 74 6f 67 72 61 70 68   the cryptograph
01b0: 69 63 20 62 75 66 66 65 72 20 2a 2f 0a 23 64 65  ic buffer */.#de
01c0: 66 69 6e 65 20 43 52 59 50 54 5f 4f 46 46 53 45  fine CRYPT_OFFSE
01d0: 54 20 38 0a 0a 74 79 70 65 64 65 66 20 73 74 72  T 8..typedef str
01e0: 75 63 74 20 5f 43 52 59 50 54 42 4c 4f 43 4b 0a  uct _CRYPTBLOCK.
01f0: 7b 0a 20 20 50 61 67 65 72 20 20 20 20 2a 70 50  {.  Pager    *pP
0200: 61 67 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 50  ager;       /* P
0210: 61 67 65 72 20 74 68 69 73 20 63 72 79 70 74 62  ager this cryptb
0220: 6c 6f 63 6b 20 62 65 6c 6f 6e 67 73 20 74 6f 20  lock belongs to 
0230: 2a 2f 0a 20 20 48 43 52 59 50 54 4b 45 59 20 68  */.  HCRYPTKEY h
0240: 52 65 61 64 4b 65 79 3b 20 20 20 20 20 2f 2a 20  ReadKey;     /* 
0250: 4b 65 79 20 75 73 65 64 20 74 6f 20 72 65 61 64  Key used to read
0260: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
0270: 73 65 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20  se and write to 
0280: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
0290: 20 48 43 52 59 50 54 4b 45 59 20 68 57 72 69 74   HCRYPTKEY hWrit
02a0: 65 4b 65 79 3b 20 20 20 20 2f 2a 20 4b 65 79 20  eKey;    /* Key 
02b0: 75 73 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  used to write to
02c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
02d0: 0a 20 20 44 57 4f 52 44 20 20 20 20 20 64 77 50  .  DWORD     dwP
02e0: 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 53 69  ageSize;   /* Si
02f0: 7a 65 20 6f 66 20 70 61 67 65 73 20 2a 2f 0a 20  ze of pages */. 
0300: 20 4c 50 56 4f 49 44 20 20 20 20 70 76 43 72 79   LPVOID    pvCry
0310: 70 74 3b 20 20 20 20 20 20 2f 2a 20 41 20 62 75  pt;      /* A bu
0320: 66 66 65 72 20 66 6f 72 20 65 6e 63 72 79 70 74  ffer for encrypt
0330: 69 6e 67 2f 64 65 63 72 79 70 74 69 6e 67 20 28  ing/decrypting (
0340: 69 66 20 6e 65 63 65 73 73 61 72 79 29 20 2a 2f  if necessary) */
0350: 0a 20 20 44 57 4f 52 44 20 20 20 20 20 64 77 43  .  DWORD     dwC
0360: 72 79 70 74 53 69 7a 65 3b 20 20 2f 2a 20 45 71  ryptSize;  /* Eq
0370: 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65  ual to or greate
0380: 72 20 74 68 61 6e 20 64 77 50 61 67 65 53 69 7a  r than dwPageSiz
0390: 65 2e 20 20 49 66 20 6c 61 72 67 65 72 2c 20 70  e.  If larger, p
03a0: 76 43 72 79 70 74 20 69 73 20 76 61 6c 69 64 20  vCrypt is valid 
03b0: 61 6e 64 20 74 68 69 73 20 69 73 20 69 74 73 20  and this is its 
03c0: 73 69 7a 65 20 2a 2f 0a 7d 20 43 52 59 50 54 42  size */.} CRYPTB
03d0: 4c 4f 43 4b 2c 20 2a 4c 50 43 52 59 50 54 42 4c  LOCK, *LPCRYPTBL
03e0: 4f 43 4b 3b 0a 0a 48 43 52 59 50 54 50 52 4f 56  OCK;..HCRYPTPROV
03f0: 20 67 5f 68 50 72 6f 76 69 64 65 72 20 3d 20 30   g_hProvider = 0
0400: 3b 20 2f 2a 20 47 6c 6f 62 61 6c 20 69 6e 73 74  ; /* Global inst
0410: 61 6e 63 65 20 6f 66 20 74 68 65 20 63 72 79 70  ance of the cryp
0420: 74 6f 67 72 61 70 68 69 63 20 70 72 6f 76 69 64  tographic provid
0430: 65 72 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 53  er */..#define S
0440: 51 4c 49 54 45 43 52 59 50 54 45 52 52 4f 52 5f  QLITECRYPTERROR_
0450: 50 52 4f 56 49 44 45 52 20 22 43 72 79 70 74 6f  PROVIDER "Crypto
0460: 67 72 61 70 68 69 63 20 70 72 6f 76 69 64 65 72  graphic provider
0470: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 0a   not available".
0480: 0a 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 72  ./* Needed for r
0490: 65 2d 6b 65 79 69 6e 67 20 2a 2f 0a 73 74 61 74  e-keying */.stat
04a0: 69 63 20 76 6f 69 64 20 2a 20 73 71 6c 69 74 65  ic void * sqlite
04b0: 33 70 61 67 65 72 5f 67 65 74 5f 63 6f 64 65 63  3pager_get_codec
04c0: 61 72 67 28 50 61 67 65 72 20 2a 70 50 61 67 65  arg(Pager *pPage
04d0: 72 29 0a 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  r).{.  return (p
04e0: 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 29 20 3f  Pager->xCodec) ?
04f0: 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 3a   pPager->pCodec:
0500: 20 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 20 43 72 65   NULL;.}../* Cre
0510: 61 74 65 20 61 20 63 72 79 70 74 6f 67 72 61 70  ate a cryptograp
0520: 68 69 63 20 63 6f 6e 74 65 78 74 2e 20 20 55 73  hic context.  Us
0530: 65 20 74 68 65 20 65 6e 68 61 6e 63 65 64 20 70  e the enhanced p
0540: 72 6f 76 69 64 65 72 20 62 65 63 61 75 73 65 20  rovider because 
0550: 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  it is available 
0560: 6f 6e 0a 2a 2a 20 6d 6f 73 74 20 70 6c 61 74 66  on.** most platf
0570: 6f 72 6d 73 0a 2a 2f 0a 73 74 61 74 69 63 20 42  orms.*/.static B
0580: 4f 4f 4c 20 49 6e 69 74 69 61 6c 69 7a 65 50 72  OOL InitializePr
0590: 6f 76 69 64 65 72 28 29 0a 7b 0a 20 20 4d 55 54  ovider().{.  MUT
05a0: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
05b0: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
05c0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
05d0: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
05e0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
05f0: 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
0600: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
0610: 74 65 72 29 3b 0a 0a 20 20 69 66 20 28 67 5f 68  ter);..  if (g_h
0620: 50 72 6f 76 69 64 65 72 29 0a 20 20 7b 0a 20 20  Provider).  {.  
0630: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
0640: 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
0650: 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
0660: 0a 20 20 7d 0a 0a 20 20 69 66 20 28 21 43 72 79  .  }..  if (!Cry
0670: 70 74 41 63 71 75 69 72 65 43 6f 6e 74 65 78 74  ptAcquireContext
0680: 28 26 67 5f 68 50 72 6f 76 69 64 65 72 2c 20 4e  (&g_hProvider, N
0690: 55 4c 4c 2c 20 4d 53 5f 45 4e 48 41 4e 43 45 44  ULL, MS_ENHANCED
06a0: 5f 50 52 4f 56 2c 20 50 52 4f 56 5f 52 53 41 5f  _PROV, PROV_RSA_
06b0: 46 55 4c 4c 2c 20 43 52 59 50 54 5f 56 45 52 49  FULL, CRYPT_VERI
06c0: 46 59 43 4f 4e 54 45 58 54 29 29 0a 20 20 7b 0a  FYCONTEXT)).  {.
06d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
06e0: 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
06f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c  ;.    return FAL
0700: 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
0710: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
0720: 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
0730: 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 20 43 72  n TRUE;.}../* Cr
0740: 65 61 74 65 20 6f 72 20 75 70 64 61 74 65 20 61  eate or update a
0750: 20 63 72 79 70 74 6f 67 72 61 70 68 69 63 20 63   cryptographic c
0760: 6f 6e 74 65 78 74 20 66 6f 72 20 61 20 70 61 67  ontext for a pag
0770: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  er..** This func
0780: 74 69 6f 6e 20 77 69 6c 6c 20 61 75 74 6f 6d 61  tion will automa
0790: 74 69 63 61 6c 6c 79 20 64 65 74 65 72 6d 69 6e  tically determin
07a0: 65 20 69 66 20 74 68 65 20 65 6e 63 72 79 70 74  e if the encrypt
07b0: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 72 65  ion algorithm re
07c0: 71 75 69 72 65 73 0a 2a 2a 20 65 78 74 72 61 20  quires.** extra 
07d0: 70 61 64 64 69 6e 67 2c 20 61 6e 64 20 69 66 20  padding, and if 
07e0: 69 74 20 64 6f 65 73 2c 20 77 69 6c 6c 20 63 72  it does, will cr
07f0: 65 61 74 65 20 61 20 74 65 6d 70 20 62 75 66 66  eate a temp buff
0800: 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  er big enough to
0810: 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 70 61 63   provide.** spac
0820: 65 20 74 6f 20 68 6f 6c 64 20 69 74 2e 0a 2a 2f  e to hold it..*/
0830: 0a 73 74 61 74 69 63 20 4c 50 43 52 59 50 54 42  .static LPCRYPTB
0840: 4c 4f 43 4b 20 43 72 65 61 74 65 43 72 79 70 74  LOCK CreateCrypt
0850: 42 6c 6f 63 6b 28 48 43 52 59 50 54 4b 45 59 20  Block(HCRYPTKEY 
0860: 68 4b 65 79 2c 20 50 61 67 65 72 20 2a 70 61 67  hKey, Pager *pag
0870: 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  er, int pageSize
0880: 2c 20 4c 50 43 52 59 50 54 42 4c 4f 43 4b 20 70  , LPCRYPTBLOCK p
0890: 45 78 69 73 74 69 6e 67 29 0a 7b 0a 20 20 4c 50  Existing).{.  LP
08a0: 43 52 59 50 54 42 4c 4f 43 4b 20 70 42 6c 6f 63  CRYPTBLOCK pBloc
08b0: 6b 3b 0a 0a 20 20 69 66 20 28 21 70 45 78 69 73  k;..  if (!pExis
08c0: 74 69 6e 67 29 20 2f 2a 20 43 72 65 61 74 69 6e  ting) /* Creatin
08d0: 67 20 61 20 6e 65 77 20 63 72 79 70 74 62 6c 6f  g a new cryptblo
08e0: 63 6b 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 70 42  ck */.  {.    pB
08f0: 6c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 6d  lock = sqlite3_m
0900: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 43 52 59  alloc(sizeof(CRY
0910: 50 54 42 4c 4f 43 4b 29 29 3b 0a 20 20 20 20 69  PTBLOCK));.    i
0920: 66 20 28 21 70 42 6c 6f 63 6b 29 20 72 65 74 75  f (!pBlock) retu
0930: 72 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 5a 65  rn NULL;..    Ze
0940: 72 6f 4d 65 6d 6f 72 79 28 70 42 6c 6f 63 6b 2c  roMemory(pBlock,
0950: 20 73 69 7a 65 6f 66 28 43 52 59 50 54 42 4c 4f   sizeof(CRYPTBLO
0960: 43 4b 29 29 3b 0a 20 20 20 20 70 42 6c 6f 63 6b  CK));.    pBlock
0970: 2d 3e 68 52 65 61 64 4b 65 79 20 3d 20 68 4b 65  ->hReadKey = hKe
0980: 79 3b 0a 20 20 20 20 70 42 6c 6f 63 6b 2d 3e 68  y;.    pBlock->h
0990: 57 72 69 74 65 4b 65 79 20 3d 20 68 4b 65 79 3b  WriteKey = hKey;
09a0: 0a 20 20 7d 0a 20 20 65 6c 73 65 20 2f 2a 20 55  .  }.  else /* U
09b0: 70 64 61 74 69 6e 67 20 61 6e 20 65 78 69 73 74  pdating an exist
09c0: 69 6e 67 20 63 72 79 70 74 62 6c 6f 63 6b 20 2a  ing cryptblock *
09d0: 2f 0a 20 20 7b 0a 20 20 20 20 70 42 6c 6f 63 6b  /.  {.    pBlock
09e0: 20 3d 20 70 45 78 69 73 74 69 6e 67 3b 0a 20 20   = pExisting;.  
09f0: 7d 0a 0a 20 20 69 66 20 28 70 61 67 65 53 69 7a  }..  if (pageSiz
0a00: 65 20 3d 3d 20 2d 31 29 0a 20 20 20 20 70 61 67  e == -1).    pag
0a10: 65 53 69 7a 65 20 3d 20 70 61 67 65 72 2d 3e 70  eSize = pager->p
0a20: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 70 42 6c 6f  ageSize;..  pBlo
0a30: 63 6b 2d 3e 70 50 61 67 65 72 20 3d 20 70 61 67  ck->pPager = pag
0a40: 65 72 3b 0a 20 20 70 42 6c 6f 63 6b 2d 3e 64 77  er;.  pBlock->dw
0a50: 50 61 67 65 53 69 7a 65 20 3d 20 28 44 57 4f 52  PageSize = (DWOR
0a60: 44 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 70 42  D)pageSize;.  pB
0a70: 6c 6f 63 6b 2d 3e 64 77 43 72 79 70 74 53 69 7a  lock->dwCryptSiz
0a80: 65 20 3d 20 70 42 6c 6f 63 6b 2d 3e 64 77 50 61  e = pBlock->dwPa
0a90: 67 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 45 78  geSize;..  /* Ex
0aa0: 69 73 74 69 6e 67 20 63 72 79 70 74 62 6c 6f 63  isting cryptbloc
0ab0: 6b 73 20 6d 61 79 20 68 61 76 65 20 61 20 62 75  ks may have a bu
0ac0: 66 66 65 72 2c 20 69 66 20 73 6f 2c 20 64 65 6c  ffer, if so, del
0ad0: 65 74 65 20 69 74 20 2a 2f 0a 20 20 69 66 20 28  ete it */.  if (
0ae0: 70 42 6c 6f 63 6b 2d 3e 70 76 43 72 79 70 74 29  pBlock->pvCrypt)
0af0: 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
0b00: 5f 66 72 65 65 28 70 42 6c 6f 63 6b 2d 3e 70 76  _free(pBlock->pv
0b10: 43 72 79 70 74 29 3b 0a 20 20 20 20 70 42 6c 6f  Crypt);.    pBlo
0b20: 63 6b 2d 3e 70 76 43 72 79 70 74 20 3d 20 4e 55  ck->pvCrypt = NU
0b30: 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  LL;.  }..  /* Fi
0b40: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 62 69 67  gure out how big
0b50: 20 74 6f 20 6d 61 6b 65 20 6f 75 72 20 73 70 61   to make our spa
0b60: 72 65 20 63 72 79 70 74 20 62 6c 6f 63 6b 20 2a  re crypt block *
0b70: 2f 0a 20 20 43 72 79 70 74 45 6e 63 72 79 70 74  /.  CryptEncrypt
0b80: 28 68 4b 65 79 2c 20 30 2c 20 54 52 55 45 2c 20  (hKey, 0, TRUE, 
0b90: 30 2c 20 4e 55 4c 4c 2c 20 26 70 42 6c 6f 63 6b  0, NULL, &pBlock
0ba0: 2d 3e 64 77 43 72 79 70 74 53 69 7a 65 2c 20 70  ->dwCryptSize, p
0bb0: 42 6c 6f 63 6b 2d 3e 64 77 43 72 79 70 74 53 69  Block->dwCryptSi
0bc0: 7a 65 20 2a 20 32 29 3b 0a 20 20 70 42 6c 6f 63  ze * 2);.  pBloc
0bd0: 6b 2d 3e 70 76 43 72 79 70 74 20 3d 20 73 71 6c  k->pvCrypt = sql
0be0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 42 6c 6f  ite3_malloc(pBlo
0bf0: 63 6b 2d 3e 64 77 43 72 79 70 74 53 69 7a 65 20  ck->dwCryptSize 
0c00: 2b 20 28 43 52 59 50 54 5f 4f 46 46 53 45 54 20  + (CRYPT_OFFSET 
0c10: 2a 20 32 29 29 3b 0a 20 20 69 66 20 28 21 70 42  * 2));.  if (!pB
0c20: 6c 6f 63 6b 2d 3e 70 76 43 72 79 70 74 29 0a 20  lock->pvCrypt). 
0c30: 20 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63 72 65   {.    /* We cre
0c40: 61 74 65 64 20 61 20 6e 65 77 20 62 6c 6f 63 6b  ated a new block
0c50: 20 69 6e 20 68 65 72 65 2c 20 73 6f 20 66 72 65   in here, so fre
0c60: 65 20 69 74 2e 20 20 4f 74 68 65 72 77 69 73 65  e it.  Otherwise
0c70: 20 6c 65 61 76 65 20 74 68 65 20 6f 72 69 67 69   leave the origi
0c80: 6e 61 6c 20 69 6e 74 61 63 74 20 2a 2f 0a 20 20  nal intact */.  
0c90: 20 20 69 66 20 28 70 42 6c 6f 63 6b 20 21 3d 20    if (pBlock != 
0ca0: 70 45 78 69 73 74 69 6e 67 29 0a 20 20 20 20 20  pExisting).     
0cb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
0cc0: 6c 6f 63 6b 29 3b 0a 0a 20 20 20 20 72 65 74 75  lock);..    retu
0cd0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20  rn NULL;.  }..  
0ce0: 72 65 74 75 72 6e 20 70 42 6c 6f 63 6b 3b 0a 7d  return pBlock;.}
0cf0: 0a 0a 2f 2a 20 44 65 73 74 72 6f 79 20 61 20 63  ../* Destroy a c
0d00: 72 79 70 74 6f 67 72 61 70 68 69 63 20 63 6f 6e  ryptographic con
0d10: 74 65 78 74 20 61 6e 64 20 61 6e 79 20 62 75 66  text and any buf
0d20: 66 65 72 73 20 61 6e 64 20 6b 65 79 73 20 61 6c  fers and keys al
0d30: 6c 6f 63 61 74 65 64 20 74 68 65 72 65 69 6e 20  located therein 
0d40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
0d50: 71 6c 69 74 65 33 43 6f 64 65 63 46 72 65 65 28  qlite3CodecFree(
0d60: 4c 50 56 4f 49 44 20 70 76 29 0a 7b 0a 20 20 4c  LPVOID pv).{.  L
0d70: 50 43 52 59 50 54 42 4c 4f 43 4b 20 70 42 6c 6f  PCRYPTBLOCK pBlo
0d80: 63 6b 20 3d 20 28 4c 50 43 52 59 50 54 42 4c 4f  ck = (LPCRYPTBLO
0d90: 43 4b 29 70 76 3b 0a 20 20 2f 2a 20 44 65 73 74  CK)pv;.  /* Dest
0da0: 72 6f 79 20 74 68 65 20 72 65 61 64 20 6b 65 79  roy the read key
0db0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
0dc0: 20 2a 2f 0a 20 20 69 66 20 28 70 42 6c 6f 63 6b   */.  if (pBlock
0dd0: 2d 3e 68 52 65 61 64 4b 65 79 29 0a 20 20 7b 0a  ->hReadKey).  {.
0de0: 20 20 20 20 43 72 79 70 74 44 65 73 74 72 6f 79      CryptDestroy
0df0: 4b 65 79 28 70 42 6c 6f 63 6b 2d 3e 68 52 65 61  Key(pBlock->hRea
0e00: 64 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  dKey);.  }..  /*
0e10: 20 49 66 20 74 68 65 72 65 27 73 20 61 20 77 72   If there's a wr
0e20: 69 74 65 6b 65 79 20 61 6e 64 20 69 74 73 20 6e  itekey and its n
0e30: 6f 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ot equal to the 
0e40: 72 65 61 64 6b 65 79 2c 20 64 65 73 74 72 6f 79  readkey, destroy
0e50: 20 69 74 20 2a 2f 0a 20 20 69 66 20 28 70 42 6c   it */.  if (pBl
0e60: 6f 63 6b 2d 3e 68 57 72 69 74 65 4b 65 79 20 26  ock->hWriteKey &
0e70: 26 20 70 42 6c 6f 63 6b 2d 3e 68 57 72 69 74 65  & pBlock->hWrite
0e80: 4b 65 79 20 21 3d 20 70 42 6c 6f 63 6b 2d 3e 68  Key != pBlock->h
0e90: 52 65 61 64 4b 65 79 29 0a 20 20 7b 0a 20 20 20  ReadKey).  {.   
0ea0: 20 43 72 79 70 74 44 65 73 74 72 6f 79 4b 65 79   CryptDestroyKey
0eb0: 28 70 42 6c 6f 63 6b 2d 3e 68 57 72 69 74 65 4b  (pBlock->hWriteK
0ec0: 65 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ey);.  }..  /* I
0ed0: 66 20 74 68 65 72 65 27 73 20 65 78 74 72 61 20  f there's extra 
0ee0: 62 75 66 66 65 72 20 73 70 61 63 65 20 61 6c 6c  buffer space all
0ef0: 6f 63 61 74 65 64 2c 20 66 72 65 65 20 69 74 20  ocated, free it 
0f00: 61 73 20 77 65 6c 6c 20 2a 2f 0a 20 20 69 66 20  as well */.  if 
0f10: 28 70 42 6c 6f 63 6b 2d 3e 70 76 43 72 79 70 74  (pBlock->pvCrypt
0f20: 29 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  ).  {.    sqlite
0f30: 33 5f 66 72 65 65 28 70 42 6c 6f 63 6b 2d 3e 70  3_free(pBlock->p
0f40: 76 43 72 79 70 74 29 3b 0a 20 20 7d 0a 0a 20 20  vCrypt);.  }..  
0f50: 2f 2a 20 41 6c 6c 20 64 6f 6e 65 20 77 69 74 68  /* All done with
0f60: 20 74 68 69 73 20 63 72 79 70 74 62 6c 6f 63 6b   this cryptblock
0f70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
0f80: 65 65 28 70 42 6c 6f 63 6b 29 3b 0a 7d 0a 0a 76  ee(pBlock);.}..v
0f90: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 63  oid sqlite3Codec
0fa0: 53 69 7a 65 43 68 61 6e 67 65 28 76 6f 69 64 20  SizeChange(void 
0fb0: 2a 70 41 72 67 2c 20 69 6e 74 20 70 61 67 65 53  *pArg, int pageS
0fc0: 69 7a 65 2c 20 69 6e 74 20 72 65 73 65 72 76 65  ize, int reserve
0fd0: 64 53 69 7a 65 29 0a 7b 0a 20 20 4c 50 43 52 59  dSize).{.  LPCRY
0fe0: 50 54 42 4c 4f 43 4b 20 70 42 6c 6f 63 6b 20 3d  PTBLOCK pBlock =
0ff0: 20 28 4c 50 43 52 59 50 54 42 4c 4f 43 4b 29 70   (LPCRYPTBLOCK)p
1000: 41 72 67 3b 0a 0a 20 20 69 66 20 28 70 42 6c 6f  Arg;..  if (pBlo
1010: 63 6b 2d 3e 64 77 50 61 67 65 53 69 7a 65 20 21  ck->dwPageSize !
1020: 3d 20 70 61 67 65 53 69 7a 65 29 0a 20 20 7b 0a  = pageSize).  {.
1030: 20 20 20 20 43 72 65 61 74 65 43 72 79 70 74 42      CreateCryptB
1040: 6c 6f 63 6b 28 70 42 6c 6f 63 6b 2d 3e 68 52 65  lock(pBlock->hRe
1050: 61 64 4b 65 79 2c 20 70 42 6c 6f 63 6b 2d 3e 70  adKey, pBlock->p
1060: 50 61 67 65 72 2c 20 70 61 67 65 53 69 7a 65 2c  Pager, pageSize,
1070: 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 2f 2a   pBlock);.    /*
1080: 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20   If this fails, 
1090: 70 76 43 72 79 70 74 20 77 69 6c 6c 20 62 65 20  pvCrypt will be 
10a0: 4e 55 4c 4c 2c 20 61 6e 64 20 74 68 65 20 6e 65  NULL, and the ne
10b0: 78 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 43  xt time sqlite3C
10c0: 6f 64 65 63 28 29 20 69 73 20 63 61 6c 6c 65 64  odec() is called
10d0: 2c 20 69 74 20 77 69 6c 6c 20 72 65 73 75 6c 74  , it will result
10e0: 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   in an error */.
10f0: 20 20 7d 0a 7d 0a 0a 2f 2a 20 45 6e 63 72 79 70    }.}../* Encryp
1100: 74 2f 44 65 63 72 79 70 74 20 66 75 6e 63 74 69  t/Decrypt functi
1110: 6f 6e 61 6c 69 74 79 2c 20 63 61 6c 6c 65 64 20  onality, called 
1120: 62 79 20 70 61 67 65 72 2e 63 20 2a 2f 0a 73 74  by pager.c */.st
1130: 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c 69 74  atic void *sqlit
1140: 65 33 43 6f 64 65 63 28 76 6f 69 64 20 2a 70 41  e3Codec(void *pA
1150: 72 67 2c 20 76 6f 69 64 20 2a 64 61 74 61 2c 20  rg, void *data, 
1160: 50 67 6e 6f 20 6e 50 61 67 65 4e 75 6d 2c 20 69  Pgno nPageNum, i
1170: 6e 74 20 6e 4d 6f 64 65 29 0a 7b 0a 20 20 4c 50  nt nMode).{.  LP
1180: 43 52 59 50 54 42 4c 4f 43 4b 20 70 42 6c 6f 63  CRYPTBLOCK pBloc
1190: 6b 20 3d 20 28 4c 50 43 52 59 50 54 42 4c 4f 43  k = (LPCRYPTBLOC
11a0: 4b 29 70 41 72 67 3b 0a 20 20 44 57 4f 52 44 20  K)pArg;.  DWORD 
11b0: 64 77 50 61 67 65 53 69 7a 65 3b 0a 20 20 4c 50  dwPageSize;.  LP
11c0: 56 4f 49 44 20 70 76 54 65 6d 70 20 3d 20 4e 55  VOID pvTemp = NU
11d0: 4c 4c 3b 0a 0a 20 20 69 66 20 28 21 70 42 6c 6f  LL;..  if (!pBlo
11e0: 63 6b 29 20 72 65 74 75 72 6e 20 64 61 74 61 3b  ck) return data;
11f0: 0a 20 20 69 66 20 28 70 42 6c 6f 63 6b 2d 3e 70  .  if (pBlock->p
1200: 76 43 72 79 70 74 20 3d 3d 20 4e 55 4c 4c 29 20  vCrypt == NULL) 
1210: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 20 2f 2a 20  return NULL; /* 
1220: 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
1230: 73 20 69 66 20 43 72 65 61 74 65 43 72 79 70 74  s if CreateCrypt
1240: 42 6c 6f 63 6b 28 29 20 66 61 69 6c 65 64 20 74  Block() failed t
1250: 6f 20 6d 61 6b 65 20 73 63 72 61 74 63 68 20 73  o make scratch s
1260: 70 61 63 65 20 2a 2f 0a 0a 20 20 73 77 69 74 63  pace */..  switc
1270: 68 28 6e 4d 6f 64 65 29 0a 20 20 7b 0a 20 20 63  h(nMode).  {.  c
1280: 61 73 65 20 30 3a 20 2f 2a 20 55 6e 64 6f 20 61  ase 0: /* Undo a
1290: 20 22 63 61 73 65 20 37 22 20 6a 6f 75 72 6e 61   "case 7" journa
12a0: 6c 20 66 69 6c 65 20 65 6e 63 72 79 70 74 69 6f  l file encryptio
12b0: 6e 20 2a 2f 0a 20 20 63 61 73 65 20 32 3a 20 2f  n */.  case 2: /
12c0: 2a 20 52 65 6c 6f 61 64 20 61 20 70 61 67 65 20  * Reload a page 
12d0: 2a 2f 0a 20 20 63 61 73 65 20 33 3a 20 2f 2a 20  */.  case 3: /* 
12e0: 4c 6f 61 64 20 61 20 70 61 67 65 20 2a 2f 0a 20  Load a page */. 
12f0: 20 20 20 69 66 20 28 21 70 42 6c 6f 63 6b 2d 3e     if (!pBlock->
1300: 68 52 65 61 64 4b 65 79 29 20 62 72 65 61 6b 3b  hReadKey) break;
1310: 0a 0a 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 63  ..    /* Block c
1320: 69 70 68 65 72 73 20 6f 66 74 65 6e 20 6e 65 65  iphers often nee
1330: 64 20 74 6f 20 77 72 69 74 65 20 65 78 74 72 61  d to write extra
1340: 20 70 61 64 64 69 6e 67 20 62 65 79 6f 6e 64 20   padding beyond 
1350: 74 68 65 0a 20 20 20 20 64 61 74 61 20 62 6c 6f  the.    data blo
1360: 63 6b 2e 20 20 57 65 20 64 6f 6e 27 74 20 68 61  ck.  We don't ha
1370: 76 65 20 74 68 61 74 20 6c 75 78 75 72 79 20 66  ve that luxury f
1380: 6f 72 20 61 20 67 69 76 65 6e 20 70 61 67 65 20  or a given page 
1390: 6f 66 20 64 61 74 61 20 73 6f 0a 20 20 20 20 77  of data so.    w
13a0: 65 20 6d 75 73 74 20 63 6f 70 79 20 74 68 65 20  e must copy the 
13b0: 70 61 67 65 20 64 61 74 61 20 74 6f 20 61 20 62  page data to a b
13c0: 75 66 66 65 72 20 74 68 61 74 20 49 53 20 6c 61  uffer that IS la
13d0: 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
13e0: 6c 64 0a 20 20 20 20 74 68 65 20 70 61 64 64 69  ld.    the paddi
13f0: 6e 67 2e 20 20 57 65 20 74 68 65 6e 20 65 6e 63  ng.  We then enc
1400: 72 79 70 74 20 74 68 65 20 62 6c 6f 63 6b 20 61  rypt the block a
1410: 6e 64 20 77 72 69 74 65 20 74 68 65 20 62 75 66  nd write the buf
1420: 66 65 72 20 62 61 63 6b 20 74 6f 0a 20 20 20 20  fer back to.    
1430: 74 68 65 20 70 61 67 65 20 77 69 74 68 6f 75 74  the page without
1440: 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79   the unnecessary
1450: 20 70 61 64 64 69 6e 67 2e 0a 20 20 20 20 57 65   padding..    We
1460: 20 6f 6e 6c 79 20 75 73 65 20 74 68 65 20 73 70   only use the sp
1470: 65 63 69 61 6c 20 62 6c 6f 63 6b 20 6f 66 20 6d  ecial block of m
1480: 65 6d 6f 72 79 20 69 66 20 69 74 73 20 61 62 73  emory if its abs
1490: 6f 6c 75 74 65 6c 79 20 6e 65 63 65 73 73 61 72  olutely necessar
14a0: 79 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 42  y. */.    if (pB
14b0: 6c 6f 63 6b 2d 3e 64 77 43 72 79 70 74 53 69 7a  lock->dwCryptSiz
14c0: 65 20 21 3d 20 70 42 6c 6f 63 6b 2d 3e 64 77 50  e != pBlock->dwP
14d0: 61 67 65 53 69 7a 65 29 0a 20 20 20 20 7b 0a 20  ageSize).    {. 
14e0: 20 20 20 20 20 43 6f 70 79 4d 65 6d 6f 72 79 28       CopyMemory(
14f0: 28 28 4c 50 42 59 54 45 29 70 42 6c 6f 63 6b 2d  ((LPBYTE)pBlock-
1500: 3e 70 76 43 72 79 70 74 29 20 2b 20 43 52 59 50  >pvCrypt) + CRYP
1510: 54 5f 4f 46 46 53 45 54 2c 20 64 61 74 61 2c 20  T_OFFSET, data, 
1520: 70 42 6c 6f 63 6b 2d 3e 64 77 50 61 67 65 53 69  pBlock->dwPageSi
1530: 7a 65 29 3b 0a 20 20 20 20 20 20 70 76 54 65 6d  ze);.      pvTem
1540: 70 20 3d 20 64 61 74 61 3b 0a 20 20 20 20 20 20  p = data;.      
1550: 64 61 74 61 20 3d 20 28 28 4c 50 42 59 54 45 29  data = ((LPBYTE)
1560: 70 42 6c 6f 63 6b 2d 3e 70 76 43 72 79 70 74 29  pBlock->pvCrypt)
1570: 20 2b 20 43 52 59 50 54 5f 4f 46 46 53 45 54 3b   + CRYPT_OFFSET;
1580: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 77 50 61  .    }..    dwPa
1590: 67 65 53 69 7a 65 20 3d 20 70 42 6c 6f 63 6b 2d  geSize = pBlock-
15a0: 3e 64 77 43 72 79 70 74 53 69 7a 65 3b 0a 20 20  >dwCryptSize;.  
15b0: 20 20 43 72 79 70 74 44 65 63 72 79 70 74 28 70    CryptDecrypt(p
15c0: 42 6c 6f 63 6b 2d 3e 68 52 65 61 64 4b 65 79 2c  Block->hReadKey,
15d0: 20 30 2c 20 54 52 55 45 2c 20 30 2c 20 28 4c 50   0, TRUE, 0, (LP
15e0: 42 59 54 45 29 64 61 74 61 2c 20 26 64 77 50 61  BYTE)data, &dwPa
15f0: 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 2f 2a  geSize);..    /*
1600: 20 49 66 20 74 68 65 20 65 6e 63 72 79 70 74 69   If the encrypti
1610: 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 72 65 71  on algorithm req
1620: 75 69 72 65 64 20 65 78 74 72 61 20 70 61 64 64  uired extra padd
1630: 69 6e 67 20 61 6e 64 20 77 65 20 77 65 72 65 20  ing and we were 
1640: 66 6f 72 63 65 64 20 74 6f 20 65 6e 63 72 79 70  forced to encryp
1650: 74 20 6f 72 0a 20 20 20 20 2a 2a 20 64 65 63 72  t or.    ** decr
1660: 79 70 74 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ypt a copy of th
1670: 65 20 70 61 67 65 20 64 61 74 61 20 74 6f 20 61  e page data to a
1680: 20 74 65 6d 70 20 62 75 66 66 65 72 2c 20 74 68   temp buffer, th
1690: 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e  en write the con
16a0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 74 65 6d  tents of the tem
16b0: 70 0a 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20  p.    ** buffer 
16c0: 62 61 63 6b 20 74 6f 20 74 68 65 20 70 61 67 65  back to the page
16d0: 20 64 61 74 61 20 6d 69 6e 75 73 20 61 6e 79 20   data minus any 
16e0: 70 61 64 64 69 6e 67 20 61 70 70 6c 69 65 64 2e  padding applied.
16f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28  .    */.    if (
1700: 70 42 6c 6f 63 6b 2d 3e 64 77 43 72 79 70 74 53  pBlock->dwCryptS
1710: 69 7a 65 20 21 3d 20 70 42 6c 6f 63 6b 2d 3e 64  ize != pBlock->d
1720: 77 50 61 67 65 53 69 7a 65 29 0a 20 20 20 20 7b  wPageSize).    {
1730: 0a 20 20 20 20 20 20 43 6f 70 79 4d 65 6d 6f 72  .      CopyMemor
1740: 79 28 70 76 54 65 6d 70 2c 20 64 61 74 61 2c 20  y(pvTemp, data, 
1750: 70 42 6c 6f 63 6b 2d 3e 64 77 50 61 67 65 53 69  pBlock->dwPageSi
1760: 7a 65 29 3b 0a 20 20 20 20 20 20 64 61 74 61 20  ze);.      data 
1770: 3d 20 70 76 54 65 6d 70 3b 0a 20 20 20 20 7d 0a  = pvTemp;.    }.
1780: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 63 61 73      break;.  cas
1790: 65 20 36 3a 20 2f 2a 20 45 6e 63 72 79 70 74 20  e 6: /* Encrypt 
17a0: 61 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 6d  a page for the m
17b0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
17c0: 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 70 42  e */.    if (!pB
17d0: 6c 6f 63 6b 2d 3e 68 57 72 69 74 65 4b 65 79 29  lock->hWriteKey)
17e0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 43 6f 70   break;..    Cop
17f0: 79 4d 65 6d 6f 72 79 28 28 28 4c 50 42 59 54 45  yMemory(((LPBYTE
1800: 29 70 42 6c 6f 63 6b 2d 3e 70 76 43 72 79 70 74  )pBlock->pvCrypt
1810: 29 20 2b 20 43 52 59 50 54 5f 4f 46 46 53 45 54  ) + CRYPT_OFFSET
1820: 2c 20 64 61 74 61 2c 20 70 42 6c 6f 63 6b 2d 3e  , data, pBlock->
1830: 64 77 50 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  dwPageSize);.   
1840: 20 64 61 74 61 20 3d 20 28 28 4c 50 42 59 54 45   data = ((LPBYTE
1850: 29 70 42 6c 6f 63 6b 2d 3e 70 76 43 72 79 70 74  )pBlock->pvCrypt
1860: 29 20 2b 20 43 52 59 50 54 5f 4f 46 46 53 45 54  ) + CRYPT_OFFSET
1870: 3b 0a 0a 20 20 20 20 64 77 50 61 67 65 53 69 7a  ;..    dwPageSiz
1880: 65 20 3d 20 70 42 6c 6f 63 6b 2d 3e 64 77 50 61  e = pBlock->dwPa
1890: 67 65 53 69 7a 65 3b 0a 20 20 20 20 43 72 79 70  geSize;.    Cryp
18a0: 74 45 6e 63 72 79 70 74 28 70 42 6c 6f 63 6b 2d  tEncrypt(pBlock-
18b0: 3e 68 57 72 69 74 65 4b 65 79 2c 20 30 2c 20 54  >hWriteKey, 0, T
18c0: 52 55 45 2c 20 30 2c 20 28 28 4c 50 42 59 54 45  RUE, 0, ((LPBYTE
18d0: 29 70 42 6c 6f 63 6b 2d 3e 70 76 43 72 79 70 74  )pBlock->pvCrypt
18e0: 29 20 2b 20 43 52 59 50 54 5f 4f 46 46 53 45 54  ) + CRYPT_OFFSET
18f0: 2c 20 26 64 77 50 61 67 65 53 69 7a 65 2c 20 70  , &dwPageSize, p
1900: 42 6c 6f 63 6b 2d 3e 64 77 43 72 79 70 74 53 69  Block->dwCryptSi
1910: 7a 65 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ze);.    break;.
1920: 20 20 63 61 73 65 20 37 3a 20 2f 2a 20 45 6e 63    case 7: /* Enc
1930: 72 79 70 74 20 61 20 70 61 67 65 20 66 6f 72 20  rypt a page for 
1940: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1950: 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 64 65 72   */.    /* Under
1960: 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74   normal circumst
1970: 61 6e 63 65 73 2c 20 74 68 65 20 72 65 61 64 6b  ances, the readk
1980: 65 79 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ey is the same a
1990: 73 20 74 68 65 20 77 72 69 74 65 6b 65 79 2e 20  s the writekey. 
19a0: 20 48 6f 77 65 76 65 72 2c 0a 20 20 20 20 77 68   However,.    wh
19b0: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
19c0: 69 73 20 62 65 69 6e 67 20 72 65 6b 65 79 65 64  is being rekeyed
19d0: 2c 20 74 68 65 20 72 65 61 64 6b 65 79 20 69 73  , the readkey is
19e0: 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73   not the same as
19f0: 20 74 68 65 20 77 72 69 74 65 6b 65 79 2e 0a 20   the writekey.. 
1a00: 20 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20     The rollback 
1a10: 6a 6f 75 72 6e 61 6c 20 6d 75 73 74 20 62 65 20  journal must be 
1a20: 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68  written using th
1a30: 65 20 6f 72 69 67 69 6e 61 6c 20 6b 65 79 20 66  e original key f
1a40: 6f 72 20 74 68 65 0a 20 20 20 20 64 61 74 61 62  or the.    datab
1a50: 61 73 65 20 66 69 6c 65 20 62 65 63 61 75 73 65  ase file because
1a60: 20 69 74 20 69 73 2c 20 62 79 20 6e 61 74 75 72   it is, by natur
1a70: 65 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  e, a rollback jo
1a80: 75 72 6e 61 6c 2e 0a 20 20 20 20 54 68 65 72 65  urnal..    There
1a90: 66 6f 72 65 2c 20 66 6f 72 20 63 61 73 65 20 37  fore, for case 7
1aa0: 2c 20 77 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , when the rollb
1ab0: 61 63 6b 20 69 73 20 62 65 69 6e 67 20 77 72 69  ack is being wri
1ac0: 74 74 65 6e 2c 20 61 6c 77 61 79 73 20 65 6e 63  tten, always enc
1ad0: 72 79 70 74 20 75 73 69 6e 67 0a 20 20 20 20 74  rypt using.    t
1ae0: 68 65 20 64 61 74 61 62 61 73 65 27 73 20 72 65  he database's re
1af0: 61 64 6b 65 79 2c 20 77 68 69 63 68 20 69 73 20  adkey, which is 
1b00: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1b10: 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 74 68   the same key th
1b20: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 0a 20  at was used to. 
1b30: 20 20 20 72 65 61 64 20 74 68 65 20 6f 72 69 67     read the orig
1b40: 69 6e 61 6c 20 64 61 74 61 2e 0a 20 20 20 20 2a  inal data..    *
1b50: 2f 0a 20 20 20 20 69 66 20 28 21 70 42 6c 6f 63  /.    if (!pBloc
1b60: 6b 2d 3e 68 52 65 61 64 4b 65 79 29 20 62 72 65  k->hReadKey) bre
1b70: 61 6b 3b 0a 0a 20 20 20 20 43 6f 70 79 4d 65 6d  ak;..    CopyMem
1b80: 6f 72 79 28 28 28 4c 50 42 59 54 45 29 70 42 6c  ory(((LPBYTE)pBl
1b90: 6f 63 6b 2d 3e 70 76 43 72 79 70 74 29 20 2b 20  ock->pvCrypt) + 
1ba0: 43 52 59 50 54 5f 4f 46 46 53 45 54 2c 20 64 61  CRYPT_OFFSET, da
1bb0: 74 61 2c 20 70 42 6c 6f 63 6b 2d 3e 64 77 50 61  ta, pBlock->dwPa
1bc0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 64 61 74  geSize);.    dat
1bd0: 61 20 3d 20 28 28 4c 50 42 59 54 45 29 70 42 6c  a = ((LPBYTE)pBl
1be0: 6f 63 6b 2d 3e 70 76 43 72 79 70 74 29 20 2b 20  ock->pvCrypt) + 
1bf0: 43 52 59 50 54 5f 4f 46 46 53 45 54 3b 0a 0a 20  CRYPT_OFFSET;.. 
1c00: 20 20 20 64 77 50 61 67 65 53 69 7a 65 20 3d 20     dwPageSize = 
1c10: 70 42 6c 6f 63 6b 2d 3e 64 77 50 61 67 65 53 69  pBlock->dwPageSi
1c20: 7a 65 3b 0a 20 20 20 20 43 72 79 70 74 45 6e 63  ze;.    CryptEnc
1c30: 72 79 70 74 28 70 42 6c 6f 63 6b 2d 3e 68 52 65  rypt(pBlock->hRe
1c40: 61 64 4b 65 79 2c 20 30 2c 20 54 52 55 45 2c 20  adKey, 0, TRUE, 
1c50: 30 2c 20 28 28 4c 50 42 59 54 45 29 70 42 6c 6f  0, ((LPBYTE)pBlo
1c60: 63 6b 2d 3e 70 76 43 72 79 70 74 29 20 2b 20 43  ck->pvCrypt) + C
1c70: 52 59 50 54 5f 4f 46 46 53 45 54 2c 20 26 64 77  RYPT_OFFSET, &dw
1c80: 50 61 67 65 53 69 7a 65 2c 20 70 42 6c 6f 63 6b  PageSize, pBlock
1c90: 2d 3e 64 77 43 72 79 70 74 53 69 7a 65 29 3b 0a  ->dwCryptSize);.
1ca0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
1cb0: 20 20 72 65 74 75 72 6e 20 64 61 74 61 3b 0a 7d    return data;.}
1cc0: 0a 0a 2f 2a 20 44 65 72 69 76 65 20 61 6e 20 65  ../* Derive an e
1cd0: 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 66 72  ncryption key fr
1ce0: 6f 6d 20 61 20 75 73 65 72 2d 73 75 70 70 6c 69  om a user-suppli
1cf0: 65 64 20 62 75 66 66 65 72 20 2a 2f 0a 73 74 61  ed buffer */.sta
1d00: 74 69 63 20 48 43 52 59 50 54 4b 45 59 20 44 65  tic HCRYPTKEY De
1d10: 72 69 76 65 4b 65 79 28 63 6f 6e 73 74 20 76 6f  riveKey(const vo
1d20: 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b  id *pKey, int nK
1d30: 65 79 29 0a 7b 0a 20 20 48 43 52 59 50 54 48 41  ey).{.  HCRYPTHA
1d40: 53 48 20 68 48 61 73 68 20 3d 20 30 3b 0a 20 20  SH hHash = 0;.  
1d50: 48 43 52 59 50 54 4b 45 59 20 20 68 4b 65 79 3b  HCRYPTKEY  hKey;
1d60: 0a 0a 20 20 69 66 20 28 21 70 4b 65 79 20 7c 7c  ..  if (!pKey ||
1d70: 20 21 6e 4b 65 79 29 20 72 65 74 75 72 6e 20 30   !nKey) return 0
1d80: 3b 0a 0a 20 20 69 66 20 28 21 49 6e 69 74 69 61  ;..  if (!Initia
1d90: 6c 69 7a 65 50 72 6f 76 69 64 65 72 28 29 29 0a  lizeProvider()).
1da0: 20 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4d    {.    return M
1db0: 41 58 44 57 4f 52 44 3b 0a 20 20 7d 0a 0a 20 20  AXDWORD;.  }..  
1dc0: 7b 0a 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49  {.    MUTEX_LOGI
1dd0: 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
1de0: 20 2a 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69   *pMaster = sqli
1df0: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
1e00: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
1e10: 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
1e20: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1e30: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1e40: 0a 0a 20 20 20 20 69 66 20 28 43 72 79 70 74 43  ..    if (CryptC
1e50: 72 65 61 74 65 48 61 73 68 28 67 5f 68 50 72 6f  reateHash(g_hPro
1e60: 76 69 64 65 72 2c 20 43 41 4c 47 5f 53 48 41 31  vider, CALG_SHA1
1e70: 2c 20 30 2c 20 30 2c 20 26 68 48 61 73 68 29 29  , 0, 0, &hHash))
1e80: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 66 20  .    {.      if 
1e90: 28 43 72 79 70 74 48 61 73 68 44 61 74 61 28 68  (CryptHashData(h
1ea0: 48 61 73 68 2c 20 28 4c 50 42 59 54 45 29 70 4b  Hash, (LPBYTE)pK
1eb0: 65 79 2c 20 6e 4b 65 79 2c 20 30 29 29 0a 20 20  ey, nKey, 0)).  
1ec0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 43 72      {.        Cr
1ed0: 79 70 74 44 65 72 69 76 65 4b 65 79 28 67 5f 68  yptDeriveKey(g_h
1ee0: 50 72 6f 76 69 64 65 72 2c 20 43 41 4c 47 5f 52  Provider, CALG_R
1ef0: 43 34 2c 20 68 48 61 73 68 2c 20 30 2c 20 26 68  C4, hHash, 0, &h
1f00: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
1f10: 20 20 20 20 43 72 79 70 74 44 65 73 74 72 6f 79      CryptDestroy
1f20: 48 61 73 68 28 68 48 61 73 68 29 3b 0a 20 20 20  Hash(hHash);.   
1f30: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
1f40: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
1f50: 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ter);.  }..  ret
1f60: 75 72 6e 20 68 4b 65 79 3b 0a 7d 0a 0a 2f 2a 20  urn hKey;.}../* 
1f70: 43 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  Called by sqlite
1f80: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6b 65 79   and sqlite3_key
1f90: 5f 69 6e 74 65 72 6f 70 20 74 6f 20 61 74 74 61  _interop to atta
1fa0: 63 68 20 61 20 6b 65 79 20 74 6f 20 61 20 64 61  ch a key to a da
1fb0: 74 61 62 61 73 65 2e 20 2a 2f 0a 69 6e 74 20 73  tabase. */.int s
1fc0: 71 6c 69 74 65 33 43 6f 64 65 63 41 74 74 61 63  qlite3CodecAttac
1fd0: 68 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  h(sqlite3 *db, i
1fe0: 6e 74 20 6e 44 62 2c 20 63 6f 6e 73 74 20 76 6f  nt nDb, const vo
1ff0: 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b  id *pKey, int nK
2000: 65 79 4c 65 6e 29 0a 7b 0a 20 20 69 6e 74 20 72  eyLen).{.  int r
2010: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
2020: 3b 0a 20 20 48 43 52 59 50 54 4b 45 59 20 68 4b  ;.  HCRYPTKEY hK
2030: 65 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4e 6f  ey = 0;..  /* No
2040: 20 6b 65 79 20 73 70 65 63 69 66 69 65 64 2c 20   key specified, 
2050: 63 6f 75 6c 64 20 6d 65 61 6e 20 65 69 74 68 65  could mean eithe
2060: 72 20 75 73 65 20 74 68 65 20 6d 61 69 6e 20 64  r use the main d
2070: 62 27 73 20 65 6e 63 72 79 70 74 69 6f 6e 20 6f  b's encryption o
2080: 72 20 6e 6f 20 65 6e 63 72 79 70 74 69 6f 6e 20  r no encryption 
2090: 2a 2f 0a 20 20 69 66 20 28 21 70 4b 65 79 20 7c  */.  if (!pKey |
20a0: 7c 20 21 6e 4b 65 79 4c 65 6e 29 0a 20 20 7b 0a  | !nKeyLen).  {.
20b0: 20 20 20 20 69 66 20 28 21 6e 44 62 29 0a 20 20      if (!nDb).  
20c0: 20 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e    {.      return
20d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 4d   SQLITE_OK; /* M
20e0: 61 69 6e 20 64 61 74 61 62 61 73 65 2c 20 6e 6f  ain database, no
20f0: 20 6b 65 79 20 73 70 65 63 69 66 69 65 64 20 73   key specified s
2100: 6f 20 6e 6f 74 20 65 6e 63 72 79 70 74 65 64 20  o not encrypted 
2110: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  */.    }.    els
2120: 65 20 2f 2a 20 41 74 74 61 63 68 65 64 20 64 61  e /* Attached da
2130: 74 61 62 61 73 65 2c 20 75 73 65 20 74 68 65 20  tabase, use the 
2140: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 27 73 20  main database's 
2150: 6b 65 79 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20  key */.    {.   
2160: 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 6e     /* Get the en
2170: 63 72 79 70 74 69 6f 6e 20 62 6c 6f 63 6b 20 66  cryption block f
2180: 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
2190: 62 61 73 65 20 61 6e 64 20 61 74 74 65 6d 70 74  base and attempt
21a0: 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 74 68   to duplicate th
21b0: 65 20 6b 65 79 0a 20 20 20 20 20 20 2a 2a 20 66  e key.      ** f
21c0: 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 61 74  or use by the at
21d0: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a  tached database.
21e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50        */.      P
21f0: 61 67 65 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  ager *p = sqlite
2200: 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e  3BtreePager(db->
2210: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
2220: 20 20 20 4c 50 43 52 59 50 54 42 4c 4f 43 4b 20     LPCRYPTBLOCK 
2230: 70 42 6c 6f 63 6b 20 3d 20 28 4c 50 43 52 59 50  pBlock = (LPCRYP
2240: 54 42 4c 4f 43 4b 29 73 71 6c 69 74 65 33 70 61  TBLOCK)sqlite3pa
2250: 67 65 72 5f 67 65 74 5f 63 6f 64 65 63 61 72 67  ger_get_codecarg
2260: 28 70 29 3b 0a 0a 20 20 20 20 20 20 69 66 20 28  (p);..      if (
2270: 21 70 42 6c 6f 63 6b 29 20 72 65 74 75 72 6e 20  !pBlock) return 
2280: 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 4d 61  SQLITE_OK; /* Ma
2290: 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  in database is n
22a0: 6f 74 20 65 6e 63 72 79 70 74 65 64 20 73 6f 20  ot encrypted so 
22b0: 6e 65 69 74 68 65 72 20 77 69 6c 6c 20 62 65 20  neither will be 
22c0: 61 6e 79 20 61 74 74 61 63 68 65 64 20 64 61 74  any attached dat
22d0: 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  abase */.      i
22e0: 66 20 28 21 70 42 6c 6f 63 6b 2d 3e 68 52 65 61  f (!pBlock->hRea
22f0: 64 4b 65 79 29 20 72 65 74 75 72 6e 20 53 51 4c  dKey) return SQL
2300: 49 54 45 5f 4f 4b 3b 20 2f 2a 20 4e 6f 74 20 65  ITE_OK; /* Not e
2310: 6e 63 72 79 70 74 65 64 20 2a 2f 0a 0a 20 20 20  ncrypted */..   
2320: 20 20 20 69 66 20 28 21 43 72 79 70 74 44 75 70     if (!CryptDup
2330: 6c 69 63 61 74 65 4b 65 79 28 70 42 6c 6f 63 6b  licateKey(pBlock
2340: 2d 3e 68 52 65 61 64 4b 65 79 2c 20 4e 55 4c 4c  ->hReadKey, NULL
2350: 2c 20 30 2c 20 26 68 4b 65 79 29 29 0a 20 20 20  , 0, &hKey)).   
2360: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20       return rc; 
2370: 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 64 75 70  /* Unable to dup
2380: 6c 69 63 61 74 65 20 74 68 65 20 6b 65 79 20 2a  licate the key *
2390: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c  /.    }.  }.  el
23a0: 73 65 20 2f 2a 20 55 73 65 72 2d 73 75 70 70 6c  se /* User-suppl
23b0: 69 65 64 20 70 61 73 73 70 68 72 61 73 65 2c 20  ied passphrase, 
23c0: 73 6f 20 63 72 65 61 74 65 20 61 20 63 72 79 70  so create a cryp
23d0: 74 6f 67 72 61 70 68 69 63 20 6b 65 79 20 6f 75  tographic key ou
23e0: 74 20 6f 66 20 69 74 20 2a 2f 0a 20 20 7b 0a 20  t of it */.  {. 
23f0: 20 20 20 68 4b 65 79 20 3d 20 44 65 72 69 76 65     hKey = Derive
2400: 4b 65 79 28 70 4b 65 79 2c 20 6e 4b 65 79 4c 65  Key(pKey, nKeyLe
2410: 6e 29 3b 0a 20 20 20 20 69 66 20 28 68 4b 65 79  n);.    if (hKey
2420: 20 3d 3d 20 4d 41 58 44 57 4f 52 44 29 0a 20 20   == MAXDWORD).  
2430: 20 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 56    {.#if SQLITE_V
2440: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d  ERSION_NUMBER >=
2450: 20 33 30 30 38 30 30 37 0a 20 20 20 20 20 20 73   3008007.      s
2460: 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
2470: 73 67 28 64 62 2c 20 72 63 2c 20 53 51 4c 49 54  sg(db, rc, SQLIT
2480: 45 43 52 59 50 54 45 52 52 4f 52 5f 50 52 4f 56  ECRYPTERROR_PROV
2490: 49 44 45 52 29 3b 0a 23 65 6c 73 65 0a 20 20 20  IDER);.#else.   
24a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
24b0: 64 62 2c 20 72 63 2c 20 53 51 4c 49 54 45 43 52  db, rc, SQLITECR
24c0: 59 50 54 45 52 52 4f 52 5f 50 52 4f 56 49 44 45  YPTERROR_PROVIDE
24d0: 52 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  R);.#endif.     
24e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
24f0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61  }.  }..  /* Crea
2500: 74 65 20 61 20 6e 65 77 20 65 6e 63 72 79 70 74  te a new encrypt
2510: 69 6f 6e 20 62 6c 6f 63 6b 20 61 6e 64 20 61 73  ion block and as
2520: 73 69 67 6e 20 74 68 65 20 63 6f 64 65 63 20 74  sign the codec t
2530: 6f 20 74 68 65 20 6e 65 77 20 61 74 74 61 63 68  o the new attach
2540: 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ed database */. 
2550: 20 69 66 20 28 68 4b 65 79 29 0a 20 20 7b 0a 20   if (hKey).  {. 
2560: 20 20 20 50 61 67 65 72 20 2a 70 20 3d 20 73 71     Pager *p = sq
2570: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
2580: 64 62 2d 3e 61 44 62 5b 6e 44 62 5d 2e 70 42 74  db->aDb[nDb].pBt
2590: 29 3b 0a 20 20 20 20 4c 50 43 52 59 50 54 42 4c  );.    LPCRYPTBL
25a0: 4f 43 4b 20 70 42 6c 6f 63 6b 20 3d 20 43 72 65  OCK pBlock = Cre
25b0: 61 74 65 43 72 79 70 74 42 6c 6f 63 6b 28 68 4b  ateCryptBlock(hK
25c0: 65 79 2c 20 70 2c 20 2d 31 2c 20 4e 55 4c 4c 29  ey, p, -1, NULL)
25d0: 3b 0a 20 20 20 20 69 66 20 28 21 70 42 6c 6f 63  ;.    if (!pBloc
25e0: 6b 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  k) return SQLITE
25f0: 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20 73 71 6c  _NOMEM;..    sql
2600: 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65  ite3PagerSetCode
2610: 63 28 70 2c 20 73 71 6c 69 74 65 33 43 6f 64 65  c(p, sqlite3Code
2620: 63 2c 20 73 71 6c 69 74 65 33 43 6f 64 65 63 53  c, sqlite3CodecS
2630: 69 7a 65 43 68 61 6e 67 65 2c 20 73 71 6c 69 74  izeChange, sqlit
2640: 65 33 43 6f 64 65 63 46 72 65 65 2c 20 70 42 6c  e3CodecFree, pBl
2650: 6f 63 6b 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  ock);..    rc = 
2660: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
2670: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2680: 2a 20 4f 6e 63 65 20 61 20 70 61 73 73 77 6f 72  * Once a passwor
2690: 64 20 68 61 73 20 62 65 65 6e 20 73 75 70 70 6c  d has been suppl
26a0: 69 65 64 20 61 6e 64 20 61 20 6b 65 79 20 63 72  ied and a key cr
26b0: 65 61 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20  eated, we don't 
26c0: 6b 65 65 70 20 74 68 65 0a 2a 2a 20 6f 72 69 67  keep the.** orig
26d0: 69 6e 61 6c 20 70 61 73 73 77 6f 72 64 20 66 6f  inal password fo
26e0: 72 20 73 65 63 75 72 69 74 79 20 70 75 72 70 6f  r security purpo
26f0: 73 65 73 2e 20 20 54 68 65 72 65 66 6f 72 65 20  ses.  Therefore 
2700: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
2710: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
2720: 63 47 65 74 4b 65 79 28 73 71 6c 69 74 65 33 20  cGetKey(sqlite3 
2730: 2a 64 62 2c 20 69 6e 74 20 6e 44 62 2c 20 76 6f  *db, int nDb, vo
2740: 69 64 20 2a 2a 70 70 4b 65 79 2c 20 69 6e 74 20  id **ppKey, int 
2750: 2a 70 6e 4b 65 79 4c 65 6e 29 0a 7b 0a 20 20 42  *pnKeyLen).{.  B
2760: 74 72 65 65 20 2a 70 62 74 20 3d 20 64 62 2d 3e  tree *pbt = db->
2770: 61 44 62 5b 30 5d 2e 70 42 74 3b 0a 20 20 50 61  aDb[0].pBt;.  Pa
2780: 67 65 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  ger *p = sqlite3
2790: 42 74 72 65 65 50 61 67 65 72 28 70 62 74 29 3b  BtreePager(pbt);
27a0: 0a 20 20 4c 50 43 52 59 50 54 42 4c 4f 43 4b 20  .  LPCRYPTBLOCK 
27b0: 70 42 6c 6f 63 6b 20 3d 20 28 4c 50 43 52 59 50  pBlock = (LPCRYP
27c0: 54 42 4c 4f 43 4b 29 73 71 6c 69 74 65 33 70 61  TBLOCK)sqlite3pa
27d0: 67 65 72 5f 67 65 74 5f 63 6f 64 65 63 61 72 67  ger_get_codecarg
27e0: 28 70 29 3b 0a 0a 20 20 69 66 20 28 70 70 4b 65  (p);..  if (ppKe
27f0: 79 29 20 2a 70 70 4b 65 79 20 3d 20 30 3b 0a 20  y) *ppKey = 0;. 
2800: 20 69 66 20 28 70 6e 4b 65 79 4c 65 6e 29 20 2a   if (pnKeyLen) *
2810: 70 6e 4b 65 79 4c 65 6e 20 3d 20 70 42 6c 6f 63  pnKeyLen = pBloc
2820: 6b 20 3f 20 31 3a 20 30 3b 0a 7d 0a 0a 53 51 4c  k ? 1: 0;.}..SQL
2830: 49 54 45 5f 41 50 49 20 76 6f 69 64 20 73 71 6c  ITE_API void sql
2840: 69 74 65 33 5f 61 63 74 69 76 61 74 65 5f 73 65  ite3_activate_se
2850: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e  e(const char *in
2860: 66 6f 29 0a 7b 0a 7d 0a 0a 2f 2a 20 57 65 20 64  fo).{.}../* We d
2870: 6f 20 6e 6f 74 20 61 74 74 61 63 68 20 74 68 69  o not attach thi
2880: 73 20 6b 65 79 20 74 6f 20 74 68 65 20 74 65 6d  s key to the tem
2890: 70 20 73 74 6f 72 65 2c 20 6f 6e 6c 79 20 74 68  p store, only th
28a0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e  e main database.
28b0: 20 2a 2f 0a 53 51 4c 49 54 45 5f 41 50 49 20 69   */.SQLITE_API i
28c0: 6e 74 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76  nt sqlite3_key_v
28d0: 32 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  2(sqlite3 *db, c
28e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
28f0: 6d 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  me, const void *
2900: 70 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79 29 0a  pKey, int nKey).
2910: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2920: 65 33 43 6f 64 65 63 41 74 74 61 63 68 28 64 62  e3CodecAttach(db
2930: 2c 20 30 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29  , 0, pKey, nKey)
2940: 3b 0a 7d 0a 0a 53 51 4c 49 54 45 5f 41 50 49 20  ;.}..SQLITE_API 
2950: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6b 65 79 28  int sqlite3_key(
2960: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
2970: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
2980: 6e 74 20 6e 4b 65 79 29 0a 7b 0a 20 20 72 65 74  nt nKey).{.  ret
2990: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f  urn sqlite3_key_
29a0: 76 32 28 64 62 2c 20 30 2c 20 70 4b 65 79 2c 20  v2(db, 0, pKey, 
29b0: 6e 4b 65 79 29 3b 0a 7d 0a 0a 53 51 4c 49 54 45  nKey);.}..SQLITE
29c0: 5f 41 50 49 20 69 6e 74 20 73 71 6c 69 74 65 33  _API int sqlite3
29d0: 5f 72 65 6b 65 79 28 73 71 6c 69 74 65 33 20 2a  _rekey(sqlite3 *
29e0: 64 62 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  db, const void *
29f0: 70 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79 29 0a  pKey, int nKey).
2a00: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2a10: 65 33 5f 72 65 6b 65 79 5f 76 32 28 64 62 2c 20  e3_rekey_v2(db, 
2a20: 30 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  0, pKey, nKey);.
2a30: 7d 0a 0a 2f 2a 20 43 68 61 6e 67 65 73 20 74 68  }../* Changes th
2a40: 65 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79  e encryption key
2a50: 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
2a60: 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 53 51   database. */.SQ
2a70: 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73 71 6c  LITE_API int sql
2a80: 69 74 65 33 5f 72 65 6b 65 79 5f 76 32 28 73 71  ite3_rekey_v2(sq
2a90: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
2aa0: 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
2ab0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
2ac0: 2c 20 69 6e 74 20 6e 4b 65 79 29 0a 7b 0a 20 20  , int nKey).{.  
2ad0: 42 74 72 65 65 20 2a 70 62 74 20 3d 20 64 62 2d  Btree *pbt = db-
2ae0: 3e 61 44 62 5b 30 5d 2e 70 42 74 3b 0a 20 20 50  >aDb[0].pBt;.  P
2af0: 61 67 65 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  ager *p = sqlite
2b00: 33 42 74 72 65 65 50 61 67 65 72 28 70 62 74 29  3BtreePager(pbt)
2b10: 3b 0a 20 20 4c 50 43 52 59 50 54 42 4c 4f 43 4b  ;.  LPCRYPTBLOCK
2b20: 20 70 42 6c 6f 63 6b 20 3d 20 28 4c 50 43 52 59   pBlock = (LPCRY
2b30: 50 54 42 4c 4f 43 4b 29 73 71 6c 69 74 65 33 70  PTBLOCK)sqlite3p
2b40: 61 67 65 72 5f 67 65 74 5f 63 6f 64 65 63 61 72  ager_get_codecar
2b50: 67 28 70 29 3b 0a 20 20 48 43 52 59 50 54 4b 45  g(p);.  HCRYPTKE
2b60: 59 20 68 4b 65 79 20 3d 20 44 65 72 69 76 65 4b  Y hKey = DeriveK
2b70: 65 79 28 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  ey(pKey, nKey);.
2b80: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b90: 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 20 28  E_ERROR;..  if (
2ba0: 68 4b 65 79 20 3d 3d 20 4d 41 58 44 57 4f 52 44  hKey == MAXDWORD
2bb0: 29 0a 20 20 7b 0a 23 69 66 20 53 51 4c 49 54 45  ).  {.#if SQLITE
2bc0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
2bd0: 3e 3d 20 33 30 30 38 30 30 37 0a 20 20 20 20 73  >= 3008007.    s
2be0: 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
2bf0: 73 67 28 64 62 2c 20 72 63 2c 20 53 51 4c 49 54  sg(db, rc, SQLIT
2c00: 45 43 52 59 50 54 45 52 52 4f 52 5f 50 52 4f 56  ECRYPTERROR_PROV
2c10: 49 44 45 52 29 3b 0a 23 65 6c 73 65 0a 20 20 20  IDER);.#else.   
2c20: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
2c30: 2c 20 72 63 2c 20 53 51 4c 49 54 45 43 52 59 50  , rc, SQLITECRYP
2c40: 54 45 52 52 4f 52 5f 50 52 4f 56 49 44 45 52 29  TERROR_PROVIDER)
2c50: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
2c60: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
2c70: 66 20 28 21 70 42 6c 6f 63 6b 20 26 26 20 21 68  f (!pBlock && !h
2c80: 4b 65 79 29 20 72 65 74 75 72 6e 20 53 51 4c 49  Key) return SQLI
2c90: 54 45 5f 4f 4b 3b 20 2f 2a 20 57 61 73 6e 27 74  TE_OK; /* Wasn't
2ca0: 20 65 6e 63 72 79 70 74 65 64 20 74 6f 20 62 65   encrypted to be
2cb0: 67 69 6e 20 77 69 74 68 20 2a 2f 0a 0a 20 20 2f  gin with */..  /
2cc0: 2a 20 54 6f 20 72 65 6b 65 79 20 61 20 64 61 74  * To rekey a dat
2cd0: 61 62 61 73 65 2c 20 77 65 20 63 68 61 6e 67 65  abase, we change
2ce0: 20 74 68 65 20 77 72 69 74 65 6b 65 79 20 66 6f   the writekey fo
2cf0: 72 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  r the pager.  Th
2d00: 65 20 72 65 61 64 6b 65 79 20 72 65 6d 61 69 6e  e readkey remain
2d10: 73 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 0a  s.  ** the same.
2d20: 20 20 2a 2f 0a 20 20 69 66 20 28 21 70 42 6c 6f    */.  if (!pBlo
2d30: 63 6b 29 20 2f 2a 20 45 6e 63 72 79 70 74 20 61  ck) /* Encrypt a
2d40: 6e 20 75 6e 65 6e 63 72 79 70 74 65 64 20 64 61  n unencrypted da
2d50: 74 61 62 61 73 65 20 2a 2f 0a 20 20 7b 0a 20 20  tabase */.  {.  
2d60: 20 20 70 42 6c 6f 63 6b 20 3d 20 43 72 65 61 74    pBlock = Creat
2d70: 65 43 72 79 70 74 42 6c 6f 63 6b 28 68 4b 65 79  eCryptBlock(hKey
2d80: 2c 20 70 2c 20 2d 31 2c 20 4e 55 4c 4c 29 3b 0a  , p, -1, NULL);.
2d90: 20 20 20 20 69 66 20 28 21 70 42 6c 6f 63 6b 29      if (!pBlock)
2da0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2db0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20  LITE_NOMEM;..   
2dc0: 20 70 42 6c 6f 63 6b 2d 3e 68 52 65 61 64 4b 65   pBlock->hReadKe
2dd0: 79 20 3d 20 30 3b 20 2f 2a 20 4f 72 69 67 69 6e  y = 0; /* Origin
2de0: 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  al database is n
2df0: 6f 74 20 65 6e 63 72 79 70 74 65 64 20 2a 2f 0a  ot encrypted */.
2e00: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2e10: 53 65 74 43 6f 64 65 63 28 73 71 6c 69 74 65 33  SetCodec(sqlite3
2e20: 42 74 72 65 65 50 61 67 65 72 28 70 62 74 29 2c  BtreePager(pbt),
2e30: 20 73 71 6c 69 74 65 33 43 6f 64 65 63 2c 20 73   sqlite3Codec, s
2e40: 71 6c 69 74 65 33 43 6f 64 65 63 53 69 7a 65 43  qlite3CodecSizeC
2e50: 68 61 6e 67 65 2c 20 73 71 6c 69 74 65 33 43 6f  hange, sqlite3Co
2e60: 64 65 63 46 72 65 65 2c 20 70 42 6c 6f 63 6b 29  decFree, pBlock)
2e70: 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 2f 2a 20  ;.  }.  else /* 
2e80: 43 68 61 6e 67 65 20 74 68 65 20 77 72 69 74 65  Change the write
2e90: 6b 65 79 20 66 6f 72 20 61 6e 20 61 6c 72 65 61  key for an alrea
2ea0: 64 79 2d 65 6e 63 72 79 70 74 65 64 20 64 61 74  dy-encrypted dat
2eb0: 61 62 61 73 65 20 2a 2f 0a 20 20 7b 0a 20 20 20  abase */.  {.   
2ec0: 20 70 42 6c 6f 63 6b 2d 3e 68 57 72 69 74 65 4b   pBlock->hWriteK
2ed0: 65 79 20 3d 20 68 4b 65 79 3b 0a 20 20 7d 0a 0a  ey = hKey;.  }..
2ee0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2ef0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
2f00: 3b 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 61 20  ;..  /* Start a 
2f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 23  transaction */.#
2f20: 69 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  if SQLITE_VERSIO
2f30: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 33 30 32 35  N_NUMBER >= 3025
2f40: 30 30 30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  000.  rc = sqlit
2f50: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
2f60: 73 28 70 62 74 2c 20 31 2c 20 30 29 3b 0a 23 65  s(pbt, 1, 0);.#e
2f70: 6c 73 65 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  lse.  rc = sqlit
2f80: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
2f90: 73 28 70 62 74 2c 20 31 29 3b 0a 23 65 6e 64 69  s(pbt, 1);.#endi
2fa0: 66 0a 0a 20 20 69 66 20 28 21 72 63 29 0a 20 20  f..  if (!rc).  
2fb0: 7b 0a 20 20 20 20 2f 2a 20 52 65 77 72 69 74 65  {.    /* Rewrite
2fc0: 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 69   all the pages i
2fd0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  n the database u
2fe0: 73 69 6e 67 20 74 68 65 20 6e 65 77 20 65 6e 63  sing the new enc
2ff0: 72 79 70 74 69 6f 6e 20 6b 65 79 20 2a 2f 0a 20  ryption key */. 
3000: 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20     Pgno nPage;. 
3010: 20 20 20 50 67 6e 6f 20 6e 53 6b 69 70 20 3d 20     Pgno nSkip = 
3020: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 29  PAGER_MJ_PGNO(p)
3030: 3b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 50  ;.    DbPage *pP
3040: 61 67 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b  age;.    Pgno n;
3050: 0a 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 3b 0a  .    int count;.
3060: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
3070: 72 50 61 67 65 63 6f 75 6e 74 28 70 2c 20 26 63  rPagecount(p, &c
3080: 6f 75 6e 74 29 3b 0a 20 20 20 20 6e 50 61 67 65  ount);.    nPage
3090: 20 3d 20 28 50 67 6e 6f 29 63 6f 75 6e 74 3b 0a   = (Pgno)count;.
30a0: 0a 20 20 20 20 66 6f 72 28 6e 20 3d 20 31 3b 20  .    for(n = 1; 
30b0: 6e 20 3c 3d 20 6e 50 61 67 65 3b 20 6e 20 2b 2b  n <= nPage; n ++
30c0: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 66  ).    {.      if
30d0: 20 28 6e 20 3d 3d 20 6e 53 6b 69 70 29 20 63 6f   (n == nSkip) co
30e0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 63  ntinue;.      rc
30f0: 20 3d 20 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43   = INTEROP_CODEC
3100: 5f 47 45 54 5f 50 41 47 45 52 28 70 2c 20 6e 2c  _GET_PAGER(p, n,
3110: 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
3120: 69 66 28 21 72 63 29 0a 20 20 20 20 20 20 7b 0a  if(!rc).      {.
3130: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
3140: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
3150: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 73  Page);.        s
3160: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
3170: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
3180: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
3190: 20 49 66 20 77 65 20 73 75 63 63 65 65 64 65 64   If we succeeded
31a0: 2c 20 74 72 79 20 61 6e 64 20 63 6f 6d 6d 69 74  , try and commit
31b0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
31c0: 20 2a 2f 0a 20 20 69 66 20 28 21 72 63 29 0a 20   */.  if (!rc). 
31d0: 20 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   {.    rc = sqli
31e0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70  te3BtreeCommit(p
31f0: 62 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2f 20 49  bt);.  }..  // I
3200: 66 20 77 65 20 66 61 69 6c 65 64 2c 20 72 6f 6c  f we failed, rol
3210: 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 20 28 72  lback */.  if (r
3220: 63 29 0a 20 20 7b 0a 23 69 66 20 53 51 4c 49 54  c).  {.#if SQLIT
3230: 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
3240: 20 3e 3d 20 33 30 30 38 30 30 37 0a 20 20 20 20   >= 3008007.    
3250: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
3260: 62 61 63 6b 28 70 62 74 2c 20 53 51 4c 49 54 45  back(pbt, SQLITE
3270: 5f 4f 4b 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20  _OK, 0);.#else. 
3280: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
3290: 6f 6c 6c 62 61 63 6b 28 70 62 74 2c 20 53 51 4c  ollback(pbt, SQL
32a0: 49 54 45 5f 4f 4b 29 3b 0a 23 65 6e 64 69 66 0a  ITE_OK);.#endif.
32b0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
32c0: 73 75 63 63 65 65 64 65 64 2c 20 64 65 73 74 72  succeeded, destr
32d0: 6f 79 20 61 6e 79 20 70 72 65 76 69 6f 75 73 20  oy any previous 
32e0: 72 65 61 64 20 6b 65 79 20 74 68 69 73 20 64 61  read key this da
32f0: 74 61 62 61 73 65 20 75 73 65 64 0a 20 20 2a 2a  tabase used.  **
3300: 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 72 65   and make the re
3310: 61 64 6b 65 79 20 65 71 75 61 6c 20 74 6f 20 74  adkey equal to t
3320: 68 65 20 77 72 69 74 65 6b 65 79 0a 20 20 2a 2f  he writekey.  */
3330: 0a 20 20 69 66 20 28 21 72 63 29 0a 20 20 7b 0a  .  if (!rc).  {.
3340: 20 20 20 20 69 66 20 28 70 42 6c 6f 63 6b 2d 3e      if (pBlock->
3350: 68 52 65 61 64 4b 65 79 29 0a 20 20 20 20 7b 0a  hReadKey).    {.
3360: 20 20 20 20 20 20 43 72 79 70 74 44 65 73 74 72        CryptDestr
3370: 6f 79 4b 65 79 28 70 42 6c 6f 63 6b 2d 3e 68 52  oyKey(pBlock->hR
3380: 65 61 64 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20  eadKey);.    }. 
3390: 20 20 20 70 42 6c 6f 63 6b 2d 3e 68 52 65 61 64     pBlock->hRead
33a0: 4b 65 79 20 3d 20 70 42 6c 6f 63 6b 2d 3e 68 57  Key = pBlock->hW
33b0: 72 69 74 65 4b 65 79 3b 0a 20 20 7d 0a 20 20 2f  riteKey;.  }.  /
33c0: 2a 20 57 65 20 66 61 69 6c 65 64 2e 20 20 44 65  * We failed.  De
33d0: 73 74 72 6f 79 20 74 68 65 20 6e 65 77 20 77 72  stroy the new wr
33e0: 69 74 65 6b 65 79 20 28 69 66 20 74 68 65 72 65  itekey (if there
33f0: 20 77 61 73 20 6f 6e 65 29 20 61 6e 64 20 72 65   was one) and re
3400: 76 65 72 74 20 69 74 20 62 61 63 6b 20 74 6f 0a  vert it back to.
3410: 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
3420: 6c 20 72 65 61 64 6b 65 79 0a 20 20 2a 2f 0a 20  l readkey.  */. 
3430: 20 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 69 66   else.  {.    if
3440: 20 28 70 42 6c 6f 63 6b 2d 3e 68 57 72 69 74 65   (pBlock->hWrite
3450: 4b 65 79 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  Key).    {.     
3460: 20 43 72 79 70 74 44 65 73 74 72 6f 79 4b 65 79   CryptDestroyKey
3470: 28 70 42 6c 6f 63 6b 2d 3e 68 57 72 69 74 65 4b  (pBlock->hWriteK
3480: 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ey);.    }.    p
3490: 42 6c 6f 63 6b 2d 3e 68 57 72 69 74 65 4b 65 79  Block->hWriteKey
34a0: 20 3d 20 70 42 6c 6f 63 6b 2d 3e 68 52 65 61 64   = pBlock->hRead
34b0: 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  Key;.  }..  /* I
34c0: 66 20 74 68 65 20 72 65 61 64 6b 65 79 20 61 6e  f the readkey an
34d0: 64 20 77 72 69 74 65 6b 65 79 20 61 72 65 20 62  d writekey are b
34e0: 6f 74 68 20 65 6d 70 74 79 2c 20 74 68 65 72 65  oth empty, there
34f0: 27 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61  's no need for a
3500: 20 63 6f 64 65 63 20 6f 6e 20 74 68 69 73 0a 20   codec on this. 
3510: 20 2a 2a 20 70 61 67 65 72 20 61 6e 79 6d 6f 72   ** pager anymor
3520: 65 2e 20 20 44 65 73 74 72 6f 79 20 74 68 65 20  e.  Destroy the 
3530: 63 72 79 70 74 20 62 6c 6f 63 6b 20 61 6e 64 20  crypt block and 
3540: 72 65 6d 6f 76 65 20 74 68 65 20 63 6f 64 65 63  remove the codec
3550: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
3560: 0a 20 20 2a 2f 0a 20 20 69 66 20 28 21 70 42 6c  .  */.  if (!pBl
3570: 6f 63 6b 2d 3e 68 52 65 61 64 4b 65 79 20 26 26  ock->hReadKey &&
3580: 20 21 70 42 6c 6f 63 6b 2d 3e 68 57 72 69 74 65   !pBlock->hWrite
3590: 4b 65 79 29 0a 20 20 7b 0a 20 20 20 20 73 71 6c  Key).  {.    sql
35a0: 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65  ite3PagerSetCode
35b0: 63 28 70 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  c(p, NULL, NULL,
35c0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20   NULL, NULL);.  
35d0: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  }..  sqlite3_mut
35e0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
35f0: 65 78 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  ex);..  return r
3600: 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
3610: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
3620: 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   */.#endif /* SQ
3630: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
3640: 20 2a 2f 0a                                       */.