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