Beispiel #1
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);
        }