Ejemplo n.º 1
0
        private void SaveDocMDP(TPdfStream DataStream, TXRefSection XRef)
        {
            BeginDictionary(DataStream);
            SaveKey(DataStream, TPdfToken.TypeName, TPdfTokens.GetString(TPdfToken.SigRefName));
            SaveKey(DataStream, TPdfToken.TransformMethodName, TPdfTokens.GetString(TPdfToken.DocMDPName));
            SaveTransformParams(DataStream);
            SaveKey(DataStream, TPdfToken.DigestMethodName, TPdfTokens.GetString(TPdfToken.MD5Name));

            //This is a small hack. We don't have an object model of the pdf file able to compute the object hash,
            //and it is not needed anyway for Acrobat >=7 (and <6 does not allow MDP anyway).
            //But we need to write something here, or acrobat will complain the document is not PDF/SigQ complaint.
            byte[] MDPHash    = new byte[16];
            string MDPHashStr = PdfConv.ToHexString(MDPHash, true);

            Write(DataStream, TPdfTokens.GetString(TPdfToken.DigestValueName));
            long StartMDPHash = DataStream.Position;

            Write(DataStream, MDPHashStr);
            string LocationString =
                TPdfTokens.GetString(TPdfToken.OpenArray) +
                String.Format(CultureInfo.InvariantCulture, "{0} {1}", StartMDPHash, MDPHashStr.Length) +
                TPdfTokens.GetString(TPdfToken.CloseArray);

            SaveKey(DataStream, TPdfToken.DigestLocationName, LocationString);

            EndDictionary(DataStream);
        }
Ejemplo n.º 2
0
        internal void GoReal(byte[] AfterSign, int PKCSSize)
        {
            Debug.Assert(HelperStream != null);
            Signer.Write(AfterSign, 0, AfterSign.Length);

            if (PKCSSize + AfterSign.Length > SignOffset)
            {
                PdfMessages.ThrowException(PdfErr.ErrSigningLengthToSmall);
            }
            byte[] PaddedByteCount = Pad(0x20, SignOffset - (PKCSSize + AfterSign.Length));
            Signer.Write(PaddedByteCount, 0, PaddedByteCount.Length);

            byte[] bt = HelperStream.CurrentStream.ToArray();
            HelperStream.Dispose();
            HelperStream = null;

            Signer.Write(bt, 0, bt.Length);
            byte[] sg    = Signer.GetSignature();
            byte[] hexsg = TPdfBaseRecord.Coder.GetBytes("<" + PdfConv.ToHexString(sg, false));

            FDataStream.Write(hexsg, 0, hexsg.Length);

            if (hexsg.Length > PKCSSize - 1)
            {
                PdfMessages.ThrowException(PdfErr.ErrSigningLengthToSmall);
            }

            for (int i = hexsg.Length; i < PKCSSize - 1; i++) //pad the certificate.
            {
                FDataStream.WriteByte(0);
            }

            FDataStream.Write(TPdfBaseRecord.Coder.GetBytes(">"), 0, 1);

            FDataStream.Write(AfterSign, 0, AfterSign.Length);
            FDataStream.Write(PaddedByteCount, 0, PaddedByteCount.Length);  //Pad the whole thing.

            FDataStream.Write(bt, 0, bt.Length);
        }
Ejemplo n.º 3
0
        internal static void SaveToStream(TPdfStream DataStream, TXRefSection XRef, int CatalogId, int InfoId)
        {
            TPdfBaseRecord.WriteLine(DataStream, TPdfTokens.GetString(TPdfToken.Trailer));

            TDictionaryRecord.BeginDictionary(DataStream);
            TDictionaryRecord.SaveKey(DataStream, TPdfToken.SizeName, XRef.Count);
            TDictionaryRecord.SaveKey(DataStream, TPdfToken.RootName, TIndirectRecord.GetCallObj(CatalogId));
            TDictionaryRecord.SaveKey(DataStream, TPdfToken.InfoName, TIndirectRecord.GetCallObj(InfoId));

            Byte[] FileIdBytes = Guid.NewGuid().ToByteArray();
            string FileId      = PdfConv.ToHexString(FileIdBytes, true);

            TDictionaryRecord.SaveKey(DataStream, TPdfToken.IDName,
                                      TPdfTokens.GetString(TPdfToken.OpenArray) +
                                      FileId + " " + FileId +
                                      TPdfTokens.GetString(TPdfToken.CloseArray));

            TDictionaryRecord.EndDictionary(DataStream);

            TPdfBaseRecord.WriteLine(DataStream, TPdfTokens.GetString(TPdfToken.StartXRef));
            TPdfBaseRecord.WriteLine(DataStream, XRef.StartPosition.ToString(CultureInfo.InvariantCulture));
            TPdfBaseRecord.WriteLine(DataStream, TPdfTokens.GetString(TPdfToken.Eof));
        }