/// <summary>
        /// Realiza el proceso de firmado
        /// </summary>
        /// <param name="input"></param>
        /// <param name="parameters"></param>
        public SignatureDocument Sign(Stream input, SignatureParameters parameters)
        {
            if (parameters.Signer == null)
            {
                throw new Exception("Es necesario un certificado válido para la firma");
            }

            if (input == null && string.IsNullOrEmpty(parameters.ExternalContentUri))
            {
                throw new Exception("No se ha especificado ningún contenido a firmar");
            }

            SignatureDocument signatureDocument = new SignatureDocument();

            switch (parameters.SignaturePackaging)
            {
            case SignaturePackaging.INTERNALLY_DETACHED:
                if (string.IsNullOrEmpty(parameters.InputMimeType))
                {
                    throw new NullReferenceException("Se necesita especificar el tipo MIME del elemento a firmar.");
                }

                if (!string.IsNullOrEmpty(parameters.ElementIdToSign))
                {
                    SetContentInternallyDetached(signatureDocument, XMLUtil.LoadDocument(input), parameters.ElementIdToSign, parameters.InputMimeType);
                }
                else
                {
                    SetContentInternallyDetached(signatureDocument, input, parameters.InputMimeType);
                }
                break;

            case SignaturePackaging.ENVELOPED:
                SetContentEnveloped(signatureDocument, XMLUtil.LoadDocument(input));
                break;

            case SignaturePackaging.ENVELOPING:
                SetContentEveloping(signatureDocument, XMLUtil.LoadDocument(input));
                break;

            case SignaturePackaging.EXTERNALLY_DETACHED:
                SetContentExternallyDetached(signatureDocument, parameters.ExternalContentUri);
                break;
            }

            SetSignatureId(signatureDocument.XadesSignature);

            PrepareSignature(signatureDocument, parameters);

            ComputeSignature(signatureDocument);

            signatureDocument.UpdateDocument();

            return(signatureDocument);
        }
 /// <summary>
 /// Carga un archivo de firma.
 /// </summary>
 /// <param name="input"></param>
 /// <returns></returns>
 public SignatureDocument[] Load(Stream input)
 {
     return(Load(XMLUtil.LoadDocument(input)));
 }
Example #3
0
        /// <summary>
        /// Realiza el proceso de firmado
        /// </summary>
        /// <param name="input"></param>
        /// <param name="parameters"></param>
        public SignatureDocument Sign(Stream input, SignatureParameters parameters)
        {
            if (parameters.Signer == null)
            {
                throw new Exception("Es necesario un certificado válido para la firma");
            }

            if (input == null && string.IsNullOrEmpty(parameters.ExternalContentUri))
            {
                throw new Exception("No se ha especificado ningún contenido a firmar");
            }

            SignatureDocument signatureDocument = new SignatureDocument();

            _dataFormat = new DataObjectFormat();

            switch (parameters.SignaturePackaging)
            {
            case SignaturePackaging.INTERNALLY_DETACHED:
                if (parameters.DataFormat == null || string.IsNullOrEmpty(parameters.DataFormat.MimeType))
                {
                    throw new NullReferenceException("Se necesita especificar el tipo MIME del elemento a firmar.");
                }

                _dataFormat.MimeType = parameters.DataFormat.MimeType;

                if (parameters.DataFormat.MimeType == "text/xml")
                {
                    _dataFormat.Encoding = "UTF-8";
                }
                else
                {
                    _dataFormat.Encoding = "http://www.w3.org/2000/09/xmldsig#base64";
                }

                if (!string.IsNullOrEmpty(parameters.ElementIdToSign))
                {
                    SetContentInternallyDetached(signatureDocument, XMLUtil.LoadDocument(input), parameters.ElementIdToSign);
                }
                else
                {
                    SetContentInternallyDetached(signatureDocument, input);
                }
                break;

            case SignaturePackaging.HASH_INTERNALLY_DETACHED:
                if (parameters.DataFormat == null || string.IsNullOrEmpty(parameters.DataFormat.MimeType))
                {
                    _dataFormat.MimeType = "application/octet-stream";
                }
                else
                {
                    _dataFormat.MimeType = parameters.DataFormat.MimeType;
                }
                _dataFormat.Encoding = "http://www.w3.org/2000/09/xmldsig#base64";
                SetContentInternallyDetachedHashed(signatureDocument, input);
                break;

            case SignaturePackaging.ENVELOPED:
                _dataFormat.MimeType = "text/xml";
                _dataFormat.Encoding = "UTF-8";
                SetContentEnveloped(signatureDocument, XMLUtil.LoadDocument(input));
                break;

            case SignaturePackaging.ENVELOPING:
                _dataFormat.MimeType = "text/xml";
                _dataFormat.Encoding = "UTF-8";
                XmlDocument inputXml = XMLUtil.LoadDocument(input);

                if (inputXml.FirstChild.Name == "Manifest" &&
                    inputXml.FirstChild.NamespaceURI == XadesSignedXml.XmlDsigNamespaceUrl)
                {
                    XmlNode idAttribute = inputXml.FirstChild.Attributes.GetNamedItem("Id");
                    if (idAttribute == null)
                    {
                        throw new Exception("Se requiere un identificador para el objeto manifest");
                    }

                    SetContentEveloping(signatureDocument, inputXml, idAttribute.Value, XadesSignedXml.XmlDsigManifestType);
                }
                else
                {
                    SetContentEveloping(signatureDocument, inputXml, null, XadesSignedXml.XmlDsigObjectType);
                }
                break;

            case SignaturePackaging.EXTERNALLY_DETACHED:
                SetContentExternallyDetached(signatureDocument, parameters.ExternalContentUri);
                break;
            }

            if (parameters.DataFormat != null)
            {
                if (!string.IsNullOrEmpty(parameters.DataFormat.TypeIdentifier))
                {
                    _dataFormat.ObjectIdentifier = new ObjectIdentifier();
                    _dataFormat.ObjectIdentifier.Identifier.IdentifierUri = parameters.DataFormat.TypeIdentifier;
                }

                _dataFormat.Description = parameters.DataFormat.Description;
            }

            SetSignatureId(signatureDocument.XadesSignature);

            if (signatureDocument.Document == null)
            {
                signatureDocument.Document = new XmlDocument();
            }

            PrepareSignature(signatureDocument, parameters);

            signatureDocument.XadesSignature.ComputeSignature();

            UpdateXadesSignature(signatureDocument);

            return(signatureDocument);
        }
Example #4
0
        /// <summary>
        /// Realiza el proceso de firmado
        /// </summary>
        /// <param name="input"></param>
        /// <param name="parameters"></param>
        public SignatureDocument Sign(Stream input, SignatureParameters parameters)
        {
            if (parameters.Signer == null)
            {
                throw new Exception("Es necesario un certificado válido para la firma");
            }

            if (input == null && string.IsNullOrEmpty(parameters.ExternalContentUri))
            {
                throw new Exception("No se ha especificado ningún contenido a firmar");
            }

            SignatureDocument signatureDocument = new SignatureDocument();

            _dataFormat = new DataObjectFormat();

            switch (parameters.SignaturePackaging)
            {
            case SignaturePackaging.INTERNALLY_DETACHED:
                if (parameters.DataFormat == null || string.IsNullOrEmpty(parameters.DataFormat.MimeType))
                {
                    throw new NullReferenceException("Se necesita especificar el tipo MIME del elemento a firmar.");
                }

                _dataFormat.MimeType = parameters.DataFormat.MimeType;

                if (parameters.DataFormat.MimeType == "text/xml")
                {
                    _dataFormat.Encoding = "UTF-8";
                }
                else
                {
                    _dataFormat.Encoding = "http://www.w3.org/2000/09/xmldsig#base64";
                }

                if (!string.IsNullOrEmpty(parameters.ElementIdToSign))
                {
                    SetContentInternallyDetached(signatureDocument, XMLUtil.LoadDocument(input), parameters.ElementIdToSign);
                }
                else
                {
                    SetContentInternallyDetached(signatureDocument, input);
                }
                break;

            case SignaturePackaging.HASH_INTERNALLY_DETACHED:
                if (parameters.DataFormat == null || string.IsNullOrEmpty(parameters.DataFormat.MimeType))
                {
                    _dataFormat.MimeType = "application/octet-stream";
                }
                else
                {
                    _dataFormat.MimeType = parameters.DataFormat.MimeType;
                }
                _dataFormat.Encoding = "http://www.w3.org/2000/09/xmldsig#base64";
                SetContentInternallyDetachedHashed(signatureDocument, input);
                break;

            case SignaturePackaging.ENVELOPED:
                _dataFormat.MimeType = "text/xml";
                _dataFormat.Encoding = "UTF-8";
                SetContentEnveloped(signatureDocument, XMLUtil.LoadDocument(input));
                break;

            case SignaturePackaging.ENVELOPING:
                _dataFormat.MimeType = "text/xml";
                _dataFormat.Encoding = "UTF-8";
                SetContentEveloping(signatureDocument, XMLUtil.LoadDocument(input));
                break;

            case SignaturePackaging.EXTERNALLY_DETACHED:
                SetContentExternallyDetached(signatureDocument, parameters.ExternalContentUri);
                break;
            }

            if (parameters.DataFormat != null)
            {
                if (!string.IsNullOrEmpty(parameters.DataFormat.TypeIdentifier))
                {
                    _dataFormat.ObjectIdentifier = new ObjectIdentifier();
                    _dataFormat.ObjectIdentifier.Identifier.IdentifierUri = parameters.DataFormat.TypeIdentifier;
                }

                _dataFormat.Description = parameters.DataFormat.Description;
            }

            SetSignatureId(signatureDocument.XadesSignature);

            PrepareSignature(signatureDocument, parameters);

            ComputeSignature(signatureDocument);

            signatureDocument.UpdateDocument();

            return(signatureDocument);
        }