internal TSignedStream(Stream aDataStream, TPdfSigner aSigner) { FDataStream = aDataStream; Signer = aSigner; HelperStream = null; SignOffset = 0; }
protected override void Dispose(bool disposing) { if (disposing) { if (HelperStream != null) { HelperStream.Dispose(); } HelperStream = null; } base.Dispose(disposing); }
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 void GoVirtual(int aSignOffset) { Debug.Assert(HelperStream == null); SignOffset = aSignOffset; HelperStream = new THelperStream(FDataStream); }