コード例 #1
0
FX_BOOL CFX_BasicArray::SetSize(int nNewSize, int nGrowBy)
{
    if (nNewSize < 0 || nNewSize > (1 << 28) / m_nUnitSize) {
        if (m_pData != NULL) {
            FX_Allocator_Free(m_pAllocator, m_pData);
            m_pData = NULL;
		}
        m_nSize = m_nMaxSize = 0;
        return FALSE;
    }
    if (nGrowBy >= 0) {
        m_nGrowBy = nGrowBy;
    }
    if (nNewSize == 0) {
        if (m_pData != NULL) {
            FX_Allocator_Free(m_pAllocator, m_pData);
            m_pData = NULL;
        }
        m_nSize = m_nMaxSize = 0;
    } else if (m_pData == NULL) {
        m_pData = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, nNewSize * m_nUnitSize);
        if (!m_pData) {
            m_nSize = m_nMaxSize = 0;
            return FALSE;
        }
        FXSYS_memset32(m_pData, 0, nNewSize * m_nUnitSize);
        m_nSize = m_nMaxSize = nNewSize;
    } else if (nNewSize <= m_nMaxSize) {
        if (nNewSize > m_nSize) {
            FXSYS_memset32(m_pData + m_nSize * m_nUnitSize, 0, (nNewSize - m_nSize) * m_nUnitSize);
        }
        m_nSize = nNewSize;
    } else {
        int nGrowBy = m_nGrowBy;
        if (nGrowBy == 0) {
            nGrowBy = m_nSize / 8;
            nGrowBy = (nGrowBy < 4) ? 4 : ((nGrowBy > 1024) ? 1024 : nGrowBy);
        }
        int nNewMax;
        if (nNewSize < m_nMaxSize + nGrowBy) {
            nNewMax = m_nMaxSize + nGrowBy;
        } else {
            nNewMax = nNewSize;
        }
        FX_LPBYTE pNewData = FX_Allocator_Realloc(m_pAllocator, FX_BYTE, m_pData, nNewMax * m_nUnitSize);
        if (pNewData == NULL) {
            return FALSE;
        }
        FXSYS_memset32(pNewData + m_nSize * m_nUnitSize, 0, (nNewMax - m_nSize) * m_nUnitSize);
        m_pData = pNewData;
        m_nSize = nNewSize;
        m_nMaxSize = nNewMax;
    }
    return TRUE;
}
コード例 #2
0
CCodec_JpegDecoder::CCodec_JpegDecoder()
{
    m_pScanlineBuf = NULL;
    m_DownScale = 1;
    m_bStarted = FALSE;
    m_bInited = FALSE;
    m_pExtProvider = NULL;
    m_pExtContext = NULL;
    FXSYS_memset32(&cinfo, 0, sizeof(cinfo));
    FXSYS_memset32(&jerr, 0, sizeof(jerr));
    FXSYS_memset32(&src, 0, sizeof(src));
    m_nDefaultScaleDenom = 1;
}
コード例 #3
0
void CPDF_StandardSecurityHandler::AES256_SetPerms(CPDF_Dictionary* pEncryptDict, FX_DWORD permissions,
        FX_BOOL bEncryptMetadata, FX_LPCBYTE key)
{
    FX_BYTE buf[16];
    buf[0] = (FX_BYTE)permissions;
    buf[1] = (FX_BYTE)(permissions >> 8);
    buf[2] = (FX_BYTE)(permissions >> 16);
    buf[3] = (FX_BYTE)(permissions >> 24);
    buf[4] = 0xff;
    buf[5] = 0xff;
    buf[6] = 0xff;
    buf[7] = 0xff;
    buf[8] = bEncryptMetadata ? 'T' : 'F';
    buf[9] = 'a';
    buf[10] = 'd';
    buf[11] = 'b';
    FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);
    CRYPT_AESSetKey(aes, 16, key, 32, TRUE);
    FX_BYTE iv[16], buf1[16];
    FXSYS_memset32(iv, 0, 16);
    CRYPT_AESSetIV(aes, iv);
    CRYPT_AESEncrypt(aes, buf1, buf, 16);
    FX_Free(aes);
    pEncryptDict->SetAtString(FX_BSTRC("Perms"), CFX_ByteString(buf1, 16));
}
コード例 #4
0
FXFT_Face CFPF_SkiaFontMgr::GetFontFace(IFX_FileRead *pFileRead, FX_INT32 iFaceIndex)
{
    if (!pFileRead) {
        return NULL;
    }
    if (pFileRead->GetSize() == 0) {
        return NULL;
    }
    if (iFaceIndex < 0) {
        return NULL;
    }
    FXFT_StreamRec streamRec;
    FXSYS_memset32(&streamRec, 0, sizeof(FXFT_StreamRec));
    streamRec.size = pFileRead->GetSize();
    streamRec.descriptor.pointer = pFileRead;
    streamRec.read = FPF_SkiaStream_Read;
    streamRec.close = FPF_SkiaStream_Close;
    FXFT_Open_Args args;
    args.flags = FT_OPEN_STREAM;
    args.stream = &streamRec;
    FXFT_Face face;
    if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) {
        return NULL;
    }
    FXFT_Set_Pixel_Sizes(face, 0, 64);
    return face;
}
コード例 #5
0
void CPDF_ContentParser::Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions)
{
    if (m_Status != Ready || pPage == NULL || pPage->m_pDocument == NULL || pPage->m_pFormDict == NULL) {
        m_Status = Done;
        return;
    }
    m_pObjects = pPage;
    m_bForm = FALSE;
    if (pOptions) {
        m_Options = *pOptions;
    }
    m_Status = ToBeContinued;
    m_InternalStage = PAGEPARSE_STAGE_GETCONTENT;
    m_CurrentOffset = 0;
    CPDF_Object* pContent = pPage->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));
    if (pContent == NULL) {
        m_Status = Done;
        return;
    }
    if (pContent->GetType() == PDFOBJ_STREAM) {
        m_nStreams = 0;
        m_pSingleStream = FX_NEW CPDF_StreamAcc;
        m_pSingleStream->LoadAllData((CPDF_Stream*)pContent, FALSE);
    } else if (pContent->GetType() == PDFOBJ_ARRAY) {
        CPDF_Array* pArray = (CPDF_Array*)pContent;
        m_nStreams = pArray->GetCount();
        if (m_nStreams == 0) {
            m_Status = Done;
            return;
        }
        m_pStreamArray = FX_Alloc(CPDF_StreamAcc*, m_nStreams);
        FXSYS_memset32(m_pStreamArray, 0, sizeof(CPDF_StreamAcc*) * m_nStreams);
    } else {
コード例 #6
0
void* CFX_BaseSegmentedArray::Add()
{
    if (m_DataSize % m_SegmentSize) {
        return GetAt(m_DataSize ++);
    }
    void* pSegment = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, m_UnitSize * m_SegmentSize);
    if (!pSegment) {
        return NULL;
    }
    if (m_pIndex == NULL) {
        m_pIndex = pSegment;
        m_DataSize ++;
        return pSegment;
    }
    if (m_IndexDepth == 0) {
        void** pIndex = (void**)FX_Allocator_Alloc(m_pAllocator, void*, m_IndexSize);
        if (pIndex == NULL) {
            FX_Allocator_Free(m_pAllocator, pSegment);
            return NULL;
        }
        FXSYS_memset32(pIndex, 0, sizeof(void*) * m_IndexSize);
        pIndex[0] = m_pIndex;
        pIndex[1] = pSegment;
        m_pIndex = pIndex;
        m_DataSize ++;
        m_IndexDepth ++;
        return pSegment;
    }
コード例 #7
0
int CPDF_Object::GetInteger() const
{
    CFX_AutoRestorer<int> restorer(&s_nCurRefDepth);
    if (++s_nCurRefDepth > OBJECT_REF_MAX_DEPTH) {
        return 0;
    }
    switch (m_Type) {
        case PDFOBJ_BOOLEAN:
            return ((CPDF_Boolean*)this)->m_bValue;
        case PDFOBJ_NUMBER:
            return ((CPDF_Number*)this)->GetInteger();
        case PDFOBJ_REFERENCE: {
                CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
                PARSE_CONTEXT context;
                FXSYS_memset32(&context, 0, sizeof(PARSE_CONTEXT));
                if (pRef->m_pObjList == NULL) {
                    return 0;
                }
                CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum, &context);
                if (pObj == NULL) {
                    return 0;
                }
                return pObj->GetInteger();
            }
    }
    return 0;
}
コード例 #8
0
CFX_ByteString CPDF_StandardSecurityHandler::GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size, FX_INT32 key_len)
{
    CFX_ByteString okey = m_pEncryptDict->GetString(FX_BSTRC("O"));
    FX_BYTE passcode[32];
    FX_DWORD i;
    for (i = 0; i < 32; i ++) {
        passcode[i] = i < pass_size ? owner_pass[i] : defpasscode[i - pass_size];
    }
    FX_BYTE digest[16];
    CRYPT_MD5Generate(passcode, 32, digest);
    if (m_Revision >= 3) {
        for (int i = 0; i < 50; i ++) {
            CRYPT_MD5Generate(digest, 16, digest);
        }
    }
    FX_BYTE enckey[32];
    FXSYS_memset32(enckey, 0, sizeof(enckey));
    FX_DWORD copy_len = key_len;
    if (copy_len > sizeof(digest)) {
        copy_len = sizeof(digest);
    }
    FXSYS_memcpy32(enckey, digest, copy_len);
    int okeylen = okey.GetLength();
    if (okeylen > 32) {
        okeylen = 32;
    }
    FX_BYTE okeybuf[64];
    FXSYS_memset32(okeybuf, 0, sizeof(okeybuf));
    FXSYS_memcpy32(okeybuf, (FX_LPCSTR)okey, okeylen);
    if (m_Revision == 2) {
        CRYPT_ArcFourCryptBlock(okeybuf, okeylen, enckey, key_len);
    } else {
        for (int i = 19; i >= 0; i --) {
            FX_BYTE tempkey[32];
            FXSYS_memset32(tempkey, 0, sizeof(tempkey));
            for (int j = 0; j < m_KeyLen; j ++) {
                tempkey[j] = enckey[j] ^ i;
            }
            CRYPT_ArcFourCryptBlock(okeybuf, okeylen, tempkey, key_len);
        }
    }
    int len = 32;
    while (len && defpasscode[len - 1] == okeybuf[len - 1]) {
        len --;
    }
    return CFX_ByteString(okeybuf, len);
}
コード例 #9
0
ファイル: fx_ge_fontmap.cpp プロジェクト: kakajika/loilo-pdf
CFX_FontMapper::CFX_FontMapper()
{
    FXSYS_memset32(m_FoxitFaces, 0, sizeof m_FoxitFaces);
    m_MMFaces[0] = m_MMFaces[1] = NULL;
    m_pFontInfo = NULL;
    m_bListLoaded = FALSE;
    m_pFontEnumerator = NULL;
}
コード例 #10
0
ファイル: fx_codec.cpp プロジェクト: mcanthony/libpdf
FX_BOOL CCodec_RLScanlineDecoder::v_Rewind()
{
    FXSYS_memset32(m_pScanline, 0, m_Pitch);
    m_SrcOffset = 0;
    m_bEOD = FALSE;
    m_Operator = 0;
    return TRUE;
}
コード例 #11
0
ファイル: fx_basic_array.cpp プロジェクト: Gardenya/pdfium
FX_BOOL CFX_BasicArray::SetSize(int nNewSize)
{
    if (nNewSize <= 0) {
        FX_Free(m_pData);
        m_pData = NULL;
        m_nSize = m_nMaxSize = 0;
        return 0 == nNewSize;
    }

    if (m_pData == NULL) {
        pdfium::base::CheckedNumeric<int> totalSize = nNewSize;
        totalSize *= m_nUnitSize;
        if (!totalSize.IsValid()) {
            m_nSize = m_nMaxSize = 0;
            return FALSE;
        }
        m_pData = FX_Alloc(FX_BYTE, totalSize.ValueOrDie());
        if (!m_pData) {
            m_nSize = m_nMaxSize = 0;
            return FALSE;
        }
        m_nSize = m_nMaxSize = nNewSize;
    } else if (nNewSize <= m_nMaxSize) {
        if (nNewSize > m_nSize) {
            FXSYS_memset32(m_pData + m_nSize * m_nUnitSize, 0, (nNewSize - m_nSize) * m_nUnitSize);
        }
        m_nSize = nNewSize;
    } else {
        int nNewMax = nNewSize < m_nMaxSize ? m_nMaxSize : nNewSize;
        pdfium::base::CheckedNumeric<int> totalSize = nNewMax;
        totalSize *= m_nUnitSize;
        if (!totalSize.IsValid() || nNewMax < m_nSize) {
            return FALSE;
        }
        FX_LPBYTE pNewData = FX_Realloc(FX_BYTE, m_pData, totalSize.ValueOrDie());
        if (pNewData == NULL) {
            return FALSE;
        }
        FXSYS_memset32(pNewData + m_nSize * m_nUnitSize, 0, (nNewMax - m_nSize) * m_nUnitSize);
        m_pData = pNewData;
        m_nSize = nNewSize;
        m_nMaxSize = nNewMax;
    }
    return TRUE;
}
コード例 #12
0
FX_BOOL CPDF_StandardSecurityHandler::CheckUserPassword(FX_LPCBYTE password, FX_DWORD pass_size,
        FX_BOOL bIgnoreEncryptMeta, FX_LPBYTE key, FX_INT32 key_len)
{
    CalcEncryptKey(m_pEncryptDict, password, pass_size, key, key_len, bIgnoreEncryptMeta,
                   m_pParser->GetIDArray());
    CFX_ByteString ukey = m_pEncryptDict ? m_pEncryptDict->GetString(FX_BSTRC("U")) : CFX_ByteString();
    if (ukey.GetLength() < 16) {
        return FALSE;
    }
    FX_BYTE ukeybuf[32];
    if (m_Revision == 2) {
        FXSYS_memcpy32(ukeybuf, defpasscode, 32);
        CRYPT_ArcFourCryptBlock(ukeybuf, 32, key, key_len);
    } else {
        FX_BYTE test[32], tmpkey[32];
        FX_DWORD copy_len = sizeof(test);
        if (copy_len > (FX_DWORD)ukey.GetLength()) {
            copy_len = ukey.GetLength();
        }
        FXSYS_memset32(test, 0, sizeof(test));
        FXSYS_memset32(tmpkey, 0, sizeof(tmpkey));
        FXSYS_memcpy32(test, (FX_LPCSTR)ukey, copy_len);
        for (int i = 19; i >= 0; i --) {
            for (int j = 0; j < key_len; j ++) {
                tmpkey[j] = key[j] ^ i;
            }
            CRYPT_ArcFourCryptBlock(test, 32, tmpkey, key_len);
        }
        FX_BYTE md5[100];
        CRYPT_MD5Start(md5);
        CRYPT_MD5Update(md5, defpasscode, 32);
        CPDF_Array* pIdArray = m_pParser->GetIDArray();
        if (pIdArray) {
            CFX_ByteString id = pIdArray->GetString(0);
            CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());
        }
        CRYPT_MD5Finish(md5, ukeybuf);
        return FXSYS_memcmp32(test, ukeybuf, 16) == 0;
    }
    if (FXSYS_memcmp32((FX_LPVOID)(FX_LPCSTR)ukey, ukeybuf, 16) == 0) {
        return TRUE;
    }
    return FALSE;
}
コード例 #13
0
ファイル: fxcrt_posix.cpp プロジェクト: Gardenya/pdfium
FX_FILESIZE CFXCRT_FileAccess_Posix::GetSize() const
{
    if (m_nFD < 0) {
        return 0;
    }
    struct stat s;
    FXSYS_memset32(&s, 0, sizeof(s));
    fstat(m_nFD, &s);
    return s.st_size;
}
コード例 #14
0
ファイル: fx_ge_fontmap.cpp プロジェクト: kakajika/loilo-pdf
CFX_FontMgr::CFX_FontMgr()
{
    m_pBuiltinMapper = FX_NEW CFX_FontMapper;
    if (!m_pBuiltinMapper) {
        return;
    }
    m_pBuiltinMapper->m_pFontMgr = this;
    m_pExtMapper = NULL;
    m_FTLibrary = NULL;
    FXSYS_memset32(m_ExternalFonts, 0, sizeof m_ExternalFonts);
}
コード例 #15
0
void CPDF_CharPosList::Load(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, CPDF_Font* pFont,
                            FX_FLOAT FontSize)
{
    m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, nChars);
    FXSYS_memset32(m_pCharPos, 0, sizeof(FXTEXT_CHARPOS) * nChars);
    m_nChars = 0;
    CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
    FX_BOOL bVertWriting = pCIDFont && pCIDFont->IsVertWriting();
    for (int iChar = 0; iChar < nChars; iChar ++) {
        FX_DWORD CharCode = nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pCharCodes : pCharCodes[iChar];
        if (CharCode == (FX_DWORD) - 1) {
            continue;
        }
        FX_BOOL bVert = FALSE;
        FXTEXT_CHARPOS& charpos = m_pCharPos[m_nChars++];
        if (pCIDFont) {
            charpos.m_bFontStyle = pCIDFont->IsFontStyleFromCharCode(CharCode);
        }
        charpos.m_GlyphIndex = pFont->GlyphFromCharCode(CharCode, &bVert);
#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_
        charpos.m_ExtGID = pFont->GlyphFromCharCodeExt(CharCode);
#endif
        if (!pFont->IsEmbedded() && pFont->GetFontType() != PDFFONT_CIDFONT) {
            charpos.m_FontCharWidth = pFont->GetCharWidthF(CharCode);
        } else {
            charpos.m_FontCharWidth = 0;
        }
        charpos.m_OriginX = iChar ? pCharPos[iChar - 1] : 0;
        charpos.m_OriginY = 0;
        charpos.m_bGlyphAdjust = FALSE;
        if (pCIDFont == NULL) {
            continue;
        }
        FX_WORD CID = pCIDFont->CIDFromCharCode(CharCode);
        if (bVertWriting) {
            charpos.m_OriginY = charpos.m_OriginX;
            charpos.m_OriginX = 0;
            short vx, vy;
            pCIDFont->GetVertOrigin(CID, vx, vy);
            charpos.m_OriginX -= FontSize * vx / 1000;
            charpos.m_OriginY -= FontSize * vy / 1000;
        }
        FX_LPCBYTE pTransform = pCIDFont->GetCIDTransform(CID);
        if (pTransform && !bVert) {
            charpos.m_AdjustMatrix[0] = _CIDTransformToFloat(pTransform[0]);
            charpos.m_AdjustMatrix[2] = _CIDTransformToFloat(pTransform[2]);
            charpos.m_AdjustMatrix[1] = _CIDTransformToFloat(pTransform[1]);
            charpos.m_AdjustMatrix[3] = _CIDTransformToFloat(pTransform[3]);
            charpos.m_OriginX += _CIDTransformToFloat(pTransform[4]) * FontSize;
            charpos.m_OriginY += _CIDTransformToFloat(pTransform[5]) * FontSize;
            charpos.m_bGlyphAdjust = TRUE;
        }
    }
}
コード例 #16
0
ファイル: fx_codec_flate.cpp プロジェクト: mcanthony/libpdf
 void* FPDFAPI_FlateInit(void* (*alloc_func)(void*, unsigned int, unsigned int),
                         void (*free_func)(void*, void*))
 {
     z_stream* p = (z_stream*)alloc_func(0, 1, sizeof(z_stream));
     if (p == NULL) {
         return NULL;
     }
     FXSYS_memset32(p, 0, sizeof(z_stream));
     p->zalloc = alloc_func;
     p->zfree = free_func;
     inflateInit(p);
     return p;
 }
