private void init(
            ISignatureCalculator signatureCalculator, 
            X509Name subject,
            AsymmetricKeyParameter publicKey,
            Asn1Set attributes,
            AsymmetricKeyParameter signingKey)
        {
            this.sigAlgId = (AlgorithmIdentifier)signatureCalculator.AlgorithmDetails;

            SubjectPublicKeyInfo pubInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey);

            this.reqInfo = new CertificationRequestInfo(subject, pubInfo, attributes);

            Stream sigStream = signatureCalculator.GetSignatureUpdater();

            byte[] reqInfoData = reqInfo.GetDerEncoded();

            sigStream.Write(reqInfoData, 0, reqInfoData.Length);

            // Generate Signature.
            sigBits = new DerBitString(signatureCalculator.Signature());
        }
        /// <summary>
        /// Generate a new X509Crl using the passed in SignatureCalculator.
        /// </summary>
        /// <param name="signatureCalculator">A signature calculator with the necessary algorithm details.</param>
        /// <returns>An X509Crl.</returns>
        public X509Crl Generate(ISignatureCalculator signatureCalculator)
        {
            tbsGen.SetSignature((AlgorithmIdentifier)signatureCalculator.AlgorithmDetails);

            TbsCertificateList tbsCertList = GenerateCertList();

            Stream sigStream = signatureCalculator.GetSignatureUpdater();

            byte[] encoded = tbsCertList.GetDerEncoded();

            sigStream.Write(encoded, 0, encoded.Length);

            sigStream.Close();

            return GenerateJcaObject(tbsCertList, (AlgorithmIdentifier)signatureCalculator.AlgorithmDetails, signatureCalculator.Signature());
        }