/// <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))); }
/// <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); }
/// <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); }