private void SetupGlobalEncryptionKey(byte[] documentID, byte[] userPad, byte[] ownerKey, int permissions)
{
this.documentID = documentID;
this.ownerKey = ownerKey;
this.permissions = permissions;
// use variable keylength
mkey = new byte[keyLength / 8];
//fixed by ujihara in order to follow PDF refrence
md5.Reset();
md5.BlockUpdate(userPad, 0, userPad.Length);
md5.BlockUpdate(ownerKey, 0, ownerKey.Length);
byte[] ext = new byte[4];
ext[0] = (byte)permissions;
ext[1] = (byte)(permissions >> 8);
ext[2] = (byte)(permissions >> 16);
ext[3] = (byte)(permissions >> 24);
md5.BlockUpdate(ext, 0, 4);
if (documentID != null)
md5.BlockUpdate(documentID, 0, documentID.Length);
if (!encryptMetadata)
md5.BlockUpdate(metadataPad, 0, metadataPad.Length);
byte[] hash = new byte[md5.GetDigestSize()];
md5.DoFinal(hash, 0);
byte[] digest = new byte[mkey.Length];
Array.Copy(hash, 0, digest, 0, mkey.Length);
md5.Reset();
// only use the really needed bits as input for the hash
if (revision == STANDARD_ENCRYPTION_128 || revision == AES_128) {
for (int k = 0; k < 50; ++k) {
Array.Copy(DigestAlgorithms.Digest("MD5", digest), 0, digest, 0, mkey.Length);
}
}
Array.Copy(digest, 0, mkey, 0, mkey.Length);
}