EldoS | Feel safer!

Software components for data protection, secure storage and transfer

Generete Digestvalue, x509Certificate and signaturevalue

Also by EldoS: CallbackProcess
A component to control process creation and termination in Windows and .NET applications.
#5854
Posted: 04/11/2008 10:17:58
by Gabriel Herdt (Standard support level)
Joined: 04/09/2008
Posts: 37

How i Include bold tag in my example? command in delphi 2005. Please!

-
- <SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
- <Reference URI="#id-2106595672">
- <Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>JbxdbLSuZIxhVCB0fexuElfpkY8=</DigestValue>
</Reference>

jMCFk8ScehX3IoG6mx9qjM6fS6ldJ1QvFPzf2y2UUDPfBVod0vf+kcDgpWI9g0MF UBNFbC0Svo2YaclGSE8KcVn4U0z9pydJZS3PXzjlznWYtg+K0rF8cfiwNV595U8i 2VHjvDQ02Sk5F1vPz7Us7marbD02lAd9puyEzF9T1w4=
- <KeyInfo>
- <X509Data>
<X509Certificate>MIIFLzCCBBegAwIBAgIQMjAwODAxMzExNjI2MTEwMjANBgkqhkiG9w0BAQUFADCB hDELMAkGA1UEBhMCQlIxEzARBgNVBAoTCklDUC1CcmFzaWwxLDAqBgNVBAsTI1Nl Y3JldGFyaWEgZGEgUmVjZWl0YSBGZWRlcmFsIC0gU1JGMTIwMAYDVQQDEylBdXRv cmlkYWRlIENlcnRpZmljYWRvcmEgZG8gU0VSUFJPIFNSRiB2MTAeFw0wODAxMzEx NjM5MDhaFw0wOTAxMzAxNjM5MDhaMIHfMQswCQYDVQQGEwJCUjETMBEGA1UEChMK SUNQLUJyYXNpbDEqMCgGA1UECxMhU2VjcmV0YXJpYSBkYSBSZWNlaXRhIEZlZGVy YWwtU1JGMRUwEwYDVQQLEwxDT05UUklCVUlOVEUxFjAUBgNVBAsTDVNSRiBlLUNO UEogQTExETAPBgNVBAcTCENyaWNpdW1hMQswCQYDVQQIEwJTQzFAMD4GA1UEAxM3 Q09OU1lTVEVDIFBST0NFU1NBTUVOVE8gREUgREFET1MgTFREQSBNRTo4NTM4Njg2 MDAwMDE2ODCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqrckA1myYq7xcC9t 6l2guYPBf47cl0KI0lyqt7IUmeAj8b3Ddf9EsmxnNmAJuVqibV8g9U1D9AVGrAco cqNuB9Se3FghWTay5i78phF1KON2HsI4VYG+Zrtv2kymETcSDbXmvh7wsuU12Plh dh0tXRYjeWgRNFZVnEihQvI+zgsCAwEAAaOCAcIwggG+MA8GA1UdEwEB/wQFMAMB AQAwHwYDVR0jBBgwFoAURnkGRIMC2ep5jQ/EgP5BuvbzEnIwDgYDVR0PAQH/BAQD AgXgMGAGA1UdIARZMFcwVQYGYEwBAgEKMEswSQYIKwYBBQUHAgEWPWh0dHBzOi8v Y2NkLnNlcnByby5nb3YuYnIvYWNzZXJwcm9zcmYvZG9jcy9kcGNhY3NlcnByb3Ny Zi5wZGYwgbYGA1UdEQSBrjCBq6A9BgVgTAEDBKA0BDIwNzExMTk1NDM0MjQwNzgw OTM0MDAwMDAwMDAwMDAwMDAwMDAwMDAyNzQ4MjhTU0lTQ6AaBgVgTAEDAqARBA9H YWJyaWVsIFdlc3RydXCgGQYFYEwBAwOgEAQOODUzODY4NjAwMDAxNjigFwYFYEwB AwegDgQMMDAwMDAwMDAwMDAwgRpjb25zeXN0ZWNAY29uc3lzdGVjLmNvbS5icjAg BgNVHSUBAf8EFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwPQYDVR0fBDYwNDAyoDCg LoYsaHR0cDovL2NjZC5zZXJwcm8uZ292LmJyL2xjci9hY3NlcnByb3NyZi5jcmww DQYJKoZIhvcNAQEFBQADggEBANRmsA7WeihdPpeprib8lUOLtj4LBfJ0cN7AcD/c WlVvfXwkJTMr/BTGlhpJx/+L7HtL/4spFgep8zNuvFZmNl+BpoQ6vybtb1RWuHBC 6fGYXQRG4BbavLXxQi/ZIi/cmmvWiHD4gjKOGH3miDdthyYPEk6dgvODnuS1mac7 skWViGTrtob6mmjPPFteVLZfvbu15M3FASMRmDmlaMtfe7uUhriau/045NPQE2wz RKlCTCwfF2cKiYhWM5ci2cyw/FXgkL6ZV/5INzgnf8vLYqJd3TvEamTFnIMSJnHB x3iyic8RPwlK+P6H5Gy8BLHY42vINzceOfEf4Ohn1Yt3AWk=</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>


