diff options
| author | richiesams | 2013-06-12 22:06:05 -0500 | 
|---|---|---|
| committer | richiesams | 2013-08-04 13:31:42 -0500 | 
| commit | ef37f14d539d417a1a4506c5c09df1409700aa30 (patch) | |
| tree | 5aece099c5ef8cfbc3e0d23daa1f310e865696a5 /engines/zvision/zfsArchive.cpp | |
| parent | 179f5de49897a723b2605a0fed18980ce144f68c (diff) | |
| download | scummvm-rg350-ef37f14d539d417a1a4506c5c09df1409700aa30.tar.gz scummvm-rg350-ef37f14d539d417a1a4506c5c09df1409700aa30.tar.bz2 scummvm-rg350-ef37f14d539d417a1a4506c5c09df1409700aa30.zip | |
ZVISION: Add xor encryption handling to ZfsArchive class
Diffstat (limited to 'engines/zvision/zfsArchive.cpp')
| -rw-r--r-- | engines/zvision/zfsArchive.cpp | 29 | 
1 files changed, 19 insertions, 10 deletions
| diff --git a/engines/zvision/zfsArchive.cpp b/engines/zvision/zfsArchive.cpp index a3111d7705..59e65f1713 100644 --- a/engines/zvision/zfsArchive.cpp +++ b/engines/zvision/zfsArchive.cpp @@ -55,16 +55,17 @@ ZfsArchive::~ZfsArchive() {  }  void ZfsArchive::readHeaders(Common::SeekableReadStream *stream) { -	ZfsHeader header; -  	// Don't do a straight struct cast since we can't guarantee endianness -	header.magic = stream->readUint32LE(); -	header.unknown1 = stream->readUint32LE(); -	header.unknown2 = stream->readUint32LE(); -	header.filesPerBlock = stream->readUint32LE(); -	header.fileCount = stream->readUint32LE(); -	header.xorKey = stream->readUint32LE(); -	header.fileSectionOffset = stream->readUint32LE(); +	_header.magic = stream->readUint32LE(); +	_header.unknown1 = stream->readUint32LE(); +	_header.maxNameLength = stream->readUint32LE(); +	_header.filesPerBlock = stream->readUint32LE(); +	_header.fileCount = stream->readUint32LE(); +	_header.xorKey[0] = stream->readByte(); +	_header.xorKey[1] = stream->readByte(); +	_header.xorKey[2] = stream->readByte(); +	_header.xorKey[3] = stream->readByte(); +	_header.fileSectionOffset = stream->readUint32LE();  	uint32 nextOffset; @@ -73,7 +74,7 @@ void ZfsArchive::readHeaders(Common::SeekableReadStream *stream) {  		nextOffset = stream->readUint32LE();  		// Read in each entry header -		for (int i = 0; i < header.filesPerBlock; i++) { +		for (int i = 0; i < _header.filesPerBlock; i++) {  			ZfsEntryHeader entryHeader;  			entryHeader.name = readEntryName(stream); @@ -135,10 +136,18 @@ Common::SeekableReadStream *ZfsArchive::createReadStreamForMember(const Common::  	byte* buffer = new byte[entryHeader->size];  	zfsArchive.read(buffer, entryHeader->size); +	// Decrypt the data in place +	if (_header.xorKey != 0) +		unXor(buffer, entryHeader->size, _header.xorKey);  	return new Common::MemoryReadStream(buffer, entryHeader->size, DisposeAfterUse::YES);  } +void ZfsArchive::unXor(byte *buffer, int length, const byte *xorKey) const { +	for (uint32 i = 0; i < length; i++) +		buffer[i] ^= xorKey[i % 4]; +} +  } // End namespace ZVision | 
