internal SignerInfoGeneratorImpl(
                CmsSignedDataStreamGenerator outer,
                AsymmetricKeyParameter key,
                SignerIdentifier signerIdentifier,
                string digestOID,
                string encOID,
                CmsAttributeTableGenerator sAttr,
                CmsAttributeTableGenerator unsAttr)
            {
                this.outer = outer;

                _signerIdentifier = signerIdentifier;
                _digestOID        = digestOID;
                _encOID           = encOID;
                _sAttr            = sAttr;
                _unsAttr          = unsAttr;
                _encName          = Helper.GetEncryptionAlgName(_encOID);

                string digestName    = Helper.GetDigestAlgName(_digestOID);
                string signatureName = digestName + "with" + _encName;

                if (_sAttr != null)
                {
                    _sig = Helper.GetSignatureInstance(signatureName);
                }
                else
                {
                    // Note: Need to use raw signatures here since we have already calculated the digest
                    if (_encName.Equals("RSA"))
                    {
                        _sig = Helper.GetSignatureInstance("RSA");
                    }
                    else if (_encName.Equals("DSA"))
                    {
                        _sig = Helper.GetSignatureInstance("NONEwithDSA");
                    }
                    // TODO Add support for raw PSS
//					else if (_encName.equals("RSAandMGF1"))
//					{
//						_sig = CMSSignedHelper.INSTANCE.getSignatureInstance("NONEWITHRSAPSS", _sigProvider);
//						try
//						{
//							// Init the params this way to avoid having a 'raw' version of each PSS algorithm
//							Signature sig2 = CMSSignedHelper.INSTANCE.getSignatureInstance(signatureName, _sigProvider);
//							PSSParameterSpec spec = (PSSParameterSpec)sig2.getParameters().getParameterSpec(PSSParameterSpec.class);
//							_sig.setParameter(spec);
//						}
//						catch (Exception e)
//						{
//							throw new SignatureException("algorithm: " + _encName + " could not be configured.");
//						}
//					}
                    else
                    {
                        throw new SignatureException("algorithm: " + _encName + " not supported in base signatures.");
                    }
                }

                _sig.Init(true, new ParametersWithRandom(key, outer.rand));
            }
        public override bool IsSameAs(SignerIdentifier other)
        {
            var otherCustomIdentifier = other as CustomIdentifier;

            return(otherCustomIdentifier != null &&
                   IsEqual(Value, otherCustomIdentifier.Value));
        }
Example #3
0
        internal SignerInfoGeneratorImpl(CmsSignedDataStreamGenerator outer, AsymmetricKeyParameter key, SignerIdentifier signerIdentifier, string digestOID, string encOID, CmsAttributeTableGenerator sAttr, CmsAttributeTableGenerator unsAttr)
        {
            this.outer        = outer;
            _signerIdentifier = signerIdentifier;
            _digestOID        = digestOID;
            _encOID           = encOID;
            _sAttr            = sAttr;
            _unsAttr          = unsAttr;
            _encName          = Helper.GetEncryptionAlgName(_encOID);
            string digestAlgName = Helper.GetDigestAlgName(_digestOID);
            string algorithm     = digestAlgName + "with" + _encName;

            if (_sAttr != null)
            {
                _sig = Helper.GetSignatureInstance(algorithm);
            }
            else if (_encName.Equals("RSA"))
            {
                _sig = Helper.GetSignatureInstance("RSA");
            }
            else
            {
                if (!_encName.Equals("DSA"))
                {
                    throw new SignatureException("algorithm: " + _encName + " not supported in base signatures.");
                }
                _sig = Helper.GetSignatureInstance("NONEwithDSA");
            }
            _sig.Init(forSigning: true, new ParametersWithRandom(key, outer.rand));
        }