コード例 #17
0
int CPDF_IndirectObjects::GetIndirectType(FX_DWORD objnum)
{
    FX_LPVOID value;
    if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
        return ((CPDF_Object*)value)->GetType();
    }
    if (m_pParser) {
        PARSE_CONTEXT context;
        FXSYS_memset32(&context, 0, sizeof(PARSE_CONTEXT));
        context.m_Flags = PDFPARSE_TYPEONLY;
        return (int)(FX_UINTPTR)m_pParser->ParseIndirectObject(this, objnum, &context);
    }
    return 0;
}
コード例 #18
0
ファイル: doc_metadata.cpp プロジェクト: codemonkey85/pdfium
CPDF_Metadata::CPDF_Metadata()
{
    m_pData = FX_Alloc(PDFDOC_METADATA, 1);
    FXSYS_memset32(m_pData, 0, sizeof(PDFDOC_METADATA));
    CFX_CMapByteStringToPtr *&pStringMap = ((PDFDOC_LPMETADATA)m_pData)->m_pStringMap;
    pStringMap = FX_NEW(CFX_CMapByteStringToPtr);
    if (pStringMap != NULL) {
        CFX_ByteString bstr;
        for (int i = 0; i < 18; i += 2) {
            bstr = gs_FPDFDOC_Metadata_Titles[i];
            pStringMap->AddValue(bstr, (void*)gs_FPDFDOC_Metadata_Titles[i + 1]);
        }
    }
}
コード例 #19
0
ファイル: fx_win32_dib.cpp プロジェクト: 151706061/PDFium
CFX_WindowsDIB::CFX_WindowsDIB(HDC hDC, int width, int height)
{
    Create(width, height, FXDIB_Rgb, (FX_LPBYTE)1);
    BITMAPINFOHEADER bmih;
    FXSYS_memset32(&bmih, 0, sizeof bmih);
    bmih.biSize = sizeof bmih;
    bmih.biBitCount = 24;
    bmih.biHeight = -height;
    bmih.biPlanes = 1;
    bmih.biWidth = width;
    m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (LPVOID*)&m_pBuffer, NULL, 0);
    m_hMemDC = CreateCompatibleDC(hDC);
    m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);
}
コード例 #20
0
ファイル: ttgsubtable.cpp プロジェクト: azunite/pdfium_ch
void CFX_CTTGSUBTable::ParseLangSys(FT_Bytes raw, struct TLangSys *rec)
{
    FT_Bytes sp = raw;
    rec->LookupOrder = GetUInt16(sp);
    rec->ReqFeatureIndex = GetUInt16(sp);
    rec->FeatureCount = GetUInt16(sp);
    if(rec->FeatureCount <= 0) {
        return;
    }
    rec->FeatureIndex = new TT_uint16_t[rec->FeatureCount];
    FXSYS_memset32(rec->FeatureIndex, 0, sizeof(TT_uint16_t) * rec->FeatureCount);
    for (int i = 0; i < rec->FeatureCount; ++i) {
        rec->FeatureIndex[i] = GetUInt16(sp);
    }
}
コード例 #21
0
ファイル: fx_codec.cpp プロジェクト: mcanthony/libpdf
FX_LPBYTE CCodec_RLScanlineDecoder::v_GetNextLine()
{
    if (m_SrcOffset == 0) {
        GetNextOperator();
    } else {
        if (m_bEOD) {
            return NULL;
        }
    }
    FXSYS_memset32(m_pScanline, 0, m_Pitch);
    FX_DWORD col_pos = 0;
    FX_BOOL	eol = FALSE;
    while (m_SrcOffset < m_SrcSize && !eol) {
        if (m_Operator < 128) {
            FX_DWORD copy_len = m_Operator + 1;
            if (col_pos + copy_len >= m_dwLineBytes) {
                copy_len = m_dwLineBytes - col_pos;
                eol = TRUE;
            }
            if (copy_len >= m_SrcSize - m_SrcOffset) {
                copy_len = m_SrcSize - m_SrcOffset;
                m_bEOD = TRUE;
            }
            FXSYS_memcpy32(m_pScanline + col_pos, m_pSrcBuf + m_SrcOffset, copy_len);
            col_pos += copy_len;
            UpdateOperator((FX_BYTE)copy_len);
        } else if (m_Operator > 128) {
            int fill = 0;
            if (m_SrcOffset - 1 < m_SrcSize - 1) {
                fill = m_pSrcBuf[m_SrcOffset];
            }
            FX_DWORD duplicate_len = 257 - m_Operator;
            if (col_pos + duplicate_len >= m_dwLineBytes) {
                duplicate_len = m_dwLineBytes - col_pos;
                eol = TRUE;
            }
            FXSYS_memset8(m_pScanline + col_pos, fill, duplicate_len);
            col_pos += duplicate_len;
            UpdateOperator((FX_BYTE)duplicate_len);
        } else {
            m_bEOD = TRUE;
            break;
        }
    }
    return m_pScanline;
}
コード例 #22
0
void CPDF_StandardSecurityHandler::AES256_SetPassword(CPDF_Dictionary* pEncryptDict, FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPCBYTE key)
{
    FX_BYTE sha[128];
    CRYPT_SHA1Start(sha);
    CRYPT_SHA1Update(sha, key, 32);
    CRYPT_SHA1Update(sha, (FX_BYTE*)"hello", 5);
    FX_BYTE digest[20];
    CRYPT_SHA1Finish(sha, digest);
    CFX_ByteString ukey = pEncryptDict->GetString(FX_BSTRC("U"));
    FX_BYTE digest1[48];
    if (m_Revision >= 6) {
        Revision6_Hash(password, size, digest, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest1);
    } else {
        CRYPT_SHA256Start(sha);
        CRYPT_SHA256Update(sha, password, size);
        CRYPT_SHA256Update(sha, digest, 8);
        if (bOwner) {
            CRYPT_SHA256Update(sha, ukey, ukey.GetLength());
        }
        CRYPT_SHA256Finish(sha, digest1);
    }
    FXSYS_memcpy32(digest1 + 32, digest, 16);
    pEncryptDict->SetAtString(bOwner ? FX_BSTRC("O") : FX_BSTRC("U"), CFX_ByteString(digest1, 48));
    if (m_Revision >= 6) {
        Revision6_Hash(password, size, digest + 8, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest1);
    } else {
        CRYPT_SHA256Start(sha);
        CRYPT_SHA256Update(sha, password, size);
        CRYPT_SHA256Update(sha, digest + 8, 8);
        if (bOwner) {
            CRYPT_SHA256Update(sha, ukey, ukey.GetLength());
        }
        CRYPT_SHA256Finish(sha, digest1);
    }
    FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);
    CRYPT_AESSetKey(aes, 16, digest1, 32, TRUE);
    FX_BYTE iv[16];
    FXSYS_memset32(iv, 0, 16);
    CRYPT_AESSetIV(aes, iv);
    CRYPT_AESEncrypt(aes, digest1, key, 32);
    FX_Free(aes);
    pEncryptDict->SetAtString(bOwner ? FX_BSTRC("OE") : FX_BSTRC("UE"), CFX_ByteString(digest1, 32));
}
コード例 #23
0
FX_LPBYTE CFX_BasicArray::InsertSpaceAt(int nIndex, int nCount)
{
    if (nIndex < 0 || nCount <= 0) {
        return NULL;
    }
    if (nIndex >= m_nSize) {
        if (!SetSize(nIndex + nCount, -1)) {
            return NULL;
        }
    } else {
        int nOldSize = m_nSize;
        if (!SetSize(m_nSize + nCount, -1)) {
            return NULL;
        }
        FXSYS_memmove32(m_pData + (nIndex + nCount)*m_nUnitSize, m_pData + nIndex * m_nUnitSize,
                        (nOldSize - nIndex) * m_nUnitSize);
        FXSYS_memset32(m_pData + nIndex * m_nUnitSize, 0, nCount * m_nUnitSize);
    }
    return m_pData + nIndex * m_nUnitSize;
}
コード例 #24
0
ファイル: fx_codec_jbig.cpp プロジェクト: azunite/pdfium_ch
FX_BOOL CCodec_Jbig2Module::Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
                                   FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch)
{
    FXSYS_memset32(dest_buf, 0, height * dest_pitch);
    CJBig2_Context* pContext = CJBig2_Context::CreateContext(&m_Module,
                               (FX_LPBYTE)global_data, global_size, (FX_LPBYTE)src_buf, src_size, JBIG2_EMBED_STREAM, &m_SymbolDictCache);
    if (pContext == NULL) {
        return FALSE;
    }
    int ret = pContext->getFirstPage(dest_buf, width, height, dest_pitch, NULL);
    CJBig2_Context::DestroyContext(pContext);
    if (ret != JBIG2_SUCCESS) {
        return FALSE;
    }
    int dword_size = height * dest_pitch / 4;
    FX_DWORD* dword_buf = (FX_DWORD*)dest_buf;
    for (int i = 0; i < dword_size; i ++) {
        dword_buf[i] = ~dword_buf[i];
    }
    return TRUE;
}
コード例 #25
0
ファイル: fx_win32_dib.cpp プロジェクト: 151706061/PDFium
CFX_ByteString CFX_WindowsDIB::GetBitmapInfo(const CFX_DIBitmap* pBitmap)
{
    CFX_ByteString result;
    int len = sizeof (BITMAPINFOHEADER);
    if (pBitmap->GetBPP() == 1 || pBitmap->GetBPP() == 8) {
        len += sizeof (DWORD) * (int)(1 << pBitmap->GetBPP());
    }
    BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)result.GetBuffer(len);
    FXSYS_memset32(pbmih, 0, sizeof (BITMAPINFOHEADER));
    pbmih->biSize = sizeof(BITMAPINFOHEADER);
    pbmih->biBitCount = pBitmap->GetBPP();
    pbmih->biCompression = BI_RGB;
    pbmih->biHeight = -(int)pBitmap->GetHeight();
    pbmih->biPlanes = 1;
    pbmih->biWidth = pBitmap->GetWidth();
    if (pBitmap->GetBPP() == 8) {
        FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);
        if (pBitmap->GetPalette() == NULL) {
            for (int i = 0; i < 256; i ++) {
                pPalette[i] = i * 0x010101;
            }
        } else {
            for (int i = 0; i < 256; i ++) {
                pPalette[i] = pBitmap->GetPalette()[i];
            }
        }
    }
    if (pBitmap->GetBPP() == 1) {
        FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);
        if (pBitmap->GetPalette() == NULL) {
            pPalette[0] = 0;
            pPalette[1] = 0xffffff;
        } else {
            pPalette[0] = pBitmap->GetPalette()[0];
            pPalette[1] = pBitmap->GetPalette()[1];
        }
    }
    result.ReleaseBuffer(len);
    return result;
}
コード例 #26
0
ファイル: fpdf_page_func.cpp プロジェクト: witwall/pdfium
FX_BOOL CPDF_Function::Init(CPDF_Object* pObj)
{
    CPDF_Dictionary* pDict;
    if (pObj->GetType() == PDFOBJ_STREAM) {
        pDict = ((CPDF_Stream*)pObj)->GetDict();
    } else {
        pDict = (CPDF_Dictionary*)pObj;
    }
    CPDF_Array* pDomains = pDict->GetArray(FX_BSTRC("Domain"));
    if (pDomains == NULL) {
        return FALSE;
    }
    m_nInputs = pDomains->GetCount() / 2;
    if (m_nInputs == 0) {
        return FALSE;
    }
    m_pDomains = FX_Alloc(FX_FLOAT, m_nInputs * 2);
    for (int i = 0; i < m_nInputs * 2; i ++) {
        m_pDomains[i] = pDomains->GetFloat(i);
    }
    CPDF_Array* pRanges = pDict->GetArray(FX_BSTRC("Range"));
    m_nOutputs = 0;
    if (pRanges) {
        m_nOutputs = pRanges->GetCount() / 2;
        m_pRanges = FX_Alloc(FX_FLOAT, m_nOutputs * 2);
        for (int i = 0; i < m_nOutputs * 2; i ++) {
            m_pRanges[i] = pRanges->GetFloat(i);
        }
    }
    FX_DWORD old_outputs = m_nOutputs;
    FX_BOOL ret = v_Init(pObj);
    if (m_pRanges && m_nOutputs > (int)old_outputs) {
        m_pRanges = FX_Realloc(FX_FLOAT, m_pRanges, m_nOutputs * 2);
        if (m_pRanges) {
            FXSYS_memset32(m_pRanges + (old_outputs * 2), 0, sizeof(FX_FLOAT) * (m_nOutputs - old_outputs) * 2);
        }
    }
    return ret;
}
コード例 #27
0
void CPDF_MeshStream::GetColor(FX_FLOAT& r, FX_FLOAT& g, FX_FLOAT& b)
{
    FX_DWORD i;
    FX_FLOAT color_value[8];
    for (i = 0; i < m_nComps; i ++) {
        color_value[i] = m_ColorMin[i] + m_BitStream.GetBits(m_nCompBits) * (m_ColorMax[i] - m_ColorMin[i]) / m_CompMax;
    }
    if (m_nFuncs) {
        static const int kMaxResults = 8;
        FX_FLOAT result[kMaxResults];
        int nResults;
        FXSYS_memset32(result, 0, sizeof(result));
        for (FX_DWORD i = 0; i < m_nFuncs; i ++) {
            if (m_pFuncs[i] && m_pFuncs[i]->CountOutputs() <= kMaxResults) {
                m_pFuncs[i]->Call(color_value, 1, result, nResults);
            }
        }
        m_pCS->GetRGB(result, r, g, b);
    } else {
        m_pCS->GetRGB(color_value, r, g, b);
    }
}
コード例 #28
0
ファイル: fx_codec_jbig.cpp プロジェクト: azunite/pdfium_ch
FXCODEC_STATUS CCodec_Jbig2Module::StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
        FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause)
{
    if(!pJbig2Context) {
        return FXCODEC_STATUS_ERR_PARAMS;
    }
    CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;
    m_pJbig2Context->m_width = width;
    m_pJbig2Context->m_height = height;
    m_pJbig2Context->m_src_buf = (unsigned char *)src_buf;
    m_pJbig2Context->m_src_size = src_size;
    m_pJbig2Context->m_global_data = global_data;
    m_pJbig2Context->m_global_size = global_size;
    m_pJbig2Context->m_dest_buf = dest_buf;
    m_pJbig2Context->m_dest_pitch = dest_pitch;
    m_pJbig2Context->m_pPause = pPause;
    m_pJbig2Context->m_bFileReader = FALSE;
    FXSYS_memset32(dest_buf, 0, height * dest_pitch);
    m_pJbig2Context->m_pContext = CJBig2_Context::CreateContext(&m_Module,
                                  (FX_LPBYTE)global_data, global_size, (FX_LPBYTE)src_buf, src_size, JBIG2_EMBED_STREAM, &m_SymbolDictCache, pPause);
    if(!m_pJbig2Context->m_pContext) {
        return FXCODEC_STATUS_ERROR;
    }
    int ret = m_pJbig2Context->m_pContext->getFirstPage(dest_buf, width, height, dest_pitch, pPause);
    if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECODE_FINISH) {
        CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
        m_pJbig2Context->m_pContext = NULL;
        if (ret != JBIG2_SUCCESS) {
            return FXCODEC_STATUS_ERROR;
        }
        int dword_size = height * dest_pitch / 4;
        FX_DWORD* dword_buf = (FX_DWORD*)dest_buf;
        for (int i = 0; i < dword_size; i ++) {
            dword_buf[i] = ~dword_buf[i];
        }
        return FXCODEC_STATUS_DECODE_FINISH;
    }
    return m_pJbig2Context->m_pContext->GetProcessiveStatus();
}
コード例 #29
0
void CalcEncryptKey(CPDF_Dictionary* pEncrypt, FX_LPCBYTE password, FX_DWORD pass_size,
                    FX_LPBYTE key, int keylen, FX_BOOL bIgnoreMeta, CPDF_Array* pIdArray)
{
    int revision = pEncrypt->GetInteger(FX_BSTRC("R"));
    FX_BYTE passcode[32];
    for (FX_DWORD i = 0; i < 32; i ++) {
        passcode[i] = i < pass_size ? password[i] : defpasscode[i - pass_size];
    }
    FX_BYTE md5[100];
    CRYPT_MD5Start(md5);
    CRYPT_MD5Update(md5, passcode, 32);
    CFX_ByteString okey = pEncrypt->GetString(FX_BSTRC("O"));
    CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)okey, okey.GetLength());
    FX_DWORD perm = pEncrypt->GetInteger(FX_BSTRC("P"));
    CRYPT_MD5Update(md5, (FX_LPBYTE)&perm, 4);
    if (pIdArray) {
        CFX_ByteString id = pIdArray->GetString(0);
        CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());
    }
    if (!bIgnoreMeta && revision >= 3 && !pEncrypt->GetInteger(FX_BSTRC("EncryptMetadata"), 1)) {
        FX_DWORD tag = (FX_DWORD) - 1;
        CRYPT_MD5Update(md5, (FX_LPBYTE)&tag, 4);
    }
    FX_BYTE digest[16];
    CRYPT_MD5Finish(md5, digest);
    FX_DWORD copy_len = keylen;
    if (copy_len > sizeof(digest)) {
        copy_len = sizeof(digest);
    }
    if (revision >= 3) {
        for (int i = 0; i < 50; i ++) {
            CRYPT_MD5Generate(digest, copy_len, digest);
        }
    }
    FXSYS_memset32(key, 0, keylen);
    FXSYS_memcpy32(key, digest, copy_len);
}
コード例 #30
0
FX_BOOL CPDF_StandardSecurityHandler::AES256_CheckPassword(FX_LPCBYTE password, FX_DWORD size,
        FX_BOOL bOwner, FX_LPBYTE key)
{
    CFX_ByteString okey = m_pEncryptDict ? m_pEncryptDict->GetString(FX_BSTRC("O")) : CFX_ByteString();
    if (okey.GetLength() < 48) {
        return FALSE;
    }
    CFX_ByteString ukey = m_pEncryptDict ? m_pEncryptDict->GetString(FX_BSTRC("U")) : CFX_ByteString();
    if (ukey.GetLength() < 48) {
        return FALSE;
    }
    FX_LPCBYTE pkey = bOwner ? (FX_LPCBYTE)okey : (FX_LPCBYTE)ukey;
    FX_BYTE sha[128];
    FX_BYTE digest[32];
    if (m_Revision >= 6) {
        Revision6_Hash(password, size, (FX_LPCBYTE)pkey + 32, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest);
    } else {
        CRYPT_SHA256Start(sha);
        CRYPT_SHA256Update(sha, password, size);
        CRYPT_SHA256Update(sha, pkey + 32, 8);
        if (bOwner) {
            CRYPT_SHA256Update(sha, ukey, 48);
        }
        CRYPT_SHA256Finish(sha, digest);
    }
    if (FXSYS_memcmp32(digest, pkey, 32) != 0) {
        return FALSE;
    }
    if (key == NULL) {
        return TRUE;
    }
    if (m_Revision >= 6) {
        Revision6_Hash(password, size, (FX_LPCBYTE)pkey + 40, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest);
    } else {
        CRYPT_SHA256Start(sha);
        CRYPT_SHA256Update(sha, password, size);
        CRYPT_SHA256Update(sha, pkey + 40, 8);
        if (bOwner) {
            CRYPT_SHA256Update(sha, ukey, 48);
        }
        CRYPT_SHA256Finish(sha, digest);
    }
    CFX_ByteString ekey = m_pEncryptDict ? m_pEncryptDict->GetString(bOwner ? FX_BSTRC("OE") : FX_BSTRC("UE")) : CFX_ByteString();
    if (ekey.GetLength() < 32) {
        return FALSE;
    }
    FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);
    CRYPT_AESSetKey(aes, 16, digest, 32, FALSE);
    FX_BYTE iv[16];
    FXSYS_memset32(iv, 0, 16);
    CRYPT_AESSetIV(aes, iv);
    CRYPT_AESDecrypt(aes, key, ekey, 32);
    CRYPT_AESSetKey(aes, 16, key, 32, FALSE);
    CRYPT_AESSetIV(aes, iv);
    CFX_ByteString perms = m_pEncryptDict->GetString(FX_BSTRC("Perms"));
    if (perms.IsEmpty()) {
        return FALSE;
    }
    FX_BYTE perms_buf[16];
    FXSYS_memset32(perms_buf, 0, sizeof(perms_buf));
    FX_DWORD copy_len = sizeof(perms_buf);
    if (copy_len > (FX_DWORD)perms.GetLength()) {
        copy_len = perms.GetLength();
    }
    FXSYS_memcpy32(perms_buf, (FX_LPCBYTE)perms, copy_len);
    FX_BYTE buf[16];
    CRYPT_AESDecrypt(aes, buf, perms_buf, 16);
    FX_Free(aes);
    if (buf[9] != 'a' || buf[10] != 'd' || buf[11] != 'b') {
        return FALSE;
    }
    if (FXDWORD_GET_LSBFIRST(buf) != m_Permissions) {
        return FALSE;
    }
    if ((buf[8] == 'T' && !IsMetadataEncrypted()) || (buf[8] == 'F' && IsMetadataEncrypted())) {
        return FALSE;
    }
    return TRUE;
}