亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? xxteacrypt.c

?? 定時器for timer for ic chip
?? C
字號:
#ifdef SQLITE_SOURCESTD
  #include <pager.c>
#else
  #include <sqlite3.c>
#endif

//#define DATA_TO_PGHDR(D)  (&((PgHdr*)(D)))

//舊版
//#define DATA_TO_PGHDR(D)  (&((PgHdr*)(D))[-1])

#ifndef SQLITE_OMIT_DISKIO
#ifdef SQLITE_HAS_CODEC

#include "md5c.c"

#define CRYPT_OFFSET 8
#define BYTE unsigned char


typedef struct _CryptBlock
{
    BYTE*     ReadKey;     // 讀數據庫和寫入事務的密鑰
    BYTE*     WriteKey;    // 寫入數據庫的密鑰
    int       PageSize;    // 頁的大小
    BYTE*     Data;
} CryptBlock, *LPCryptBlock;


int xxtea( int * v, int n , int * k ) {
    unsigned int z/*=v[n-1]*/, y=v[0], sum=0,  e,    DELTA=0x9e3779b9 ;
    int m, p, q ;
    if ( n>1) {
        /* Coding Part */
        z = v[n-1];
        q = 6+52/n ;
        while ( q-- > 0 ) {
            sum += DELTA ;
            e = sum >> 2&3 ;
            for ( p = 0 ; p < n-1 ; p++ ){
                y = v[p+1],
                    z = v[p] += (z>>5^y<<2)+(y>>3^z<<4)^(sum^y)+(k[p&3^e]^z);
            }
            y = v[0] ;
            z = v[n-1] += (z>>5^y<<2)+(y>>3^z<<4)^(sum^y)+(k[p&3^e]^z);
        }
        return 0 ;

        /* Decoding Part */
    }else if ( n <-1 ) {
        n = -n ;
        q = 6+52/n ;
        sum = q*DELTA ;
        while (sum != 0) {
            e = sum>>2 & 3 ;
            for (p = n-1 ; p > 0 ; p-- ){
                z = v[p-1],
                    y = v[p] -= (z>>5^y<<2)+(y>>3^z<<4)^(sum^y)+(k[p&3^e]^z);
            }
            z = v[n-1] ;
            y = v[0] -= (z>>5^y<<2)+(y>>3^z<<4)^(sum^y)+(k[p&3^e]^z);
            sum -= DELTA ; 
        }
        return 0 ;
    }

    return 1 ;
} /* Signal n=0,1,-1 */


void * sqlite3pager_get_codecarg(Pager *pPager)
{
    return (pPager->xCodec) ? pPager->pCodecArg: NULL;
}

void sqlite3_activate_see(const char *info)
{
}

//創建或更新一個頁的加密算法索引.此函數會申請緩沖區.
static LPCryptBlock CreateCryptBlock(BYTE* hKey, Pager *pager, LPCryptBlock pExisting)
{
    LPCryptBlock pBlock;

    if (!pExisting) //創建新加密塊
    {
        pBlock = sqlite3_malloc(sizeof(CryptBlock));
        ZeroMemory(pBlock, sizeof(CryptBlock));
        pBlock->ReadKey = hKey;
        pBlock->WriteKey = hKey;
        pBlock->PageSize = pager->pageSize;
        pBlock->Data = (BYTE*)sqlite3_malloc(pBlock->PageSize + CRYPT_OFFSET);
    }
    else //更新存在的加密塊
    {
        pBlock = pExisting;
        if ( pBlock->PageSize != pager->pageSize && !pBlock->Data){
            sqlite3_free(pBlock->Data);
            pBlock->PageSize = pager->pageSize;
            pBlock->Data = (BYTE*)sqlite3_malloc(pBlock->PageSize + CRYPT_OFFSET);
        }
    }

    ZeroMemory(pBlock->Data, pBlock->PageSize + CRYPT_OFFSET);

    return pBlock;
}