Example #4
0
    private void DoAddSigner(AsymmetricKeyParameter privateKey, SignerIdentifier signerIdentifier, string encryptionOid, string digestOid, CmsAttributeTableGenerator signedAttrGenerator, CmsAttributeTableGenerator unsignedAttrGenerator)
    {
        ConfigureDigest(digestOid);
        SignerInfoGeneratorImpl signerInf = new SignerInfoGeneratorImpl(this, privateKey, signerIdentifier, digestOid, encryptionOid, signedAttrGenerator, unsignedAttrGenerator);

        _signerInfs.Add(new DigestAndSignerInfoGeneratorHolder(signerInf, digestOid));
    }
        internal SignerInfoGenerator(SignerIdentifier sigId, ISignatureFactory <AlgorithmIdentifier> signerFactory, IDigestFactoryProvider <AlgorithmIdentifier> digesterProvider, ISignatureEncryptionAlgorithmFinder sigEncAlgFinder, bool isDirectSignature)
        {
            this.sigId            = sigId;
            this.signer           = signerFactory;
            this.signerCalculator = signerFactory.CreateCalculator();

            if (digesterProvider != null)
            {
                this.digester         = digesterProvider.CreateDigestFactory(digAlgFinder.Find(signer.AlgorithmDetails));
                this.digestCalculator = digester.CreateCalculator();
            }
            else
            {
                this.digester = null;
            }

            this.sigEncAlgFinder = sigEncAlgFinder;

            this.isDirectSignature = isDirectSignature;
            if (this.isDirectSignature)
            {
                this.signedGen   = null;
                this.unsignedGen = null;
            }
            else
            {
                this.signedGen   = new DefaultSignedAttributeTableGenerator();
                this.unsignedGen = null;
            }
        }
 internal SignerInformation(Org.BouncyCastle.Asn1.Cms.SignerInfo info, DerObjectIdentifier contentType, CmsProcessable content, IDigestCalculator digestCalculator)
 {
     this.info               = info;
     this.sid                = new SignerID();
     this.contentType        = contentType;
     this.isCounterSignature = (contentType == null);
     try
     {
         SignerIdentifier signerID = info.SignerID;
         if (signerID.IsTagged)
         {
             Asn1OctetString instance = Asn1OctetString.GetInstance(signerID.ID);
             this.sid.SubjectKeyIdentifier = instance.GetEncoded();
         }
         else
         {
             Org.BouncyCastle.Asn1.Cms.IssuerAndSerialNumber instance2 = Org.BouncyCastle.Asn1.Cms.IssuerAndSerialNumber.GetInstance(signerID.ID);
             this.sid.Issuer       = instance2.Name;
             this.sid.SerialNumber = instance2.SerialNumber.Value;
         }
     }
     catch (IOException)
     {
         throw new ArgumentException("invalid sid in SignerInfo");
     }
     this.digestAlgorithm      = info.DigestAlgorithm;
     this.signedAttributeSet   = info.AuthenticatedAttributes;
     this.unsignedAttributeSet = info.UnauthenticatedAttributes;
     this.encryptionAlgorithm  = info.DigestEncryptionAlgorithm;
     this.signature            = info.EncryptedDigest.GetOctets();
     this.content          = content;
     this.digestCalculator = digestCalculator;
 }
    public SignerInfo(Asn1Sequence seq)
    {
        IEnumerator enumerator = seq.GetEnumerator();

        enumerator.MoveNext();
        version = (DerInteger)enumerator.Current;
        enumerator.MoveNext();
        sid = SignerIdentifier.GetInstance(enumerator.Current);
        enumerator.MoveNext();
        digAlgorithm = AlgorithmIdentifier.GetInstance(enumerator.Current);
        enumerator.MoveNext();
        object current = enumerator.Current;

        if (current is Asn1TaggedObject)
        {
            authenticatedAttributes = Asn1Set.GetInstance((Asn1TaggedObject)current, explicitly: false);
            enumerator.MoveNext();
            digEncryptionAlgorithm = AlgorithmIdentifier.GetInstance(enumerator.Current);
        }
        else
        {
            authenticatedAttributes = null;
            digEncryptionAlgorithm  = AlgorithmIdentifier.GetInstance(current);
        }
        enumerator.MoveNext();
        encryptedDigest = Asn1OctetString.GetInstance(enumerator.Current);
        if (enumerator.MoveNext())
        {
            unauthenticatedAttributes = Asn1Set.GetInstance((Asn1TaggedObject)enumerator.Current, explicitly: false);
        }
        else
        {
            unauthenticatedAttributes = null;
        }
    }
        public TestHelper Sign_job(SignerIdentifier signerIdentifier)
        {
            Assert_state(_jobResponse);

            var identifierValue = signerIdentifier.IsPersonalIdentificationNumber()
                ? ((PersonalIdentificationNumber)signerIdentifier).Value
                : ((CustomIdentifier)signerIdentifier).Value;

            var statusUrl = _directClient.AutoSign(_jobResponse.JobId, identifierValue).Result;

            try
            {
                var queryParams = new Uri(statusUrl).Query;

                var queryDictionary  = HttpUtility.ParseQueryString(queryParams);
                var statusQueryToken = queryDictionary.Get(0);

                var jobStatus = _jobResponse.StatusUrl;
                if (jobStatus != null && jobStatus.HasValue())
                {
                    _statusReference = MorphStatusReferenceIfMayBe(jobStatus.Status(statusQueryToken));
                }

                return(this);
            }
            catch (Exception)
            {
                throw new InvalidOperationException("Unable to auto-sign. This is probably a result of the backend not supporting the kind of job you are trying to sign.");
            }
        }
