public LoadXml ( System xmlElement ) : void | ||
xmlElement | System | The XML element from which to load the XadesSignedXml state |
리턴 | void |
/// <summary> /// Realiza la contrafirma de la firma actual /// </summary> /// <param name="certificate"></param> /// <param name="signMethod"></param> public void CounterSign(X509Certificate2 certificate, SignMethod? signMethod = null) { SetSignatureId(); if (_xadesSignedXml == null) { throw new Exception("No hay ninguna firma XADES cargada previamente."); } if (certificate == null) { throw new Exception("Es necesario un certificado válido para la firma."); } if (signMethod.HasValue) { this.SignMethod = signMethod.Value; } _signCertificate = certificate; XadesSignedXml counterSignature = new XadesSignedXml(_document); SetCryptoServiceProvider(); counterSignature.SigningKey = _rsaKey; Reference reference = new Reference(); reference.Uri = "#" + _xadesSignedXml.SignatureValueId; reference.Id = "Reference-" + Guid.NewGuid().ToString(); reference.Type = "http://uri.etsi.org/01903#CountersignedSignature"; reference.AddTransform(new XmlDsigC14NTransform()); counterSignature.AddReference(reference); _objectReference = reference.Id; KeyInfo keyInfo = new KeyInfo(); keyInfo.Id = "KeyInfoId-" + _signatureId; keyInfo.AddClause(new KeyInfoX509Data((X509Certificate)_signCertificate)); keyInfo.AddClause(new RSAKeyValue((RSA)_rsaKey)); counterSignature.KeyInfo = keyInfo; Reference referenceKeyInfo = new Reference(); referenceKeyInfo.Id = "ReferenceKeyInfo-" + _signatureId; referenceKeyInfo.Uri = "#KeyInfoId-" + _signatureId; counterSignature.AddReference(referenceKeyInfo); counterSignature.Signature.Id = _signatureId; counterSignature.SignatureValueId = _signatureValueId; XadesObject counterSignatureXadesObject = new XadesObject(); counterSignatureXadesObject.Id = "CounterSignatureXadesObject-" + Guid.NewGuid().ToString(); counterSignatureXadesObject.QualifyingProperties.Target = "#" + _signatureId; counterSignatureXadesObject.QualifyingProperties.SignedProperties.Id = "SignedProperties-" + _signatureId; AddSignatureProperties(counterSignatureXadesObject.QualifyingProperties.SignedProperties.SignedSignatureProperties, counterSignatureXadesObject.QualifyingProperties.SignedProperties.SignedDataObjectProperties, counterSignatureXadesObject.QualifyingProperties.UnsignedProperties.UnsignedSignatureProperties, "text/xml", _signCertificate); counterSignature.AddXadesObject(counterSignatureXadesObject); foreach (Reference signReference in counterSignature.SignedInfo.References) { signReference.DigestMethod = _refsMethodUri; } counterSignature.AddXadesNamespace = true; counterSignature.ComputeSignature(); UnsignedProperties unsignedProperties = _xadesSignedXml.UnsignedProperties; unsignedProperties.UnsignedSignatureProperties.CounterSignatureCollection.Add(counterSignature); _xadesSignedXml.UnsignedProperties = unsignedProperties; UpdateDocument(); _xadesSignedXml = new XadesSignedXml(_document); XmlNode xmlNode = _document.SelectSingleNode("//*[@Id='" + _signatureId + "']"); _xadesSignedXml.LoadXml((XmlElement)xmlNode); }
/// <summary> /// Realiza el proceso de firmado /// </summary> /// <param name="certificate"></param> /// <param name="signMethod"></param> public void Sign(X509Certificate2 certificate, SignMethod? signMethod = null) { if (certificate == null) { throw new Exception("Es necesario un certificado válido para la firma."); } if (signMethod.HasValue) { this.SignMethod = signMethod.Value; } if (!string.IsNullOrEmpty(_signatureId) && _document != null && _document.SelectSingleNode("//*[@Id='" + _signatureId + "']") != null) { throw new Exception("El documento ya ha sido firmado, debe seleccionar otro método de firma."); } if (string.IsNullOrEmpty(_signatureId)) { SetSignatureId(); } _signCertificate = certificate; AddCertificateInfo(); AddXadesInfo(); foreach (Reference reference in _xadesSignedXml.SignedInfo.References) { reference.DigestMethod = _refsMethodUri; } _xadesSignedXml.SignedInfo.SignatureMethod = _signMethodUri; ComputeSignature(); UpdateDocument(); XmlNode xmlNode = _document.SelectSingleNode("//*[@Id='" + _signatureId + "']"); _xadesSignedXml = new XadesSignedXml(_document); _xadesSignedXml.LoadXml((XmlElement)xmlNode); }
/// <exception cref="System.IO.IOException"></exception> public virtual Document ExtendSignature(object signatureId, Document document, Document originalData, SignatureParameters parameters) { if (this.tspSource == null) { throw new ConfigurationException(ConfigurationException.MSG.CONFIGURE_TSP_SERVER); } XmlDocument envelopedSignatureXmlDocument; XmlDocument xadesDocument; XmlElement signature; XadesSignedXml xadesSignedXml; xadesDocument = XmlUtils.ToXmlDocument(document); xadesDocument.PreserveWhitespace = true; xadesDocument.Load(document.OpenStream()); xadesSignedXml = new XadesSignedXml(xadesDocument.DocumentElement); //Needed if it is a enveloped signature document signature = xadesSignedXml.GetIdElement(xadesDocument, (string)signatureId); xadesSignedXml.LoadXml(signature); ExtendSignatureTag(xadesSignedXml); envelopedSignatureXmlDocument = XmlUtils.ToXmlDocument(originalData); return XmlUtils.ToDocument(envelopedSignatureXmlDocument, xadesSignedXml); }