namespace com.hitrust.util.Encryption
|
|
{
|
|
using com.hitrust.util.Checksums;
|
|
using System;
|
|
|
|
internal class PkzipClassicCryptoBase
|
|
{
|
|
private uint[] keys;
|
|
|
|
protected void Reset()
|
|
{
|
|
this.keys[0] = 0;
|
|
this.keys[1] = 0;
|
|
this.keys[2] = 0;
|
|
}
|
|
|
|
protected void SetKeys(byte[] keyData)
|
|
{
|
|
if (keyData == null)
|
|
{
|
|
throw new ArgumentNullException("keyData");
|
|
}
|
|
if (keyData.Length != 12)
|
|
{
|
|
throw new InvalidOperationException("Key length is not valid");
|
|
}
|
|
this.keys = new[] { (uint)((((keyData[3] << 0x18) | (keyData[2] << 0x10)) | (keyData[1] << 8)) | keyData[0]), (uint)((((keyData[7] << 0x18) | (keyData[6] << 0x10)) | (keyData[5] << 8)) | keyData[4]), (uint)((((keyData[11] << 0x18) | (keyData[10] << 0x10)) | (keyData[9] << 8)) | keyData[8]) };
|
|
}
|
|
|
|
protected byte TransformByte()
|
|
{
|
|
uint temp = (this.keys[2] & 0xffff) | 2;
|
|
return (byte) ((temp * (temp ^ 1)) >> 8);
|
|
}
|
|
|
|
protected void UpdateKeys(byte ch)
|
|
{
|
|
this.keys[0] = Crc32.ComputeCrc32(this.keys[0], ch);
|
|
this.keys[1] += (byte) this.keys[0];
|
|
this.keys[1] = (this.keys[1] * 0x8088405) + 1;
|
|
this.keys[2] = Crc32.ComputeCrc32(this.keys[2], (byte) (this.keys[1] >> 0x18));
|
|
}
|
|
}
|
|
}
|
|
|