Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
onlyoffice_core
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Boris Kocherov
onlyoffice_core
Commits
ebdfcbd7
Commit
ebdfcbd7
authored
Jun 23, 2017
by
ElenaSubbotina
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
PprFormatReader - read encrypted files
parent
867c09c8
Changes
22
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
706 additions
and
580 deletions
+706
-580
ASCOfficeDocFile/DocDocxConverter/WordDocument.cpp
ASCOfficeDocFile/DocDocxConverter/WordDocument.cpp
+37
-20
ASCOfficePPTFile/PPTFormatLib/PPTFormatLib.cpp
ASCOfficePPTFile/PPTFormatLib/PPTFormatLib.cpp
+10
-131
ASCOfficePPTFile/PPTFormatLib/PPTFormatLib.h
ASCOfficePPTFile/PPTFormatLib/PPTFormatLib.h
+0
-3
ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfo.h
ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfo.h
+2
-2
ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp
...icePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp
+97
-65
ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.h
...fficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.h
+9
-3
ASCOfficePPTFile/PPTFormatLib/Reader/PPTFileReader.cpp
ASCOfficePPTFile/PPTFormatLib/Reader/PPTFileReader.cpp
+269
-0
ASCOfficePPTFile/PPTFormatLib/Reader/PPTFileReader.h
ASCOfficePPTFile/PPTFormatLib/Reader/PPTFileReader.h
+25
-199
ASCOfficePPTFile/PPTFormatLib/Reader/Records.cpp
ASCOfficePPTFile/PPTFormatLib/Reader/Records.cpp
+91
-0
ASCOfficePPTFile/PPTFormatLib/Reader/Records.h
ASCOfficePPTFile/PPTFormatLib/Reader/Records.h
+53
-15
ASCOfficePPTFile/PPTFormatLib/Records/Animations/AnimationTypes.h
...ePPTFile/PPTFormatLib/Records/Animations/AnimationTypes.h
+43
-43
ASCOfficePPTFile/PPTFormatLib/Records/CString.h
ASCOfficePPTFile/PPTFormatLib/Records/CString.h
+0
-2
ASCOfficePPTFile/PPTFormatLib/Records/CryptSession10Container.h
...icePPTFile/PPTFormatLib/Records/CryptSession10Container.h
+31
-7
ASCOfficePPTFile/PPTFormatLib/Records/Drawing/ArtBlip.cpp
ASCOfficePPTFile/PPTFormatLib/Records/Drawing/ArtBlip.cpp
+7
-10
ASCOfficePPTFile/PPTFormatLib/Records/Drawing/ArtBlip.h
ASCOfficePPTFile/PPTFormatLib/Records/Drawing/ArtBlip.h
+1
-1
ASCOfficePPTFile/PPTFormatLib/Win32/PPTFormatLib.vcproj
ASCOfficePPTFile/PPTFormatLib/Win32/PPTFormatLib.vcproj
+4
-0
ASCOfficePPTXFile/Editor/Drawing/Attributes.h
ASCOfficePPTXFile/Editor/Drawing/Attributes.h
+6
-10
ASCOfficePPTXFile/Editor/Drawing/Shapes/BaseShape/PPTShape/ElementSettings.h
...ditor/Drawing/Shapes/BaseShape/PPTShape/ElementSettings.h
+0
-17
ASCOfficeXlsFile2/source/XlsFormat/Binary/CFStream.h
ASCOfficeXlsFile2/source/XlsFormat/Binary/CFStream.h
+1
-2
OfficeCryptReader/source/CryptTransform.cpp
OfficeCryptReader/source/CryptTransform.cpp
+17
-48
OfficeCryptReader/source/ECMACryptFile.cpp
OfficeCryptReader/source/ECMACryptFile.cpp
+2
-1
X2tConverter/build/Qt/X2tConverter.pri
X2tConverter/build/Qt/X2tConverter.pri
+1
-1
No files found.
ASCOfficeDocFile/DocDocxConverter/WordDocument.cpp
View file @
ebdfcbd7
...
...
@@ -153,6 +153,24 @@ namespace DocFileFormat
}
else
{
//POLE::Stream * pStream = NULL;
//if (m_pStorage->GetStream ("EncryptedSummaryInformation", &pStream))
//{
// VirtualStreamReader tStream( pStream, 0, FIB->m_bOlderVersion);
// _UINT32 StreamDescriptorArrayOffset = tStream.ReadUInt32();
// _UINT32 StreamDescriptorArraySize = tStream.ReadUInt32();
// for (int i = 0; i < StreamDescriptorArraySize; i++)
// {
// }
// _UINT32 EncryptedStreamDescriptorCount = tStream.ReadUInt32();
// for (int i = 0; i < EncryptedStreamDescriptorCount; i++)
// {
// }
// RELEASEOBJECT(pStream);
//}
CRYPT
::
ECMADecryptor
Decryptor
;
Decryptor
.
SetCryptData
(
encryptionHeader
->
crypt_data_aes
);
...
...
@@ -470,11 +488,6 @@ namespace DocFileFormat
delete
storageOut
;
return
false
;
}
//DecryptStream(Decryptor, "WordDocument", storageIn, storageOut);
//if (FIB->m_FibBase.fWhichTblStm)
// DecryptStream(Decryptor, "1Table", storageIn, storageOut);
//else
// DecryptStream(Decryptor, "0Table", storageIn, storageOut);
std
::
list
<
std
::
string
>
listStream
=
storageIn
->
entries
();
...
...
@@ -486,15 +499,11 @@ namespace DocFileFormat
for
(
std
::
list
<
std
::
string
>::
iterator
it2
=
list_entry
.
begin
();
it2
!=
list_entry
.
end
();
it2
++
)
{
//if (*it2 != "WordDocument" && std::wstring::npos == it2->find("Table"))
// CopyStream( *it2, storageIn, storageOut);
DecryptStream
(
Decryptor
,
*
it2
,
storageIn
,
storageOut
);
}
}
else
{
//if (*it != "WordDocument" && std::wstring::npos == it->find("Table"))
// CopyStream( *it, storageIn, storageOut);
DecryptStream
(
Decryptor
,
*
it
,
storageIn
,
storageOut
);
}
...
...
@@ -554,32 +563,40 @@ namespace DocFileFormat
if
(
!
stream
)
return
false
;
stream
->
seek
(
0
);
int
s
z
_stream
=
stream
->
size
();
int
s
ize
_stream
=
stream
->
size
();
POLE
::
Stream
*
streamNew
=
new
POLE
::
Stream
(
storageOut
,
streamName
,
true
,
s
z
_stream
);
POLE
::
Stream
*
streamNew
=
new
POLE
::
Stream
(
storageOut
,
streamName
,
true
,
s
ize
_stream
);
if
(
!
streamNew
)
return
false
;
unsigned
char
*
data_stream
=
new
unsigned
char
[
s
z
_stream
];
stream
->
read
(
data_stream
,
s
z
_stream
);
unsigned
char
*
data_stream
=
new
unsigned
char
[
s
ize
_stream
];
stream
->
read
(
data_stream
,
s
ize
_stream
);
unsigned
char
*
data_store
=
NULL
;
int
s
z
_data_store
=
0
;
int
s
ize
_data_store
=
0
;
if
(
"WordDocument"
==
streamName
)
{
s
z
_data_store
=
68
;
data_store
=
new
unsigned
char
[
s
z
_data_store
];
s
ize
_data_store
=
68
;
data_store
=
new
unsigned
char
[
s
ize
_data_store
];
}
if
(
data_store
)
memcpy
(
data_store
,
data_stream
,
sz_data_store
);
memcpy
(
data_store
,
data_stream
,
size_data_store
);
int
size_block
=
0x200
;
for
(
int
pos
=
0
,
block
=
0
;
pos
<
size_stream
;
pos
+=
size_block
,
block
++
)
{
if
(
pos
+
size_block
>
size_stream
)
size_block
=
size_stream
-
pos
;
Decryptor
->
Decrypt
((
char
*
)
data_stream
+
pos
,
size_block
,
block
);
}
Decryptor
->
Decrypt
((
char
*
)
data_stream
,
sz_stream
,
0
);
if
(
data_store
)
memcpy
(
data_stream
,
data_store
,
s
z
_data_store
);
memcpy
(
data_stream
,
data_store
,
s
ize
_data_store
);
streamNew
->
write
(
data_stream
,
s
z
_stream
);
streamNew
->
write
(
data_stream
,
s
ize
_stream
);
RELEASEARRAYOBJECTS
(
data_store
);
RELEASEARRAYOBJECTS
(
data_stream
);
...
...
ASCOfficePPTFile/PPTFormatLib/PPTFormatLib.cpp
View file @
ebdfcbd7
...
...
@@ -64,7 +64,7 @@ long COfficePPTFile::OpenFile(const std::wstring & sFileName, const std::wstring
m_pReader
=
new
CPPTFileReader
(
pStgFrom
,
m_strTempDirectory
);
CPPTFileReader
*
pptReader
=
(
CPPTFileReader
*
)
m_pReader
;
pptReader
->
m_oDocumentInfo
.
m_str
FileDirectory
=
GetDirectory
(
sFileName
.
c_str
())
;
pptReader
->
m_oDocumentInfo
.
m_str
TmpDirectory
=
m_strTempDirectory
;
pptReader
->
m_oDocumentInfo
.
m_strPassword
=
password
;
if
(
pptReader
->
IsPowerPoint
()
==
false
)
...
...
@@ -75,50 +75,20 @@ long COfficePPTFile::OpenFile(const std::wstring & sFileName, const std::wstring
}
if
(
pptReader
->
ReadPersists
()
==
false
)
return
AVS_ERROR_FILEFORMAT
;
if
(
pptReader
->
IsEncrypted
())
{
CEncryptionHeader
*
pEncryptionHeader
=
pptReader
->
GetEncryptionHeader
();
if
(
!
pEncryptionHeader
)
return
AVS_ERROR_FILEFORMAT
;
if
(
password
.
empty
())
return
AVS_ERROR_DRM
;
if
(
pEncryptionHeader
->
bStandard
)
{
CRYPT
::
RC4Decryptor
Decryptor
(
pEncryptionHeader
->
crypt_data_rc4
,
password
,
1
);
if
(
Decryptor
.
IsVerify
()
==
false
)
{
return
AVS_ERROR_PASSWORD
;
}
if
(
DecryptOfficeFile
(
&
Decryptor
)
==
false
)
return
AVS_ERROR_DRM
;
return
AVS_ERROR_PASSWORD
;
//return OpenFile(m_sTempDecryptFileName, L"");
}
else
if
(
pptReader
->
IsEncrypted
())
{
CRYPT
::
ECMADecryptor
Decryptor
;
Decryptor
.
SetCryptData
(
pEncryptionHeader
->
crypt_data_aes
);
if
(
Decryptor
.
SetPassword
(
password
)
==
false
)
{
return
AVS_ERROR_PASSWORD
;
}
if
(
DecryptOfficeFile
(
&
Decryptor
)
==
false
)
return
AVS_ERROR_DRM
;
return
AVS_ERROR_PASSWORD
;
pptReader
->
ReadDocument
(
&
Decryptor
);
//return OpenFile(m_sTempDecryptFileName, L"");
if
(
password
.
empty
())
return
AVS_ERROR_DRM
;
else
return
AVS_ERROR_PASSWORD
;
}
return
AVS_ERROR_FILEFORMAT
;
}
else
{
pptReader
->
ReadDocument
(
NULL
);
m_Status
=
READMODE
;
}
//pptReader->ReadEncryptedSummary();
//pptReader->ReadDocumentSummary();
pptReader
->
ReadDocument
();
m_Status
=
READMODE
;
return
S_OK
;
}
...
...
@@ -166,94 +136,3 @@ std::wstring COfficePPTFile::GetDirectory(std::wstring strFileName)
}
return
strFileName
;
}
bool
COfficePPTFile
::
DecryptOfficeFile
(
CRYPT
::
Decryptor
*
Decryptor
)
{
if
(
!
m_pReader
)
return
false
;
CPPTFileReader
*
pptReader
=
(
CPPTFileReader
*
)(
m_pReader
);
if
(
m_strTempDirectory
.
empty
())
{
m_strTempDirectory
=
NSFile
::
CFileBinary
::
GetTempPath
();
}
m_sTempDecryptFileName
=
m_strTempDirectory
+
FILE_SEPARATOR_STR
+
L"~tempFile.ppt"
;
POLE
::
Storage
*
storageIn
=
pptReader
->
m_pPowerPointStg
;
POLE
::
Storage
*
storageOut
=
new
POLE
::
Storage
(
m_sTempDecryptFileName
.
c_str
());
if
(
!
storageOut
||
!
storageIn
)
return
false
;
if
(
!
storageOut
->
open
(
true
,
true
))
{
delete
storageOut
;
return
false
;
}
std
::
list
<
std
::
string
>
listStream
=
storageIn
->
entries
();
for
(
std
::
list
<
std
::
string
>::
iterator
it
=
listStream
.
begin
();
it
!=
listStream
.
end
();
it
++
)
{
if
(
storageIn
->
isDirectory
(
*
it
))
{
std
::
list
<
std
::
string
>
list_entry
=
storageIn
->
GetAllStreams
(
*
it
);
for
(
std
::
list
<
std
::
string
>::
iterator
it2
=
list_entry
.
begin
();
it2
!=
list_entry
.
end
();
it2
++
)
{
DecryptStream
(
Decryptor
,
*
it2
,
storageIn
,
storageOut
);
}
}
else
DecryptStream
(
Decryptor
,
*
it
,
storageIn
,
storageOut
);
}
storageOut
->
close
();
delete
storageOut
;
return
true
;
}
bool
COfficePPTFile
::
DecryptStream
(
CRYPT
::
Decryptor
*
Decryptor
,
std
::
string
streamName
,
POLE
::
Storage
*
storageIn
,
POLE
::
Storage
*
storageOut
)
{
POLE
::
Stream
*
stream
=
new
POLE
::
Stream
(
storageIn
,
streamName
);
if
(
!
stream
)
return
false
;
stream
->
seek
(
0
);
int
sz_stream
=
stream
->
size
();
POLE
::
Stream
*
streamNew
=
new
POLE
::
Stream
(
storageOut
,
streamName
,
true
,
sz_stream
);
if
(
!
streamNew
)
return
false
;
unsigned
char
*
data_stream
=
new
unsigned
char
[
sz_stream
];
stream
->
read
(
data_stream
,
sz_stream
);
unsigned
char
*
data_store
=
NULL
;
int
sz_data_store
=
0
;
//if ("WordDocument" == streamName)
//{
// sz_data_store = 68;
// data_store = new unsigned char[sz_data_store];
//}
if
(
data_store
)
memcpy
(
data_store
,
data_stream
,
sz_data_store
);
Decryptor
->
Decrypt
((
char
*
)
data_stream
,
sz_stream
,
0
);
if
(
data_store
)
memcpy
(
data_stream
,
data_store
,
sz_data_store
);
streamNew
->
write
(
data_stream
,
sz_stream
);
RELEASEARRAYOBJECTS
(
data_store
);
RELEASEARRAYOBJECTS
(
data_stream
);
streamNew
->
flush
();
delete
streamNew
;
delete
stream
;
return
true
;
}
ASCOfficePPTFile/PPTFormatLib/PPTFormatLib.h
View file @
ebdfcbd7
...
...
@@ -79,9 +79,6 @@ private:
long
OpenFile
(
const
std
::
wstring
&
fileName
,
const
std
::
wstring
&
password
);
bool
CloseFile
();
bool
DecryptOfficeFile
(
CRYPT
::
Decryptor
*
Decryptor
);
bool
DecryptStream
(
CRYPT
::
Decryptor
*
Decryptor
,
std
::
string
streamName
,
POLE
::
Storage
*
storageIn
,
POLE
::
Storage
*
storageOut
);
std
::
wstring
GetDirectory
(
std
::
wstring
strFileName
);
};
ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfo.h
View file @
ebdfcbd7
...
...
@@ -38,7 +38,7 @@ class CPPTDocumentInfo
public:
CCurrentUser
m_oCurrentUser
;
std
::
vector
<
CPPTUserInfo
*>
m_arUsers
;
std
::
wstring
m_str
File
Directory
;
std
::
wstring
m_str
Tmp
Directory
;
std
::
map
<
int
,
std
::
wstring
>
m_mapStoreImageFile
;
std
::
wstring
m_strPassword
;
...
...
@@ -85,7 +85,7 @@ public:
CPPTUserInfo
*
pInfo
=
new
CPPTUserInfo
();
pInfo
->
m_str
FileDirectory
=
m_strFile
Directory
;
pInfo
->
m_str
TmpDirectory
=
m_strTmp
Directory
;
pInfo
->
m_bEncrypt
=
m_oCurrentUser
.
m_bIsEncrypt
;
pInfo
->
m_strPassword
=
m_strPassword
;
...
...
ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp
View file @
ebdfcbd7
...
...
@@ -48,6 +48,8 @@ CPPTUserInfo::CPPTUserInfo() : CDocument(),
m_mapNotes
(),
m_mapSlides
(),
m_bEncrypt
(
false
),
m_pStorageDecrypt
(
NULL
),
m_pDecryptor
(
NULL
),
m_arOffsetPictures
()
{
m_pDocumentInfo
=
NULL
;
...
...
@@ -59,7 +61,6 @@ CPPTUserInfo::CPPTUserInfo() : CDocument(),
m_nWriteSlideTimeOffset
=
0.0
;
m_nWriteSlideTime
=
0.0
;
m_strFileDirectory
=
_T
(
""
);
m_bIsSetupEmpty
=
false
;
m_bRtl
=
false
;
...
...
@@ -79,6 +80,9 @@ CPPTUserInfo::~CPPTUserInfo()
void
CPPTUserInfo
::
Clear
()
{
CDocument
::
Clear
();
RELEASEOBJECT
(
m_pDecryptor
);
RELEASEOBJECT
(
m_pStorageDecrypt
);
for
(
std
::
map
<
DWORD
,
CRecordSlide
*>::
iterator
pPair
=
m_mapSlides
.
begin
();
pPair
!=
m_mapSlides
.
end
();
++
pPair
)
{
...
...
@@ -150,7 +154,6 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
oPersist
.
ReadFromStream
(
oHeader
,
pStream
);
oPersist
.
ToMap
(
&
m_mapOffsetInPIDs
);
//--------------------------------------------------------------------------------------------------
CRYPT
::
ECMADecryptor
*
pDecryptor
=
NULL
;
std
::
map
<
DWORD
,
DWORD
>::
iterator
pPair
=
m_mapOffsetInPIDs
.
find
(
m_oUser
.
m_nEncryptRef
);
if
(
pPair
!=
m_mapOffsetInPIDs
.
end
())
...
...
@@ -163,21 +166,49 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
m_bEncrypt
=
true
;
m_oEncryptionHeader
.
ReadFromStream
(
oHeader
,
pStream
);
pDecryptor
=
new
CRYPT
::
ECMADecryptor
();
pDecryptor
->
SetCryptData
(
m_oEncryptionHeader
.
crypt_data_aes
);
if
(
pDecryptor
->
SetPassword
(
m_strPassword
)
==
false
)
m_
pDecryptor
=
new
CRYPT
::
ECMADecryptor
();
m_
pDecryptor
->
SetCryptData
(
m_oEncryptionHeader
.
crypt_data_aes
);
if
(
m_strPassword
.
empty
()
)
{
delete
pDecryptor
;
pDecryptor
=
NULL
;
//return true;
if
(
m_pDecryptor
->
SetPassword
(
L"VelvetSweatshop"
)
==
false
)
return
false
;
}
return
true
;
//read persis decrypt
else
if
(
m_pDecryptor
->
SetPassword
(
m_strPassword
)
==
false
)
{
return
false
;
}
std
::
wstring
sTemp
=
m_strTmpDirectory
+
FILE_SEPARATOR_STR
+
L"~tempFile.ppt"
;
m_pStorageDecrypt
=
new
POLE
::
Storage
(
sTemp
.
c_str
());
m_pStorageDecrypt
->
open
(
true
,
true
);
}
}
//--------------------------------------------------------------------------------------------------
pPair
=
m_mapOffsetInPIDs
.
find
(
m_oUser
.
m_nDocumentRef
);
ReadDocumentPersists
(
pStream
);
return
true
;
}
void
CPPTUserInfo
::
DecryptStream
(
POLE
::
Stream
*
pStream
,
int
block
)
{
int
size
=
pStream
->
size
()
-
pStream
->
tell
();
POLE
::
Stream
*
pStreamTmp
=
new
POLE
::
Stream
(
m_pStorageDecrypt
,
"Tmp"
+
std
::
to_string
(
m_arStreamDecrypt
.
size
()
+
1
),
true
,
size
);
unsigned
char
*
data_stream
=
new
unsigned
char
[
size
];
pStream
->
read
(
data_stream
,
size
);
m_pDecryptor
->
Decrypt
((
char
*
)
data_stream
,
size
,
block
);
pStreamTmp
->
write
(
data_stream
,
size
);
pStreamTmp
->
flush
();
pStreamTmp
->
seek
(
0
);
m_arStreamDecrypt
.
push_back
(
CFStreamPtr
(
new
CFStream
(
pStreamTmp
)));
}
bool
CPPTUserInfo
::
ReadDocumentPersists
(
POLE
::
Stream
*
pStream
)
{
SRecordHeader
oHeader
;
std
::
map
<
DWORD
,
DWORD
>::
iterator
pPair
=
m_mapOffsetInPIDs
.
find
(
m_oUser
.
m_nDocumentRef
);
if
(
pPair
==
m_mapOffsetInPIDs
.
end
())
return
false
;
...
...
@@ -185,44 +216,19 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
DWORD
offset_stream
=
pPair
->
second
;
StreamUtils
::
StreamSeek
(
offset_stream
,
pStream
);
oHeader
.
ReadFromStream
(
pStream
);
if
(
pDecryptor
)
POLE
::
Stream
*
pStreamTmp
=
pStream
;
if
(
m_pDecryptor
)
{
POLE
::
Storage
*
pStorageOut
=
NULL
;
POLE
::
Stream
*
pStreamTmp
=
NULL
;
std
::
wstring
sTemp
=
m_strFileDirectory
+
FILE_SEPARATOR_STR
+
L"~tempFile.ppt"
;
pStorageOut
=
new
POLE
::
Storage
(
sTemp
.
c_str
());
pStorageOut
->
open
(
true
,
true
);
pStreamTmp
=
new
POLE
::
Stream
(
pStorageOut
,
"Tmp"
,
true
,
oHeader
.
RecLen
);
unsigned
char
*
data_stream
=
new
unsigned
char
[
oHeader
.
RecLen
];
pStream
->
read
(
data_stream
,
oHeader
.
RecLen
);
pDecryptor
->
Decrypt
((
char
*
)
data_stream
,
oHeader
.
RecLen
,
m_oUser
.
m_nDocumentRef
);
pStreamTmp
->
write
(
data_stream
,
oHeader
.
RecLen
);
pStreamTmp
->
flush
();
pStreamTmp
->
seek
(
0
);
m_oDocument
.
ReadFromStream
(
oHeader
,
pStreamTmp
);
delete
pStream
;
delete
pStorageOut
;
//NSFile::DeleteFile(sTemp);
DecryptStream
(
pStream
,
m_oUser
.
m_nDocumentRef
);
pStreamTmp
=
m_arStreamDecrypt
.
back
()
->
stream_
;
}
else
oHeader
.
ReadFromStream
(
pStreamTmp
);
if
(
RECORD_TYPE_DOCUMENT
!=
oHeader
.
RecType
)
{
if
(
RECORD_TYPE_DOCUMENT
!=
oHeader
.
RecType
)
{
return
false
;
}
m_oDocument
.
ReadFromStream
(
oHeader
,
pStream
);
return
false
;
}
Clear
();
m_oDocument
.
ReadFromStream
(
oHeader
,
pStreamTmp
);
std
::
map
<
DWORD
,
DWORD
>::
iterator
nIndexPsrRef
;
...
...
@@ -235,11 +241,16 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
offset_stream
=
nIndexPsrRef
->
second
;
StreamUtils
::
StreamSeek
(
offset_stream
,
pStream
);
oHeader
.
ReadFromStream
(
pStream
);
POLE
::
Stream
*
pStreamTmp
=
pStream
;
if
(
m_pDecryptor
)
{
DecryptStream
(
pStream
,
m_oDocument
.
m_arMasterPersists
[
index
].
m_nPsrRef
);
pStreamTmp
=
m_arStreamDecrypt
.
back
()
->
stream_
;
}
oHeader
.
ReadFromStream
(
pStreamTmp
);
CRecordSlide
*
pSlide
=
new
CRecordSlide
();
pSlide
->
ReadFromStream
(
oHeader
,
pStream
);
pSlide
->
ReadFromStream
(
oHeader
,
pStream
Tmp
);
pSlide
->
m_oPersist
=
m_oDocument
.
m_arMasterPersists
[
index
];
pSlide
->
m_Index
=
m_mapMasters
.
size
();
...
...
@@ -260,10 +271,17 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
{
offset_stream
=
nIndexPsrRef
->
second
;
StreamUtils
::
StreamSeek
(
offset_stream
,
pStream
);
oHeader
.
ReadFromStream
(
pStream
);
POLE
::
Stream
*
pStreamTmp
=
pStream
;
if
(
m_pDecryptor
)
{
DecryptStream
(
pStream
,
m_oDocument
.
m_arNotePersists
[
index
].
m_nPsrRef
);
pStreamTmp
=
m_arStreamDecrypt
.
back
()
->
stream_
;
}
oHeader
.
ReadFromStream
(
pStreamTmp
);
CRecordSlide
*
pSlide
=
new
CRecordSlide
();
pSlide
->
ReadFromStream
(
oHeader
,
pStream
);
pSlide
->
ReadFromStream
(
oHeader
,
pStream
Tmp
);
pSlide
->
m_oPersist
=
m_oDocument
.
m_arNotePersists
[
index
];
pSlide
->
m_Index
=
m_mapNotes
.
size
();
...
...
@@ -284,13 +302,18 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
if
(
m_mapOffsetInPIDs
.
end
()
!=
nIndexPsrRef
)
{
offset_stream
=
(
long
)
nIndexPsrRef
->
second
;
StreamUtils
::
StreamSeek
(
offset_stream
,
pStream
);
oHeader
.
ReadFromStream
(
pStream
);
POLE
::
Stream
*
pStreamTmp
=
pStream
;
if
(
m_pDecryptor
)
{
DecryptStream
(
pStream
,
m_oDocument
.
m_arSlidePersists
[
index
].
m_nPsrRef
);
pStreamTmp
=
m_arStreamDecrypt
.
back
()
->
stream_
;
}
oHeader
.
ReadFromStream
(
pStreamTmp
);
CRecordSlide
*
pSlide
=
new
CRecordSlide
();
pSlide
->
ReadFromStream
(
oHeader
,
pStream
);
pSlide
->
ReadFromStream
(
oHeader
,
pStream
Tmp
);
pSlide
->
m_oPersist
=
m_oDocument
.
m_arSlidePersists
[
index
];
pSlide
->
m_Index
=
m_mapSlides
.
size
();
// in m_arrSlidesOrder
...
...
@@ -327,13 +350,18 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
if
(
m_mapOffsetInPIDs
.
end
()
!=
nIndexPsrRef
)
{
offset_stream
=
nIndexPsrRef
->
second
;
StreamUtils
::
StreamSeek
(
offset_stream
,
pStream
);
oHeader
.
ReadFromStream
(
pStream
);
POLE
::
Stream
*
pStreamTmp
=
pStream
;
if
(
m_pDecryptor
)
{
DecryptStream
(
pStream
,
oArrayDoc
[
0
]
->
m_nNotesMasterPersistIDRef
);
pStreamTmp
=
m_arStreamDecrypt
.
back
()
->
stream_
;
}
oHeader
.
ReadFromStream
(
pStreamTmp
);
CRecordSlide
*
pSlide
=
new
CRecordSlide
();
pSlide
->
ReadFromStream
(
oHeader
,
pStream
);
pSlide
->
ReadFromStream
(
oHeader
,
pStream
Tmp
);
pSlide
->
m_oPersist
.
m_nPsrRef
=
oArrayDoc
[
0
]
->
m_nNotesMasterPersistIDRef
;
pSlide
->
m_Index
=
0
;
...
...
@@ -344,13 +372,18 @@ bool CPPTUserInfo::ReadFromStream(CRecordUserEditAtom* pUser, POLE::Stream* pStr
if
(
m_mapOffsetInPIDs
.
end
()
!=
nIndexPsrRef
)
{
offset_stream
=
nIndexPsrRef
->
second
;
StreamUtils
::
StreamSeek
(
offset_stream
,
pStream
);
oHeader
.
ReadFromStream
(
pStream
);
POLE
::
Stream
*
pStreamTmp
=
pStream
;
if
(
m_pDecryptor
)
{
DecryptStream
(
pStream
,
oArrayDoc
[
0
]
->
m_nHandoutMasterPersistIDRef
);
pStreamTmp
=
m_arStreamDecrypt
.
back
()
->
stream_
;
}
oHeader
.
ReadFromStream
(
pStreamTmp
);
CRecordSlide
*
pSlide
=
new
CRecordSlide
();
pSlide
->
ReadFromStream
(
oHeader
,
pStream
);
pSlide
->
ReadFromStream
(
oHeader
,
pStream
Tmp
);
pSlide
->
m_oPersist
.
m_nPsrRef
=
oArrayDoc
[
0
]
->
m_nHandoutMasterPersistIDRef
;
pSlide
->
m_Index
=
0
;
...
...
@@ -364,7 +397,6 @@ void CPPTUserInfo::ReadExtenalObjects(std::wstring strFolderMem)
{
// так... теперь берем всю инфу о ExObject -----------------------------
m_oExMedia
.
m_strPresentationDirectory
=
strFolderMem
;
m_oExMedia
.
m_strSourceDirectory
=
m_strFileDirectory
;
NSPresentationEditor
::
CExFilesInfo
oInfo
;
...
...
ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.h
View file @
ebdfcbd7
...
...
@@ -51,7 +51,10 @@ public:
CEncryptionHeader
m_oEncryptionHeader
;
bool
m_bEncrypt
;
std
::
wstring
m_strPassword
;
CRYPT
::
ECMADecryptor
*
m_pDecryptor
;
POLE
::
Storage
*
m_pStorageDecrypt
;
std
::
vector
<
CFStreamPtr
>
m_arStreamDecrypt
;
// на каждый Persist свой ... оО
std
::
map
<
DWORD
,
CRecordSlide
*>
m_mapSlides
;
std
::
map
<
DWORD
,
CRecordSlide
*>
m_mapMasters
;
std
::
map
<
DWORD
,
CRecordSlide
*>
m_mapNotes
;
...
...
@@ -106,7 +109,7 @@ public:
std
::
vector
<
int
>
m_arOffsetPictures
;
bool
m_bIsSetupEmpty
;
std
::
wstring
m_str
File
Directory
;
std
::
wstring
m_str
Tmp
Directory
;
// вся инфа о ex - файлах
CExMedia
m_oExMedia
;
...
...
@@ -124,7 +127,11 @@ public:
void
Clear
();
bool
ReadFromStream
(
CRecordUserEditAtom
*
pUser
,
POLE
::
Stream
*
pStream
);
bool
ReadDocumentPersists
(
POLE
::
Stream
*
pStream
);
void
ReadExtenalObjects
(
std
::
wstring
strFolderMem
);
void
DecryptStream
(
POLE
::
Stream
*
pStream
,
int
block
);
void
FromDocument
();
void
NormalizeCoords
(
long
lWidth
,
long
lHeight
);
...
...
@@ -301,7 +308,6 @@ public:
}
return
_T
(
"blank"
);
}
void
AddAnimation
(
DWORD
dwSlideID
,
double
Width
,
double
Height
,
IElement
*
pElement
);
void
AddAudioTransition
(
DWORD
dwSlideID
,
CTransition
*
pTransition
,
const
std
::
wstring
&
strFilePath
);
...
...
ASCOfficePPTFile/PPTFormatLib/Reader/PPTFileReader.cpp
0 → 100644
View file @
ebdfcbd7
/*
* (c) Copyright Ascensio System SIA 2010-2017
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#include "PPTFileReader.h"
#include "../../../ASCOfficeXlsFile2/source/XlsFormat/Crypt/Decryptor.h"
#include "../../../ASCOfficeXlsFile2/source/XlsFormat/Logic/SummaryInformationStream/SummaryInformation.h"
#include "../../../DesktopEditor/common/Directory.h"
#include "../Records/Drawing/ArtBlip.h"
#define CURRENT_USER_STREAM "Current User"
#define DOCUMENT_STREAM "PowerPoint Document"
#define PICTURE_STREAM "Pictures"
#define HEADER_STREAM "Header"
#define PP97_DUALSTORAGE "PP97_DUALSTORAGE"
#define ENCRYPTED_SUMMARY_STREAM "EncryptedSummary"
#define DOCUMENT_SUMMARY_STREAM "DocumentSummaryInformation"
CPPTFileReader
::
CPPTFileReader
(
POLE
::
Storage
*
pStorage
,
std
::
wstring
strTemp
)
:
m_pStorage
(
pStorage
),
m_bIsPPTFile
(
false
),
m_nPresentationCodePage
(
1250
),
m_pDocumentStream
(
NULL
),
m_pPictureStream
(
NULL
),
m_pDocumentSummaryStream
(
NULL
),
m_pEncryptedSummaryStream
(
NULL
),
m_strTmpDirectory
(
strTemp
),
m_oDocumentInfo
()
{
m_bDualStorage
=
false
;
POLE
::
Stream
*
pStm
=
new
POLE
::
Stream
(
m_pStorage
,
CURRENT_USER_STREAM
);
if
(
ReadCurrentUser
(
pStm
)
)
{
m_bIsPPTFile
=
true
;
}
else
{
RELEASEOBJECT
(
pStm
);
std
::
string
stream_name
=
std
::
string
(
PP97_DUALSTORAGE
)
+
std
::
string
(
"/"
)
+
std
::
string
(
CURRENT_USER_STREAM
);
pStm
=
new
POLE
::
Stream
(
m_pStorage
,
stream_name
);
if
(
pStm
==
NULL
)
return
;
m_bDualStorage
=
true
;
if
(
ReadCurrentUser
(
pStm
))
{
m_bIsPPTFile
=
true
;
}
}
RELEASEOBJECT
(
pStm
);
if
(
0
==
m_strTmpDirectory
.
length
())
{
m_strTmpDirectory
=
NSDirectory
::
GetTempPath
();
}
m_strTmpDirectory
=
NSDirectory
::
CreateDirectoryWithUniqueName
(
m_strTmpDirectory
);
}
CPPTFileReader
::~
CPPTFileReader
()
{
RELEASEOBJECT
(
m_pStorage
);
NSDirectory
::
DeleteDirectory
(
m_strTmpDirectory
);
}
bool
CPPTFileReader
::
IsPowerPoint
()
{
return
m_bIsPPTFile
;
}
bool
CPPTFileReader
::
IsEncrypted
()
{
if
(
m_oDocumentInfo
.
m_arUsers
.
empty
())
return
m_oDocumentInfo
.
m_oCurrentUser
.
m_bIsEncrypt
;
//wps не выставляет флаг!
return
m_oDocumentInfo
.
m_arUsers
[
0
]
->
m_bEncrypt
;
}
bool
CPPTFileReader
::
ReadPersists
()
{
CFStreamPtr
pStream
=
GetDocumentStream
();
if
(
!
pStream
)
return
false
;
if
(
m_oDocumentInfo
.
ReadFromStream
(
&
m_oCurrentUser
,
pStream
->
stream_
)
==
false
)
return
false
;
}
void
CPPTFileReader
::
ReadDocument
()
{
ReadPictures
();
m_oDocumentInfo
.
LoadDocument
(
m_strTmpDirectory
);
}
bool
CPPTFileReader
::
ReadCurrentUser
(
POLE
::
Stream
*
pStm
)
{
if
(
!
pStm
)
return
false
;
SRecordHeader
oHeader
;
bool
isPP
=
false
;
if
(
oHeader
.
ReadFromStream
(
pStm
))
{
m_oCurrentUser
.
ReadFromStream
(
oHeader
,
pStm
);
isPP
=
(
m_oCurrentUser
.
m_nSize
==
0x00000014
&&
(
m_oCurrentUser
.
m_nLenUserName
<=
255
));
}
return
isPP
;
}
CFStreamPtr
CPPTFileReader
::
GetDocumentStream
()
{
if
(
!
m_pDocumentStream
)
{
m_pDocumentStream
=
GetStreamByName
(
DOCUMENT_STREAM
);
}
return
m_pDocumentStream
;
}
CFStreamPtr
CPPTFileReader
::
GetPictureStream
()
{
if
(
!
m_pPictureStream
)
{
m_pPictureStream
=
GetStreamByName
(
PICTURE_STREAM
);
}
return
m_pPictureStream
;
}
CFStreamPtr
CPPTFileReader
::
GetStreamByName
(
const
std
::
string
&
name
)
{
if
(
!
m_bIsPPTFile
)
return
CFStreamPtr
();
std
::
string
stream_name
;
if
(
m_bDualStorage
)
stream_name
=
std
::
string
(
PP97_DUALSTORAGE
)
+
std
::
string
(
"/"
);
POLE
::
Stream
*
pStream
=
new
POLE
::
Stream
(
m_pStorage
,
stream_name
+
name
);
if
(
pStream
->
fail
())
{
RELEASEOBJECT
(
pStream
);
return
CFStreamPtr
();
}
return
CFStreamPtr
(
new
CFStream
(
pStream
));
}
CFStreamPtr
CPPTFileReader
::
GetEncryptedSummaryStream
()
{
if
(
m_pEncryptedSummaryStream
==
NULL
)
{
m_pEncryptedSummaryStream
=
GetStreamByName
(
ENCRYPTED_SUMMARY_STREAM
);
}
return
m_pEncryptedSummaryStream
;
}
CFStreamPtr
CPPTFileReader
::
GetDocumentSummaryStream
()
{
if
(
!
m_pDocumentSummaryStream
)
{
m_pDocumentSummaryStream
=
GetStreamByName
(
DOCUMENT_SUMMARY_STREAM
);
}
return
m_pDocumentSummaryStream
;
}
void
CPPTFileReader
::
ReadEncryptedSummary
()
{
CFStreamPtr
pStream
=
GetEncryptedSummaryStream
();
if
(
!
pStream
)
return
;
SRecordHeader
oHeader
;
ULONG
nRd
=
0
;
if
(
oHeader
.
ReadFromStream
(
pStream
)
==
false
)
{
return
;
}
CRecordEncryptedSummary
info
;
info
.
ReadFromStream
(
oHeader
,
pStream
);
}
void
CPPTFileReader
::
ReadDocumentSummary
()
{
CFStreamPtr
pStream
=
GetDocumentSummaryStream
();
if
(
!
pStream
)
return
;
OLEPS
::
SummaryInformation
doc_summary_info
(
pStream
);
m_nPresentationCodePage
=
doc_summary_info
.
GetCodePage
();
if
(
m_nPresentationCodePage
==
0
)
m_nPresentationCodePage
=
1250
;
}
void
CPPTFileReader
::
ReadPictures
()
{
CFStreamPtr
pStream
=
GetPictureStream
();
if
(
!
pStream
)
return
;
SRecordHeader
oHeader
;
ULONG
nRd
=
0
;
CRYPT
::
ECMADecryptor
*
pDecryptor
=
m_oDocumentInfo
.
m_arUsers
[
0
]
->
m_pDecryptor
;
while
(
true
)
{
if
(
pStream
->
isEOF
())
break
;
int
pos
=
pStream
->
getStreamPointer
();
POLE
::
Stream
*
pStreamTmp
=
pStream
->
stream_
;
if
(
pDecryptor
)
{
m_oDocumentInfo
.
m_arUsers
[
0
]
->
DecryptStream
(
pStreamTmp
,
0
);
pStreamTmp
=
m_oDocumentInfo
.
m_arUsers
[
0
]
->
m_arStreamDecrypt
.
back
()
->
stream_
;
}
oHeader
.
ReadFromStream
(
pStreamTmp
);
pStream
->
seekFromBegin
(
pos
+
8
);
CRecordOfficeArtBlip
art_blip
;
art_blip
.
m_strTmpDirectory
=
m_strTmpDirectory
;
art_blip
.
m_oDocumentInfo
=
&
m_oDocumentInfo
;
pStreamTmp
=
pStream
->
stream_
;
if
(
pDecryptor
)
{
m_oDocumentInfo
.
m_arUsers
[
0
]
->
DecryptStream
(
pStreamTmp
,
1
);
pStreamTmp
=
m_oDocumentInfo
.
m_arUsers
[
0
]
->
m_arStreamDecrypt
.
back
()
->
stream_
;
}
art_blip
.
ReadFromStream
(
oHeader
,
pStreamTmp
);
pStream
->
seekFromBegin
(
pos
+
oHeader
.
RecLen
+
8
);
m_oDocumentInfo
.
m_mapStoreImageFile
[
pos
]
=
art_blip
.
m_sFileName
;
}
}
ASCOfficePPTFile/PPTFormatLib/Reader/PPTFileReader.h
View file @
ebdfcbd7
...
...
@@ -31,222 +31,48 @@
*/
#pragma once
#include "../../../ASCOfficeXlsFile2/source/XlsFormat/Crypt/Decryptor.h"
#include "../../../DesktopEditor/common/Directory.h"
#include "../Records/Drawing/ArtBlip.h"
#include "PPTDocumentInfo.h"
#define CURRENT_USER_STREAM "Current User"
#define DOCUMENT_STREAM "PowerPoint Document"
#define PICTURE_STREAM "Pictures"
#define HEADER_STREAM "Header"
#define PP97_DUALSTORAGE "PP97_DUALSTORAGE"
#define ENCRYPTION_STREAM "EncryptedSummary"
using
namespace
XLS
;
class
CPPTFileReader
{
public:
CPPTFileReader
(
POLE
::
Storage
*
pStg
,
std
::
wstring
strTemp
)
:
m_pPowerPointStg
(
pStg
),
m_bIsPPTFile
(
false
),
m_pDocStream
(
NULL
),
m_pPictureStream
(
NULL
),
m_strMemoryForder
(
strTemp
),
m_oDocumentInfo
()
{
m_bDualStorage
=
false
;
POLE
::
Stream
*
pStm
=
new
POLE
::
Stream
(
m_pPowerPointStg
,
CURRENT_USER_STREAM
);
if
(
ReadCurrentUser
(
pStm
)
)
{
m_bIsPPTFile
=
true
;
}
else
{
RELEASEOBJECT
(
pStm
);
std
::
string
stream_name
=
std
::
string
(
PP97_DUALSTORAGE
)
+
std
::
string
(
"/"
)
+
std
::
string
(
CURRENT_USER_STREAM
);
pStm
=
new
POLE
::
Stream
(
m_pPowerPointStg
,
stream_name
);
if
(
pStm
==
NULL
)
return
;
m_bDualStorage
=
true
;
if
(
ReadCurrentUser
(
pStm
))
{
m_bIsPPTFile
=
true
;
}
}
RELEASEOBJECT
(
pStm
);
if
(
0
==
m_strMemoryForder
.
length
())
{
m_strMemoryForder
=
NSDirectory
::
GetTempPath
();
}
m_strMemoryForder
=
NSDirectory
::
CreateDirectoryWithUniqueName
(
m_strMemoryForder
);
}
~
CPPTFileReader
()
{
RELEASEOBJECT
(
m_pDocStream
);
RELEASEOBJECT
(
m_pPictureStream
);
RELEASEOBJECT
(
m_pPowerPointStg
);
NSDirectory
::
DeleteDirectory
(
m_strMemoryForder
);
}
bool
IsPowerPoint
()
{
return
m_bIsPPTFile
;
}
bool
IsEncrypted
()
{
if
(
m_oDocumentInfo
.
m_arUsers
.
empty
())
return
m_oDocumentInfo
.
m_oCurrentUser
.
m_bIsEncrypt
;
//wps не выставляет флаг!
return
m_oDocumentInfo
.
m_arUsers
[
0
]
->
m_bEncrypt
;
}
CEncryptionHeader
*
GetEncryptionHeader
()
{
if
(
m_oDocumentInfo
.
m_arUsers
.
empty
())
return
NULL
;
return
&
m_oDocumentInfo
.
m_arUsers
[
0
]
->
m_oEncryptionHeader
;
}
bool
ReadPersists
()
{
return
m_oDocumentInfo
.
ReadFromStream
(
&
m_oCurrentUser
,
GetDocStream
());
}
void
ReadDocument
(
CRYPT
::
ECMADecryptor
*
pDecryptor
)
{
ReadPictures
(
pDecryptor
);
m_oDocumentInfo
.
LoadDocument
(
m_strMemoryForder
);
}
CPPTFileReader
(
POLE
::
Storage
*
pStorage
,
std
::
wstring
strTemp
);
~
CPPTFileReader
();
bool
IsPowerPoint
();
bool
IsEncrypted
();
bool
ReadPersists
();
void
ReadDocument
();
protected:
bool
ReadCurrentUser
(
POLE
::
Stream
*
pStm
)
{
if
(
!
pStm
)
return
false
;
SRecordHeader
oHeader
;
bool
isPP
=
false
;
if
(
oHeader
.
ReadFromStream
(
pStm
))
{
m_oCurrentUser
.
ReadFromStream
(
oHeader
,
pStm
);
isPP
=
(
m_oCurrentUser
.
m_nSize
==
0x00000014
&&
(
m_oCurrentUser
.
m_nLenUserName
<=
255
));
}
return
isPP
;
}
POLE
::
Stream
*
GetDocStream
()
{
if
(
m_pDocStream
==
NULL
)
{
if
(
!
m_bIsPPTFile
)
return
NULL
;
std
::
string
stream_name
;
if
(
m_bDualStorage
)
stream_name
=
std
::
string
(
PP97_DUALSTORAGE
)
+
std
::
string
(
"/"
);
m_pDocStream
=
new
POLE
::
Stream
(
m_pPowerPointStg
,
stream_name
+
DOCUMENT_STREAM
);
}
return
m_pDocStream
;
}
POLE
::
Stream
*
GetPictureStream
()
{
if
(
m_pPictureStream
==
NULL
)
{
if
(
!
m_bIsPPTFile
)
return
NULL
;
std
::
string
stream_name
;
if
(
m_bDualStorage
)
stream_name
=
std
::
string
(
PP97_DUALSTORAGE
)
+
std
::
string
(
"/"
);
m_pPictureStream
=
new
POLE
::
Stream
(
m_pPowerPointStg
,
stream_name
+
PICTURE_STREAM
);
}
return
m_pPictureStream
;
}
void
ReadPictures
(
CRYPT
::
ECMADecryptor
*
pDecryptor
)
{
POLE
::
Stream
*
pStream
=
GetPictureStream
();
if
(
NULL
==
pStream
)
return
;
SRecordHeader
oHeader
;
ULONG
nRd
=
0
;
while
(
true
)
{
if
(
oHeader
.
ReadFromStream
(
pStream
)
==
false
)
{
break
;
}
CRecordOfficeArtBlip
art_blip
;
art_blip
.
m_strMemoryForder
=
m_strMemoryForder
;
art_blip
.
m_oDocumentInfo
=
&
m_oDocumentInfo
;
if
(
pDecryptor
)
{
POLE
::
Storage
*
pStorageOut
=
NULL
;
POLE
::
Stream
*
pStreamTmp
=
NULL
;
std
::
wstring
sTemp
=
m_strMemoryForder
+
FILE_SEPARATOR_STR
+
L"~tempFile.ppt"
;
pStorageOut
=
new
POLE
::
Storage
(
sTemp
.
c_str
());
pStorageOut
->
open
(
true
,
true
);
pStreamTmp
=
new
POLE
::
Stream
(
pStorageOut
,
"Tmp"
,
true
,
oHeader
.
RecLen
);
unsigned
char
*
data_stream
=
new
unsigned
char
[
oHeader
.
RecLen
];
pStream
->
read
(
data_stream
,
oHeader
.
RecLen
);
pDecryptor
->
Decrypt
((
char
*
)
data_stream
,
oHeader
.
RecLen
,
0
);
pStreamTmp
->
write
(
data_stream
,
oHeader
.
RecLen
);
pStreamTmp
->
flush
();
pStreamTmp
->
seek
(
0
);
art_blip
.
ReadFromStream
(
oHeader
,
pStreamTmp
);
delete
pStream
;
delete
pStorageOut
;
//NSFile::DeleteFile(sTemp);
}
else
{
art_blip
.
ReadFromStream
(
oHeader
,
pStream
);
}
}
}
CFStreamPtr
GetDocumentStream
();
CFStreamPtr
GetPictureStream
();
CFStreamPtr
GetEncryptedSummaryStream
();
CFStreamPtr
GetDocumentSummaryStream
();
CFStreamPtr
GetStreamByName
(
const
std
::
string
&
name
);
bool
ReadCurrentUser
(
POLE
::
Stream
*
pStm
);
void
ReadEncryptedSummary
();
void
ReadDocumentSummary
();
void
ReadPictures
();
private:
bool
m_bDualStorage
;
CRecordCurrentUserAtom
m_oCurrentUser
;
POLE
::
Stream
*
m_pDocStream
;
POLE
::
Stream
*
m_pPictureStream
;
XLS
::
CFStreamPtr
m_pDocumentStream
;
XLS
::
CFStreamPtr
m_pPictureStream
;
XLS
::
CFStreamPtr
m_pDocumentSummaryStream
;
XLS
::
CFStreamPtr
m_pEncryptedSummaryStream
;
bool
m_bIsPPTFile
;
public:
POLE
::
Storage
*
m_pPowerPointStg
;
std
::
wstring
m_strMemoryForder
;
POLE
::
Storage
*
m_pStorage
;
std
::
wstring
m_strTmpDirectory
;
std
::
vector
<
bool
>
m_arLoadImageFlags
;
CPPTDocumentInfo
m_oDocumentInfo
;
int
m_nPresentationCodePage
;
};
ASCOfficePPTFile/PPTFormatLib/Reader/Records.cpp
View file @
ebdfcbd7
...
...
@@ -35,6 +35,97 @@
#include <iostream>
std
::
wstring
CUnknownRecord
::
ReadStringW
(
const
CFStreamPtr
&
pStream
,
int
lLen
)
{
if
(
!
pStream
)
return
(
L""
);
unsigned
char
*
pData
=
new
unsigned
char
[
2
*
(
lLen
+
1
)];
memset
(
pData
,
0
,
2
*
(
lLen
+
1
));
pStream
->
read
(
pData
,
2
*
lLen
);
if
(
sizeof
(
wchar_t
)
==
4
)
{
ConversionResult
eUnicodeConversionResult
;
UTF32
*
pStrUtf32
=
new
UTF32
[
lLen
+
1
];
pStrUtf32
[
lLen
]
=
0
;
const
UTF16
*
pStrUtf16_Conv
=
(
const
UTF16
*
)
pData
;
UTF32
*
pStrUtf32_Conv
=
pStrUtf32
;
eUnicodeConversionResult
=
ConvertUTF16toUTF32
(
&
pStrUtf16_Conv
,
&
pStrUtf16_Conv
[
lLen
]
,
&
pStrUtf32_Conv
,
&
pStrUtf32
[
lLen
]
,
strictConversion
);
if
(
conversionOK
!=
eUnicodeConversionResult
)
{
delete
[]
pStrUtf32
;
return
(
L""
);
}
std
::
wstring
res
((
wchar_t
*
)
pStrUtf32
,
lLen
);
if
(
pStrUtf32
)
delete
[]
pStrUtf32
;
return
res
;
}
else
{
std
::
wstring
str
((
wchar_t
*
)
pData
);
delete
[]
pData
;
return
str
;
}
}
std
::
string
CUnknownRecord
::
ReadStringA
(
const
CFStreamPtr
&
pStream
,
int
lLen
)
{
if
(
!
pStream
)
return
(
""
);
char
*
pData
=
new
char
[
lLen
+
1
];
pStream
->
read
((
unsigned
char
*
)
pData
,
lLen
);
pData
[
lLen
]
=
0
;
std
::
string
str
(
pData
,
lLen
);
delete
[]
pData
;
return
str
;
}
void
CRecordsContainer
::
ReadFromStream
(
SRecordHeader
&
oHeader
,
const
CFStreamPtr
&
pStream
)
{
m_oHeader
=
oHeader
;
m_arRecords
.
clear
();
LONG
lPosition
=
pStream
->
getStreamPointer
();
m_oHeader
=
oHeader
;
UINT
lCurLen
=
0
;
ULONG
lReadLen
=
0
;
SRecordHeader
oRec
;
while
(
lCurLen
<
m_oHeader
.
RecLen
)
{
if
(
oRec
.
ReadFromStream
(
pStream
)
==
FALSE
)
{
break
;
}
IRecord
*
pRecord
=
CreateByType
(
oRec
);
pRecord
->
ReadFromStream
(
oRec
,
pStream
);
m_arRecords
.
push_back
(
pRecord
);
lCurLen
+=
(
8
+
oRec
.
RecLen
);
}
if
(
lCurLen
!=
m_oHeader
.
RecLen
)
{
// нужно разобраться, что тут такое!!!
LONG
lPosition
=
0
;
pStream
->
seekFromBegin
(
lPosition
+
m_oHeader
.
RecLen
);
}
}
void
CRecordsContainer
::
ReadFromStream
(
SRecordHeader
&
oHeader
,
POLE
::
Stream
*
pStream
)
{
m_oHeader
=
oHeader
;
...
...
ASCOfficePPTFile/PPTFormatLib/Reader/Records.h
View file @
ebdfcbd7
...
...
@@ -34,49 +34,77 @@
#include "PPTFileDefines.h"
#include "../Reader/ReadStructures.h"
#include "../../../ASCOfficePPTXFile/Editor/Drawing/Shapes/BaseShape/PPTShape/Enums.h"
#include "../../../ASCOfficeXlsFile2/source/XlsFormat/Binary/CFStream.h"
#include "../../../Common/3dParty/pole/pole.h"
#include "../../../OfficeCryptReader/source/CryptTransform.h"
using
namespace
NSPresentationEditor
;
using
namespace
XLS
;
class
SRecordHeader
{
public:
BYTE
RecVersion
;
USHORT
RecInstance
;
USHORT
RecType
;
UINT
RecLen
;
unsigned
char
RecVersion
;
unsigned
short
RecInstance
;
unsigned
short
RecType
;
_UINT32
RecLen
;
SRecordHeade
r
()
void
Clea
r
()
{
RecVersion
=
0
;
RecInstance
=
0
;
RecType
=
0
;
RecLen
=
0
;
}
SRecordHeader
()
{
Clear
();
}
bool
ReadFromStream
(
const
CFStreamPtr
&
pStream
)
{
Clear
();
if
(
pStream
->
isEOF
())
return
FALSE
;
POLE
::
uint64
nRd
=
0
;
unsigned
short
rec
=
0
;
pStream
->
read
((
unsigned
char
*
)
&
(
rec
),
2
);
RecInstance
=
rec
>>
4
;
RecVersion
=
rec
-
(
RecInstance
<<
4
);
*
pStream
>>
RecType
>>
RecLen
;
unsigned
long
sz
=
pStream
->
getStreamSize
()
-
pStream
->
getStreamPointer
();
if
(
RecLen
>
sz
)
{
RecLen
=
sz
;
}
return
true
;
}
bool
ReadFromStream
(
POLE
::
Stream
*
pStream
)
{
RecVersion
=
0
;
RecInstance
=
RecType
=
0
;
RecLen
=
0
;
Clear
();
if
(
!
pStream
)
return
false
;
POLE
::
uint64
nRd
=
0
;
unsigned
short
rec
=
0
;
nRd
=
pStream
->
read
((
unsigned
char
*
)
&
(
rec
),
2
);
if
(
nRd
!=
2
)
return
FALSE
;
if
(
nRd
!=
2
)
return
false
;
//RecVersion = rec & 0xFF0F;
RecInstance
=
rec
>>
4
;
RecVersion
=
rec
-
(
RecInstance
<<
4
);
RecVersion
=
rec
-
(
RecInstance
<<
4
);
nRd
=
pStream
->
read
((
unsigned
char
*
)
&
(
RecType
),
2
);
nRd
=
pStream
->
read
((
unsigned
char
*
)
&
(
RecLen
),
4
);
POLE
::
uint64
sz
=
pStream
->
size
()
-
pStream
->
tell
();
POLE
::
uint64
sz
=
pStream
->
size
()
-
pStream
->
tell
();
if
(
RecLen
>
sz
)
{
...
...
@@ -119,8 +147,8 @@ public:
SRecordHeader
m_oHeader
;
public:
// читаем из файла
virtual
~
IRecord
(){}
virtual
void
ReadFromStream
(
SRecordHeader
&
oHeader
,
const
CFStreamPtr
&
pStream
)
=
0
;
virtual
void
ReadFromStream
(
SRecordHeader
&
oHeader
,
POLE
::
Stream
*
pStream
)
=
0
;
};
...
...
@@ -137,17 +165,26 @@ public:
~
CUnknownRecord
()
{
}
virtual
void
ReadFromStream
(
SRecordHeader
&
oHeader
,
const
CFStreamPtr
&
pStream
)
{
m_oHeader
=
oHeader
;
pStream
->
seekFromCurForward
(
m_oHeader
.
RecLen
);
}
virtual
void
ReadFromStream
(
SRecordHeader
&
oHeader
,
POLE
::
Stream
*
pStream
)
{
m_oHeader
=
oHeader
;
StreamUtils
::
StreamSkip
((
long
)
m_oHeader
.
RecLen
,
pStream
);
}
std
::
wstring
ReadStringW
(
const
CFStreamPtr
&
pStream
,
int
size
);
std
::
string
ReadStringA
(
const
CFStreamPtr
&
pStream
,
int
size
);
};
IRecord
*
CreateByType
(
SRecordHeader
oHeader
);
class
CRecordsContainer
:
public
I
Record
class
CRecordsContainer
:
public
CUnknown
Record
{
protected:
std
::
vector
<
IRecord
*>
m_arRecords
;
...
...
@@ -176,6 +213,7 @@ public:
}
}
virtual
void
ReadFromStream
(
SRecordHeader
&
oHeader
,
const
CFStreamPtr
&
pStream
);
virtual
void
ReadFromStream
(
SRecordHeader
&
oHeader
,
POLE
::
Stream
*
pStream
);
template
<
typename
T
>
...
...
ASCOfficePPTFile/PPTFormatLib/Records/Animations/AnimationTypes.h
View file @
ebdfcbd7
This diff is collapsed.
Click to expand it.
ASCOfficePPTFile/PPTFormatLib/Records/CString.h
View file @
ebdfcbd7
...
...
@@ -36,8 +36,6 @@ class CRecordCString : public CUnknownRecord
{
public:
std
::
wstring
m_strText
;
public:
CRecordCString
()
{
...
...
ASCOfficePPTFile/PPTFormatLib/Records/CryptSession10Container.h
View file @
ebdfcbd7
...
...
@@ -32,6 +32,35 @@
#pragma once
#include "../../../ASCOfficeXlsFile2/source/XlsFormat/Crypt/Decryptor.h"
class
CRecordEncryptedSummary
:
public
CUnknownRecord
{
public:
CRecordEncryptedSummary
(){}
~
CRecordEncryptedSummary
(){}
DWORD
StreamOffset
;
DWORD
StreamSize
;
unsigned
short
Block
;
unsigned
char
NameSize
;
bool
fStream
;
std
::
wstring
StreamName
;
virtual
void
ReadFromStream
(
SRecordHeader
&
oHeader
,
const
CFStreamPtr
&
pStream
)
{
m_oHeader
=
oHeader
;
unsigned
char
flags
;
*
pStream
>>
StreamOffset
>>
StreamSize
>>
Block
>>
NameSize
>>
flags
;
fStream
=
GETBIT
(
flags
,
0
);
if
(
NameSize
>
0
&&
NameSize
<
0xff
)
{
StreamName
=
ReadStringW
(
pStream
,
NameSize
);
}
}
};
class
CEncryptionHeader
:
public
CUnknownRecord
{
public:
...
...
@@ -40,13 +69,8 @@ public:
CRYPT
::
_ecmaCryptData
crypt_data_aes
;
bool
bStandard
;
CEncryptionHeader
()
{
}
~
CEncryptionHeader
()
{
}
CEncryptionHeader
(){}
~
CEncryptionHeader
(){}
virtual
void
ReadFromStream
(
SRecordHeader
&
oHeader
,
POLE
::
Stream
*
pStream
)
{
...
...
ASCOfficePPTFile/PPTFormatLib/Records/Drawing/ArtBlip.cpp
View file @
ebdfcbd7
...
...
@@ -130,7 +130,8 @@ void CRecordOfficeArtBlip::ReadFromStream(SRecordHeader & oHeader, POLE::Stream*
if
(
0x046A
==
oHeader
.
RecInstance
||
0x06E2
==
oHeader
.
RecInstance
)
lOffset
=
17
;
else
if
(
0x046B
==
oHeader
.
RecInstance
||
0x06E3
==
oHeader
.
RecInstance
)
lOffset
=
33
;
StreamUtils
::
StreamSkip
(
lOffset
,
pStream
);
//StreamUtils::StreamSkip(lOffset, pStream);
std
::
string
str
=
StreamUtils
::
ReadStringA
(
pStream
,
lOffset
);
sExt
=
_T
(
".jpg"
);
break
;
...
...
@@ -140,7 +141,8 @@ void CRecordOfficeArtBlip::ReadFromStream(SRecordHeader & oHeader, POLE::Stream*
if
(
0x06E0
==
oHeader
.
RecInstance
)
lOffset
=
17
;
else
if
(
0x06E1
==
oHeader
.
RecInstance
)
lOffset
=
33
;
StreamUtils
::
StreamSkip
(
lOffset
,
pStream
);
//StreamUtils::StreamSkip(lOffset, pStream);
std
::
string
str
=
StreamUtils
::
ReadStringA
(
pStream
,
lOffset
);
sExt
=
_T
(
".png"
);
break
;
...
...
@@ -182,7 +184,7 @@ void CRecordOfficeArtBlip::ReadFromStream(SRecordHeader & oHeader, POLE::Stream*
std
::
wstring
strFile
=
L"Image "
+
std
::
to_wstring
(
nImagesCount
+
1
)
+
oMetaFile
.
m_sExtension
;
CFile
fileMeta
;
HRESULT
hr
=
fileMeta
.
CreateFile
(
m_str
MemoryForder
+
FILE_SEPARATOR_STR
+
strFile
);
HRESULT
hr
=
fileMeta
.
CreateFile
(
m_str
TmpDirectory
+
FILE_SEPARATOR_STR
+
strFile
);
if
(
hr
==
S_OK
)
{
...
...
@@ -200,7 +202,7 @@ void CRecordOfficeArtBlip::ReadFromStream(SRecordHeader & oHeader, POLE::Stream*
std
::
wstring
strFile
=
L"Image "
+
std
::
to_wstring
(
nImagesCount
+
1
)
+
sExt
;
CFile
fileImage
;
HRESULT
hr
=
fileImage
.
CreateFile
(
m_str
MemoryForder
+
FILE_SEPARATOR_STR
+
strFile
);
HRESULT
hr
=
fileImage
.
CreateFile
(
m_str
TmpDirectory
+
FILE_SEPARATOR_STR
+
strFile
);
if
(
hr
==
S_OK
)
{
if
(
RECORD_TYPE_ESCHER_BLIP_DIB
==
oHeader
.
RecType
)
...
...
@@ -222,11 +224,6 @@ void CRecordOfficeArtBlip::ReadFromStream(SRecordHeader & oHeader, POLE::Stream*
m_sFileName
=
strFile
;
}
int
dwOffset
=
pos
-
8
;
if
(
m_oDocumentInfo
)
{
m_oDocumentInfo
->
m_mapStoreImageFile
[
dwOffset
]
=
m_sFileName
;
}
}
}
ASCOfficePPTFile/PPTFormatLib/Records/Drawing/ArtBlip.h
View file @
ebdfcbd7
...
...
@@ -42,7 +42,7 @@ public:
CPPTDocumentInfo
*
m_oDocumentInfo
;
std
::
wstring
m_sFileName
;
std
::
wstring
m_str
MemoryForder
;
std
::
wstring
m_str
TmpDirectory
;
CRecordOfficeArtBlip
()
{
...
...
ASCOfficePPTFile/PPTFormatLib/Win32/PPTFormatLib.vcproj
View file @
ebdfcbd7
...
...
@@ -486,6 +486,10 @@
RelativePath=
"..\Reader\PPTFileDefines.h"
>
</File>
<File
RelativePath=
"..\Reader\PPTFileReader.cpp"
>
</File>
<File
RelativePath=
"..\Reader\PPTFileReader.h"
>
...
...
ASCOfficePPTXFile/Editor/Drawing/Attributes.h
View file @
ebdfcbd7
...
...
@@ -109,15 +109,14 @@ namespace NSPresentationEditor
class
CExMedia
{
public:
std
::
wstring
m_strPresentationDirectory
;
std
::
wstring
m_strSourceDirectory
;
std
::
wstring
m_strPresentationDirectory
;
std
::
vector
<
CExFilesInfo
>
m_arVideos
;
std
::
vector
<
CExFilesInfo
>
m_arImages
;
std
::
vector
<
CExFilesInfo
>
m_arAudios
;
std
::
vector
<
CExFilesInfo
>
m_arHyperlinks
;
std
::
vector
<
CExFilesInfo
>
m_arVideos
;
std
::
vector
<
CExFilesInfo
>
m_arImages
;
std
::
vector
<
CExFilesInfo
>
m_arAudios
;
std
::
vector
<
CExFilesInfo
>
m_arHyperlinks
;
std
::
vector
<
CExFilesInfo
>
m_arAudioCollection
;
std
::
vector
<
CExFilesInfo
>
m_arAudioCollection
;
public:
void
Clear
()
...
...
@@ -131,8 +130,6 @@ namespace NSPresentationEditor
public:
CExMedia
()
:
m_arVideos
(),
m_arImages
(),
m_arAudios
()
{
m_strPresentationDirectory
=
_T
(
""
);
m_strSourceDirectory
=
_T
(
""
);
}
CExMedia
(
const
CExMedia
&
oSrc
)
...
...
@@ -143,7 +140,6 @@ namespace NSPresentationEditor
CExMedia
&
operator
=
(
const
CExMedia
&
oSrc
)
{
m_strPresentationDirectory
=
oSrc
.
m_strPresentationDirectory
;
m_strSourceDirectory
=
oSrc
.
m_strSourceDirectory
;
for
(
size_t
i
=
0
;
i
<
oSrc
.
m_arVideos
.
size
();
i
++
)
m_arVideos
.
push_back
(
oSrc
.
m_arVideos
[
i
]);
...
...
ASCOfficePPTXFile/Editor/Drawing/Shapes/BaseShape/PPTShape/ElementSettings.h
View file @
ebdfcbd7
...
...
@@ -165,23 +165,6 @@ public:
}
}
}
// std::wstring ToString()
// {
// std::wstring str = _T("");
// str.Format(_T("%d,%d,%d,%d"), (long)m_ePID, (long)m_bIsBlip, (long)m_bComplex, (long)m_lValue);
// // не будем ничего писать - а то xml - не распознаются
// /*if (m_bComplex)
// {
// std::wstring strProp = CDirectory::BYTEArrayToString(m_pOptions, m_lValue);
// if (NSOfficeDrawing::pibName == m_ePID)
// {
// strProp = (std::wstring)CDirectory::BYTEArrayToStringW(m_pOptions, m_lValue);
// }
// str += _T(" options=") + strProp;
// }*/
// return _T("<Property command='") + str + _T("'/>");
// }
};
// А вот контейнер пропертей
...
...
ASCOfficeXlsFile2/source/XlsFormat/Binary/CFStream.h
View file @
ebdfcbd7
...
...
@@ -96,9 +96,8 @@ public:
void
appendDelayedItems
(
const
ReceiverItems
&
receiver_items_from_record
,
const
SourceItems
&
source_items_from_record
);
void
applyDelayedItems
();
POLE
::
Stream
*
stream_
;
private
:
POLE
::
Stream
*
stream_
;
CFStream
::
ReceiverItems
receiver_items
;
CFStream
::
SourceItems
source_items
;
}
;
...
...
OfficeCryptReader/source/CryptTransform.cpp
View file @
ebdfcbd7
...
...
@@ -49,7 +49,6 @@
#include "../../Common/DocxFormat/Source/Base/unicode_util.h"
#include "../../Common/DocxFormat/Source/Base/Types_32.h"
#include "../../ASCOfficeXlsFile2/source/XlsFormat/Crypt/rtl/cipher.h"
static
const
unsigned
char
encrVerifierHashInputBlockKey
[
8
]
=
{
0xfe
,
0xa7
,
0xd2
,
0x76
,
0x3b
,
0x4b
,
0x9e
,
0x79
};
static
const
unsigned
char
encrVerifierHashValueBlockKey
[
8
]
=
{
0xd7
,
0xaa
,
0x0f
,
0x6d
,
0x30
,
0x61
,
0x34
,
0x4e
};
...
...
@@ -381,8 +380,8 @@ bool EncryptCipher(_buf & key, _buf & iv, _buf & data_inp, _buf & data_out, CRYP
return
true
;
}
//ARC4::Decryption rc4Decryption;
CipherARCFOUR
rc4Decryption
;
ARC4
::
Decryption
rc4Decryption
;
// todooo -> in impl
bool
DecryptCipher
(
_buf
&
key
,
_buf
&
iv
,
_buf
&
data_inp
,
_buf
&
data_out
,
CRYPT_METHOD
::
_cipherAlgorithm
algorithm
,
StreamTransformationFilter
::
BlockPaddingScheme
padding
=
StreamTransformationFilter
::
NO_PADDING
)
...
...
@@ -398,8 +397,7 @@ bool DecryptCipher(_buf & key, _buf & iv, _buf & data_inp, _buf & data_out, CRY
}
else
if
(
algorithm
==
CRYPT_METHOD
::
RC4
)
{
rc4Decryption
.
Decode
(
data_inp
.
ptr
,
data_inp
.
size
,
data_out
.
ptr
,
data_out
.
size
);
//rc4Decryption.ProcessData(data_out.ptr, data_inp.ptr, data_inp.size);
rc4Decryption
.
ProcessData
(
data_out
.
ptr
,
data_inp
.
ptr
,
data_inp
.
size
);
}
else
//AES
{
...
...
@@ -486,10 +484,8 @@ bool ECMADecryptor::SetPassword(std::wstring _password)
if
(
cryptData
.
cipherAlgorithm
==
CRYPT_METHOD
::
RC4
)
{
//rc4Decryption.SetKey(verifierKey.ptr, verifierKey.size);
rc4Decryption
.
Init
(
CipherARCFOUR
::
rtl_Cipher_DirectionDecode
,
verifierKey
.
ptr
,
verifierKey
.
size
,
0
,
0
);
rc4Decryption
.
SetKey
(
verifierKey
.
ptr
,
verifierKey
.
size
);
}
//--------------------------------------------
_buf
decryptedVerifierHashInputBytes
;
DecryptCipher
(
verifierKey
,
pSalt
,
pEncVerInput
,
decryptedVerifierHashInputBytes
,
cryptData
.
cipherAlgorithm
);
...
...
@@ -568,19 +564,14 @@ bool ECMADecryptor::CheckDataIntegrity(unsigned char* data, int size)
return
(
hmac
==
expected
);
}
void
ECMADecryptor
::
Decrypt
(
unsigned
char
*
data_
ptr
,
int
data_
size
,
unsigned
char
*&
data_out
,
int
start_iv_block
)
void
ECMADecryptor
::
Decrypt
(
unsigned
char
*
data_
inp
,
int
size
,
unsigned
char
*&
data_out
,
int
start_iv_block
)
{
data_out
=
NULL
;
data_out
=
new
unsigned
char
[
size
]
;
_buf
pPassword
(
password
);
_buf
pSalt
(
cryptData
.
saltValue
);
_buf
empty
(
NULL
,
0
,
false
);
int
size
=
data_size
-
8
;
unsigned
char
*
data_inp
=
data_ptr
+
8
;
data_out
=
new
unsigned
char
[
size
];
if
(
cryptData
.
bAgile
)
{
_buf
pBlockKey
((
unsigned
char
*
)
encrKeyValueBlockKey
,
8
);
...
...
@@ -595,7 +586,7 @@ void ECMADecryptor::Decrypt(unsigned char* data_ptr, int data_size, unsigned ch
_buf
iv
(
cryptData
.
blockSize
);
memset
(
iv
.
ptr
,
0x00
,
cryptData
.
blockSize
);
int
i
=
start_iv_block
,
sz
=
4096
,
pos
=
0
;
int
i
=
start_iv_block
,
sz
=
4096
,
pos
=
0
;
//aes block size = 4096
while
(
pos
<
size
)
{
...
...
@@ -617,43 +608,21 @@ void ECMADecryptor::Decrypt(unsigned char* data_ptr, int data_size, unsigned ch
}
else
{
_buf
hashKey
=
GenerateHashKey
(
pSalt
,
pPassword
,
cryptData
.
hashSize
,
cryptData
.
spinCount
,
cryptData
.
hashAlgorithm
,
start_iv_block
);
CorrectHashSize
(
hashKey
,
cryptData
.
keySize
,
0
);
if
(
cryptData
.
cipherAlgorithm
==
CRYPT_METHOD
::
RC4
)
{
int
i
=
start_iv_block
,
sz
=
512
,
pos
=
0
;
_buf
pHashBuf
=
HashAppend
(
pSalt
,
pPassword
,
cryptData
.
hashAlgorithm
);
if
(
cryptData
.
keySize
==
5
)
CorrectHashSize
(
hashKey
,
16
,
0
);
//40-bit crypt key !!!
while
(
pos
<
size
)
{
if
(
pos
+
sz
>
size
)
sz
=
size
-
pos
;
_buf
block
((
unsigned
char
*
)
&
i
,
4
,
false
);
_buf
pDecryptedKey
=
HashAppend
(
pHashBuf
,
block
,
cryptData
.
hashAlgorithm
);
CorrectHashSize
(
pDecryptedKey
,
cryptData
.
keySize
,
0
);
if
(
cryptData
.
keySize
==
5
)
CorrectHashSize
(
pDecryptedKey
,
16
,
0
);
//40-bit crypt key !!!
CipherARCFOUR
rc4
;
rc4
.
Init
(
CipherARCFOUR
::
rtl_Cipher_DirectionDecode
,
pDecryptedKey
.
ptr
,
pDecryptedKey
.
size
,
0
,
0
);
rc4
.
Decode
(
data_inp
+
pos
,
sz
,
data_out
+
pos
,
sz
);
pos
+=
sz
,
i
++
;
}
rc4Decryption
.
SetKey
(
hashKey
.
ptr
,
hashKey
.
size
);
}
else
{
_buf
hashKey
=
GenerateHashKey
(
pSalt
,
pPassword
,
cryptData
.
hashSize
,
cryptData
.
spinCount
,
cryptData
.
hashAlgorithm
);
CorrectHashSize
(
hashKey
,
cryptData
.
keySize
,
0
);
_buf
pInp
(
data_inp
,
size
,
false
);
_buf
pOut
(
data_out
,
size
,
false
);
_buf
pInp
(
data_inp
,
size
,
false
);
_buf
pOut
(
data_out
,
size
,
false
);
DecryptCipher
(
hashKey
,
empty
,
pInp
,
pOut
,
cryptData
.
cipherAlgorithm
);
}
DecryptCipher
(
hashKey
,
empty
,
pInp
,
pOut
,
cryptData
.
cipherAlgorithm
);
}
}
...
...
OfficeCryptReader/source/ECMACryptFile.cpp
View file @
ebdfcbd7
...
...
@@ -713,10 +713,11 @@ bool ECMACryptFile::DecryptOfficeFile(std::wstring file_name_inp, std::wstring f
unsigned
char
*
data_out
=
NULL
;
int
readTrue
=
pStream
->
read
(
data
,
lengthRead
);
int
readData
=
readTrue
-
8
;
lengthData
=
*
((
_UINT64
*
)
data
);
decryptor
.
Decrypt
(
data
,
readTrue
,
data_out
);
//todoo сделать покусочное чтение декриптование
decryptor
.
Decrypt
(
data
+
8
,
readData
,
data_out
);
//todoo сделать покусочное чтение декриптование
if
(
data_out
)
{
...
...
X2tConverter/build/Qt/X2tConverter.pri
View file @
ebdfcbd7
...
...
@@ -7,7 +7,7 @@
QT -= core
QT -= gui
VERSION = 2.4.46
4
.0
VERSION = 2.4.46
5
.0
DEFINES += INTVER=$$VERSION
TARGET = x2t
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment