using System; using System.IO; using System.Collections; using iTextSharp.text.pdf.crypto; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.X509; using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.Cms; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Security; /** * The below 2 methods are from pdfbox. * * private DERObject CreateDERForRecipient(byte[] in, X509Certificate cert) ; * private KeyTransRecipientInfo ComputeRecipientInfo(X509Certificate x509certificate, byte[] abyte0); * * 2006-11-22 Aiken Sam. */ /** * Copyright (c) 2003-2006, www.pdfbox.org * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of pdfbox; nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * http://www.pdfbox.org * */ namespace iTextSharp.text.pdf { /** * @author Aiken Sam (aikensam@ieee.org) */ public class PdfPublicKeySecurityHandler { private const int SEED_LENGTH = 20; private ArrayList recipients = null; private byte[] seed; public PdfPublicKeySecurityHandler() { seed = IVGenerator.GetIV(SEED_LENGTH); recipients = new ArrayList(); } public void AddRecipient(PdfPublicKeyRecipient recipient) { recipients.Add(recipient); } protected internal byte[] GetSeed() { return (byte[])seed.Clone(); } public int GetRecipientsSize() { return recipients.Count; } public byte[] GetEncodedRecipient(int index) { //Certificate certificate = recipient.GetX509(); PdfPublicKeyRecipient recipient = (PdfPublicKeyRecipient)recipients[index]; byte[] cms = recipient.Cms; if (cms != null) return cms; X509Certificate certificate = recipient.Certificate; int permission = recipient.Permission;//PdfWriter.AllowCopy | PdfWriter.AllowPrinting | PdfWriter.AllowScreenReaders | PdfWriter.AllowAssembly; int revision = 3; permission |= (int)(revision==3 ? (uint)0xfffff0c0 : (uint)0xffffffc0); permission &= unchecked((int)0xfffffffc); permission += 1; byte[] pkcs7input = new byte[24]; byte one = (byte)(permission); byte two = (byte)(permission >> 8); byte three = (byte)(permission >> 16); byte four = (byte)(permission >> 24); System.Array.Copy(seed, 0, pkcs7input, 0, 20); // put this seed in the pkcs7 input pkcs7input[20] = four; pkcs7input[21] = three; pkcs7input[22] = two; pkcs7input[23] = one; Asn1Object obj = CreateDERForRecipient(pkcs7input, certificate); MemoryStream baos = new MemoryStream(); DerOutputStream k = new DerOutputStream(baos); k.WriteObject(obj); cms = baos.ToArray(); recipient.Cms = cms; return cms; } public PdfArray GetEncodedRecipients() { PdfArray EncodedRecipients = new PdfArray(); byte[] cms = null; for (int i=0; i