首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

董淳光SQLITE3 施用总结(4)-转

2012-08-01 
董淳光SQLITE3 使用总结(4)--转case 2: //重载一个页case 3: //载入一个页???? if (!pBlock-ReadKey) bre

董淳光SQLITE3 使用总结(4)--转


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;

}

热点排行