Esto si que es raro, si lo firmo como la facturaE, no me da ningun tipo de error, pero su ejemplo es completamente distinto. No sé. Os pongo el código que he usado y que si me funciona, pero no tengo claro que vaya a ser así en un futuro
Código Delphi
[-]procedure TFrmMain.Button1Click(Sender: TObject);
var
ArchivoDestino: String;
F : TFileStream;
Out_Stream: TFileStream;
XML_Doc : ElXMLDOMDocument;
XML_Refs : TElXMLReferenceList;
XML_RefDocu : TElXMLReference;
XML_RefCert : TElXMLReference;
XML_Signer : TElXMLSigner;
XML_XAdES : TElXAdESSigner;
XML_KeyData : TElXMLKeyInfoX509Data;
XML_Digest: String;
XML_Buf: ByteArray;
j, i, k1, k2: Integer;
Cert : TElX509Certificate;
XML_Nodo : TElXMLDOMNode;
const
SHA256 = 'http://www.w3.org/2001/04/xmlenc#sha256';
POLITICA_PDF = 'http://www.facturae.es/politica_de_firma_formato_facturae/politica_de_firma_formato_facturae_v3_1.pdf';
POLITICA_FIRMA = 'Política de firma electrónica para facturación electrónica con formato Facturae';
HASH_POLITICA = '3A18B197ABA90FA6AFF0DEE912F0C006110BEA13';
begin
try
ArchivoDestino := ExtractFilePath(EdtRutaFicheroXML.Text) + StringReplace(ExtractFileName(EdtRutaFicheroXML.Text), ExtractFileExt(EdtRutaFicheroXML.Text), '', [rfReplaceAll, rfIgnoreCase])
+ 'Signed' + ExtractFileExt(EdtRutaFicheroXML.Text);
if (Trim(ArchivoDestino) = EmptyStr) or (FileExists(EdtRutaFicheroXML.Text) = False) then
raise Exception.Create('Error Inicializar');
F := TFileStream.Create(EdtRutaFicheroXML.Text, fmOpenRead or fmShareDenyWrite);
XML_Doc := ElXMLDOMDocument.Create;
XML_Refs := TElXMLReferenceList.Create;
XML_RefDocu := TElXMLReference.create;
XML_RefCert := TElXMLReference.create;
XML_Signer := TElXMLSigner.Create(nil);
XML_XAdES := TElXAdESSigner.Create(nil);
XML_KeyData:= TElXMLKeyInfoX509Data.create(false);
XML_Doc.LoadFromStream(F,'', True);
if not XML_Doc.Loaded then
raise Exception.create('Firma XML: No se pudo cargar el documento XML.');
XML_Signer.References := XML_Refs;
XML_Signer.SignatureMethodType := SBXMLSec.xmtSig;
XML_Signer.SignatureType := SBXMLSec.xstEnveloped;
XML_Signer.CanonicalizationMethod := SBXMLDefs.xcmCanon;
XML_Signer.SignatureMethod := SBXMLSec.xsmRSA_SHA256;
XML_Signer.IncludeKey := True;
XML_Signer.XAdESProcessor := XML_XAdES;
XML_Signer.XAdESProcessor.XAdESVersion := SBXMLAdES.XAdES_v1_4_1;
XML_Signer.XAdESProcessor.Included := [SBXMLAdESIntf.xipSignerRole];
XML_Signer.XAdESProcessor.SignerRole.ClaimedRoles.AddText(XML_Signer.XAdESProcessor.XAdESVersion, XML_Doc, 'supplier');
XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.Identifier := POLITICA_PDF;
if (Length(POLITICA_PDF) > 0) then
begin
if (LowerCase(Copy(POLITICA_PDF,0,4)) = 'urn:') then
XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.IdentifierQualifier := SBXMLAdES.xqtOIDAsURN
else
XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.IdentifierQualifier := SBXMLAdES.xqtOIDAsURI;
end
else
XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.IdentifierQualifier := SBXMLAdES.xqtNone;
XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.Description := POLITICA_FIRMA;
XML_Signer.XAdESProcessor.PolicyId.SigPolicyHash.DigestMethod := SHA256;
XML_Digest:= LowerCase(HASH_POLITICA);
SetLength(XML_Buf, Length(XML_Digest) div 2);
for j:= 0 to Length(XML_Buf)-1 do
begin
k1:= SBMath.HexToDecDigit(XML_Digest[j*2 + 1]);
k2:= SBMath.HexToDecDigit(XML_Digest[j*2 + 2]);
if (k1<0) or (k2<0) then
raise Exception.Create('Firma XML: Error convirtiendo digest de política de firmado a Base64.');
XML_Buf[j]:= k1 shl 4 + k2;
end;
XML_Signer.XAdESProcessor.PolicyId.SigPolicyHash.DigestValue := XML_Buf;
XML_Signer.XAdESProcessor.SigningTime := UtcNow;
XML_Signer.XAdESProcessor.Generate();
XML_Signer.UpdateReferencesDigest();
XML_KeyData.IncludeKeyValue := true;
Cert := ListaCertificados[ComboBoxCertificados.ItemIndex];
XML_KeyData.Certificate := Cert;
XML_Signer.KeyData := XML_KeyData;
XML_RefDocu.DigestMethod := SBXMLSec.xdmSHA256;
XML_RefDocu.URINode := XML_Doc.DocumentElement;
XML_RefDocu.URI := '';
XML_RefDocu.TransformChain.Add(TElXMLEnvelopedSignatureTransform.Create);
XML_Refs.Add(XML_RefDocu);
XML_Signer.UpdateReferencesDigest();
XML_RefCert.URI := '#Certificate1';
XML_RefCert.DigestMethod := SBXMLSec.xdmSHA256;
XML_Refs.Add(XML_RefCert);
XML_Signer.Sign();
XML_Signer.Signature.KeyInfo.ID := 'Certificate1';
XML_Nodo := XML_Doc.DocumentElement;
XML_Signer.Save(XML_Nodo);
F.Position := 0;
XML_Doc.SaveToStream(F);
Out_Stream:= TFileStream.create(ArchivoDestino, fmCreate);
XML_Doc.SaveToStream(Out_Stream);
FreeAndNil(Out_Stream);
FreeAndNil(F);
XML_Doc.free;
XML_Refs.free;
XML_Signer.free;
XML_XAdES.free;
XML_KeyData.Free;
ShowMessage('Fichero Firmado');
except on E: Exception do
begin
ShowMessage(e.ToString);
if Assigned(XML_Doc) then
XML_Doc.free;
if Assigned(XML_Refs) then
XML_Refs.free;
if Assigned(XML_Signer) then
XML_Signer.free;
end;
end;
end;