Example #9
0
 internal SignerInfoGenerator(SignerIdentifier sigId, ISignatureCalculator contentSigner, CmsAttributeTableGenerator signedGen, CmsAttributeTableGenerator unsignedGen)
 {
     this.sigId             = sigId;
     this.contentSigner     = contentSigner;
     this.signedGen         = signedGen;
     this.unsignedGen       = unsignedGen;
     this.isDirectSignature = false;
 }
Example #10
0
        public SignerInfoGenerator Build(ISignatureFactory contentSigner, X509Certificate certificate)
        {
            SignerIdentifier    sigId = new SignerIdentifier(new IssuerAndSerialNumber(certificate.IssuerDN, new DerInteger(certificate.SerialNumber)));
            SignerInfoGenerator signerInfoGenerator = CreateGenerator(contentSigner, sigId);

            signerInfoGenerator.setAssociatedCertificate(certificate);
            return(signerInfoGenerator);
        }
        public TestHelper Get_XAdES(SignerIdentifier signer)
        {
            Assert_state(_status);

            var xades = _directClient.GetXades(_status.GetSignatureFor(signer).XadesReference).Result;

            Assert.True(xades.CanRead);
            return(this);
        }
 public SignerInfo(SignerIdentifier sid, AlgorithmIdentifier digAlgorithm, Attributes authenticatedAttributes, AlgorithmIdentifier digEncryptionAlgorithm, Asn1OctetString encryptedDigest, Attributes unauthenticatedAttributes)
 {
     version                        = new DerInteger((!sid.IsTagged) ? 1 : 3);
     this.sid                       = sid;
     this.digAlgorithm              = digAlgorithm;
     this.authenticatedAttributes   = Asn1Set.GetInstance(authenticatedAttributes);
     this.digEncryptionAlgorithm    = digEncryptionAlgorithm;
     this.encryptedDigest           = encryptedDigest;
     this.unauthenticatedAttributes = Asn1Set.GetInstance(unauthenticatedAttributes);
 }
Example #13
0
        public override bool IsSameAs(SignerIdentifier other)
        {
            if (other is PersonalIdentificationNumber)
            {
                var otherPersonalIdentificationNumber = (PersonalIdentificationNumber)other;
                return(IsEqual(Value, otherPersonalIdentificationNumber.Value));
            }

            return(false);
        }
Example #14
0
        public static void SignPdf(string certificate, string signature)
        {
            byte[] signatureBytes   = ConvertToBytes(signature);
            byte[] certificateBytes = ConvertToBytes(certificate);

            var acsd = Encoding.Default.GetString(signatureBytes);

            var chains = GetChains();

            var datasplited = chain.Split("=");
            var a           = HttpUtility.UrlDecode(datasplited[1]);
            var b           = a.Split(";");

            Console.WriteLine(a);

            X509Certificate x509Certificate = new X509CertificateParser().ReadCertificate(certificateBytes);

            SignerIdentifier    sid                       = new SignerIdentifier(new IssuerAndSerialNumber(x509Certificate.IssuerDN, x509Certificate.SerialNumber));
            AlgorithmIdentifier digAlgorithm              = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha256);
            Attributes          authenticatedAttributes   = null;
            AlgorithmIdentifier digEncryptionAlgorithm    = new AlgorithmIdentifier(Org.BouncyCastle.Asn1.Pkcs.PkcsObjectIdentifiers.Sha256WithRsaEncryption);
            Asn1OctetString     encryptedDigest           = new DerOctetString(signatureBytes);
            Attributes          unauthenticatedAttributes = null;
            SignerInfo          signerInfo                = new SignerInfo(sid, digAlgorithm, authenticatedAttributes, digEncryptionAlgorithm, encryptedDigest, unauthenticatedAttributes);
            Asn1EncodableVector digestAlgs                = new Asn1EncodableVector();

            digestAlgs.Add(signerInfo.DigestAlgorithm);
            Asn1Set             digestAlgorithms = new DerSet(digestAlgs);
            ContentInfo         contentInfo      = new ContentInfo(CmsObjectIdentifiers.Data, null);
            Asn1EncodableVector certs            = new Asn1EncodableVector();

            certs.Add(x509Certificate.CertificateStructure.ToAsn1Object());
            for (int i = 0; i < chains.Length; i++)
            {
                certs.Add(chains[i].CertificateStructure.ToAsn1Object());
            }
            Asn1Set             certificates = new DerSet(certs);
            Asn1EncodableVector signerInfs   = new Asn1EncodableVector();

            signerInfs.Add(signerInfo);
            Asn1Set    signerInfos = new DerSet(signerInfs);
            SignedData signedData  = new SignedData(digestAlgorithms, contentInfo, certificates, null, signerInfos);

            contentInfo = new ContentInfo(CmsObjectIdentifiers.SignedData, signedData);

            byte[] Signature = contentInfo.GetDerEncoded();

            using (PdfReader reader = new PdfReader(temp))
                using (PdfDocument document = new PdfDocument(reader))
                    using (FileStream fout = new FileStream(dest, FileMode.Create))
                    {
                        PdfSigner.SignDeferred(document, "Signature", fout, new ExternalPrecalculatedSignatureContainer(Signature));
                    }
        }
 internal SignerInf(CmsSignedGenerator outer, AsymmetricKeyParameter key, SignerIdentifier signerIdentifier, string digestOID, string encOID, CmsAttributeTableGenerator sAttr, CmsAttributeTableGenerator unsAttr, Org.BouncyCastle.Asn1.Cms.AttributeTable baseSignedTable)
 {
     this.outer            = outer;
     this.key              = key;
     this.signerIdentifier = signerIdentifier;
     this.digestOID        = digestOID;
     this.encOID           = encOID;
     this.sAttr            = sAttr;
     this.unsAttr          = unsAttr;
     this.baseSignedTable  = baseSignedTable;
 }
Example #16
0
 internal SignerInf(CmsSignedGenerator outer, ISignatureFactory sigCalc, SignerIdentifier signerIdentifier, CmsAttributeTableGenerator sAttr, CmsAttributeTableGenerator unsAttr, Org.BouncyCastle.Asn1.Cms.AttributeTable baseSignedTable)
 {
     this.outer            = outer;
     this.sigCalc          = sigCalc;
     this.signerIdentifier = signerIdentifier;
     digestOID             = new DefaultDigestAlgorithmIdentifierFinder().find((AlgorithmIdentifier)sigCalc.AlgorithmDetails).Algorithm.Id;
     encOID               = ((AlgorithmIdentifier)sigCalc.AlgorithmDetails).Algorithm.Id;
     this.sAttr           = sAttr;
     this.unsAttr         = unsAttr;
     this.baseSignedTable = baseSignedTable;
 }
Example #17
0
 internal SignerInf(CmsSignedGenerator outer, AsymmetricKeyParameter key, SignerIdentifier signerIdentifier, string digestOID, string encOID,
                    CmsAttributeTableGenerator sAttr, CmsAttributeTableGenerator unsAttr, Asn1.Cms.AttributeTable baseSignedTable)
 {
     _outer            = outer;
     _key              = key;
     _signerIdentifier = signerIdentifier;
     _digestOID        = digestOID;
     _encOID           = encOID;
     _sAttr            = sAttr;
     _unsAttr          = unsAttr;
     _baseSignedTable  = baseSignedTable;
 }
 private void doAddSigner(
     AsymmetricKeyParameter privateKey,
     SignerIdentifier signerIdentifier,
     string encryptionOID,
     string digestOID,
     CmsAttributeTableGenerator signedAttrGen,
     CmsAttributeTableGenerator unsignedAttrGen,
     AttributeTable baseSignedTable)
 {
     signerInfs.Add(new SignerInf(this, privateKey, signerIdentifier, digestOID, encryptionOID,
                                  signedAttrGen, unsignedAttrGen, baseSignedTable));
 }
Example #19
0
        public static CmsSignedData Generate(IX509Store certificateStore, X509Certificate signingCertificate, AsymmetricKeyEntry privateKey, string digestOID, CmsProcessable content)
        {
            string encOID = CmsSignedGenerator.EncryptionRsa;
            IssuerAndSerialNumber issuerAndSerialNumber = new IssuerAndSerialNumber(signingCertificate.IssuerDN, signingCertificate.SerialNumber);
            SignerIdentifier      signerIdentifier      = new SignerIdentifier(issuerAndSerialNumber);

            AlgorithmIdentifier digestAlgorithmID     = new AlgorithmIdentifier(new DerObjectIdentifier(digestOID));
            AlgorithmIdentifier encryptionAlgorithmID = new AlgorithmIdentifier(new DerObjectIdentifier(encOID));

            SignerInfo signerInfo = new SignerInfo(signerIdentifier, digestAlgorithmID, (Asn1Set)null, encryptionAlgorithmID, null, null);

            return(Generate(certificateStore, signerInfo, content));
        }
Example #20
0
            internal SignerInf(CmsSignedGenerator outer, AsymmetricKeyParameter key, SignerIdentifier signerIdentifier, string digestOID, string encOID, CmsAttributeTableGenerator sAttr, CmsAttributeTableGenerator unsAttr, Org.BouncyCastle.Asn1.Cms.AttributeTable baseSignedTable)
            {
                string digestAlgName = Helper.GetDigestAlgName(digestOID);
                string algorithm     = digestAlgName + "with" + Helper.GetEncryptionAlgName(encOID);

                this.outer            = outer;
                sigCalc               = new Asn1SignatureFactory(algorithm, key);
                this.signerIdentifier = signerIdentifier;
                this.digestOID        = digestOID;
                this.encOID           = encOID;
                this.sAttr            = sAttr;
                this.unsAttr          = unsAttr;
                this.baseSignedTable  = baseSignedTable;
            }
Example #21
0
 internal SignerInfoGenerator(SignerIdentifier sigId, ISignatureCalculator contentSigner, bool isDirectSignature)
 {
     this.sigId             = sigId;
     this.contentSigner     = contentSigner;
     this.isDirectSignature = isDirectSignature;
     if (this.isDirectSignature)
     {
         this.signedGen   = null;
         this.unsignedGen = null;
     }
     else
     {
         this.signedGen   = new DefaultSignedAttributeTableGenerator();
         this.unsignedGen = null;
     }
 }
Example #22
0
 internal SignerInfoGenerator(SignerIdentifier sigId, ISignatureFactory signerFactory, bool isDirectSignature)
 {
     this.sigId             = sigId;
     contentSigner          = signerFactory;
     this.isDirectSignature = isDirectSignature;
     if (this.isDirectSignature)
     {
         signedGen   = null;
         unsignedGen = null;
     }
     else
     {
         signedGen   = new DefaultSignedAttributeTableGenerator();
         unsignedGen = null;
     }
 }
Example #23
0
 private SignerInfoGenerator CreateGenerator(ISignatureFactory contentSigner, SignerIdentifier sigId)
 {
     if (directSignature)
     {
         return(new SignerInfoGenerator(sigId, contentSigner, isDirectSignature: true));
     }
     if (signedGen != null || unsignedGen != null)
     {
         if (signedGen == null)
         {
             signedGen = new DefaultSignedAttributeTableGenerator();
         }
         return(new SignerInfoGenerator(sigId, contentSigner, signedGen, unsignedGen));
     }
     return(new SignerInfoGenerator(sigId, contentSigner));
 }
            internal SignerInf(
                CmsSignedDataStreamGenerator outer,
                AsymmetricKeyParameter key,
                SignerIdentifier signerIdentifier,
                string digestOID,
                string encOID,
                CmsAttributeTableGenerator sAttr,
                CmsAttributeTableGenerator unsAttr)
            {
                this.outer = outer;

                _key = key;
                _signerIdentifier = signerIdentifier;
                _digestOID        = digestOID;
                _encOID           = encOID;
                _sAttr            = sAttr;
                _unsAttr          = unsAttr;
            }
Example #25
0
        internal SignerInformation(
            Asn1.Cms.SignerInfo info,
            DerObjectIdentifier contentType,
            ICmsTypedData content,
            byte[] digest)
        {
            this.info = info;

            this.contentType        = contentType;
            this.isCounterSignature = contentType == null;

            try
            {
                SignerIdentifier s = info.SignerID;

                if (s.IsTagged)
                {
                    Asn1OctetString octs = Asn1OctetString.GetInstance(s.ID);

                    this.sid = new SignerID(octs.GetEncoded());
                }
                else
                {
                    Asn1.Cms.IssuerAndSerialNumber iAnds =
                        Asn1.Cms.IssuerAndSerialNumber.GetInstance(s.ID);

                    this.sid = new SignerID(iAnds.Name, iAnds.SerialNumber.Value);
                }
            }
            catch (IOException)
            {
                throw new ArgumentException("invalid sid in SignerInfo");
            }

            this.digestAlgorithm      = info.DigestAlgorithm;
            this.signedAttributeSet   = info.AuthenticatedAttributes;
            this.unsignedAttributeSet = info.UnauthenticatedAttributes;
            this.encryptionAlgorithm  = info.DigestEncryptionAlgorithm;
            this.signature            = info.EncryptedDigest.GetOctets();

            this.content      = content;
            this.resultDigest = digest;
        }
 internal SignerInfoGenerator(SignerIdentifier sigId, ISignatureFactory <AlgorithmIdentifier> contentSigner, IDigestFactoryProvider <AlgorithmIdentifier> digesterProvider, ISignatureEncryptionAlgorithmFinder sigEncAlgFinder, ICmsAttributeTableGenerator signedGen, ICmsAttributeTableGenerator unsignedGen)
 {
     this.sigId            = sigId;
     this.signer           = contentSigner;
     this.signerCalculator = contentSigner.CreateCalculator();
     if (digesterProvider != null)
     {
         this.digester         = digesterProvider.CreateDigestFactory(digAlgFinder.Find(signer.AlgorithmDetails));
         this.digestCalculator = digester.CreateCalculator();
     }
     else
     {
         this.digester = null;
     }
     this.sigEncAlgFinder   = sigEncAlgFinder;
     this.signedGen         = signedGen;
     this.unsignedGen       = unsignedGen;
     this.isDirectSignature = false;
 }
Example #27
0
        internal SignerInformation(
            SignerInfo info,
            DerObjectIdentifier contentType,
            CmsProcessable content,
            byte[]                          digest)
        {
            this.info        = info;
            this.sid         = new SignerID();
            this.contentType = contentType;

            try
            {
                SignerIdentifier s = info.SignerID;

                if (s.IsTagged)
                {
                    Asn1OctetString octs = Asn1OctetString.GetInstance(s.ID);

                    sid.SubjectKeyIdentifier = octs.GetOctets();
                }
                else
                {
                    Asn1.Cms.IssuerAndSerialNumber iAnds =
                        Asn1.Cms.IssuerAndSerialNumber.GetInstance(s.ID);

                    sid.Issuer       = iAnds.Name;
                    sid.SerialNumber = iAnds.SerialNumber.Value;
                }
            }
            catch (IOException)
            {
                throw new ArgumentException("invalid sid in SignerInfo");
            }

            this.digestAlgorithm     = info.DigestAlgorithm;
            this.signedAttributes    = info.AuthenticatedAttributes;
            this.unsignedAttributes  = info.UnauthenticatedAttributes;
            this.encryptionAlgorithm = info.DigestEncryptionAlgorithm;
            this.signature           = info.EncryptedDigest.GetOctets();

            this.content = content;
            _digest      = digest;
        }
        /// <summary>
        ///     Gets the signature from a given signer.
        /// </summary>
        /// <exception cref="InvalidOperationException">if the job response doesn't contain a signature for this signer</exception>
        /// <seealso cref="Signatures" />
        public Signature GetSignatureFor(SignerIdentifier signer)
        {
            Signature foundSignature = null;

            if (signer is PersonalIdentificationNumber)
            {
                foundSignature = Signatures.SingleOrDefault(s => s.Signer == ((PersonalIdentificationNumber)signer).Value);
            }

            if (signer is CustomIdentifier)
            {
                foundSignature = Signatures.SingleOrDefault(s => s.Signer == ((CustomIdentifier)signer).Value);
            }

            if (foundSignature == null)
            {
                throw new InvalidOperationException($"Unable to find signature for Signer '{signer}'");
            }

            return(foundSignature);
        }
Example #29
0
 /// <summary>
 /// Signer is received with crypto provider or pr. key (if the crypto provider == null)
 /// </summary>
 /// <param name="krProv">Crypto provider. if null than use key</param>
 /// <param name="key">Private key</param>
 internal SignerInf(
     CmsSignedGenerator outer,
     NetCrypto.RSACryptoServiceProvider krProv,
     AsymmetricKeyParameter key,
     SignerIdentifier signerIdentifier,
     string digestOID,
     string encOID,
     CmsAttributeTableGenerator sAttr,
     CmsAttributeTableGenerator unsAttr,
     Asn1.Cms.AttributeTable baseSignedTable)
 {
     this.outer            = outer;
     this.key              = key;
     this.krProv           = krProv;
     this.signerIdentifier = signerIdentifier;
     this.digestOID        = digestOID;
     this.encOID           = encOID;
     this.sAttr            = sAttr;
     this.unsAttr          = unsAttr;
     this.baseSignedTable  = baseSignedTable;
 }
            internal Asn1.Cms.SignerInfo ToSignerInfo(
                DerObjectIdentifier contentType,
                CmsProcessable content,
                SecureRandom random,
                bool isCounterSignature)
            {
                AlgorithmIdentifier digAlgId = new AlgorithmIdentifier(
                    new DerObjectIdentifier(this.DigestAlgOid), DerNull.Instance);
                AlgorithmIdentifier encAlgId = CmsSignedGenerator.GetEncAlgorithmIdentifier(this.EncryptionAlgOid);
                string  digestName           = Helper.GetDigestAlgName(digestOID);
                string  signatureName        = digestName + "with" + Helper.GetEncryptionAlgName(encOID);
                ISigner sig = Helper.GetSignatureInstance(signatureName);
                IDigest dig = Helper.GetDigestInstance(digestName);

                byte[] hash = null;

                if (content != null)
                {
                    content.Write(new DigOutputStream(dig));

                    hash = DigestUtilities.DoFinal(dig);

                    outer._digests.Add(digestOID, hash.Clone());
                }

                IDictionary parameters = outer.GetBaseParameters(contentType, digAlgId, hash);

                Asn1.Cms.AttributeTable signed = (sAttr != null)
//					?	sAttr.GetAttributes(Collections.unmodifiableMap(parameters))
                                        ?       sAttr.GetAttributes(parameters)
                                        :       null;

                if (isCounterSignature)
                {
                    Hashtable ats = signed.ToHashtable();

                    ats.Remove(CmsAttributes.ContentType);

                    signed = new Asn1.Cms.AttributeTable(ats);
                }

                Asn1Set signedAttr = outer.GetAttributeSet(signed);


                //
                // sig must be composed from the DER encoding.
                //
                byte[] tmp;
                if (signedAttr != null)
                {
                    tmp = signedAttr.GetEncoded(Asn1Encodable.Der);
                }
                else
                {
                    MemoryStream bOut = new MemoryStream();
                    content.Write(bOut);
                    tmp = bOut.ToArray();
                }

                sig.Init(true, new ParametersWithRandom(key, random));
                sig.BlockUpdate(tmp, 0, tmp.Length);

                Asn1OctetString encDigest = new DerOctetString(sig.GenerateSignature());

                IDictionary baseParameters = outer.GetBaseParameters(contentType, digAlgId, hash);

                baseParameters[CmsAttributeTableParameter.Signature] = encDigest.GetOctets().Clone();

                Asn1.Cms.AttributeTable unsigned = (unsAttr != null)
//					?	unsAttr.GetAttributes(Collections.unmodifiableMap(baseParameters))
                                        ?       unsAttr.GetAttributes(baseParameters)
                                        :       null;

                Asn1Set unsignedAttr = outer.GetAttributeSet(unsigned);

                X509Certificate  cert = this.GetCertificate();
                SignerIdentifier identifier;

                if (cert != null)
                {
                    TbsCertificateStructure tbs = TbsCertificateStructure.GetInstance(
                        Asn1Object.FromByteArray(cert.GetTbsCertificate()));
                    Asn1.Cms.IssuerAndSerialNumber encSid = new Asn1.Cms.IssuerAndSerialNumber(
                        tbs.Issuer, tbs.SerialNumber.Value);
                    identifier = new SignerIdentifier(encSid);
                }
                else
                {
                    identifier = new SignerIdentifier(new DerOctetString(keyIdentifier));
                }

                return(new Asn1.Cms.SignerInfo(identifier, digAlgId,
                                               signedAttr, encAlgId, encDigest, unsignedAttr));
            }