//銷毀一個加密塊及相關的緩沖區,密鑰.
static void DestroyCryptBlock(LPCryptBlock pBlock)
{
    //銷毀讀密鑰.
    if (pBlock->ReadKey){
        sqlite3_free(pBlock->ReadKey);
    }

    //如果寫密鑰存在并且不等于讀密鑰,也銷毀.
    if (pBlock->WriteKey && pBlock->WriteKey != pBlock->ReadKey){
        sqlite3_free(pBlock->WriteKey);
    }

    if(pBlock->Data){
        sqlite3_free(pBlock->Data);
    }

    //釋放加密塊.
    sqlite3_free(pBlock);
}

//加密/解密函數, 被pager調用
void * sqlite3Codec(void *pArg, BYTE *data, Pgno nPageNum, int nMode, PgHdr *pageHeader)
{
    LPCryptBlock pBlock = (LPCryptBlock)pArg;
    int len = 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 7" journal file encryption
    case 2: //重載一個頁
    case 3: //載入一個頁
        if (!pBlock->ReadKey) break;


        len = 0 - (pBlock->PageSize/4);
        xxtea(data, len, pBlock->ReadKey);

        break;
    case 6: //加密一個主數據庫文件的頁
        if (!pBlock->WriteKey) break;

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


        len = pBlock->PageSize/4;
        xxtea(data , len, pBlock->WriteKey);
        break;
    case 7: //加密事務文件的頁
        /*在正常環境下, 讀密鑰和寫密鑰相同. 當數據庫是被重新加密的,讀密鑰和寫密鑰未必相同.
        回滾事務必要用數據庫文件的原始密鑰寫入.因此,當一次回滾被寫入,總是用數據庫的讀密鑰,
        這是為了保證與讀取原始數據的密鑰相同.
        */
        if (!pBlock->ReadKey) break;

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


        len = pBlock->PageSize/4;
        xxtea(data, len, pBlock->ReadKey);
        break;
    }

    return data;
}

// 從用戶提供的緩沖區中得到一個加密密鑰
static BYTE * DeriveKey(const void *pKey, int nKeyLen)
{
    BYTE *  hKey = NULL;
    BYTE *  digest = NULL;
    MD5_CTX md5ctx;


    if ((pKey == NULL) || (nKeyLen <1 ))
    {
        return NULL;
    }


    digest = sqlite3_malloc(16);

    MD5Init(&md5ctx);

    MD5Update(&md5ctx, (unsigned char*)pKey, nKeyLen);
    MD5Final(digest, &md5ctx);

    hKey = digest;
    return hKey;
}

//被sqlite 和 sqlite3_key_interop 調用, 附加密鑰到數據庫.
int sqlite3CodecAttach(sqlite3 *db, int nDb, const void *pKey, int nKeyLen)
{
    int rc = SQLITE_ERROR;
    BYTE* hKey = 0;

    //如果沒有指定密匙,可能標識用了主數據庫的加密或沒加密.
    if (!pKey || !nKeyLen)
    {
        if (!nDb)
        {
            return SQLITE_OK; //主數據庫, 沒有指定密鑰所以沒有加密.
        }
        else //附加數據庫,使用主數據庫的密鑰. 
        {
            //獲取主數據庫的加密塊并復制密鑰給附加數據庫使用
            LPCryptBlock pBlock = (LPCryptBlock)sqlite3pager_get_codecarg(sqlite3BtreePager(db->aDb[0].pBt));

            if (!pBlock) return SQLITE_OK; //主數據庫沒有加密
            if (!pBlock->ReadKey) return SQLITE_OK; //沒有加密

            memcpy(pBlock->ReadKey, &hKey, 16);
        }
    }
    else //用戶提供了密碼,從中創建密鑰.
    {
        hKey = DeriveKey(pKey, nKeyLen);
    }

    //創建一個新的加密塊,并將解碼器指向新的附加數據庫. 
    if (hKey)
    {
        LPCryptBlock pBlock = CreateCryptBlock(hKey, sqlite3BtreePager(db->aDb[nDb].pBt), NULL);
        sqlite3PagerSetCodec(sqlite3BtreePager(db->aDb[nDb].pBt), sqlite3Codec, pBlock);
        db->aDb[nDb].pAux = pBlock;
        db->aDb[nDb].xFreeAux = DestroyCryptBlock;

        rc = SQLITE_OK;
    }
    return rc;
}