Gabriel Herdt
Consystec
#5855
Posted: 04/11/2008 10:46:13
by Dmytro Bogatskyy (EldoS Corp.)

before Refs.Add(Ref) add following line:
Ref.TransformChain.Add(TElXMLC14NTransform.Create);

P.S. This canonicalization is default and could be omitted.
#5884
Posted: 04/15/2008 09:03:21
by Gabriel Herdt (Standard support level)
Joined: 04/09/2008
Posts: 37

What is wrong in that function?

Xml = <enviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.10">1<NFe xmlns="http://www.portalfiscal.inf.br/nfe"><ide><cUF>51</cUF><cNF>000012351</cNF><natOp>REMESSA POR CONTA E ORDEM TERCEIROS</natOp><indPag>0<mod>55</mod>0<nNF>12351</nNF><dEmi>2008-03-18</dEmi><dSaiEnt>2008-03-18</dSaiEnt><tpNF>1</tpNF><cMunFG>5107602</cMunFG><tpImp>1</tpImp><tpEmis>1</tpEmis><cDV>2</cDV><tpAmb>2</tpAmb><finNFe>1</finNFe><procEmi>0</procEmi><verProc>1.10</verProc></ide><emit><CNPJ>03941052001718</CNPJ><xNome> DE ALIMENTOS LTDA</xNome><enderEmit><xLgr>RUA 13 DE MAIO, aaaa1</xLgr><nro>320</nro><xBairro>VILA AURORA</xBairro><cMun>5107602</cMun><xMun>OLIS</xMun>MT<CEP>78740040</CEP><cPais>1058</cPais><xPais>Brasil</xPais></enderEmit>133164152</emit><dest><CNPJ>03307926000999</CNPJ><xNome>aaaaaa E DISTRIBUICAO S/A</xNome><enderDest><xLgr>RODOVIA JORGE LACERDA</xLgr><nro>s/n</nro><xBairro>SALSEIRO</xBairro><cMun>4208203</cMun><xMun>ITAJAI</xMun>SC<CEP>88130000</CEP><cPais>1058</cPais><xPais>Brasil</xPais></enderDest>254653618</dest><det nItem="1"><prod><cProd>96113</cProd><cEAN/><xProd>PERNIL CONG SUINO S/ OSSO EXPORT P-R CX</xProd><CFOP>6923</CFOP>KG<qCom>13360.6100</qCom><vUnCom>5.5000</vUnCom><vProd>73483.36</vProd><cEANTrib/>KG<qTrib>13360.6100</qTrib><vUnTrib>5.5000</vUnTrib></prod><ICMS><ICMS40><orig>0</orig><CST>41</CST></ICMS><PIS><PISNT><CST>08</CST></PISNT></PIS><COFINS><COFINSNT><CST>08</CST></COFINSNT></COFINS></imposto></det><det nItem="2"><prod><cProd>96114</cProd><cEAN/><xProd>PERNIL CONG SUINO S/ OSSO EXPORT M-R CX</xProd><CFOP>6923</CFOP>KG<qCom>3887.1900</qCom><vUnCom>5.5000</vUnCom><vProd>21379.55</vProd><cEANTrib/>KG<qTrib>3887.1900</qTrib><vUnTrib>5.5000</vUnTrib></prod><ICMS><ICMS40><orig>0</orig><CST>41</CST></ICMS><PIS><PISNT><CST>08</CST></PISNT></PIS><COFINS><COFINSNT><CST>08</CST></COFINSNT></COFINS></imposto></det><det nItem="3"><prod><cProd>96122</cProd><cEAN/><xProd>CARRE CONG SUINO EXPORT CX N/P - INDIV</xProd><CFOP>6923</CFOP>KG<qCom>841.0400</qCom><vUnCom>5.0000</vUnCom><vProd>4205.20</vProd><cEANTrib/>KG<qTrib>841.0400</qTrib><vUnTrib>5.0000</vUnTrib></prod><ICMS><ICMS40><orig>0</orig><CST>41</CST></ICMS><PIS><PISNT><CST>08</CST></PISNT></PIS><COFINS><COFINSNT><CST>08</CST></COFINSNT></COFINS></imposto></det><det nItem="4"><prod><cProd>96200</cProd><cEAN/><xProd>PALETA CONG SUINO S/ OSSO EXPORT M-R CX</xProd><CFOP>6923</CFOP>KG<qCom>2380.4000</qCom><vUnCom>5.0000</vUnCom><vProd>11902.00</vProd><cEANTrib/>KG<qTrib>2380.4000</qTrib><vUnTrib>5.0000</vUnTrib></prod><ICMS><ICMS40><orig>0</orig><CST>41</CST></ICMS><PIS><PISNT><CST>08</CST></PISNT></PIS><COFINS><COFINSNT><CST>08</CST></COFINSNT></COFINS></imposto></det><det nItem="5"><prod><cProd>96210</cProd><cEAN/><xProd>SOBREPALETA CONG SUINO S/ OSSO EXPORT 1X1 CX 20KG</xProd><CFOP>6923</CFOP>KG<qCom>320.0000</qCom><vUnCom>5.5000</vUnCom><vProd>1760.00</vProd><cEANTrib/>KG<qTrib>320.0000</qTrib><vUnTrib>5.5000</vUnTrib></prod><ICMS><ICMS40><orig>0</orig><CST>41</CST></ICMS><PIS><PISNT><CST>08</CST></PISNT></PIS><COFINS><COFINSNT><CST>08</CST></COFINSNT></COFINS></imposto></det><det nItem="6"><prod><cProd>96303</cProd><cEAN/><xProd>BARRIGA CONG SUINO S/ OSSO PIANO EXPORT</xProd><CFOP>6923</CFOP>KG<qCom>26.0000</qCom><vUnCom>5.0000</vUnCom><vProd>130.00</vProd><cEANTrib/>KG<qTrib>26.0000</qTrib><vUnTrib>5.0000</vUnTrib></prod><ICMS><ICMS40><orig>0</orig><CST>41</CST></ICMS><PIS><PISNT><CST>08</CST></PISNT></PIS><COFINS><COFINSNT><CST>08</CST></COFINSNT></COFINS></imposto></det><det nItem="7"><prod><cProd>96304</cProd><cEAN/><xProd>BARRIGA CONG SUINO S/ COSTELA EXPORT 1X1</xProd><CFOP>6923</CFOP>KG<qCom>896.5100</qCom><vUnCom>3.5000</vUnCom><vProd>3137.79</vProd><cEANTrib/>KG<qTrib>896.5100</qTrib><vUnTrib>3.5000</vUnTrib></prod><ICMS><ICMS40><orig>0</orig><CST>41</CST></ICMS><PIS><PISNT><CST>08</CST></PISNT></PIS><COFINS><COFINSNT><CST>08</CST></COFINSNT></COFINS></imposto></det><det nItem="8"><prod><cProd>96310</cProd><cEAN/><xProd>LOMBO CONG SUINO EXPORT CX 20KG - INDIV</xProd><CFOP>6923</CFOP>KG<qCom>3340.0000</qCom><vUnCom>8.0000</vUnCom><vProd>26720.00</vProd><cEANTrib/>KG<qTrib>3340.0000</qTrib><vUnTrib>8.0000</vUnTrib></prod><ICMS><ICMS40><orig>0</orig><CST>41</CST></ICMS><PIS><PISNT><CST>08</CST></PISNT></PIS><COFINS><COFINSNT><CST>08</CST></COFINSNT></COFINS></imposto></det><det nItem="9"><prod><cProd>96500</cProd><cEAN/><xProd>RECORTE MAGRO 80X20 CONG SUINO EXPORT CX 20KG - BLOCO</xProd><CFOP>6923</CFOP>KG<qCom>1160.0000</qCom><vUnCom>4.0000</vUnCom><vProd>4640.00</vProd><cEANTrib/>KG<qTrib>1160.0000</qTrib><vUnTrib>4.0000</vUnTrib></prod><ICMS><ICMS40><orig>0</orig><CST>41</CST></ICMS><PIS><PISNT><CST>08</CST></PISNT></PIS><COFINS><COFINSNT><CST>08</CST></COFINSNT></COFINS></imposto></det><total><vBC>147357.90</vBC><vICMS>0.00</vICMS><vBCST>0.00</vBCST><vST>0.00</vST><vProd>147357.90</vProd><vFrete>0.00</vFrete><vSeg>0.00</vSeg><vDesc>0.00</vDesc><vII>0.00</vII><vIPI>0.00</vIPI><vPIS>0.00</vPIS><vCOFINS>0.00</vCOFINS><vOutro>0.00</vOutro><vNF>147357.90</vNF></total><transp><modFrete>0</modFrete><transporta><CNPJ>99993332000100</CNPJ><xNome>aaaaaaaaaa DE ASSES PORTUARIA LTDA</xNome>253907012RS</transporta></transp></infNFe></NFe></enviNFe>


