diff --git a/src/sqlite3.c b/src/sqlite3.c index b80d9f2aa739cfdf41b171ed6cf9f8e768f5e3a3..dd5915010a43cee8a8799018c38d1b4a2e6ae5c2 100644 --- a/src/sqlite3.c +++ b/src/sqlite3.c @@ -245014,12 +245014,22 @@ CODEC_STATIC int sqlite3CodecDeriveKey(CodecContext *ctx, OperateContext whichKe if(keyCtx->deriveFlag){ return SQLITE_OK; } + errno_t memcpyRc = EOK; + unsigned char salt[SALT_SIZE]; + if (ctx->pBt != NULL && sqlite3OsRead(ctx->pBt->pBt->pPager->fd, salt, SALT_SIZE, 0) == SQLITE_OK) { + assert(SALT_SIZE == FILE_HEADER_SIZE); + if (memcmp(SQLITE_FILE_HEADER, salt, SALT_SIZE) != 0 && memcmp(ctx->salt, salt, SALT_SIZE) != 0) { + memcpyRc = memcpy_s(ctx->salt, FILE_HEADER_SIZE, salt, SALT_SIZE); + if(memcpyRc != EOK){ + return SQLITE_ERROR; + } + } + } sqlite3CodecInitDeriveKeyMemory(keyCtx); if(keyCtx->key == NULL || keyCtx->hmacKey == NULL || keyCtx->keyInfo == NULL){ sqlite3CodecClearDeriveKey(keyCtx); return SQLITE_NOMEM; } - errno_t memcpyRc = EOK; if((keyCtx->passwordSize == keyCtx->codecConst.keyInfoSize) && (sqlite3CodecIsKeyInfoFormat(keyCtx->password, keyCtx->passwordSize))){ sqlite3CodecHex2Bin(keyCtx->password + 2, keyCtx->codecConst.keySize * 2, keyCtx->key);