// 釋放與一個頁相關的加密塊
void sqlite3pager_free_codecarg(void *pArg)
{
    if (pArg)
        DestroyCryptBlock((LPCryptBlock)pArg);
}

//不保存用戶的原始密碼.返回NULL.
void sqlite3CodecGetKey(sqlite3 *db, int nDb, void **ppKey, int *pnKeyLen)
{
    *ppKey = NULL;
    *pnKeyLen = 0;
}

//密鑰并不保留到臨時空間,僅保存于主數據庫.
int sqlite3_key_interop(sqlite3 *db, const void *pKey, int nKeySize)
{
    return sqlite3CodecAttach(db, 0, pKey, nKeySize);
}

//改變已有數據庫的加密密鑰
int sqlite3_rekey_interop(sqlite3 *db, const void *pKey, int nKeySize)
{
    Btree *pbt = db->aDb[0].pBt;
    Pager *p = sqlite3BtreePager(pbt);
    LPCryptBlock pBlock = (LPCryptBlock)sqlite3pager_get_codecarg(p);
    BYTE * hKey = DeriveKey(pKey, nKeySize);
    int rc = SQLITE_ERROR;


    if (!pBlock && !hKey) return SQLITE_OK; 

    //重新加密一個數據庫,改變pager的寫密鑰, 讀密鑰依舊保留.
    if (!pBlock) //加密一個未加密的數據庫
    {
        pBlock = CreateCryptBlock(hKey, p, NULL);
        pBlock->ReadKey = 0; // 原始數據庫未加密
        sqlite3PagerSetCodec(sqlite3BtreePager(pbt), sqlite3Codec, pBlock);
        db->aDb[0].pAux = pBlock;
        db->aDb[0].xFreeAux = DestroyCryptBlock;
    }
    else // 改變已加密數據庫的寫密鑰
    {
        pBlock->WriteKey = hKey;
    }

    // 開始一個事務
    rc = sqlite3BtreeBeginTrans(pbt, 1);

    if (!rc)
    {
        // 用新密鑰重寫所有的頁到數據庫。
        Pgno nPage = 0;
        Pgno nSkip = PAGER_MJ_PGNO(p);
        void *pPage;
        Pgno n;
        if (sqlite3PagerPagecount(p, &nPage) == SQLITE_OK)
        {
            for(n = 1; rc == SQLITE_OK && n <= nPage; n ++)
            {
                if (n == nSkip) continue;
                rc = sqlite3PagerGet(p, n, &pPage);
                if(!rc)
                {
                    rc = sqlite3PagerWrite(pPage);
                    sqlite3PagerUnref(pPage);
                }
            }
        }
    }

    // 如果成功,提交事務。
    if (!rc)
    {
        rc = sqlite3BtreeCommit(pbt);
    }

    // 如果失敗,回滾。
    if (rc)
    {
        sqlite3BtreeRollback(pbt);
    }



    // 如果成功,銷毀先前的讀密鑰。并使讀密鑰等于當前的寫密鑰。
    if (!rc)
    {
        if (pBlock->ReadKey)
        {
            sqlite3_free(pBlock->ReadKey);
        }
        pBlock->ReadKey = pBlock->WriteKey;
    }
    else// 如果失敗,銷毀當前的寫密鑰,并恢復為當前的讀密鑰。
    {
        if (pBlock->WriteKey)
        {
            sqlite3_free(pBlock->WriteKey);
        }
        pBlock->WriteKey = pBlock->ReadKey;
    }

    // 如果讀密鑰和寫密鑰皆為空,就不需要再對頁進行編解碼。
    // 銷毀加密塊并移除頁的編解碼器
    if (!pBlock->ReadKey && !pBlock->WriteKey)
    {
        sqlite3PagerSetCodec(p, NULL, NULL);
        db->aDb[0].pAux = NULL;
        db->aDb[0].xFreeAux = NULL;
        DestroyCryptBlock(pBlock);
    }
    return rc;
}

