Exemplo n.º 1
0
        // methods overriding some methods in PdfObject

        /**
         * Returns the PDF representation of this <CODE>PdfString</CODE>.
         *
         * @return        an array of <CODE>byte</CODE>s
         */

        public override void ToPdf(PdfWriter writer, Stream os)
        {
            byte[]        b      = GetBytes();
            PdfEncryption crypto = null;

            if (writer != null)
            {
                crypto = writer.Encryption;
            }
            if (crypto != null && !crypto.IsEmbeddedFilesOnly())
            {
                b = crypto.EncryptByteArray(b);
            }
            if (hexWriting)
            {
                ByteBuffer buf = new ByteBuffer();
                buf.Append('<');
                int len = b.Length;
                for (int k = 0; k < len; ++k)
                {
                    buf.AppendHex(b[k]);
                }
                buf.Append('>');
                os.Write(buf.ToByteArray(), 0, buf.Size);
            }
            else
            {
                b = PdfContentByte.EscapeString(b);
                os.Write(b, 0, b.Length);
            }
        }
Exemplo n.º 2
0
        public PdfArray GetEncodedRecipients()
        {
            PdfArray EncodedRecipients = new PdfArray();

            byte[] cms = null;
            for (int i = 0; i < recipients.Count; i++)
            {
                try {
                    cms = GetEncodedRecipient(i);
                    EncodedRecipients.Add(new PdfLiteral(PdfContentByte.EscapeString(cms)));
                } catch {
                    EncodedRecipients = null;
                }
            }
            return(EncodedRecipients);
        }
Exemplo n.º 3
0
        public PdfDictionary GetEncryptionDictionary()
        {
            PdfDictionary 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.ADBE_PKCS7_S4);
                    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.ADBE_PKCS7_S4);
                    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.ADBE_PKCS7_S5);

                    PdfDictionary 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);
                    }
                    PdfDictionary 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);
                    }
                }

                IDigest sh = DigestUtilities.GetDigest("SHA1");
                byte[]  encodedRecipient = null;
                byte[]  seed             = publicKeyHandler.GetSeed();
                sh.BlockUpdate(seed, 0, seed.Length);
                for (int i = 0; i < publicKeyHandler.GetRecipientsSize(); i++)
                {
                    encodedRecipient = publicKeyHandler.GetEncodedRecipient(i);
                    sh.BlockUpdate(encodedRecipient, 0, encodedRecipient.Length);
                }
                if (!encryptMetadata)
                {
                    sh.BlockUpdate(metadataPad, 0, metadataPad.Length);
                }
                byte[] mdResult = new byte[sh.GetDigestSize()];
                sh.DoFinal(mdResult, 0);
                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 (revision == AES_256)
                {
                    if (!encryptMetadata)
                    {
                        dic.Put(PdfName.ENCRYPTMETADATA, PdfBoolean.PDFFALSE);
                    }
                    dic.Put(PdfName.OE, new PdfLiteral(PdfContentByte.EscapeString(oeKey)));
                    dic.Put(PdfName.UE, new PdfLiteral(PdfContentByte.EscapeString(ueKey)));
                    dic.Put(PdfName.PERMS, new PdfLiteral(PdfContentByte.EscapeString(perms)));
                    dic.Put(PdfName.V, new PdfNumber(revision));
                    dic.Put(PdfName.LENGTH, new PdfNumber(256));
                    PdfDictionary stdcf = new PdfDictionary();
                    stdcf.Put(PdfName.LENGTH, new PdfNumber(32));
                    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);
                    }
                    stdcf.Put(PdfName.CFM, PdfName.AESV3);
                    PdfDictionary cf = new PdfDictionary();
                    cf.Put(PdfName.STDCF, stdcf);
                    dic.Put(PdfName.CF, cf);
                }
                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));
                    PdfDictionary 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);
                    }
                    PdfDictionary cf = new PdfDictionary();
                    cf.Put(PdfName.STDCF, stdcf);
                    dic.Put(PdfName.CF, cf);
                }
            }
            return(dic);
        }
        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);
        }