System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 56333e5065df75183730e8b0a97fc5b7601ae5d8:


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 76 6f 69 64 20 73   NULL;.}..void s
0510: 71 6c 69 74 65 33 5f 61 63 74 69 76 61 74 65 5f  qlite3_activate_
0520: 73 65 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  see(const char *
0530: 69 6e 66 6f 29 0a 7b 0a 7d 0a 0a 2f 2a 20 43 72  info).{.}../* Cr
0540: 65 61 74 65 20 61 20 63 72 79 70 74 6f 67 72 61  eate a cryptogra
0550: 70 68 69 63 20 63 6f 6e 74 65 78 74 2e 20 20 55  phic context.  U
0560: 73 65 20 74 68 65 20 65 6e 68 61 6e 63 65 64 20  se the enhanced 
0570: 70 72 6f 76 69 64 65 72 20 62 65 63 61 75 73 65  provider because
0580: 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
0590: 20 6f 6e 0a 2a 2a 20 6d 6f 73 74 20 70 6c 61 74   on.** most plat
05a0: 66 6f 72 6d 73 0a 2a 2f 0a 73 74 61 74 69 63 20  forms.*/.static 
05b0: 42 4f 4f 4c 20 49 6e 69 74 69 61 6c 69 7a 65 50  BOOL InitializeP
05c0: 72 6f 76 69 64 65 72 28 29 0a 7b 0a 20 20 4d 55  rovider().{.  MU
05d0: 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
05e0: 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
05f0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  r = sqlite3_mute
0600: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
0610: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
0620: 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33  ER); ).  sqlite3
0630: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
0640: 73 74 65 72 29 3b 0a 0a 20 20 69 66 20 28 67 5f  ster);..  if (g_
0650: 68 50 72 6f 76 69 64 65 72 29 0a 20 20 7b 0a 20  hProvider).  {. 
0660: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
0670: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
0680: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45  .    return TRUE
0690: 3b 0a 20 20 7d 0a 0a 20 20 69 66 20 28 21 43 72  ;.  }..  if (!Cr
06a0: 79 70 74 41 63 71 75 69 72 65 43 6f 6e 74 65 78  yptAcquireContex
06b0: 74 28 26 67 5f 68 50 72 6f 76 69 64 65 72 2c 20  t(&g_hProvider, 
06c0: 4e 55 4c 4c 2c 20 4d 53 5f 45 4e 48 41 4e 43 45  NULL, MS_ENHANCE
06d0: 44 5f 50 52 4f 56 2c 20 50 52 4f 56 5f 52 53 41  D_PROV, PROV_RSA
06e0: 5f 46 55 4c 4c 2c 20 43 52 59 50 54 5f 56 45 52  _FULL, CRYPT_VER
06f0: 49 46 59 43 4f 4e 54 45 58 54 29 29 0a 20 20 7b  IFYCONTEXT)).  {
0700: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
0710: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
0720: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  );.    return FA
0730: 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  LSE;.  }..  sqli
0740: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
0750: 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
0760: 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 20 43  rn TRUE;.}../* C
0770: 72 65 61 74 65 20 6f 72 20 75 70 64 61 74 65 20  reate or update 
0780: 61 20 63 72 79 70 74 6f 67 72 61 70 68 69 63 20  a cryptographic 
0790: 63 6f 6e 74 65 78 74 20 66 6f 72 20 61 20 70 61  context for a pa
07a0: 67 65 72 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ger..** This fun
07b0: 63 74 69 6f 6e 20 77 69 6c 6c 20 61 75 74 6f 6d  ction will autom
07c0: 61 74 69 63 61 6c 6c 79 20 64 65 74 65 72 6d 69  atically determi
07d0: 6e 65 20 69 66 20 74 68 65 20 65 6e 63 72 79 70  ne if the encryp
07e0: 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 72  tion algorithm r
07f0: 65 71 75 69 72 65 73 0a 2a 2a 20 65 78 74 72 61  equires.** extra
0800: 20 70 61 64 64 69 6e 67 2c 20 61 6e 64 20 69 66   padding, and if
0810: 20 69 74 20 64 6f 65 73 2c 20 77 69 6c 6c 20 63   it does, will c
0820: 72 65 61 74 65 20 61 20 74 65 6d 70 20 62 75 66  reate a temp buf
0830: 66 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74  fer big enough t
0840: 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 70 61  o provide.** spa
0850: 63 65 20 74 6f 20 68 6f 6c 64 20 69 74 2e 0a 2a  ce to hold it..*
0860: 2f 0a 73 74 61 74 69 63 20 4c 50 43 52 59 50 54  /.static LPCRYPT
0870: 42 4c 4f 43 4b 20 43 72 65 61 74 65 43 72 79 70  BLOCK CreateCryp
0880: 74 42 6c 6f 63 6b 28 48 43 52 59 50 54 4b 45 59  tBlock(HCRYPTKEY
0890: 20 68 4b 65 79 2c 20 50 61 67 65 72 20 2a 70 61   hKey, Pager *pa
08a0: 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a  ger, int pageSiz
08b0: 65 2c 20 4c 50 43 52 59 50 54 42 4c 4f 43 4b 20  e, LPCRYPTBLOCK 
08c0: 70 45 78 69 73 74 69 6e 67 29 0a 7b 0a 20 20 4c  pExisting).{.  L
08d0: 50 43 52 59 50 54 42 4c 4f 43 4b 20 70 42 6c 6f  PCRYPTBLOCK pBlo
08e0: 63 6b 3b 0a 0a 20 20 69 66 20 28 21 70 45 78 69  ck;..  if (!pExi
08f0: 73 74 69 6e 67 29 20 2f 2a 20 43 72 65 61 74 69  sting) /* Creati
0900: 6e 67 20 61 20 6e 65 77 20 63 72 79 70 74 62 6c  ng a new cryptbl
0910: 6f 63 6b 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 70  ock */.  {.    p
0920: 42 6c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f  Block = sqlite3_
0930: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 43 52  malloc(sizeof(CR
0940: 59 50 54 42 4c 4f 43 4b 29 29 3b 0a 20 20 20 20  YPTBLOCK));.    
0950: 69 66 20 28 21 70 42 6c 6f 63 6b 29 20 72 65 74  if (!pBlock) ret
0960: 75 72 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 5a  urn NULL;..    Z
0970: 65 72 6f 4d 65 6d 6f 72 79 28 70 42 6c 6f 63 6b  eroMemory(pBlock
0980: 2c 20 73 69 7a 65 6f 66 28 43 52 59 50 54 42 4c  , sizeof(CRYPTBL
0990: 4f 43 4b 29 29 3b 0a 20 20 20 20 70 42 6c 6f 63  OCK));.    pBloc
09a0: 6b 2d 3e 68 52 65 61 64 4b 65 79 20 3d 20 68 4b  k->hReadKey = hK
09b0: 65 79 3b 0a 20 20 20 20 70 42 6c 6f 63 6b 2d 3e  ey;.    pBlock->
09c0: 68 57 72 69 74 65 4b 65 79 20 3d 20 68 4b 65 79  hWriteKey = hKey
09d0: 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 2f 2a 20  ;.  }.  else /* 
09e0: 55 70 64 61 74 69 6e 67 20 61 6e 20 65 78 69 73  Updating an exis
09f0: 74 69 6e 67 20 63 72 79 70 74 62 6c 6f 63 6b 20  ting cryptblock 
0a00: 2a 2f 0a 20 20 7b 0a 20 20 20 20 70 42 6c 6f 63  */.  {.    pBloc
0a10: 6b 20 3d 20 70 45 78 69 73 74 69 6e 67 3b 0a 20  k = pExisting;. 
0a20: 20 7d 0a 0a 20 20 69 66 20 28 70 61 67 65 53 69   }..  if (pageSi
0a30: 7a 65 20 3d 3d 20 2d 31 29 0a 20 20 20 20 70 61  ze == -1).    pa
0a40: 67 65 53 69 7a 65 20 3d 20 70 61 67 65 72 2d 3e  geSize = pager->
0a50: 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 70 42 6c  pageSize;..  pBl
0a60: 6f 63 6b 2d 3e 70 50 61 67 65 72 20 3d 20 70 61  ock->pPager = pa
0a70: 67 65 72 3b 0a 20 20 70 42 6c 6f 63 6b 2d 3e 64  ger;.  pBlock->d
0a80: 77 50 61 67 65 53 69 7a 65 20 3d 20 28 44 57 4f  wPageSize = (DWO
0a90: 52 44 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 70  RD)pageSize;.  p
0aa0: 42 6c 6f 63 6b 2d 3e 64 77 43 72 79 70 74 53 69  Block->dwCryptSi
0ab0: 7a 65 20 3d 20 70 42 6c 6f 63 6b 2d 3e 64 77 50  ze = pBlock->dwP
0ac0: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 45  ageSize;..  /* E
0ad0: 78 69 73 74 69 6e 67 20 63 72 79 70 74 62 6c 6f  xisting cryptblo
0ae0: 63 6b 73 20 6d 61 79 20 68 61 76 65 20 61 20 62  cks may have a b
0af0: 75 66 66 65 72 2c 20 69 66 20 73 6f 2c 20 64 65  uffer, if so, de
0b00: 6c 65 74 65 20 69 74 20 2a 2f 0a 20 20 69 66 20  lete it */.  if 
0b10: 28 70 42 6c 6f 63 6b 2d 3e 70 76 43 72 79 70 74  (pBlock->pvCrypt
0b20: 29 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  ).  {.    sqlite
0b30: 33 5f 66 72 65 65 28 70 42 6c 6f 63 6b 2d 3e 70  3_free(pBlock->p
0b40: 76 43 72 79 70 74 29 3b 0a 20 20 20 20 70 42 6c  vCrypt);.    pBl
0b50: 6f 63 6b 2d 3e 70 76 43 72 79 70 74 20 3d 20 4e  ock->pvCrypt = N
0b60: 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ULL;.  }..  /* F
0b70: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 62 69  igure out how bi
0b80: 67 20 74 6f 20 6d 61 6b 65 20 6f 75 72 20 73 70  g to make our sp
0b90: 61 72 65 20 63 72 79 70 74 20 62 6c 6f 63 6b 20  are crypt block 
0ba0: 2a 2f 0a 20 20 43 72 79 70 74 45 6e 63 72 79 70  */.  CryptEncryp
0bb0: 74 28 68 4b 65 79 2c 20 30 2c 20 54 52 55 45 2c  t(hKey, 0, TRUE,
0bc0: 20 30 2c 20 4e 55 4c 4c 2c 20 26 70 42 6c 6f 63   0, NULL, &pBloc
0bd0: 6b 2d 3e 64 77 43 72 79 70 74 53 69 7a 65 2c 20  k->dwCryptSize, 
0be0: 70 42 6c 6f 63 6b 2d 3e 64 77 43 72 79 70 74 53  pBlock->dwCryptS
0bf0: 69 7a 65 20 2a 20 32 29 3b 0a 20 20 70 42 6c 6f  ize * 2);.  pBlo
0c00: 63 6b 2d 3e 70 76 43 72 79 70 74 20 3d 20 73 71  ck->pvCrypt = sq
0c10: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 42 6c  lite3_malloc(pBl
0c20: 6f 63 6b 2d 3e 64 77 43 72 79 70 74 53 69 7a 65  ock->dwCryptSize
0c30: 20 2b 20 28 43 52 59 50 54 5f 4f 46 46 53 45 54   + (CRYPT_OFFSET
0c40: 20 2a 20 32 29 29 3b 0a 20 20 69 66 20 28 21 70   * 2));.  if (!p
0c50: 42 6c 6f 63 6b 2d 3e 70 76 43 72 79 70 74 29 0a  Block->pvCrypt).
0c60: 20 20 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63 72    {.    /* We cr
0c70: 65 61 74 65 64 20 61 20 6e 65 77 20 62 6c 6f 63  eated a new bloc
0c80: 6b 20 69 6e 20 68 65 72 65 2c 20 73 6f 20 66 72  k in here, so fr
0c90: 65 65 20 69 74 2e 20 20 4f 74 68 65 72 77 69 73  ee it.  Otherwis
0ca0: 65 20 6c 65 61 76 65 20 74 68 65 20 6f 72 69 67  e leave the orig
0cb0: 69 6e 61 6c 20 69 6e 74 61 63 74 20 2a 2f 0a 20  inal intact */. 
0cc0: 20 20 20 69 66 20 28 70 42 6c 6f 63 6b 20 21 3d     if (pBlock !=
0cd0: 20 70 45 78 69 73 74 69 6e 67 29 0a 20 20 20 20   pExisting).    
0ce0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
0cf0: 42 6c 6f 63 6b 29 3b 0a 0a 20 20 20 20 72 65 74  Block);..    ret
0d00: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20  urn NULL;.  }.. 
0d10: 20 72 65 74 75 72 6e 20 70 42 6c 6f 63 6b 3b 0a   return pBlock;.
0d20: 7d 0a 0a 2f 2a 20 44 65 73 74 72 6f 79 20 61 20  }../* Destroy a 
0d30: 63 72 79 70 74 6f 67 72 61 70 68 69 63 20 63 6f  cryptographic co
0d40: 6e 74 65 78 74 20 61 6e 64 20 61 6e 79 20 62 75  ntext and any bu
0d50: 66 66 65 72 73 20 61 6e 64 20 6b 65 79 73 20 61  ffers and keys a
0d60: 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 69 6e  llocated therein
0d70: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
0d80: 73 71 6c 69 74 65 33 43 6f 64 65 63 46 72 65 65  sqlite3CodecFree
0d90: 28 4c 50 56 4f 49 44 20 70 76 29 0a 7b 0a 20 20  (LPVOID pv).{.  
0da0: 4c 50 43 52 59 50 54 42 4c 4f 43 4b 20 70 42 6c  LPCRYPTBLOCK pBl
0db0: 6f 63 6b 20 3d 20 28 4c 50 43 52 59 50 54 42 4c  ock = (LPCRYPTBL
0dc0: 4f 43 4b 29 70 76 3b 0a 20 20 2f 2a 20 44 65 73  OCK)pv;.  /* Des
0dd0: 74 72 6f 79 20 74 68 65 20 72 65 61 64 20 6b 65  troy the read ke
0de0: 79 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  y if there is on
0df0: 65 20 2a 2f 0a 20 20 69 66 20 28 70 42 6c 6f 63  e */.  if (pBloc
0e00: 6b 2d 3e 68 52 65 61 64 4b 65 79 29 0a 20 20 7b  k->hReadKey).  {
0e10: 0a 20 20 20 20 43 72 79 70 74 44 65 73 74 72 6f  .    CryptDestro
0e20: 79 4b 65 79 28 70 42 6c 6f 63 6b 2d 3e 68 52 65  yKey(pBlock->hRe
0e30: 61 64 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f  adKey);.  }..  /
0e40: 2a 20 49 66 20 74 68 65 72 65 27 73 20 61 20 77  * If there's a w
0e50: 72 69 74 65 6b 65 79 20 61 6e 64 20 69 74 73 20  ritekey and its 
0e60: 6e 6f 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  not equal to the
0e70: 20 72 65 61 64 6b 65 79 2c 20 64 65 73 74 72 6f   readkey, destro
0e80: 79 20 69 74 20 2a 2f 0a 20 20 69 66 20 28 70 42  y it */.  if (pB
0e90: 6c 6f 63 6b 2d 3e 68 57 72 69 74 65 4b 65 79 20  lock->hWriteKey 
0ea0: 26 26 20 70 42 6c 6f 63 6b 2d 3e 68 57 72 69 74  && pBlock->hWrit
0eb0: 65 4b 65 79 20 21 3d 20 70 42 6c 6f 63 6b 2d 3e  eKey != pBlock->
0ec0: 68 52 65 61 64 4b 65 79 29 0a 20 20 7b 0a 20 20  hReadKey).  {.  
0ed0: 20 20 43 72 79 70 74 44 65 73 74 72 6f 79 4b 65    CryptDestroyKe
0ee0: 79 28 70 42 6c 6f 63 6b 2d 3e 68 57 72 69 74 65  y(pBlock->hWrite
0ef0: 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Key);.  }..  /* 
0f00: 49 66 20 74 68 65 72 65 27 73 20 65 78 74 72 61  If there's extra
0f10: 20 62 75 66 66 65 72 20 73 70 61 63 65 20 61 6c   buffer space al
0f20: 6c 6f 63 61 74 65 64 2c 20 66 72 65 65 20 69 74  located, free it
0f30: 20 61 73 20 77 65 6c 6c 20 2a 2f 0a 20 20 69 66   as well */.  if
0f40: 20 28 70 42 6c 6f 63 6b 2d 3e 70 76 43 72 79 70   (pBlock->pvCryp
0f50: 74 29 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  t).  {.    sqlit
0f60: 65 33 5f 66 72 65 65 28 70 42 6c 6f 63 6b 2d 3e  e3_free(pBlock->
0f70: 70 76 43 72 79 70 74 29 3b 0a 20 20 7d 0a 0a 20  pvCrypt);.  }.. 
0f80: 20 2f 2a 20 41 6c 6c 20 64 6f 6e 65 20 77 69 74   /* All done wit
0f90: 68 20 74 68 69 73 20 63 72 79 70 74 62 6c 6f 63  h this cryptbloc
0fa0: 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  k */.  sqlite3_f
0fb0: 72 65 65 28 70 42 6c 6f 63 6b 29 3b 0a 7d 0a 0a  ree(pBlock);.}..
0fc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
0fd0: 63 53 69 7a 65 43 68 61 6e 67 65 28 76 6f 69 64  cSizeChange(void
0fe0: 20 2a 70 41 72 67 2c 20 69 6e 74 20 70 61 67 65   *pArg, int page
0ff0: 53 69 7a 65 2c 20 69 6e 74 20 72 65 73 65 72 76  Size, int reserv
1000: 65 64 53 69 7a 65 29 0a 7b 0a 20 20 4c 50 43 52  edSize).{.  LPCR
1010: 59 50 54 42 4c 4f 43 4b 20 70 42 6c 6f 63 6b 20  YPTBLOCK pBlock 
1020: 3d 20 28 4c 50 43 52 59 50 54 42 4c 4f 43 4b 29  = (LPCRYPTBLOCK)
1030: 70 41 72 67 3b 0a 0a 20 20 69 66 20 28 70 42 6c  pArg;..  if (pBl
1040: 6f 63 6b 2d 3e 64 77 50 61 67 65 53 69 7a 65 20  ock->dwPageSize 
1050: 21 3d 20 70 61 67 65 53 69 7a 65 29 0a 20 20 7b  != pageSize).  {
1060: 0a 20 20 20 20 43 72 65 61 74 65 43 72 79 70 74  .    CreateCrypt
1070: 42 6c 6f 63 6b 28 70 42 6c 6f 63 6b 2d 3e 68 52  Block(pBlock->hR
1080: 65 61 64 4b 65 79 2c 20 70 42 6c 6f 63 6b 2d 3e  eadKey, pBlock->
1090: 70 50 61 67 65 72 2c 20 70 61 67 65 53 69 7a 65  pPager, pageSize
10a0: 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 2f  , pBlock);.    /
10b0: 2a 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c  * If this fails,
10c0: 20 70 76 43 72 79 70 74 20 77 69 6c 6c 20 62 65   pvCrypt will be
10d0: 20 4e 55 4c 4c 2c 20 61 6e 64 20 74 68 65 20 6e   NULL, and the n
10e0: 65 78 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33  ext time sqlite3
10f0: 43 6f 64 65 63 28 29 20 69 73 20 63 61 6c 6c 65  Codec() is calle
1100: 64 2c 20 69 74 20 77 69 6c 6c 20 72 65 73 75 6c  d, it will resul
1110: 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 2a 2f  t in an error */
1120: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 45 6e 63 72 79  .  }.}../* Encry
1130: 70 74 2f 44 65 63 72 79 70 74 20 66 75 6e 63 74  pt/Decrypt funct
1140: 69 6f 6e 61 6c 69 74 79 2c 20 63 61 6c 6c 65 64  ionality, called
1150: 20 62 79 20 70 61 67 65 72 2e 63 20 2a 2f 0a 76   by pager.c */.v
1160: 6f 69 64 20 2a 20 73 71 6c 69 74 65 33 43 6f 64  oid * sqlite3Cod
1170: 65 63 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 76  ec(void *pArg, v
1180: 6f 69 64 20 2a 64 61 74 61 2c 20 50 67 6e 6f 20  oid *data, Pgno 
1190: 6e 50 61 67 65 4e 75 6d 2c 20 69 6e 74 20 6e 4d  nPageNum, int nM
11a0: 6f 64 65 29 0a 7b 0a 20 20 4c 50 43 52 59 50 54  ode).{.  LPCRYPT
11b0: 42 4c 4f 43 4b 20 70 42 6c 6f 63 6b 20 3d 20 28  BLOCK pBlock = (
11c0: 4c 50 43 52 59 50 54 42 4c 4f 43 4b 29 70 41 72  LPCRYPTBLOCK)pAr
11d0: 67 3b 0a 20 20 44 57 4f 52 44 20 64 77 50 61 67  g;.  DWORD dwPag
11e0: 65 53 69 7a 65 3b 0a 20 20 4c 50 56 4f 49 44 20  eSize;.  LPVOID 
11f0: 70 76 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 0a  pvTemp = NULL;..
1200: 20 20 69 66 20 28 21 70 42 6c 6f 63 6b 29 20 72    if (!pBlock) r
1210: 65 74 75 72 6e 20 64 61 74 61 3b 0a 20 20 69 66  eturn data;.  if
1220: 20 28 70 42 6c 6f 63 6b 2d 3e 70 76 43 72 79 70   (pBlock->pvCryp
1230: 74 20 3d 3d 20 4e 55 4c 4c 29 20 72 65 74 75 72  t == NULL) retur
1240: 6e 20 4e 55 4c 4c 3b 20 2f 2a 20 54 68 69 73 20  n NULL; /* This 
1250: 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
1260: 43 72 65 61 74 65 43 72 79 70 74 42 6c 6f 63 6b  CreateCryptBlock
1270: 28 29 20 66 61 69 6c 65 64 20 74 6f 20 6d 61 6b  () failed to mak
1280: 65 20 73 63 72 61 74 63 68 20 73 70 61 63 65 20  e scratch space 
1290: 2a 2f 0a 0a 20 20 73 77 69 74 63 68 28 6e 4d 6f  */..  switch(nMo
12a0: 64 65 29 0a 20 20 7b 0a 20 20 63 61 73 65 20 30  de).  {.  case 0
12b0: 3a 20 2f 2a 20 55 6e 64 6f 20 61 20 22 63 61 73  : /* Undo a "cas
12c0: 65 20 37 22 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e 7" journal fil
12d0: 65 20 65 6e 63 72 79 70 74 69 6f 6e 20 2a 2f 0a  e encryption */.
12e0: 20 20 63 61 73 65 20 32 3a 20 2f 2a 20 52 65 6c    case 2: /* Rel
12f0: 6f 61 64 20 61 20 70 61 67 65 20 2a 2f 0a 20 20  oad a page */.  
1300: 63 61 73 65 20 33 3a 20 2f 2a 20 4c 6f 61 64 20  case 3: /* Load 
1310: 61 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 66  a page */.    if
1320: 20 28 21 70 42 6c 6f 63 6b 2d 3e 68 52 65 61 64   (!pBlock->hRead
1330: 4b 65 79 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  Key) break;..   
1340: 20 2f 2a 20 42 6c 6f 63 6b 20 63 69 70 68 65 72   /* Block cipher
1350: 73 20 6f 66 74 65 6e 20 6e 65 65 64 20 74 6f 20  s often need to 
1360: 77 72 69 74 65 20 65 78 74 72 61 20 70 61 64 64  write extra padd
1370: 69 6e 67 20 62 65 79 6f 6e 64 20 74 68 65 0a 20  ing beyond the. 
1380: 20 20 20 64 61 74 61 20 62 6c 6f 63 6b 2e 20 20     data block.  
1390: 57 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 68  We don't have th
13a0: 61 74 20 6c 75 78 75 72 79 20 66 6f 72 20 61 20  at luxury for a 
13b0: 67 69 76 65 6e 20 70 61 67 65 20 6f 66 20 64 61  given page of da
13c0: 74 61 20 73 6f 0a 20 20 20 20 77 65 20 6d 75 73  ta so.    we mus
13d0: 74 20 63 6f 70 79 20 74 68 65 20 70 61 67 65 20  t copy the page 
13e0: 64 61 74 61 20 74 6f 20 61 20 62 75 66 66 65 72  data to a buffer
13f0: 20 74 68 61 74 20 49 53 20 6c 61 72 67 65 20 65   that IS large e
1400: 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 0a 20 20  nough to hold.  
1410: 20 20 74 68 65 20 70 61 64 64 69 6e 67 2e 20 20    the padding.  
1420: 57 65 20 74 68 65 6e 20 65 6e 63 72 79 70 74 20  We then encrypt 
1430: 74 68 65 20 62 6c 6f 63 6b 20 61 6e 64 20 77 72  the block and wr
1440: 69 74 65 20 74 68 65 20 62 75 66 66 65 72 20 62  ite the buffer b
1450: 61 63 6b 20 74 6f 0a 20 20 20 20 74 68 65 20 70  ack to.    the p
1460: 61 67 65 20 77 69 74 68 6f 75 74 20 74 68 65 20  age without the 
1470: 75 6e 6e 65 63 65 73 73 61 72 79 20 70 61 64 64  unnecessary padd
1480: 69 6e 67 2e 0a 20 20 20 20 57 65 20 6f 6e 6c 79  ing..    We only
1490: 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c   use the special
14a0: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
14b0: 20 69 66 20 69 74 73 20 61 62 73 6f 6c 75 74 65   if its absolute
14c0: 6c 79 20 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f  ly necessary. */
14d0: 0a 20 20 20 20 69 66 20 28 70 42 6c 6f 63 6b 2d  .    if (pBlock-
14e0: 3e 64 77 43 72 79 70 74 53 69 7a 65 20 21 3d 20  >dwCryptSize != 
14f0: 70 42 6c 6f 63 6b 2d 3e 64 77 50 61 67 65 53 69  pBlock->dwPageSi
1500: 7a 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  ze).    {.      
1510: 43 6f 70 79 4d 65 6d 6f 72 79 28 28 28 4c 50 42  CopyMemory(((LPB
1520: 59 54 45 29 70 42 6c 6f 63 6b 2d 3e 70 76 43 72  YTE)pBlock->pvCr
1530: 79 70 74 29 20 2b 20 43 52 59 50 54 5f 4f 46 46  ypt) + CRYPT_OFF
1540: 53 45 54 2c 20 64 61 74 61 2c 20 70 42 6c 6f 63  SET, data, pBloc
1550: 6b 2d 3e 64 77 50 61 67 65 53 69 7a 65 29 3b 0a  k->dwPageSize);.
1560: 20 20 20 20 20 20 70 76 54 65 6d 70 20 3d 20 64        pvTemp = d
1570: 61 74 61 3b 0a 20 20 20 20 20 20 64 61 74 61 20  ata;.      data 
1580: 3d 20 28 28 4c 50 42 59 54 45 29 70 42 6c 6f 63  = ((LPBYTE)pBloc
1590: 6b 2d 3e 70 76 43 72 79 70 74 29 20 2b 20 43 52  k->pvCrypt) + CR
15a0: 59 50 54 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20  YPT_OFFSET;.    
15b0: 7d 0a 0a 20 20 20 20 64 77 50 61 67 65 53 69 7a  }..    dwPageSiz
15c0: 65 20 3d 20 70 42 6c 6f 63 6b 2d 3e 64 77 43 72  e = pBlock->dwCr
15d0: 79 70 74 53 69 7a 65 3b 0a 20 20 20 20 43 72 79  yptSize;.    Cry
15e0: 70 74 44 65 63 72 79 70 74 28 70 42 6c 6f 63 6b  ptDecrypt(pBlock
15f0: 2d 3e 68 52 65 61 64 4b 65 79 2c 20 30 2c 20 54  ->hReadKey, 0, T
1600: 52 55 45 2c 20 30 2c 20 28 4c 50 42 59 54 45 29  RUE, 0, (LPBYTE)
1610: 64 61 74 61 2c 20 26 64 77 50 61 67 65 53 69 7a  data, &dwPageSiz
1620: 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  e);..    /* If t
1630: 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20 61 6c  he encryption al
1640: 67 6f 72 69 74 68 6d 20 72 65 71 75 69 72 65 64  gorithm required
1650: 20 65 78 74 72 61 20 70 61 64 64 69 6e 67 20 61   extra padding a
1660: 6e 64 20 77 65 20 77 65 72 65 20 66 6f 72 63 65  nd we were force
1670: 64 20 74 6f 20 65 6e 63 72 79 70 74 20 6f 72 0a  d to encrypt or.
1680: 20 20 20 20 2a 2a 20 64 65 63 72 79 70 74 20 61      ** decrypt a
1690: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 61 67   copy of the pag
16a0: 65 20 64 61 74 61 20 74 6f 20 61 20 74 65 6d 70  e data to a temp
16b0: 20 62 75 66 66 65 72 2c 20 74 68 65 6e 20 77 72   buffer, then wr
16c0: 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
16d0: 20 6f 66 20 74 68 65 20 74 65 6d 70 0a 20 20 20   of the temp.   
16e0: 20 2a 2a 20 62 75 66 66 65 72 20 62 61 63 6b 20   ** buffer back 
16f0: 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61  to the page data
1700: 20 6d 69 6e 75 73 20 61 6e 79 20 70 61 64 64 69   minus any paddi
1710: 6e 67 20 61 70 70 6c 69 65 64 2e 0a 20 20 20 20  ng applied..    
1720: 2a 2f 0a 20 20 20 20 69 66 20 28 70 42 6c 6f 63  */.    if (pBloc
1730: 6b 2d 3e 64 77 43 72 79 70 74 53 69 7a 65 20 21  k->dwCryptSize !
1740: 3d 20 70 42 6c 6f 63 6b 2d 3e 64 77 50 61 67 65  = pBlock->dwPage
1750: 53 69 7a 65 29 0a 20 20 20 20 7b 0a 20 20 20 20  Size).    {.    
1760: 20 20 43 6f 70 79 4d 65 6d 6f 72 79 28 70 76 54    CopyMemory(pvT
1770: 65 6d 70 2c 20 64 61 74 61 2c 20 70 42 6c 6f 63  emp, data, pBloc
1780: 6b 2d 3e 64 77 50 61 67 65 53 69 7a 65 29 3b 0a  k->dwPageSize);.
1790: 20 20 20 20 20 20 64 61 74 61 20 3d 20 70 76 54        data = pvT
17a0: 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  emp;.    }.    b
17b0: 72 65 61 6b 3b 0a 20 20 63 61 73 65 20 36 3a 20  reak;.  case 6: 
17c0: 2f 2a 20 45 6e 63 72 79 70 74 20 61 20 70 61 67  /* Encrypt a pag
17d0: 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  e for the main d
17e0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
17f0: 20 20 20 20 69 66 20 28 21 70 42 6c 6f 63 6b 2d      if (!pBlock-
1800: 3e 68 57 72 69 74 65 4b 65 79 29 20 62 72 65 61  >hWriteKey) brea
1810: 6b 3b 0a 0a 20 20 20 20 43 6f 70 79 4d 65 6d 6f  k;..    CopyMemo
1820: 72 79 28 28 28 4c 50 42 59 54 45 29 70 42 6c 6f  ry(((LPBYTE)pBlo
1830: 63 6b 2d 3e 70 76 43 72 79 70 74 29 20 2b 20 43  ck->pvCrypt) + C
1840: 52 59 50 54 5f 4f 46 46 53 45 54 2c 20 64 61 74  RYPT_OFFSET, dat
1850: 61 2c 20 70 42 6c 6f 63 6b 2d 3e 64 77 50 61 67  a, pBlock->dwPag
1860: 65 53 69 7a 65 29 3b 0a 20 20 20 20 64 61 74 61  eSize);.    data
1870: 20 3d 20 28 28 4c 50 42 59 54 45 29 70 42 6c 6f   = ((LPBYTE)pBlo
1880: 63 6b 2d 3e 70 76 43 72 79 70 74 29 20 2b 20 43  ck->pvCrypt) + C
1890: 52 59 50 54 5f 4f 46 46 53 45 54 3b 0a 0a 20 20  RYPT_OFFSET;..  
18a0: 20 20 64 77 50 61 67 65 53 69 7a 65 20 3d 20 70    dwPageSize = p
18b0: 42 6c 6f 63 6b 2d 3e 64 77 50 61 67 65 53 69 7a  Block->dwPageSiz
18c0: 65 3b 0a 20 20 20 20 43 72 79 70 74 45 6e 63 72  e;.    CryptEncr
18d0: 79 70 74 28 70 42 6c 6f 63 6b 2d 3e 68 57 72 69  ypt(pBlock->hWri
18e0: 74 65 4b 65 79 2c 20 30 2c 20 54 52 55 45 2c 20  teKey, 0, TRUE, 
18f0: 30 2c 20 28 28 4c 50 42 59 54 45 29 70 42 6c 6f  0, ((LPBYTE)pBlo
1900: 63 6b 2d 3e 70 76 43 72 79 70 74 29 20 2b 20 43  ck->pvCrypt) + C
1910: 52 59 50 54 5f 4f 46 46 53 45 54 2c 20 26 64 77  RYPT_OFFSET, &dw
1920: 50 61 67 65 53 69 7a 65 2c 20 70 42 6c 6f 63 6b  PageSize, pBlock
1930: 2d 3e 64 77 43 72 79 70 74 53 69 7a 65 29 3b 0a  ->dwCryptSize);.
1940: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 63 61 73      break;.  cas
1950: 65 20 37 3a 20 2f 2a 20 45 6e 63 72 79 70 74 20  e 7: /* Encrypt 
1960: 61 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 6a  a page for the j
1970: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
1980: 20 20 20 2f 2a 20 55 6e 64 65 72 20 6e 6f 72 6d     /* Under norm
1990: 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  al circumstances
19a0: 2c 20 74 68 65 20 72 65 61 64 6b 65 79 20 69 73  , the readkey is
19b0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
19c0: 20 77 72 69 74 65 6b 65 79 2e 20 20 48 6f 77 65   writekey.  Howe
19d0: 76 65 72 2c 0a 20 20 20 20 77 68 65 6e 20 74 68  ver,.    when th
19e0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 62 65  e database is be
19f0: 69 6e 67 20 72 65 6b 65 79 65 64 2c 20 74 68 65  ing rekeyed, the
1a00: 20 72 65 61 64 6b 65 79 20 69 73 20 6e 6f 74 20   readkey is not 
1a10: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1a20: 77 72 69 74 65 6b 65 79 2e 0a 20 20 20 20 54 68  writekey..    Th
1a30: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1a40: 61 6c 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  al must be writt
1a50: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 6f 72 69  en using the ori
1a60: 67 69 6e 61 6c 20 6b 65 79 20 66 6f 72 20 74 68  ginal key for th
1a70: 65 0a 20 20 20 20 64 61 74 61 62 61 73 65 20 66  e.    database f
1a80: 69 6c 65 20 62 65 63 61 75 73 65 20 69 74 20 69  ile because it i
1a90: 73 2c 20 62 79 20 6e 61 74 75 72 65 2c 20 61 20  s, by nature, a 
1aa0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1ab0: 2e 0a 20 20 20 20 54 68 65 72 65 66 6f 72 65 2c  ..    Therefore,
1ac0: 20 66 6f 72 20 63 61 73 65 20 37 2c 20 77 68 65   for case 7, whe
1ad0: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69  n the rollback i
1ae0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
1af0: 20 61 6c 77 61 79 73 20 65 6e 63 72 79 70 74 20   always encrypt 
1b00: 75 73 69 6e 67 0a 20 20 20 20 74 68 65 20 64 61  using.    the da
1b10: 74 61 62 61 73 65 27 73 20 72 65 61 64 6b 65 79  tabase's readkey
1b20: 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72 61  , which is guara
1b30: 6e 74 65 65 64 20 74 6f 20 62 65 20 74 68 65 20  nteed to be the 
1b40: 73 61 6d 65 20 6b 65 79 20 74 68 61 74 20 77 61  same key that wa
1b50: 73 20 75 73 65 64 20 74 6f 0a 20 20 20 20 72 65  s used to.    re
1b60: 61 64 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ad the original 
1b70: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
1b80: 20 69 66 20 28 21 70 42 6c 6f 63 6b 2d 3e 68 52   if (!pBlock->hR
1b90: 65 61 64 4b 65 79 29 20 62 72 65 61 6b 3b 0a 0a  eadKey) break;..
1ba0: 20 20 20 20 43 6f 70 79 4d 65 6d 6f 72 79 28 28      CopyMemory((
1bb0: 28 4c 50 42 59 54 45 29 70 42 6c 6f 63 6b 2d 3e  (LPBYTE)pBlock->
1bc0: 70 76 43 72 79 70 74 29 20 2b 20 43 52 59 50 54  pvCrypt) + CRYPT
1bd0: 5f 4f 46 46 53 45 54 2c 20 64 61 74 61 2c 20 70  _OFFSET, data, p
1be0: 42 6c 6f 63 6b 2d 3e 64 77 50 61 67 65 53 69 7a  Block->dwPageSiz
1bf0: 65 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 28  e);.    data = (
1c00: 28 4c 50 42 59 54 45 29 70 42 6c 6f 63 6b 2d 3e  (LPBYTE)pBlock->
1c10: 70 76 43 72 79 70 74 29 20 2b 20 43 52 59 50 54  pvCrypt) + CRYPT
1c20: 5f 4f 46 46 53 45 54 3b 0a 0a 20 20 20 20 64 77  _OFFSET;..    dw
1c30: 50 61 67 65 53 69 7a 65 20 3d 20 70 42 6c 6f 63  PageSize = pBloc
1c40: 6b 2d 3e 64 77 50 61 67 65 53 69 7a 65 3b 0a 20  k->dwPageSize;. 
1c50: 20 20 20 43 72 79 70 74 45 6e 63 72 79 70 74 28     CryptEncrypt(
1c60: 70 42 6c 6f 63 6b 2d 3e 68 52 65 61 64 4b 65 79  pBlock->hReadKey
1c70: 2c 20 30 2c 20 54 52 55 45 2c 20 30 2c 20 28 28  , 0, TRUE, 0, ((
1c80: 4c 50 42 59 54 45 29 70 42 6c 6f 63 6b 2d 3e 70  LPBYTE)pBlock->p
1c90: 76 43 72 79 70 74 29 20 2b 20 43 52 59 50 54 5f  vCrypt) + CRYPT_
1ca0: 4f 46 46 53 45 54 2c 20 26 64 77 50 61 67 65 53  OFFSET, &dwPageS
1cb0: 69 7a 65 2c 20 70 42 6c 6f 63 6b 2d 3e 64 77 43  ize, pBlock->dwC
1cc0: 72 79 70 74 53 69 7a 65 29 3b 0a 20 20 20 20 62  ryptSize);.    b
1cd0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
1ce0: 75 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20  urn data;.}../* 
1cf0: 44 65 72 69 76 65 20 61 6e 20 65 6e 63 72 79 70  Derive an encryp
1d00: 74 69 6f 6e 20 6b 65 79 20 66 72 6f 6d 20 61 20  tion key from a 
1d10: 75 73 65 72 2d 73 75 70 70 6c 69 65 64 20 62 75  user-supplied bu
1d20: 66 66 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 48  ffer */.static H
1d30: 43 52 59 50 54 4b 45 59 20 44 65 72 69 76 65 4b  CRYPTKEY DeriveK
1d40: 65 79 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  ey(const void *p
1d50: 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79 29 0a 7b  Key, int nKey).{
1d60: 0a 20 20 48 43 52 59 50 54 48 41 53 48 20 68 48  .  HCRYPTHASH hH
1d70: 61 73 68 20 3d 20 30 3b 0a 20 20 48 43 52 59 50  ash = 0;.  HCRYP
1d80: 54 4b 45 59 20 20 68 4b 65 79 3b 0a 0a 20 20 69  TKEY  hKey;..  i
1d90: 66 20 28 21 70 4b 65 79 20 7c 7c 20 21 6e 4b 65  f (!pKey || !nKe
1da0: 79 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20  y) return 0;..  
1db0: 69 66 20 28 21 49 6e 69 74 69 61 6c 69 7a 65 50  if (!InitializeP
1dc0: 72 6f 76 69 64 65 72 28 29 29 0a 20 20 7b 0a 20  rovider()).  {. 
1dd0: 20 20 20 72 65 74 75 72 6e 20 4d 41 58 44 57 4f     return MAXDWO
1de0: 52 44 3b 0a 20 20 7d 0a 0a 20 20 7b 0a 20 20 20  RD;.  }..  {.   
1df0: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
1e00: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
1e10: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  ster = sqlite3_m
1e20: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
1e30: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
1e40: 41 53 54 45 52 29 3b 20 29 0a 20 20 20 20 73 71  ASTER); ).    sq
1e50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1e60: 72 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 20  r(pMaster);..   
1e70: 20 69 66 20 28 43 72 79 70 74 43 72 65 61 74 65   if (CryptCreate
1e80: 48 61 73 68 28 67 5f 68 50 72 6f 76 69 64 65 72  Hash(g_hProvider
1e90: 2c 20 43 41 4c 47 5f 53 48 41 31 2c 20 30 2c 20  , CALG_SHA1, 0, 
1ea0: 30 2c 20 26 68 48 61 73 68 29 29 0a 20 20 20 20  0, &hHash)).    
1eb0: 7b 0a 20 20 20 20 20 20 69 66 20 28 43 72 79 70  {.      if (Cryp
1ec0: 74 48 61 73 68 44 61 74 61 28 68 48 61 73 68 2c  tHashData(hHash,
1ed0: 20 28 4c 50 42 59 54 45 29 70 4b 65 79 2c 20 6e   (LPBYTE)pKey, n
1ee0: 4b 65 79 2c 20 30 29 29 0a 20 20 20 20 20 20 7b  Key, 0)).      {
1ef0: 0a 20 20 20 20 20 20 20 20 43 72 79 70 74 44 65  .        CryptDe
1f00: 72 69 76 65 4b 65 79 28 67 5f 68 50 72 6f 76 69  riveKey(g_hProvi
1f10: 64 65 72 2c 20 43 41 4c 47 5f 52 43 34 2c 20 68  der, CALG_RC4, h
1f20: 48 61 73 68 2c 20 30 2c 20 26 68 4b 65 79 29 3b  Hash, 0, &hKey);
1f30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43  .      }.      C
1f40: 72 79 70 74 44 65 73 74 72 6f 79 48 61 73 68 28  ryptDestroyHash(
1f50: 68 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 0a 20  hHash);.    }.. 
1f60: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1f70: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
1f80: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 68  .  }..  return h
1f90: 4b 65 79 3b 0a 7d 0a 0a 2f 2a 20 43 61 6c 6c 65  Key;.}../* Calle
1fa0: 64 20 62 79 20 73 71 6c 69 74 65 20 61 6e 64 20  d by sqlite and 
1fb0: 73 71 6c 69 74 65 33 5f 6b 65 79 5f 69 6e 74 65  sqlite3_key_inte
1fc0: 72 6f 70 20 74 6f 20 61 74 74 61 63 68 20 61 20  rop to attach a 
1fd0: 6b 65 79 20 74 6f 20 61 20 64 61 74 61 62 61 73  key to a databas
1fe0: 65 2e 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e. */.int sqlite
1ff0: 33 43 6f 64 65 63 41 74 74 61 63 68 28 73 71 6c  3CodecAttach(sql
2000: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 44  ite3 *db, int nD
2010: 62 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  b, const void *p
2020: 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79 4c 65 6e  Key, int nKeyLen
2030: 29 0a 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ).{.  int rc = S
2040: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 48  QLITE_ERROR;.  H
2050: 43 52 59 50 54 4b 45 59 20 68 4b 65 79 20 3d 20  CRYPTKEY hKey = 
2060: 30 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6b 65 79 20  0;..  /* No key 
2070: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 75 6c 64  specified, could
2080: 20 6d 65 61 6e 20 65 69 74 68 65 72 20 75 73 65   mean either use
2090: 20 74 68 65 20 6d 61 69 6e 20 64 62 27 73 20 65   the main db's e
20a0: 6e 63 72 79 70 74 69 6f 6e 20 6f 72 20 6e 6f 20  ncryption or no 
20b0: 65 6e 63 72 79 70 74 69 6f 6e 20 2a 2f 0a 20 20  encryption */.  
20c0: 69 66 20 28 21 70 4b 65 79 20 7c 7c 20 21 6e 4b  if (!pKey || !nK
20d0: 65 79 4c 65 6e 29 0a 20 20 7b 0a 20 20 20 20 69  eyLen).  {.    i
20e0: 66 20 28 21 6e 44 62 29 0a 20 20 20 20 7b 0a 20  f (!nDb).    {. 
20f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2100: 54 45 5f 4f 4b 3b 20 2f 2a 20 4d 61 69 6e 20 64  TE_OK; /* Main d
2110: 61 74 61 62 61 73 65 2c 20 6e 6f 20 6b 65 79 20  atabase, no key 
2120: 73 70 65 63 69 66 69 65 64 20 73 6f 20 6e 6f 74  specified so not
2130: 20 65 6e 63 72 79 70 74 65 64 20 2a 2f 0a 20 20   encrypted */.  
2140: 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 2f 2a 20    }.    else /* 
2150: 41 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  Attached databas
2160: 65 2c 20 75 73 65 20 74 68 65 20 6d 61 69 6e 20  e, use the main 
2170: 64 61 74 61 62 61 73 65 27 73 20 6b 65 79 20 2a  database's key *
2180: 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 2f 2a  /.    {.      /*
2190: 20 47 65 74 20 74 68 65 20 65 6e 63 72 79 70 74   Get the encrypt
21a0: 69 6f 6e 20 62 6c 6f 63 6b 20 66 6f 72 20 74 68  ion block for th
21b0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
21c0: 61 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20 64  and attempt to d
21d0: 75 70 6c 69 63 61 74 65 20 74 68 65 20 6b 65 79  uplicate the key
21e0: 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 75 73  .      ** for us
21f0: 65 20 62 79 20 74 68 65 20 61 74 74 61 63 68 65  e by the attache
2200: 64 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  d database.     
2210: 20 2a 2f 0a 20 20 20 20 20 20 50 61 67 65 72 20   */.      Pager 
2220: 2a 70 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  *p = sqlite3Btre
2230: 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30  ePager(db->aDb[0
2240: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20 4c 50  ].pBt);.      LP
2250: 43 52 59 50 54 42 4c 4f 43 4b 20 70 42 6c 6f 63  CRYPTBLOCK pBloc
2260: 6b 20 3d 20 28 4c 50 43 52 59 50 54 42 4c 4f 43  k = (LPCRYPTBLOC
2270: 4b 29 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  K)sqlite3pager_g
2280: 65 74 5f 63 6f 64 65 63 61 72 67 28 70 29 3b 0a  et_codecarg(p);.
2290: 0a 20 20 20 20 20 20 69 66 20 28 21 70 42 6c 6f  .      if (!pBlo
22a0: 63 6b 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ck) return SQLIT
22b0: 45 5f 4f 4b 3b 20 2f 2a 20 4d 61 69 6e 20 64 61  E_OK; /* Main da
22c0: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6e  tabase is not en
22d0: 63 72 79 70 74 65 64 20 73 6f 20 6e 65 69 74 68  crypted so neith
22e0: 65 72 20 77 69 6c 6c 20 62 65 20 61 6e 79 20 61  er will be any a
22f0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
2300: 20 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 21 70   */.      if (!p
2310: 42 6c 6f 63 6b 2d 3e 68 52 65 61 64 4b 65 79 29  Block->hReadKey)
2320: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2330: 4b 3b 20 2f 2a 20 4e 6f 74 20 65 6e 63 72 79 70  K; /* Not encryp
2340: 74 65 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  ted */..      if
2350: 20 28 21 43 72 79 70 74 44 75 70 6c 69 63 61 74   (!CryptDuplicat
2360: 65 4b 65 79 28 70 42 6c 6f 63 6b 2d 3e 68 52 65  eKey(pBlock->hRe
2370: 61 64 4b 65 79 2c 20 4e 55 4c 4c 2c 20 30 2c 20  adKey, NULL, 0, 
2380: 26 68 4b 65 79 29 29 0a 20 20 20 20 20 20 20 20  &hKey)).        
2390: 72 65 74 75 72 6e 20 72 63 3b 20 2f 2a 20 55 6e  return rc; /* Un
23a0: 61 62 6c 65 20 74 6f 20 64 75 70 6c 69 63 61 74  able to duplicat
23b0: 65 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 20  e the key */.   
23c0: 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 20 2f 2a   }.  }.  else /*
23d0: 20 55 73 65 72 2d 73 75 70 70 6c 69 65 64 20 70   User-supplied p
23e0: 61 73 73 70 68 72 61 73 65 2c 20 73 6f 20 63 72  assphrase, so cr
23f0: 65 61 74 65 20 61 20 63 72 79 70 74 6f 67 72 61  eate a cryptogra
2400: 70 68 69 63 20 6b 65 79 20 6f 75 74 20 6f 66 20  phic key out of 
2410: 69 74 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 68 4b  it */.  {.    hK
2420: 65 79 20 3d 20 44 65 72 69 76 65 4b 65 79 28 70  ey = DeriveKey(p
2430: 4b 65 79 2c 20 6e 4b 65 79 4c 65 6e 29 3b 0a 20  Key, nKeyLen);. 
2440: 20 20 20 69 66 20 28 68 4b 65 79 20 3d 3d 20 4d     if (hKey == M
2450: 41 58 44 57 4f 52 44 29 0a 20 20 20 20 7b 0a 23  AXDWORD).    {.#
2460: 69 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  if SQLITE_VERSIO
2470: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 33 30 30 38  N_NUMBER >= 3008
2480: 30 30 37 0a 20 20 20 20 20 20 73 71 6c 69 74 65  007.      sqlite
2490: 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
24a0: 2c 20 72 63 2c 20 53 51 4c 49 54 45 43 52 59 50  , rc, SQLITECRYP
24b0: 54 45 52 52 4f 52 5f 50 52 4f 56 49 44 45 52 29  TERROR_PROVIDER)
24c0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 73 71  ;.#else.      sq
24d0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
24e0: 63 2c 20 53 51 4c 49 54 45 43 52 59 50 54 45 52  c, SQLITECRYPTER
24f0: 52 4f 52 5f 50 52 4f 56 49 44 45 52 29 3b 0a 23  ROR_PROVIDER);.#
2500: 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75  endif.      retu
2510: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
2520: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20  ..  /* Create a 
2530: 6e 65 77 20 65 6e 63 72 79 70 74 69 6f 6e 20 62  new encryption b
2540: 6c 6f 63 6b 20 61 6e 64 20 61 73 73 69 67 6e 20  lock and assign 
2550: 74 68 65 20 63 6f 64 65 63 20 74 6f 20 74 68 65  the codec to the
2560: 20 6e 65 77 20 61 74 74 61 63 68 65 64 20 64 61   new attached da
2570: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 20 28  tabase */.  if (
2580: 68 4b 65 79 29 0a 20 20 7b 0a 20 20 20 20 50 61  hKey).  {.    Pa
2590: 67 65 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  ger *p = sqlite3
25a0: 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61  BtreePager(db->a
25b0: 44 62 5b 6e 44 62 5d 2e 70 42 74 29 3b 0a 20 20  Db[nDb].pBt);.  
25c0: 20 20 4c 50 43 52 59 50 54 42 4c 4f 43 4b 20 70    LPCRYPTBLOCK p
25d0: 42 6c 6f 63 6b 20 3d 20 43 72 65 61 74 65 43 72  Block = CreateCr
25e0: 79 70 74 42 6c 6f 63 6b 28 68 4b 65 79 2c 20 70  yptBlock(hKey, p
25f0: 2c 20 2d 31 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  , -1, NULL);.   
2600: 20 69 66 20 28 21 70 42 6c 6f 63 6b 29 20 72 65   if (!pBlock) re
2610: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2620: 4d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50  M;..    sqlite3P
2630: 61 67 65 72 53 65 74 43 6f 64 65 63 28 70 2c 20  agerSetCodec(p, 
2640: 73 71 6c 69 74 65 33 43 6f 64 65 63 2c 20 73 71  sqlite3Codec, sq
2650: 6c 69 74 65 33 43 6f 64 65 63 53 69 7a 65 43 68  lite3CodecSizeCh
2660: 61 6e 67 65 2c 20 73 71 6c 69 74 65 33 43 6f 64  ange, sqlite3Cod
2670: 65 63 46 72 65 65 2c 20 70 42 6c 6f 63 6b 29 3b  ecFree, pBlock);
2680: 0a 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ..    rc = SQLIT
2690: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
26a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4f 6e 63  rn rc;.}../* Onc
26b0: 65 20 61 20 70 61 73 73 77 6f 72 64 20 68 61 73  e a password has
26c0: 20 62 65 65 6e 20 73 75 70 70 6c 69 65 64 20 61   been supplied a
26d0: 6e 64 20 61 20 6b 65 79 20 63 72 65 61 74 65 64  nd a key created
26e0: 2c 20 77 65 20 64 6f 6e 27 74 20 6b 65 65 70 20  , we don't keep 
26f0: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
2700: 70 61 73 73 77 6f 72 64 20 66 6f 72 20 73 65 63  password for sec
2710: 75 72 69 74 79 20 70 75 72 70 6f 73 65 73 2e 20  urity purposes. 
2720: 20 54 68 65 72 65 66 6f 72 65 20 72 65 74 75 72   Therefore retur
2730: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20  n NULL..*/.void 
2740: 73 71 6c 69 74 65 33 43 6f 64 65 63 47 65 74 4b  sqlite3CodecGetK
2750: 65 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ey(sqlite3 *db, 
2760: 69 6e 74 20 6e 44 62 2c 20 76 6f 69 64 20 2a 2a  int nDb, void **
2770: 70 70 4b 65 79 2c 20 69 6e 74 20 2a 70 6e 4b 65  ppKey, int *pnKe
2780: 79 4c 65 6e 29 0a 7b 0a 20 20 42 74 72 65 65 20  yLen).{.  Btree 
2790: 2a 70 62 74 20 3d 20 64 62 2d 3e 61 44 62 5b 30  *pbt = db->aDb[0
27a0: 5d 2e 70 42 74 3b 0a 20 20 50 61 67 65 72 20 2a  ].pBt;.  Pager *
27b0: 70 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  p = sqlite3Btree
27c0: 50 61 67 65 72 28 70 62 74 29 3b 0a 20 20 4c 50  Pager(pbt);.  LP
27d0: 43 52 59 50 54 42 4c 4f 43 4b 20 70 42 6c 6f 63  CRYPTBLOCK pBloc
27e0: 6b 20 3d 20 28 4c 50 43 52 59 50 54 42 4c 4f 43  k = (LPCRYPTBLOC
27f0: 4b 29 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  K)sqlite3pager_g
2800: 65 74 5f 63 6f 64 65 63 61 72 67 28 70 29 3b 0a  et_codecarg(p);.
2810: 0a 20 20 69 66 20 28 70 70 4b 65 79 29 20 2a 70  .  if (ppKey) *p
2820: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 20 28  pKey = 0;.  if (
2830: 70 6e 4b 65 79 4c 65 6e 29 20 2a 70 6e 4b 65 79  pnKeyLen) *pnKey
2840: 4c 65 6e 20 3d 20 70 42 6c 6f 63 6b 20 3f 20 31  Len = pBlock ? 1
2850: 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f  : 0;.}../* We do
2860: 20 6e 6f 74 20 61 74 74 61 63 68 20 74 68 69 73   not attach this
2870: 20 6b 65 79 20 74 6f 20 74 68 65 20 74 65 6d 70   key to the temp
2880: 20 73 74 6f 72 65 2c 20 6f 6e 6c 79 20 74 68 65   store, only the
2890: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20   main database. 
28a0: 2a 2f 0a 53 51 4c 49 54 45 5f 41 50 49 20 69 6e  */.SQLITE_API in
28b0: 74 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32  t sqlite3_key_v2
28c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
28d0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
28e0: 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  e, const void *p
28f0: 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79 29 0a 7b  Key, int nKey).{
2900: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2910: 33 43 6f 64 65 63 41 74 74 61 63 68 28 64 62 2c  3CodecAttach(db,
2920: 20 30 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b   0, pKey, nKey);
2930: 0a 7d 0a 0a 53 51 4c 49 54 45 5f 41 50 49 20 69  .}..SQLITE_API i
2940: 6e 74 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 73  nt sqlite3_key(s
2950: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
2960: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e  t void *pKey, in
2970: 74 20 6e 4b 65 79 29 0a 7b 0a 20 20 72 65 74 75  t nKey).{.  retu
2980: 72 6e 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76  rn sqlite3_key_v
2990: 32 28 64 62 2c 20 30 2c 20 70 4b 65 79 2c 20 6e  2(db, 0, pKey, n
29a0: 4b 65 79 29 3b 0a 7d 0a 0a 2f 2a 20 43 68 61 6e  Key);.}../* Chan
29b0: 67 65 73 20 74 68 65 20 65 6e 63 72 79 70 74 69  ges the encrypti
29c0: 6f 6e 20 6b 65 79 20 66 6f 72 20 61 6e 20 65 78  on key for an ex
29d0: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 2e  isting database.
29e0: 20 2a 2f 0a 53 51 4c 49 54 45 5f 41 50 49 20 69   */.SQLITE_API i
29f0: 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79  nt sqlite3_rekey
2a00: 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  _v2(sqlite3 *db,
2a10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2a20: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Name, const void
2a30: 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79   *pKey, int nKey
2a40: 29 0a 7b 0a 20 20 42 74 72 65 65 20 2a 70 62 74  ).{.  Btree *pbt
2a50: 20 3d 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42   = db->aDb[0].pB
2a60: 74 3b 0a 20 20 50 61 67 65 72 20 2a 70 20 3d 20  t;.  Pager *p = 
2a70: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
2a80: 72 28 70 62 74 29 3b 0a 20 20 4c 50 43 52 59 50  r(pbt);.  LPCRYP
2a90: 54 42 4c 4f 43 4b 20 70 42 6c 6f 63 6b 20 3d 20  TBLOCK pBlock = 
2aa0: 28 4c 50 43 52 59 50 54 42 4c 4f 43 4b 29 73 71  (LPCRYPTBLOCK)sq
2ab0: 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 5f 63  lite3pager_get_c
2ac0: 6f 64 65 63 61 72 67 28 70 29 3b 0a 20 20 48 43  odecarg(p);.  HC
2ad0: 52 59 50 54 4b 45 59 20 68 4b 65 79 20 3d 20 44  RYPTKEY hKey = D
2ae0: 65 72 69 76 65 4b 65 79 28 70 4b 65 79 2c 20 6e  eriveKey(pKey, n
2af0: 4b 65 79 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Key);.  int rc =
2b00: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a   SQLITE_ERROR;..
2b10: 20 20 69 66 20 28 68 4b 65 79 20 3d 3d 20 4d 41    if (hKey == MA
2b20: 58 44 57 4f 52 44 29 0a 20 20 7b 0a 23 69 66 20  XDWORD).  {.#if 
2b30: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
2b40: 55 4d 42 45 52 20 3e 3d 20 33 30 30 38 30 30 37  UMBER >= 3008007
2b50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
2b60: 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c  rWithMsg(db, rc,
2b70: 20 53 51 4c 49 54 45 43 52 59 50 54 45 52 52 4f   SQLITECRYPTERRO
2b80: 52 5f 50 52 4f 56 49 44 45 52 29 3b 0a 23 65 6c  R_PROVIDER);.#el
2b90: 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  se.    sqlite3Er
2ba0: 72 6f 72 28 64 62 2c 20 72 63 2c 20 53 51 4c 49  ror(db, rc, SQLI
2bb0: 54 45 43 52 59 50 54 45 52 52 4f 52 5f 50 52 4f  TECRYPTERROR_PRO
2bc0: 56 49 44 45 52 29 3b 0a 23 65 6e 64 69 66 0a 20  VIDER);.#endif. 
2bd0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2be0: 7d 0a 0a 20 20 69 66 20 28 21 70 42 6c 6f 63 6b  }..  if (!pBlock
2bf0: 20 26 26 20 21 68 4b 65 79 29 20 72 65 74 75 72   && !hKey) retur
2c00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  n SQLITE_OK; /* 
2c10: 57 61 73 6e 27 74 20 65 6e 63 72 79 70 74 65 64  Wasn't encrypted
2c20: 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 20 2a   to begin with *
2c30: 2f 0a 0a 20 20 2f 2a 20 54 6f 20 72 65 6b 65 79  /..  /* To rekey
2c40: 20 61 20 64 61 74 61 62 61 73 65 2c 20 77 65 20   a database, we 
2c50: 63 68 61 6e 67 65 20 74 68 65 20 77 72 69 74 65  change the write
2c60: 6b 65 79 20 66 6f 72 20 74 68 65 20 70 61 67 65  key for the page
2c70: 72 2e 20 20 54 68 65 20 72 65 61 64 6b 65 79 20  r.  The readkey 
2c80: 72 65 6d 61 69 6e 73 0a 20 20 2a 2a 20 74 68 65  remains.  ** the
2c90: 20 73 61 6d 65 0a 20 20 2a 2f 0a 20 20 69 66 20   same.  */.  if 
2ca0: 28 21 70 42 6c 6f 63 6b 29 20 2f 2a 20 45 6e 63  (!pBlock) /* Enc
2cb0: 72 79 70 74 20 61 6e 20 75 6e 65 6e 63 72 79 70  rypt an unencryp
2cc0: 74 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ted database */.
2cd0: 20 20 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d    {.    pBlock =
2ce0: 20 43 72 65 61 74 65 43 72 79 70 74 42 6c 6f 63   CreateCryptBloc
2cf0: 6b 28 68 4b 65 79 2c 20 70 2c 20 2d 31 2c 20 4e  k(hKey, p, -1, N
2d00: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 21 70  ULL);.    if (!p
2d10: 42 6c 6f 63 6b 29 0a 20 20 20 20 20 20 72 65 74  Block).      ret
2d20: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2d30: 3b 0a 0a 20 20 20 20 70 42 6c 6f 63 6b 2d 3e 68  ;..    pBlock->h
2d40: 52 65 61 64 4b 65 79 20 3d 20 30 3b 20 2f 2a 20  ReadKey = 0; /* 
2d50: 4f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  Original databas
2d60: 65 20 69 73 20 6e 6f 74 20 65 6e 63 72 79 70 74  e is not encrypt
2d70: 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
2d80: 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 73  3PagerSetCodec(s
2d90: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
2da0: 28 70 62 74 29 2c 20 73 71 6c 69 74 65 33 43 6f  (pbt), sqlite3Co
2db0: 64 65 63 2c 20 73 71 6c 69 74 65 33 43 6f 64 65  dec, sqlite3Code
2dc0: 63 53 69 7a 65 43 68 61 6e 67 65 2c 20 73 71 6c  cSizeChange, sql
2dd0: 69 74 65 33 43 6f 64 65 63 46 72 65 65 2c 20 70  ite3CodecFree, p
2de0: 42 6c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 65 6c  Block);.  }.  el
2df0: 73 65 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65  se /* Change the
2e00: 20 77 72 69 74 65 6b 65 79 20 66 6f 72 20 61 6e   writekey for an
2e10: 20 61 6c 72 65 61 64 79 2d 65 6e 63 72 79 70 74   already-encrypt
2e20: 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ed database */. 
2e30: 20 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 2d 3e 68   {.    pBlock->h
2e40: 57 72 69 74 65 4b 65 79 20 3d 20 68 4b 65 79 3b  WriteKey = hKey;
2e50: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
2e60: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
2e70: 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 74  mutex);..  /* St
2e80: 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
2e90: 6e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  n */.  rc = sqli
2ea0: 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
2eb0: 6e 73 28 70 62 74 2c 20 31 29 3b 0a 0a 20 20 69  ns(pbt, 1);..  i
2ec0: 66 20 28 21 72 63 29 0a 20 20 7b 0a 20 20 20 20  f (!rc).  {.    
2ed0: 2f 2a 20 52 65 77 72 69 74 65 20 61 6c 6c 20 74  /* Rewrite all t
2ee0: 68 65 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  he pages in the 
2ef0: 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74  database using t
2f00: 68 65 20 6e 65 77 20 65 6e 63 72 79 70 74 69 6f  he new encryptio
2f10: 6e 20 6b 65 79 20 2a 2f 0a 20 20 20 20 50 67 6e  n key */.    Pgn
2f20: 6f 20 6e 50 61 67 65 3b 0a 20 20 20 20 50 67 6e  o nPage;.    Pgn
2f30: 6f 20 6e 53 6b 69 70 20 3d 20 50 41 47 45 52 5f  o nSkip = PAGER_
2f40: 4d 4a 5f 50 47 4e 4f 28 70 29 3b 0a 20 20 20 20  MJ_PGNO(p);.    
2f50: 44 62 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  DbPage *pPage;. 
2f60: 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 69     Pgno n;.    i
2f70: 6e 74 20 63 6f 75 6e 74 3b 0a 0a 20 20 20 20 73  nt count;..    s
2f80: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
2f90: 6f 75 6e 74 28 70 2c 20 26 63 6f 75 6e 74 29 3b  ount(p, &count);
2fa0: 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67  .    nPage = (Pg
2fb0: 6e 6f 29 63 6f 75 6e 74 3b 0a 0a 20 20 20 20 66  no)count;..    f
2fc0: 6f 72 28 6e 20 3d 20 31 3b 20 6e 20 3c 3d 20 6e  or(n = 1; n <= n
2fd0: 50 61 67 65 3b 20 6e 20 2b 2b 29 0a 20 20 20 20  Page; n ++).    
2fe0: 7b 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3d 3d  {.      if (n ==
2ff0: 20 6e 53 6b 69 70 29 20 63 6f 6e 74 69 6e 75 65   nSkip) continue
3000: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 49 4e 54  ;.      rc = INT
3010: 45 52 4f 50 5f 43 4f 44 45 43 5f 47 45 54 5f 50  EROP_CODEC_GET_P
3020: 41 47 45 52 28 70 2c 20 6e 2c 20 26 70 50 61 67  AGER(p, n, &pPag
3030: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 21 72 63  e);.      if(!rc
3040: 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ).      {.      
3050: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
3060: 67 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b  gerWrite(pPage);
3070: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3080: 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
3090: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
30a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
30b0: 20 73 75 63 63 65 65 64 65 64 2c 20 74 72 79 20   succeeded, try 
30c0: 61 6e 64 20 63 6f 6d 6d 69 74 20 74 68 65 20 74  and commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
30e0: 69 66 20 28 21 72 63 29 0a 20 20 7b 0a 20 20 20  if (!rc).  {.   
30f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
3100: 65 65 43 6f 6d 6d 69 74 28 70 62 74 29 3b 0a 20  eeCommit(pbt);. 
3110: 20 7d 0a 0a 20 20 2f 2f 20 49 66 20 77 65 20 66   }..  // If we f
3120: 61 69 6c 65 64 2c 20 72 6f 6c 6c 62 61 63 6b 20  ailed, rollback 
3130: 2a 2f 0a 20 20 69 66 20 28 72 63 29 0a 20 20 7b  */.  if (rc).  {
3140: 0a 23 69 66 20 53 51 4c 49 54 45 5f 56 45 52 53  .#if SQLITE_VERS
3150: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 33 30  ION_NUMBER >= 30
3160: 30 38 30 30 37 0a 20 20 20 20 73 71 6c 69 74 65  08007.    sqlite
3170: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
3180: 62 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  bt, SQLITE_OK, 0
3190: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c  );.#else.    sql
31a0: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
31b0: 6b 28 70 62 74 2c 20 53 51 4c 49 54 45 5f 4f 4b  k(pbt, SQLITE_OK
31c0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
31d0: 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65 65   /* If we succee
31e0: 64 65 64 2c 20 64 65 73 74 72 6f 79 20 61 6e 79  ded, destroy any
31f0: 20 70 72 65 76 69 6f 75 73 20 72 65 61 64 20 6b   previous read k
3200: 65 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  ey this database
3210: 20 75 73 65 64 0a 20 20 2a 2a 20 61 6e 64 20 6d   used.  ** and m
3220: 61 6b 65 20 74 68 65 20 72 65 61 64 6b 65 79 20  ake the readkey 
3230: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 77 72 69  equal to the wri
3240: 74 65 6b 65 79 0a 20 20 2a 2f 0a 20 20 69 66 20  tekey.  */.  if 
3250: 28 21 72 63 29 0a 20 20 7b 0a 20 20 20 20 69 66  (!rc).  {.    if
3260: 20 28 70 42 6c 6f 63 6b 2d 3e 68 52 65 61 64 4b   (pBlock->hReadK
3270: 65 79 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  ey).    {.      
3280: 43 72 79 70 74 44 65 73 74 72 6f 79 4b 65 79 28  CryptDestroyKey(
3290: 70 42 6c 6f 63 6b 2d 3e 68 52 65 61 64 4b 65 79  pBlock->hReadKey
32a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 6c  );.    }.    pBl
32b0: 6f 63 6b 2d 3e 68 52 65 61 64 4b 65 79 20 3d 20  ock->hReadKey = 
32c0: 70 42 6c 6f 63 6b 2d 3e 68 57 72 69 74 65 4b 65  pBlock->hWriteKe
32d0: 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 57 65 20 66  y;.  }.  /* We f
32e0: 61 69 6c 65 64 2e 20 20 44 65 73 74 72 6f 79 20  ailed.  Destroy 
32f0: 74 68 65 20 6e 65 77 20 77 72 69 74 65 6b 65 79  the new writekey
3300: 20 28 69 66 20 74 68 65 72 65 20 77 61 73 20 6f   (if there was o
3310: 6e 65 29 20 61 6e 64 20 72 65 76 65 72 74 20 69  ne) and revert i
3320: 74 20 62 61 63 6b 20 74 6f 0a 20 20 2a 2a 20 74  t back to.  ** t
3330: 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 61 64  he original read
3340: 6b 65 79 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 0a  key.  */.  else.
3350: 20 20 7b 0a 20 20 20 20 69 66 20 28 70 42 6c 6f    {.    if (pBlo
3360: 63 6b 2d 3e 68 57 72 69 74 65 4b 65 79 29 0a 20  ck->hWriteKey). 
3370: 20 20 20 7b 0a 20 20 20 20 20 20 43 72 79 70 74     {.      Crypt
3380: 44 65 73 74 72 6f 79 4b 65 79 28 70 42 6c 6f 63  DestroyKey(pBloc
3390: 6b 2d 3e 68 57 72 69 74 65 4b 65 79 29 3b 0a 20  k->hWriteKey);. 
33a0: 20 20 20 7d 0a 20 20 20 20 70 42 6c 6f 63 6b 2d     }.    pBlock-
33b0: 3e 68 57 72 69 74 65 4b 65 79 20 3d 20 70 42 6c  >hWriteKey = pBl
33c0: 6f 63 6b 2d 3e 68 52 65 61 64 4b 65 79 3b 0a 20  ock->hReadKey;. 
33d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
33e0: 72 65 61 64 6b 65 79 20 61 6e 64 20 77 72 69 74  readkey and writ
33f0: 65 6b 65 79 20 61 72 65 20 62 6f 74 68 20 65 6d  ekey are both em
3400: 70 74 79 2c 20 74 68 65 72 65 27 73 20 6e 6f 20  pty, there's no 
3410: 6e 65 65 64 20 66 6f 72 20 61 20 63 6f 64 65 63  need for a codec
3420: 20 6f 6e 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   on this.  ** pa
3430: 67 65 72 20 61 6e 79 6d 6f 72 65 2e 20 20 44 65  ger anymore.  De
3440: 73 74 72 6f 79 20 74 68 65 20 63 72 79 70 74 20  stroy the crypt 
3450: 62 6c 6f 63 6b 20 61 6e 64 20 72 65 6d 6f 76 65  block and remove
3460: 20 74 68 65 20 63 6f 64 65 63 20 66 72 6f 6d 20   the codec from 
3470: 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a  the pager..  */.
3480: 20 20 69 66 20 28 21 70 42 6c 6f 63 6b 2d 3e 68    if (!pBlock->h
3490: 52 65 61 64 4b 65 79 20 26 26 20 21 70 42 6c 6f  ReadKey && !pBlo
34a0: 63 6b 2d 3e 68 57 72 69 74 65 4b 65 79 29 0a 20  ck->hWriteKey). 
34b0: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   {.    sqlite3Pa
34c0: 67 65 72 53 65 74 43 6f 64 65 63 28 70 2c 20 4e  gerSetCodec(p, N
34d0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  ULL, NULL, NULL,
34e0: 20 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 0a 20 20 73   NULL);.  }..  s
34f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
3500: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a  ve(db->mutex);..
3510: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3520: 53 51 4c 49 54 45 5f 41 50 49 20 69 6e 74 20 73  SQLITE_API int s
3530: 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 73 71 6c  qlite3_rekey(sql
3540: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
3550: 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20  void *pKey, int 
3560: 6e 4b 65 79 29 0a 7b 0a 20 20 72 65 74 75 72 6e  nKey).{.  return
3570: 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76   sqlite3_rekey_v
3580: 32 28 64 62 2c 20 30 2c 20 70 4b 65 79 2c 20 6e  2(db, 0, pKey, n
3590: 4b 65 79 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  Key);.}..#endif 
35a0: 2f 2a 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  /* SQLITE_HAS_CO
35b0: 44 45 43 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  DEC */.#endif /*
35c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
35d0: 4b 49 4f 20 2a 2f 0a                             KIO */.