Esempio n. 1
0
        private void btnEnviarSolicitud_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtFicheroFirma.Text))
            {
                MessageBox.Show("Debe seleccionar un fichero de firma");
                return;
            }

            if (string.IsNullOrEmpty(txtIdentificador.Text))
            {
                MessageBox.Show("Debe introducir el identificador de aplicación de @firma");
                return;
            }

            /* Selecionar el certificado para firmar la solicitud. El certificado deberá ser el mismo
             * que el empleado durante el registro en @firma */
            X509Certificate2 cert = SeleccionarCertificado();

            if (cert == null)
            {
                MessageBox.Show("Debe seleccionar un certificado para firmar la solicitud.");
                return;
            }

            try
            {
                byte[]          contenidoFirma = File.ReadAllBytes(txtFicheroFirma.Text);
                SignatureFormat formatoFirma;

                if (Path.GetExtension(txtFicheroFirma.Text).ToUpper() == ".PDF")
                {
                    if (cmbTipo.SelectedIndex != cmbTipo.Items.Count - 1)
                    {
                        MessageBox.Show("Debe especificar un formato de firma correcto.");
                    }

                    formatoFirma = SignatureFormat.PAdES;
                }
                else if (Path.GetExtension(txtFicheroFirma.Text).ToUpper() == ".XML" ||
                         Path.GetExtension(txtFicheroFirma.Text).ToUpper() == ".XSIG")
                {
                    formatoFirma = SignatureFormat.XAdES;
                }
                else
                {
                    formatoFirma = SignatureFormat.CAdES;
                }

                Identity identity = new Identity(cert, txtIdentificador.Text);

                // Certificado que firma las respuestas del servidor
                AfirmaService afirmaService = new AfirmaService(identity);

                byte[] resultado = afirmaService.UpgradeSignature(contenidoFirma, formatoFirma, ReturnUpdatedSignatureType.GetReturnUpdatedSignatureType(cmbTipo.Text));

                if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    File.WriteAllBytes(saveFileDialog1.FileName, resultado);
                }

                MessageBox.Show("Proceso completado correctamente");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ha ocurrido procesando la solicitud");
            }
        }
Esempio n. 2
0
        public byte[] UpgradeSignature(byte[] signature, SignatureFormat signatureFormat, ReturnUpdatedSignatureType returnUpdateSignatureType,
                                       byte[] targetSignerCert = null, IEnumerable <DocumentBaseType> otherInputDocuments = null)
        {
            if (signature == null)
            {
                throw new ArgumentNullException("signature", "El valor no puede ser nulo.");
            }

            if (returnUpdateSignatureType == null)
            {
                throw new ArgumentNullException("returnUpdateSignatureType", "El valor no puede ser nulo.");
            }

            object document = GetDocument(signature, signatureFormat);

            ReturnUpdatedSignature returnUpdated = new ReturnUpdatedSignature();

            returnUpdated.Type = returnUpdateSignatureType.ResourceName;

            IgnoreGracePeriod igp = new IgnoreGracePeriod();

            DocumentType doc = new DocumentType();

            doc.ID   = "ID_DOCUMENTO";
            doc.Item = document;

            SignatureObject signatureObject = new SignatureObject();

            signatureObject.Item = new SignaturePtr()
            {
                WhichDocument = "ID_DOCUMENTO"
            };

            List <DocumentBaseType> documents = new List <DocumentBaseType>();

            documents.Add(doc);

            if (otherInputDocuments != null)
            {
                foreach (var inputDocument in otherInputDocuments)
                {
                    documents.Add(inputDocument);
                }
            }

            List <XmlElement> optionalInputs = new List <XmlElement>();

            optionalInputs.Add(GetXmlElement(igp));
            optionalInputs.Add(GetXmlElement(returnUpdated));

            if (targetSignerCert != null)
            {
                TargetSigner targetSigner = new TargetSigner();
                targetSigner.Value = targetSignerCert;

                optionalInputs.Add(GetXmlElement(targetSigner));
            }

            VerifyRequest request = BuildRequest(documents, signatureObject, optionalInputs);

            DSSAfirmaVerifyService ds = new DSSAfirmaVerifyService(_identity, _serverCert);

            string result = ds.verify(GetXmlElement(request).OuterXml);

            VerifyResponse response = DeserializeXml <VerifyResponse>(result);

            if (ResultType.Success.Equals(response.Result.ResultMajor))
            {
                XmlElement           updatedSignatureXmlElement = response.OptionalOutputs.Any.Single(e => e.LocalName == "UpdatedSignature");
                UpdatedSignatureType updatedSignatureType       = DeserializeXml <UpdatedSignatureType>(updatedSignatureXmlElement.OuterXml);

                if (updatedSignatureType.SignatureObject.Item.GetType() == typeof(SignaturePtr))
                {
                    SignaturePtr             signaturePtr     = updatedSignatureType.SignatureObject.Item as SignaturePtr;
                    DocumentWithSignature    docWithSignature = null;
                    IEnumerable <XmlElement> documentWithSignatureXmlElements = response.OptionalOutputs.Any.Where(e => e.LocalName == "DocumentWithSignature");
                    foreach (var item in documentWithSignatureXmlElements)
                    {
                        docWithSignature = DeserializeXml <DocumentWithSignature>(item.OuterXml);

                        if (docWithSignature.Document.ID == signaturePtr.WhichDocument)
                        {
                            return(docWithSignature.Document.Item as byte[]);
                        }
                    }

                    throw new Exception("No se ha encontrado el documento de firma");
                }
                else if (updatedSignatureType.SignatureObject.Item.GetType() == typeof(Base64Signature))
                {
                    Base64Signature b64Signature = updatedSignatureType.SignatureObject.Item as Base64Signature;

                    return(b64Signature.Value);
                }
                else
                {
                    throw new Exception("Tipo de resultado no soportado");
                }
            }
            else
            {
                throw new AfirmaResultException(response.Result.ResultMajor, response.Result.ResultMinor, response.Result.ResultMessage.Value);
            }
        }