public PdfDictionary GetEncryptionDictionary()
{
var dic = new PdfDictionary();
if (PublicKeyHandler.GetRecipientsSize() > 0)
{
PdfArray recipients = null;
dic.Put(PdfName.Filter, PdfName.Pubsec);
dic.Put(PdfName.R, new PdfNumber(_revision));
recipients = PublicKeyHandler.GetEncodedRecipients();
if (_revision == STANDARD_ENCRYPTION_40)
{
dic.Put(PdfName.V, new PdfNumber(1));
dic.Put(PdfName.Subfilter, PdfName.AdbePkcs7S4);
dic.Put(PdfName.Recipients, recipients);
}
else if (_revision == STANDARD_ENCRYPTION_128 && _encryptMetadata)
{
dic.Put(PdfName.V, new PdfNumber(2));
dic.Put(PdfName.LENGTH, new PdfNumber(128));
dic.Put(PdfName.Subfilter, PdfName.AdbePkcs7S4);
dic.Put(PdfName.Recipients, recipients);
}
else
{
dic.Put(PdfName.R, new PdfNumber(AES_128));
dic.Put(PdfName.V, new PdfNumber(4));
dic.Put(PdfName.Subfilter, PdfName.AdbePkcs7S5);
var stdcf = new PdfDictionary();
stdcf.Put(PdfName.Recipients, recipients);
if (!_encryptMetadata)
{
stdcf.Put(PdfName.Encryptmetadata, PdfBoolean.Pdffalse);
}
if (_revision == AES_128)
{
stdcf.Put(PdfName.Cfm, PdfName.Aesv2);
}
else
{
stdcf.Put(PdfName.Cfm, PdfName.V2);
}
var cf = new PdfDictionary();
cf.Put(PdfName.Defaultcryptfilter, stdcf);
dic.Put(PdfName.Cf, cf);
if (_embeddedFilesOnly)
{
dic.Put(PdfName.Eff, PdfName.Defaultcryptfilter);
dic.Put(PdfName.Strf, PdfName.Identity);
dic.Put(PdfName.Stmf, PdfName.Identity);
}
else
{
dic.Put(PdfName.Strf, PdfName.Defaultcryptfilter);
dic.Put(PdfName.Stmf, PdfName.Defaultcryptfilter);
}
}
#if NET40
SHA1 sh = new SHA1CryptoServiceProvider();
byte[] encodedRecipient = null;
var seed = PublicKeyHandler.GetSeed();
sh.TransformBlock(seed, 0, seed.Length, seed, 0);
for (var i = 0; i < PublicKeyHandler.GetRecipientsSize(); i++)
{
encodedRecipient = PublicKeyHandler.GetEncodedRecipient(i);
sh.TransformBlock(encodedRecipient, 0, encodedRecipient.Length, encodedRecipient, 0);
}
if (!_encryptMetadata)
{
sh.TransformBlock(MetadataPad, 0, MetadataPad.Length, MetadataPad, 0);
}
sh.TransformFinalBlock(seed, 0, 0);
var mdResult = sh.Hash;
#else
byte[] mdResult;
using (var sh = IncrementalHash.CreateHash(HashAlgorithmName.SHA1))
{
var seed = PublicKeyHandler.GetSeed();
sh.AppendData(seed, 0, seed.Length);
for (var i = 0; i < PublicKeyHandler.GetRecipientsSize(); i++)
{
var encodedRecipient = PublicKeyHandler.GetEncodedRecipient(i);
sh.AppendData(encodedRecipient, 0, encodedRecipient.Length);
}
if (!_encryptMetadata)
{
sh.AppendData(MetadataPad, 0, MetadataPad.Length);
}
mdResult = sh.GetHashAndReset();
}
#endif
SetupByEncryptionKey(mdResult, _keyLength);
}
else
{
dic.Put(PdfName.Filter, PdfName.Standard);
dic.Put(PdfName.O, new PdfLiteral(PdfContentByte.EscapeString(OwnerKey)));
dic.Put(PdfName.U, new PdfLiteral(PdfContentByte.EscapeString(UserKey)));
dic.Put(PdfName.P, new PdfNumber(Permissions));
dic.Put(PdfName.R, new PdfNumber(_revision));
if (_revision == STANDARD_ENCRYPTION_40)
{
dic.Put(PdfName.V, new PdfNumber(1));
}
else if (_revision == STANDARD_ENCRYPTION_128 && _encryptMetadata)
{
dic.Put(PdfName.V, new PdfNumber(2));
dic.Put(PdfName.LENGTH, new PdfNumber(128));
}
else
{
if (!_encryptMetadata)
{
dic.Put(PdfName.Encryptmetadata, PdfBoolean.Pdffalse);
}
dic.Put(PdfName.R, new PdfNumber(AES_128));
dic.Put(PdfName.V, new PdfNumber(4));
dic.Put(PdfName.LENGTH, new PdfNumber(128));
var stdcf = new PdfDictionary();
stdcf.Put(PdfName.LENGTH, new PdfNumber(16));
if (_embeddedFilesOnly)
{
stdcf.Put(PdfName.Authevent, PdfName.Efopen);
dic.Put(PdfName.Eff, PdfName.Stdcf);
dic.Put(PdfName.Strf, PdfName.Identity);
dic.Put(PdfName.Stmf, PdfName.Identity);
}
else
{
stdcf.Put(PdfName.Authevent, PdfName.Docopen);
dic.Put(PdfName.Strf, PdfName.Stdcf);
dic.Put(PdfName.Stmf, PdfName.Stdcf);
}
if (_revision == AES_128)
{
stdcf.Put(PdfName.Cfm, PdfName.Aesv2);
}
else
{
stdcf.Put(PdfName.Cfm, PdfName.V2);
}
var cf = new PdfDictionary();
cf.Put(PdfName.Stdcf, stdcf);
dic.Put(PdfName.Cf, cf);
}
}
return(dic);
}