SQLite3 API编程手册2011(4)

2019-08-31 22:04

//加密/解密函数, 被pager调用

void * sqlite3Codec(void *pArg, unsigned char *data, Pgno nPageNum, int nMode); //设置密码函数

int __stdcall sqlite3_key_interop(sqlite3 *db, const void *pKey, int nKeySize); // 修改密码函数

int __stdcall sqlite3_rekey_interop(sqlite3 *db, const void *pKey, int nKeySize);

//销毁一个加密块及相关的缓冲区,密钥.

static void DestroyCryptBlock(LPCryptBlock pBlock);

static void * sqlite3pager_get_codecarg(Pager *pPager); void sqlite3pager_set_codec(Pager *pPager,void *(*xCodec)(void*,void*,Pgno,int),void *pCodecArg );

//加密/解密函数, 被pager调用

void * sqlite3Codec(void *pArg, unsigned char *data, Pgno nPageNum, int nMode) {

LPCryptBlock pBlock = (LPCryptBlock)pArg; unsigned int dwPageSize = 0; if (!pBlock) return data;

// 确保pager的页长度和加密块的页长度相等.如果改变,就需要调整. if (nMode != 2) {

PgHdr *pageHeader;

pageHeader = DATA_TO_PGHDR(data);

if (pageHeader->pPager->pageSize != pBlock->PageSize) {

CreateCryptBlock(0, pageHeader->pPager, pBlock); } }

switch(nMode)

{

case 0: // Undo a \ case 2: //重载一个页 case 3: //载入一个页

if (!pBlock->ReadKey) break;

dwPageSize = pBlock->PageSize;

My_DeEncrypt_Func(data, dwPageSize, pBlock->ReadKey, DB_KEY_LENGTH_BYTE ); break;

case 6: //加密一个主数据库文件的页 if (!pBlock->WriteKey) break;

memcpy(pBlock->Data CRYPT_OFFSET, data, pBlock->PageSize); data = pBlock->Data CRYPT_OFFSET;

dwPageSize = pBlock->PageSize;

My_Encrypt_Func(data , dwPageSize, pBlock->WriteKey, DB_KEY_LENGTH_BYTE ); break;

case 7: //加密事务文件的页 if (!pBlock->ReadKey) break;

memcpy(pBlock->Data CRYPT_OFFSET, data, pBlock->PageSize); data = pBlock->Data CRYPT_OFFSET; dwPageSize = pBlock->PageSize;

My_Encrypt_Func( data, dwPageSize, pBlock->ReadKey, DB_KEY_LENGTH_BYTE ); break; }

return data; } //

销毁一个加密块及相关的缓冲区,密钥.

static void DestroyCryptBlock(LPCryptBlock pBlock) {

//销毁读密钥.

if (pBlock->ReadKey){

sqliteFree(pBlock->ReadKey); }

//如果写密钥存在并且不等于读密钥,也销毁.

if (pBlock->WriteKey && pBlock->WriteKey != pBlock->ReadKey){ sqliteFree(pBlock->WriteKey); }

if(pBlock->Data){

sqliteFree(pBlock->Data); }

//释放加密块.

sqliteFree(pBlock); }

static void * sqlite3pager_get_codecarg(Pager *pPager) {

return (pPager->xCodec) ? pPager->pCodecArg: NULL; }

// 从用户提供的缓冲区中得到一个加密密钥

static unsigned char * DeriveKey(const void *pKey, int nKeyLen) {

unsigned char * hKey = NULL; int j;

if( pKey == NULL || nKeyLen == 0 ) {

return NULL; }

hKey = sqliteMalloc( DB_KEY_LENGTH_BYTE 1 ); if( hKey == NULL ) {

return NULL; }

hKey[ DB_KEY_LENGTH_BYTE ] = 0; if( nKeyLen < DB_KEY_LENGTH_BYTE ) {

memcpy( hKey, pKey, nKeyLen ); //先拷贝得到密钥前面的部分 j = DB_KEY_LENGTH_BYTE - nKeyLen; //补充密钥后面的部分

memset( hKey nKeyLen, DB_KEY_PADDING, j ); } else

{ //密钥位数已经足够,直接把密钥取过来

memcpy( hKey, pKey, DB_KEY_LENGTH_BYTE ); }

return hKey; }

//创建或更新一个页的加密算法索引.此函数会申请缓冲区.

static LPCryptBlock CreateCryptBlock(unsigned char* hKey, Pager *pager, LPCryptBlock pExisting) {

LPCryptBlock pBlock;

if (!pExisting) //创建新加密块 {

pBlock = sqliteMalloc(sizeof(CryptBlock)); memset(pBlock, 0, sizeof(CryptBlock)); pBlock->ReadKey = hKey; pBlock->WriteKey = hKey;

pBlock->PageSize = pager->pageSize;

pBlock->Data = (unsigned char*)sqliteMalloc(pBlock->PageSize CRYPT_OFFSET); }

else //更新存在的加密块 {

pBlock = pExisting;

if ( pBlock->PageSize != pager->pageSize && !pBlock->Data){ sqliteFree(pBlock->Data);

pBlock->PageSize = pager->pageSize;

pBlock->Data = (unsigned char*)sqliteMalloc(pBlock->PageSize CRYPT_OFFSET); } }

memset(pBlock->Data, 0, pBlock->PageSize CRYPT_OFFSET);

return pBlock; }

void sqlite3pager_set_codec( Pager *pPager,

void *(*xCodec)(void*,void*,Pgno,int), void *pCodecArg ) {

pPager->xCodec = xCodec; pPager->pCodecArg = pCodecArg; }

int sqlite3_key(sqlite3 *db, const void *pKey, int nKey) {

return sqlite3_key_interop(db, pKey, nKey); }

int sqlite3_rekey(sqlite3 *db, const void *pKey, int nKey)


SQLite3 API编程手册2011(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:“十三五”重点项目-苯乙烯类热塑性弹性体项目可行性研究报告 -

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: