private void SetupCryptoForExtract(string password)
{
//if (password == null) return;
if (_Encryption_FromZipFile == EncryptionAlgorithm.None) return;
if (_Encryption_FromZipFile == EncryptionAlgorithm.PkzipWeak)
{
if (password == null)
throw new ZipException("Missing password.");
this.ArchiveStream.Seek(this.FileDataPosition - 12, SeekOrigin.Begin);
// workitem 10178
Crisis.Ionic.Zip.SharedUtilities.Workaround_Ladybug318918(this.ArchiveStream);
_zipCrypto_forExtract = ZipCrypto.ForRead(password, this);
}
#if AESCRYPTO
else if (_Encryption_FromZipFile == EncryptionAlgorithm.WinZipAes128 ||
_Encryption_FromZipFile == EncryptionAlgorithm.WinZipAes256)
{
if (password == null)
throw new ZipException("Missing password.");
// If we already have a WinZipAesCrypto object in place, use it.
// It can be set up in the ReadDirEntry(), or during a previous Extract.
if (_aesCrypto_forExtract != null)
{
_aesCrypto_forExtract.Password = password;
}
else
{
int sizeOfSaltAndPv = GetLengthOfCryptoHeaderBytes(_Encryption_FromZipFile);
this.ArchiveStream.Seek(this.FileDataPosition - sizeOfSaltAndPv, SeekOrigin.Begin);
// workitem 10178
Ionic.Zip.SharedUtilities.Workaround_Ladybug318918(this.ArchiveStream);
int keystrength = GetKeyStrengthInBits(_Encryption_FromZipFile);
_aesCrypto_forExtract = WinZipAesCrypto.ReadFromStream(password, keystrength, this.ArchiveStream);
}
}
#endif
}