function TFLnEnvNFe.Assinar2(Xml, Uri:WideString; out x509, Ass,
Digest: WideString): WideString;
var
Signer: TElXMLSigner;
XAdESSigner: TElXAdESSigner;
HMACKeyData: TElXMLKeyInfoHMACData;
RSAKeyData: TElXMLKeyInfoRSAData;
X509KeyData: TElXMLKeyInfoX509Data;
PGPKeyData: TElXMLKeyInfoPGPData;
Cert: TElX509Certificate;
SigNode: TElXMLDOMNode;
El: TElXMLDOMElement;
Buf: ByteArray;
Ref: TElXMLReference;
Refs: TElXMLReferenceList;
HTTPClient: TElHTTPSClient;
TSPClient: TElHttpTSPClient;
NodeNivel1,
NodeNivel2,
NodeNivel3,
NodeNivelZC: IXMLNode;
iNode,i : Integer;
Elementos : ElXMLDOMElement;
Document : ElXMLDOMDocument;
F: {$ifndef DELPHI_NET}TFileStream{$else}FileStream{$endif};
begin
inherited;
XAdESSigner := nil;
TSPClient := nil;
HTTPClient := nil;
HMACKeyData := nil;
RSAKeyData := nil;
X509KeyData := nil;
PGPKeyData := nil;
Ref := nil;
Refs := TElXMLReferenceList.Create;
try
XML;
FXMLDocument := TElXMLDOMDocument.Create;
Elementos := ParseElementFromXMLString(Xml,FXMLDocument);
FXMLDocument.AppendChild(Elementos);
Elementos.OuterXML;