SQLITE_API int sqlite3_key(sqlite3 *db, const void *pKey, int nKey)
{
    return sqlite3_key_interop(db, pKey, nKey);
}

SQLITE_API int sqlite3_rekey(sqlite3 *db, const void *pKey, int nKey)
{
    return sqlite3_rekey_interop(db, pKey, nKey);
}

#endif // SQLITE_HAS_CODEC

#endif // SQLITE_OMIT_DISKIO

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区不卡精品| 亚洲www啪成人一区二区麻豆| 欧美一二三在线| 欧美日韩精品免费观看视频| 日本大香伊一区二区三区| 99精品欧美一区| 99亚偷拍自图区亚洲| 不卡影院免费观看| 成人福利视频在线看| 99久久精品国产网站| 白白色亚洲国产精品| 99久久国产综合色|国产精品| hitomi一区二区三区精品| aa级大片欧美| 在线视频亚洲一区| 欧美另类一区二区三区| 日韩一级片网址| 精品噜噜噜噜久久久久久久久试看| 日韩一区二区三区免费看 | 欧美一区二区三区男人的天堂| 91精品福利在线| 欧美一级在线视频| 久久一日本道色综合| 国产精品麻豆一区二区| 亚洲一级电影视频| 国内成人自拍视频| 99久久精品国产一区| 欧美又粗又大又爽| 亚洲精品在线观| 亚洲视频香蕉人妖| 蜜桃视频在线一区| 99精品欧美一区| 91精品国产欧美日韩| 中文成人av在线| 五月婷婷久久丁香| 91精品在线麻豆| 国产日产欧美精品一区二区三区| 成人免费在线视频观看| 青草国产精品久久久久久| 成人激情免费电影网址| 欧美久久久久久久久久| 国产精品日韩成人| 秋霞影院一区二区| 日本高清成人免费播放| 久久久久亚洲综合| 午夜精品久久久久久久99樱桃| 国产一二三精品| 欧美日韩亚洲不卡| 亚洲欧洲无码一区二区三区| 男人操女人的视频在线观看欧美| 99re热视频精品| 国产色产综合产在线视频| 午夜精品福利久久久| 99国产精品久久久久久久久久| 精品久久人人做人人爽| 午夜一区二区三区在线观看| 成人av资源站| 久久精品夜色噜噜亚洲aⅴ| 首页国产欧美日韩丝袜| 色偷偷久久人人79超碰人人澡| 欧美激情一区二区三区不卡| 九色|91porny| 欧美一区永久视频免费观看| 亚洲一区日韩精品中文字幕| 播五月开心婷婷综合| 国产午夜精品福利| 国产一区二区在线观看免费| 日韩视频免费观看高清完整版 | 欧美三级电影网| 日韩伦理av电影| av中文字幕在线不卡| 国产偷国产偷精品高清尤物| 国产精品一区二区久激情瑜伽| 日韩精品最新网址| 国产一区二区三区免费在线观看| 日韩欧美亚洲国产另类 | 欧美国产综合色视频| 国产高清在线观看免费不卡| 久久久久久9999| 国产成人综合在线播放| 中文无字幕一区二区三区| 岛国一区二区三区| 中文字幕一区二区三区不卡| 成人网页在线观看| 亚洲欧美另类在线| 在线观看精品一区| 免费成人在线视频观看| 精品国产免费久久| 不卡区在线中文字幕| 亚洲天堂成人在线观看| 欧美性xxxxxxxx| 免费在线观看一区| 久久久久久电影| aaa国产一区| 午夜影院久久久| 久久美女高清视频| 91农村精品一区二区在线| 午夜精品在线看| 亚洲精品一区二区三区蜜桃下载 | 一区二区三区在线视频观看| 欧美日韩在线直播| 久88久久88久久久| 中文字幕一区二区5566日韩| 欧美日韩国产欧美日美国产精品| 美女高潮久久久| 国产精品国产精品国产专区不蜜 | 另类小说视频一区二区| 久久精品无码一区二区三区| 91福利在线导航| 精品一区二区三区免费播放| 最新久久zyz资源站| 欧美喷潮久久久xxxxx| 国产毛片精品视频| 亚洲成人动漫在线观看| 亚洲国产精品成人久久综合一区| 欧美日韩一区二区三区免费看| 国产呦萝稀缺另类资源| 亚洲一卡二卡三卡四卡 | 在线亚洲+欧美+日本专区| 六月婷婷色综合| 夜夜操天天操亚洲| 国产农村妇女精品| 日韩视频一区二区| 欧美视频日韩视频| voyeur盗摄精品| 精品一区二区三区在线播放视频 | 91国偷自产一区二区开放时间| 日本一不卡视频| 亚洲人成网站在线| 国产欧美1区2区3区| 日韩一区二区三区av| 欧美中文字幕一区二区三区亚洲| 国产黄色精品网站| 国产在线播精品第三| 全部av―极品视觉盛宴亚洲| 亚洲在线视频网站| 亚洲精品综合在线| 国产精品视频观看| 国产午夜精品一区二区三区四区| 日韩欧美一区二区久久婷婷| 欧美午夜片在线观看| 91在线视频免费观看| av在线一区二区| 成人黄色一级视频| 国产999精品久久久久久绿帽| 欧美专区日韩专区| 色拍拍在线精品视频8848| av电影在线观看一区| 不卡欧美aaaaa| av电影在线观看不卡 | 午夜精品一区二区三区三上悠亚 | 日韩av二区在线播放| 五月婷婷综合激情| 日韩电影在线免费| 日韩精品五月天| 美腿丝袜一区二区三区| 麻豆高清免费国产一区| 精品无人区卡一卡二卡三乱码免费卡 | 欧美一区二区三区在线视频 | 精品午夜一区二区三区在线观看 | 亚洲人被黑人高潮完整版| 亚洲欧洲色图综合| 亚洲国产cao| 青青草精品视频| 激情文学综合网| 不卡的看片网站| 在线亚洲一区二区| 欧美久久一二三四区| 日韩视频国产视频| 国产蜜臀97一区二区三区| 亚洲欧美区自拍先锋| 亚洲18女电影在线观看| 91在线国产观看| 欧美日韩精品系列| 精品福利一二区| 中文字幕一区二区三区在线不卡| 依依成人精品视频| 奇米四色…亚洲| 粉嫩高潮美女一区二区三区| 色婷婷一区二区| 欧美一级搡bbbb搡bbbb| 国产精品水嫩水嫩| 日韩不卡在线观看日韩不卡视频| 久久国产精品免费| 色婷婷久久久久swag精品| 日韩欧美国产午夜精品| 日本一区二区成人| 天天av天天翘天天综合网色鬼国产| 久久99国产精品尤物| 99精品视频一区二区| 日韩欧美中文字幕制服| 亚洲欧洲av另类| 秋霞电影网一区二区| 一本大道久久a久久综合| 日韩欧美亚洲国产另类| 伊人色综合久久天天人手人婷| 精品一区二区免费看| 欧美日韩一区二区三区免费看| 中文字幕av一区二区三区| 午夜伊人狠狠久久|