Ref := TElXMLReference.Create;
Ref.DigestMethod := xdmSHA1;

Ref.URINode := FXMLDocument.DocumentElement.FindNode('infNFe');
// ref.LoadFromXML();
Ref.URI := Uri;
Ref.TransformChain.Add(TElXMLEnvelopedSignatureTransform.Create);
Ref.TransformChain.Add(TElXMLC14NTransform.Create);

Refs.Add(Ref);
//if True then begin
Signer := TElXMLSigner.Create(Self);
try

Signer.SignatureType := xstEnveloped;
Signer.CanonicalizationMethod := xcmCanon;
Signer.SignatureMethodType := xmtSig;
Signer.SignatureMethod := xsmRSA_SHA1;
Signer.MACMethod := xmmHMAC_SHA1;
Signer.IncludeKey := True;
Signer.References := Refs;
Signer.OnFormatElement := FormatElement;
Signer.OnFormatText := FormatText;
Signer.References.Add(ref);
Cert := ElWinCertStorage.Certificates[(Parametro.NR_ITECER-1)];

//ate aki ok
if Assigned(Cert) and Cert.PrivateKeyExists then
begin
X509KeyData := TElXMLKeyInfoX509Data.Create(False);
X509KeyData.IncludeDataParams := [xkidX509SKI, xkidX509Certificate, xkidX509CRL];
X509KeyData.IncludeKeyValue := False;
X509KeyData.Certificate := Cert;
Signer.KeyData := X509KeyData;
end;

Signer.UpdateReferencesDigest;
if True then
begin

Signer.Sign;

SigNode := FXMLDocument.DocumentElement.FindNode('NFe');

try
// If the signature type is enveloping, then the signature is placed into the passed node and the contents of the node are moved to inside of the signature.
// If the signature type is enveloped, the signature is placed as a child of the passed node.
Signer.Save(SigNode);
signode.OuterXML;
except
on E: Exception do
raise EElXMLError.CreateFmt('Signed data saving failed. (%s)', [E.Message]);
end;
end;

finally
FreeAndNil(Signer);
FreeAndNil(XAdESSigner);
FreeAndNil(TSPClient);
FreeAndNil(HTTPClient);
FreeAndNil(HMACKeyData);
FreeAndNil(RSAKeyData);
FreeAndNil(X509KeyData);
FreeAndNil(PGPKeyData);
end;
//end;
finally
FreeAndNil(Refs);
end;
end;


Gabriel Herdt
Consystec
#5886
Posted: 04/15/2008 09:56:56
by Dmytro Bogatskyy (EldoS Corp.)

Quote
What is wrong in that function?

What problem did you had?
"Access violation ..."?
That's because you have in code:
Refs.Add(Ref);
..
Signer.References := Refs;
Signer.References.Add(ref);
- you add twice a Ref object to the references list.

And you have another problem:
in code: Ref.URINode := FXMLDocument.DocumentElement.FindNode('infNFe');
FindNode method search for child element only. In your xml infNFe is grandchild element.
You can first search for NFe element than for infNFe. Or use SelectNodes method with XPath expression to search for this element.
#5887
Posted: 04/15/2008 10:08:14
by Gabriel Herdt (Standard support level)
Joined: 04/09/2008
Posts: 37

The correct it?


Gabriel Herdt
Consystec
#5888
Posted: 04/15/2008 10:44:00
by Dmytro Bogatskyy (EldoS Corp.)

Quote
The correct it?

For example:
Remove this line: Signer.References.Add(ref);
And replace:
Ref.URINode := FXMLDocument.DocumentElement.FindNode('infNFe');
with
Ref.URINode := FXMLDocument.DocumentElement.FindNode('NFe').FindNode('infNFe');
#5892
Posted: 04/15/2008 13:52:22
by Gabriel Herdt (Standard support level)
Joined: 04/09/2008
Posts: 37

In Line Signer.Save(SigNode); i have error Failed to extract id (bad local URI)
Resolution for this error is?


My Code now is:


function TFLnEnvNFe.Assinar2(Xml, Uri:WideString; out x509, Ass,
Digest: WideString): WideString;
var
Signer: TElXMLSigner;
XAdESSigner: TElXAdESSigner;
HMACKeyData: TElXMLKeyInfoHMACData;
RSAKeyData: TElXMLKeyInfoRSAData;
X509KeyData: TElXMLKeyInfoX509Data;
PGPKeyData: TElXMLKeyInfoPGPData;
Cert: TElX509Certificate;
SigNode: TElXMLDOMNode;
El: TElXMLDOMElement;
Buf: ByteArray;
Ref: TElXMLReference;
Refs: TElXMLReferenceList;
HTTPClient: TElHTTPSClient;
TSPClient: TElHttpTSPClient;
NodeNivel1,
NodeNivel2,
NodeNivel3,
NodeNivelZC: IXMLNode;
iNode,i : Integer;
Elementos : ElXMLDOMElement;
Document : ElXMLDOMDocument;
F: {$ifndef DELPHI_NET}TFileStream{$else}FileStream{$endif};
begin
inherited;
XAdESSigner := nil;
TSPClient := nil;
HTTPClient := nil;
HMACKeyData := nil;
RSAKeyData := nil;
X509KeyData := nil;
PGPKeyData := nil;
Ref := nil;
Refs := TElXMLReferenceList.Create;
try
XML;
FXMLDocument := TElXMLDOMDocument.Create;
Elementos := ParseElementFromXMLString(Xml,FXMLDocument);
FXMLDocument.AppendChild(Elementos);

Ref := TElXMLReference.Create;
Ref.DigestMethod := xdmSHA1;

Ref.URINode := FXMLDocument.DocumentElement.FindNode('NFe').FindNode('infNFe');
// ref.LoadFromXML();
Ref.URI := Uri;
Ref.TransformChain.Add(TElXMLEnvelopedSignatureTransform.Create);
Ref.TransformChain.Add(TElXMLC14NTransform.Create);

Refs.Add(Ref);
//if True then begin
Signer := TElXMLSigner.Create(Self);
try

Signer.SignatureType := xstEnveloped;
Signer.CanonicalizationMethod := xcmCanon;
Signer.SignatureMethodType := xmtSig;
Signer.SignatureMethod := xsmRSA_SHA1;
Signer.MACMethod := xmmHMAC_SHA1;
Signer.IncludeKey := True;
Signer.References := Refs;
//Signer.References.Add(ref);
Signer.OnFormatElement := FormatElement;
Signer.OnFormatText := FormatText;
Cert := ElWinCertStorage.Certificates[(Parametro.NR_ITECER-1)];

//ate aki ok
if Assigned(Cert) and Cert.PrivateKeyExists then
begin
X509KeyData := TElXMLKeyInfoX509Data.Create(False);
X509KeyData.IncludeDataParams := [xkidX509SKI, xkidX509Certificate, xkidX509CRL];
X509KeyData.IncludeKeyValue := False;
X509KeyData.Certificate := Cert;
Signer.KeyData := X509KeyData;
end;

Signer.UpdateReferencesDigest;
if True then
begin

Signer.Sign;

SigNode := FXMLDocument.DocumentElement.FindNode('NFe');

try
// If the signature type is enveloping, then the signature is placed into the passed node and the contents of the node are moved to inside of the signature.
// If the signature type is enveloped, the signature is placed as a child of the passed node.
Signer.Save(SigNode);
signode.OuterXML;
except
on E: Exception do
raise EElXMLError.CreateFmt('Signed data saving failed. (%s)', [E.Message]);
end;
end;

finally
FreeAndNil(Signer);
FreeAndNil(XAdESSigner);
FreeAndNil(TSPClient);
FreeAndNil(HTTPClient);
FreeAndNil(HMACKeyData);
FreeAndNil(RSAKeyData);
FreeAndNil(X509KeyData);
FreeAndNil(PGPKeyData);
end;
//end;
finally
FreeAndNil(Refs);
end;
end;




Gabriel Herdt
Consystec
#5893
Posted: 04/15/2008 14:52:24
by Dmytro Bogatskyy (EldoS Corp.)

Quote
In Line Signer.Save(SigNode); i have error Failed to extract id (bad local URI)
Resolution for this error is?

This is silent exception and it is catched inside Save method. If you had set Ref.URI with local URI, then possibly you forgot to add '#' char at the begining.
In your xml sample for "infNFe" element the URI should be: '#Nfe51080303941052001718550010000123510000123512'
#5928
Posted: 04/18/2008 09:24:53
by Gabriel Herdt (Standard support level)
Joined: 04/09/2008
Posts: 37

My assinature string generate one indent more. why?


Gabriel Herdt
Consystec
#5929
Posted: 04/18/2008 11:00:38
by Dmytro Bogatskyy (EldoS Corp.)

Quote
My assinature string generate one indent more. why?

Did you mean to change how indentation/whitespace generated for signature elements?
You can control this using OnFormatElement/OnFormatText events, in your case change FormatElement/FormatText functions.
Also by EldoS: BizCrypto
Components for BizTalk® and SQL Server® Integration Services that let you securely store and transfer information in your business automation solutions.

Reply

Statistics

Topic viewed 61046 times

Number of guests: 2, registered members: 0, in total hidden: 0




|

Back to top

As of July 15, 2016 EldoS Corporation will operate as a division of /n software inc. For more information, please read the announcement.

Got it!