PRINT SOME SYSTEM PROPERTIES...
java.version=1.7.0_71
os.arch=amd64
os.name=Windows 7
os.version=6.1
file.encoding=Cp1252

TEST THE GENERAL CLASS...
General.version()=70000
General.moduleName()=C:\Windows\system32\diFirmaSAT2.dll
General.platform()=Win64
General.compileTime()=Jan 12 2015 14:48:08
General.licenceType()=D
General.lastError()='' (expecting empty)
Current working directory is C:\Scratch\firmasat-7.0.j0

LOOKUP MESSAGES FOR SOME ERROR CODES...
General.errorLookup(1)=Cannot open input file/No se puede abrir archivo de entrada
General.errorLookup(17)=Invalid option/Opcion no valida
General.errorLookup(9999)=Miscellaneous error/Varios de error

FORM THE PIPESTRING FROM AN XML FILE:
Sat.makePipeStringFromXml('ejemplo_v32-signed2012.xml')=
||3.2|2012-07-20T20:38:12|ingreso|Pago en una sola exhibición|488.50|488.50|Efectivo|Queretaro, Qro.|3850|3464|ABC|2012-07-11T11:11:11|24499.99|PPL961114GZ1|PHARMA PLUS SA DE CV|AV. RIO MIXCOAC|No. 140|ACACIAS|BENITO JUAREZ|MEXICO, D.F.|Mexico|03240|AV. UNIVERSIDAD|1858|OXTOPULCO|DISTRITO FEDERAL|MÉXICO|03910|Regimen General de Ley|Otro regimen (opcional)|PEPJ8001019Q8|JUAN PEREZ PEREZ|AV UNIVERSIDAD|16 EDF 3|DPTO 101|COPILCO UNIVERSIDAD|COYOACAN|DISTRITO FEDERAL|Mexico|04360|1.0|CAPSULAS|VIBRAMICINA 100MG 10|244.00|244.00|1.0|BOTELLA|CLORUTO 500M|137.93|137.93|1.0|TABLETAS|SEDEPRON 250MG 10|84.50|84.50|IVA|0.00|0.00|IVA|16.00|22.07||

SIGN AN XML FILE:
Sat.signXml('ejemplo_v32-base2012.xml'-->'ejemplo_v32-new_signed.xml') returns 0
Sat.validateXml('ejemplo_v32-new_signed.xml') returns 0

VERIFY A SIGNATURE IN AN XML FILE:
1. One we know is good:
Sat.verifySignature('ejemplo_v32-signed2012.xml') returns 0
2. One we just made, so it should be good:
Sat.verifySignature('ejemplo_v32-new_signed.xml') returns 0

FORM THE DIGEST OF THE PIPESTRING IN AN XML FILE:
Sat.makeDigestFromXml('ejemplo_v32-signed2012.xml')=
dea5f5acd7ff2deebcacdf0af6cefa7c854efa22

EXTRACT THE DIGEST FROM THE SIGNATURE IN AN XML FILE:
Sat.extractDigestFromSignature('ejemplo_v32-signed2012.xml')=
DEA5F5ACD7FF2DEEBCACDF0AF6CEFA7C854EFA22

TRY VALIDATING XML FILES:
1. A valid one:
Sat.validateXml('Muestra_v22-signed2012.xml') returns 0
2. An invalid one (missing version):
Sat.validateXml('Muestra_v22-bad-nover.xml') returns -21
ErrorLookup(-21)=Match not found/No se pudo encontrar datos coincidente
LastError=
3. An invalid one (empty noCertificado):
Sat.validateXml('Muestra_v22-base2012-nocert.xml') returns -28
ErrorLookup(-28)=XML restriction is violated/XML restriccion es violada
LastError=Bad attribute/atributo mal [Comprobante/@noCertificado]: '' is too short/es demasiado corto, minimum length/longitud minima=20

EXTRACT AN ATTRIBUTE FROM AN XML FILE:
Sat.getXmlAttribute('ejemplo_v32-signed2012.xml',sello,Comprobante)=
JaeN6gdrrUV3P6ElOKxhDkAaAd9t0D2q6/kF651uQYInkl7ik3Oa8Xh81xtAYnjtMYa/HqvJz47UBVvWEconmk6T7NR7KOdgYeT1iSZkKruv3zt7PhgMNFMLJ43dpxe3X3z6GOv9MCn4dDnph590Lo+OEN6i3rJfIRAW1uioWMU=
Sat.getXmlAttribute('ejemplo_v32-signed2012.xml',formaDePago,Comprobante)=
Pago en una sola exhibición

GET DETAILS OF X.509 CERTIFICATE:
1. From embedded `certificado` in XML
Sat.getCertNumber('ejemplo_v32-signed2012.xml')=20001000000100005867
Sat.getCertExpiry('ejemplo_v32-signed2012.xml')=2016-07-27T17:02:00Z
2. From X.509 file
Sat.getCertNumber('emisor.cer')=20001000000100005867
Sat.getCertExpiry('emisor.cer')=2016-07-27T17:02:00Z

GET CERTIFICATE AS A BASE64 STRING:
Sat.getCertAsString('emisor.cer')=
MIIEdDCCA1ygAwIBAgIUMjAwMDEwMDAwMDAxMDAwMDU4NjcwDQYJKoZIhvcNAQEFBQAwggFvMRgwFgYDVQQDDA9BLkMuIGRlIHBydWViYXMxLzAtBgNVBAoMJlNlcnZpY2lvIGRlIEFkbWluaXN0cmFjacOzbiBUcmlidXRhcmlhMTgwNgYDVQQLDC9BZG1pbmlzdHJhY2nDs24gZGUgU2VndXJpZGFkIGRlIGxhIEluZm9ybWFjacOzbjEpMCcGCSqGSIb3DQEJARYaYXNpc25ldEBwcnVlYmFzLnNhdC5nb2IubXgxJjAkBgNVBAkMHUF2LiBIaWRhbGdvIDc3LCBDb2wuIEd1ZXJyZXJvMQ4wDAYDVQQRDAUwNjMwMDELMAkGA1UEBhMCTVgxGTAXBgNVBAgMEERpc3RyaXRvIEZlZGVyYWwxEjAQBgNVBAcMCUNveW9hY8OhbjEVMBMGA1UELRMMU0FUOTcwNzAxTk4zMTIwMAYJKoZIhvcNAQkCDCNSZXNwb25zYWJsZTogSMOpY3RvciBPcm5lbGFzIEFyY2lnYTAeFw0xMjA3MjcxNzAyMDBaFw0xNjA3MjcxNzAyMDBaMIHbMSkwJwYDVQQDEyBBQ0NFTSBTRVJWSUNJT1MgRU1QUkVTQVJJQUxFUyBTQzEpMCcGA1UEKRMgQUNDRU0gU0VSVklDSU9TIEVNUFJFU0FSSUFMRVMgU0MxKTAnBgNVBAoTIEFDQ0VNIFNFUlZJQ0lPUyBFTVBSRVNBUklBTEVTIFNDMSUwIwYDVQQtExxBQUEwMTAxMDFBQUEgLyBIRUdUNzYxMDAzNFMyMR4wHAYDVQQFExUgLyBIRUdUNzYxMDAzTURGUk5OMDkxETAPBgNVBAsTCFVuaWRhZCAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2TTQSPONBOVxpXv9wLYo8jezBrb34i/tLx8jGdtyy27BcesOav2c1NS/Gdv10u9SkWtwdy34uRAVe7H0a3VMRLHAkvp2qMCHaZc4T8k47Jtb9wrOEh/XFS8LgT4y5OQYo6civfXXdlvxWU/gdM/e6I2lg6FGorP8H4GPAJ/qCNwIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQUFAAOCAQEATxMecTpMbdhSHo6KVUg4QVF4Op2IBhiMaOrtrXBdJgzGotUFcJgdBCMjtTZXSlq1S4DG1jr8p4NzQlzxsdTxaB8nSKJ4KEMgIT7E62xRUj15jI49qFz7f2uMttZLNThipunsN/NF1XtvESMTDwQFvas/Ugig6qwEfSZc0MDxMpKLEkEePmQwtZD+zXFSMVa6hmOu4M+FzGiRXbj4YJXn9Myjd8xbL/c+9UIcrYoZskxDvMxc6/6M3rNNDY3OFhBK+V/sPMzWWGt8S1yjmtPfXgFs1t65AZ2hcTwTAuHrKwDatJ1ZPfa482ZBROAAX1waz7WwXp0gso7sDCm2/yUVww==
Sat.getCertAsString('emisor.cer').length()=1528
Sat.getCertAsString('Muestra_v22-signed2012.xml').length()=1528

MAKE A SIGNATURE FROM A BASE XML FILE:
Sat.makeSignatureFromXml('ejemplo_v32-base2012.xml')=
JaeN6gdrrUV3P6ElOKxhDkAaAd9t0D2q6/kF651uQYInkl7ik3Oa8Xh81xtAYnjtMYa/HqvJz47UBVvWEconmk6T7NR7KOdgYeT1iSZkKruv3zt7PhgMNFMLJ43dpxe3X3z6GOv9MCn4dDnph590Lo+OEN6i3rJfIRAW1uioWMU=

SIGN A DETALLISTA XML FILE:
Sat.signXml('detallista_base2012.xml'-->'detallista-new_signed.xml') returns 0
Sat.validateXml('detallista-new_signed.xml') returns 0
Sat.verifySignature('detallista-new_signed.xml') returns 0

EXTRACT AN ATTRIBUTE FROM A DETALLISTA XML FILE:
Sat.getXmlAttribute('detallista-new_signed.xml',documentStructureVersion,detallista:detallista)=AMC8.1

EXTRACT AN ATTRIBUTE WITH ACCENTED CHARACTERS:
Sat.getXmlAttribute('Muestra_v22-signed2012.xml',pais,Domicilio)=México

SIGN CFDi VERSION 3.2 XML FILE:
Sat.signXml('ejemplo_v32-base2012.xml'-->'ejemplo_v32-new_signed.xml') returns 0
Sat.validateXml('ejemplo_v32-new_signed.xml') returns 0

VERIFY A SHA-1 SIGNATURE IN AN XML FILE:
Sat.verifySignature('ejemplo_v32-new_signed.xml') returns 0

EXTRACT THE DIGEST FROM THE SIGNATURE IN AN XML FILE:
Sat.extractDigestFromSignature('ejemplo_v32-new_signed.xml')=
DEA5F5ACD7FF2DEEBCACDF0AF6CEFA7C854EFA22
Using a separate certificate file:
Sat.extractDigestFromSignature('ejemplo_v32-new_signed.xml', certfile)=
DEA5F5ACD7FF2DEEBCACDF0AF6CEFA7C854EFA22
Using a separate certificate stored as a String:
Sat.extractDigestFromSignature('ejemplo_v32-new_signed.xml', certStr)=
DEA5F5ACD7FF2DEEBCACDF0AF6CEFA7C854EFA22

FORM THE SHA-1 DIGEST OF THE PIPESTRING IN AN XML FILE:
Sat.makeDigestFromXml('ejemplo_v32-new_signed.xml')=
dea5f5acd7ff2deebcacdf0af6cefa7c854efa22

GET VALIDITY DETAILS OF X.509 CERTIFICATE:
1. From embedded `certificado` in XML
Sat.getCertExpiry('ejemplo_v32-signed2012.xml')=    2016-07-27T17:02:00Z
Sat.getCertStart('ejemplo_v32-signed2012.xml') =    2012-07-27T17:02:00Z
2. From X.509 file
Sat.getCertExpiry('emisor.cer')=    2016-07-27T17:02:00Z
Sat.getCertStart('emisor.cer') =    2012-07-27T17:02:00Z

CHECK PRIVATE KEY MATCHES PUBLIC KEY IN CERTIFICATE:
Sat.checkKeyAndCert(emisor.key,emisor.cer) = 0
Sat.checkKeyAndCert(pac.key,pac.cer) = 0
Sat.checkKeyAndCert(emisor.key,ejemplo_v32-signed2012.xml) = 0
Sat.checkKeyAndCert(STRINGS) = 0

FIND THE COMPROBANTE VERSION OF AN XML FILE:
Sat.xmlReceiptVersion('Muestra_v22-base2012.xml') = 22
Sat.xmlReceiptVersion('ejemplo_v32-base2012.xml') = 32
Sat.xmlReceiptVersion('Muestra_v2_signed2011.xml') = 2
Sat.xmlReceiptVersion('ejemplo_v3_signed2011.xml') = 3
Sat.xmlReceiptVersion('ejemplo_v32-noprefix2012.xml') = 32

CREATE CADENA ORIGINAL DEL TIMBRE FISCAL DIGITAL (PIPESTRING FOR TFD):
Tfd.makePipeStringFromXml('ejemplo_v32-tfd2012.xml')=
||1.0|909728e9-b1f4-40f1-ba32-0985651c1abb|2012-07-12T20:40:10|JaeN6gdrrUV3P6ElOKxhDkAaAd9t0D2q6/kF651uQYInkl7ik3Oa8Xh81xtAYnjtMYa/HqvJz47UBVvWEconmk6T7NR7KOdgYeT1iSZkKruv3zt7PhgMNFMLJ43dpxe3X3z6GOv9MCn4dDnph590Lo+OEN6i3rJfIRAW1uioWMU=|20001000000100005761||

FORM DIGEST OF PIPESTRING FOR TFD:
Tfd.makeDigestFromXml('ejemplo_v32-tfd2012.xml')=
7955442567e50619cf3da0e37328d108fd818f3d

EXTRACT DIGEST FROM TFD SELLOSAT:
Tfd.extractDigestFromSignature('ejemplo_v32-tfd2012.xml')=
7955442567E50619CF3DA0E37328D108FD818F3D

PRETEND WE ARE A PAC WITH A KEY ALLOWED TO SIGN THE TFD:
Tfd.makeSignatureFromXml('ejemplo_v32-tfd2012.xml')=
5fqII0agaGIW8Z1LwWhgrvNQkVW1OVzI/jR/OWRtYqZd90NiXXkE/G6DiQcN1S5ipIOLXSQc3eYqeomHGtN/MogJa30j4ZISmSehf5+j0lXuZzzHl/i4PHx/2yTqXk0doshE1rsEKCX8U6fB/e8cFUDjTjBaUFZzyQJeDuaK0I0=
Correct=
5fqII0agaGIW8Z1LwWhgrvNQkVW1OVzI/jR/OWRtYqZd90NiXXkE/G6DiQcN1S5ipIOLXSQc3eYqeomHGtN/MogJa30j4ZISmSehf5+j0lXuZzzHl/i4PHx/2yTqXk0doshE1rsEKCX8U6fB/e8cFUDjTjBaUFZzyQJeDuaK0I0=

VERIFY SIGNATURE IN TFD SELLOSAT:
Tfd.verifySignature(ejemplo_v32-tfd2012.xml,pac.cer)=0 (expected 0)

ADD UTF-8 BOM TO EXISTING FILE:
Sat.fixBom(Muestra_v22-signed2012.xml->Muestra_v22-with_BOM.xml)=0 (expected 0)

EXTRACT ATTRIBUTES FROM CONSECUTIVE ELEMENTS:
For file 'ejemplo_v32-base2012.xml'
Sat.getXmlAttribute(descripcion,cfdi:Concepto[1])=VIBRAMICINA 100MG 10
Sat.getXmlAttribute(descripcion,cfdi:Concepto[2])=CLORUTO 500M
Sat.getXmlAttribute(descripcion,cfdi:Concepto[3])=SEDEPRON 250MG 10
Sat.getXmlAttribute(descripcion,cfdi:Concepto[4])=

VALIDATE XML WITH STRICT AND LOOSE OPTIONS:
Default strict behaviour (Bad attribute..@CURP..is too long):
Sat.validateXml('V3_2_BadCurp.xml') returns -28
ErrorLookup(-28)=XML restriction is violated/XML restriccion es violada
LastError=Bad attribute/atributo mal [iedu:instEducativas/@CURP]: 'JUAN01010101GTOHMD0' is too long/es demasiado largo, maximum length/longitud maxima=18

Using XmlOption.Loose:
Sat.validateXml('V3_2_BadCurp.xml', Loose) returns 0

GET PRIVATE KEY AS BASE64:
Sat.getKeyAsString(emisor.key)=
PFJTQUtleVZhbHVlPjxNb2R1bHVzPnRrMDBFanpqUVRsY2FWNy9jQzJLUEkzc3dhMjkrSXY3UzhmSXhuYmNzdHV3WEhyRG1yOW5OVFV2eG5iOWRMdlVwRnJjSGN0K0xrUUZYdXg5R3QxVEVTeHdKTDZkcWpBaDJtWE9FL0pPT3liVy9jS3poSWYxeFV2QzRFK011VGtHS09uSXIzMTEzWmI4VmxQNEhUUDN1aU5wWU9oUnFLei9CK0Jqd0NmNmdqYz08L01vZHVsdXM+PEV4cG9uZW50PkFRQUI8L0V4cG9uZW50PjxQPjZ2S0JhR3lrQnE3TE1Hekx4bUVjRkx6aUxDVWx0bnJoRVQ3M2wzZXd3WUlpNWJUVDRVNVRHMFBodlBURnNKcFhmT1JzWUNlMm1Od2JIbXZWODNhNXd3PT08L1A+PFE+eHFNTW5KWGFSTGFtY3I0SnRsNXlFWEJ3UEZOM2U5Y1ZUSUxra0tpQjY1UGdXQVhablFmUVBPbzRURXVBZ3czOFVEMWsrcE4yWmNuUUhjR3hRUXdhZlE9PTwvUT48RFA+VmFpdzBiZTZYYzFndTNrUEduYlJYQ1k1ZDhyYll4cU44Rkc2eDNpVjh4ZFZUZGFONFhsREI0L0tQN0FtVzJzS05yaTVZcDFZRDRkQVEra2hDakRoTFE9PTwvRFA+PERRPkJGWlZGU28wZk9HY0dzOUplUUR3N3E2TTFOUmh2SU9DeEl2ckg3bCtOTDJpM1drclNrRjhhNGdWdUp6QmJwc2trai8wNzMrK3l4UXdCaVpQajRNTEpRPT08L0RRPjxJbnZlcnNlUT5ybEg2cnBtbGRwQ0g3MHFQd09lcWQ4YSs1cWlrUFRmZzVlOXordUVqdFQxYUEwVmtzS3RLbzdsZmVDU3FWOVhrKzVRWjRuWlJ3NmRqZ3lWR21FdGRhdz09PC9JbnZlcnNlUT48RD5NaEhpUzJBTnlzeEdaV3FDSGYxa0NsMnd1VUZPL0FUMmNFbmZDeU42V21XY2VzbjlEM09pbFNxV2hKd0o0Ulgxd1c1ekpudk5uRWR5Y2kvaDdJNzlVVE1jOW1qa0JabzlaVWlRTFlkOE9HZ0dNZG9HYzZOQjZvUFVJNS93WHNQd29XZ3dNTHd4cXFXMVh6bm1aRmJoZCtvYW5ZTDE0ZUp3OXp6aTU2RjNMWUU9PC9EPjwvUlNBS2V5VmFsdWU+

Sat.getKeyAsString('emisor.key').length()=1220

WRITE PFX FROM PRIVATE KEY AND CERT:
Sat.writePfxFile()->archivo_pfx.pem returns 0
New PFX file is 2934 bytes long.

GET RFC AND ORG NAME FROM CERT:
FILE: emisor.cer
Sat.queryCert(rfc)=AAA010101AAA
Sat.queryCert(organizationName)='Servicio de Administración Tributaria'
FILE: ejemplo_v32-signed2012.xml
Sat.queryCert(rfc)=AAA010101AAA
Sat.queryCert(organizationName)='Servicio de Administración Tributaria'

TEST OTHER QUERIES FOR CERT:
FILE: emisor.cer
Sat.queryCert(notBefore)=2012-07-27T17:02:00Z
Sat.queryCert(notAfter)=2016-07-27T17:02:00Z
Sat.queryCert(serialNumber)=20001000000100005867

TEST NOMINA FEATURE:
FILE: Muestra_nomina.xml
Sat.makePipeStringFromXml=
||3.2|2014-01-15T13:01:59|egreso|FormaDePago|PAGONOMINA|4765.46|PESOS|4765.46|TRANSFERENCIA|MEXICO DF|43200101|AAA010101AAA|ACCEM SERVICIOS EMPRESARIALES SC|AV. HIDALGO|14|GUERRERO|MEXICO|MEXICO, D.F.|México|06300|Regimen General de Ley|JUAN680116AAA|Juanito Pérez Niño|Calle Verde|1234|456|Col. Arboles|Ciudad de Tegucigalpa|Municipio de Torres|Nuevo Leon|México|38294|1|SERVICIO|00000022|QUINCENA 22|4457.96|4457.96|627.07|IVA|0.00|0.00|0.00|1.1|N4515588991|000012|JUAN680116MAZBCÑ90|1|13099903896|2014-01-15|2014-01-01|2014-01-15|12|ADMINISTRACION|230230302302302309|123|2013-11-30|8|COORDONADOR C3|PLANTA|COMPLETA|QUINCENAL|416.67|3|551.19|7343.75|937.50|001|00001|SUELDOS|6250.00|0.00|004|00003|TIEMPO EXTRA DOBLES|312.50|312.50|004|00004|TIEMPO EXTRA TRIPLES|781.25|0.00|009|00043|FONDO DE AHORRO|0.00|625.00|1249.99|2265.80|001|00503|FALTA INJUSTIFICADA|416.66|0.00|036|00507|ISR RETENIDO|0.00|747.07|009|00517|FONDO DE AHORRO EMPRESA|0.00|625.00|009|00518|FONDO DE AHORRO EMPLEADO|0.00|625.00|040|00533|IMSS ENF Y MATERNIDAD|0.00|63.34|040|00534|IMSS INVALIDES Y VIDA|0.00|44.78|040|00535|IMSS CESANTIA Y VEJEZ|0.00|80.61|013|00542|FONACOT|0.00|200.00|036|00570|SUBSIDIO AL ISR|0.00|-120.00|001|00574|INCAPACIDAD POR ENFERMEDAD GENERAL|833.33|0.00|2|3|833.33|2|Dobles|6|625.00|1|Triples|5|781.25||
Sat.signXml('Muestra_nomina.xml'-->'Muestra_nomina2014-signed.xml') returns 0
Sat.validateXml('Muestra_nomina2014-signed.xml') returns 0 ==> OK
File 'Muestra_nomina2014-signed.xml' has a BOM

SIGN FILE WITHOUT BOM:
Sat.signXml('Muestra_nomina.xml'-->'Muestra_nomina2014-signed-no-bom.xml') returns 0
Sat.validateXml('Muestra_nomina2014-signed-no-bom.xml') returns 0 ==> OK
File 'Muestra_nomina2014-signed-no-bom.xml' does NOT have a BOM

SIGN FILE WITHOUT BOM AND EMPTY ELEMENTS:
Sat.signXml('Muestra_nomina.xml'-->'Muestra_nomina2014-signed-no-bom-empty-elems.xml') returns 0
Sat.validateXml('Muestra_nomina2014-signed-no-bom-empty-elems.xml') returns 0 ==> OK
File 'Muestra_nomina2014-signed-no-bom-empty-elems.xml' does NOT have a BOM

SIGN A `NOTARIOSPUBLICUS` XML FILE:
Sat.signXml('Prueba2Notario_iedu.xml'-->'Prueba2Notario_iedu-signed.xml') returns 0
Sat.validateXml('Prueba2Notario_iedu-signed.xml') returns 0 ==> OK

TEST TFD IN NOMINA XML:
FILE: Muestra_nomina_tfd.xml
Tfd.makePipeStringFromXml(TFD)=
||1.0|B3D02A7F-C07A-4C72-B7D4-6B70BB2BB3D4|2014-01-15T20:41:18|iJw36avvTScTbBqRhQhxoRQo6EfBK8FeQv46KJBCX8rzf/iix8COB+Nm8/dW2zJcSbhH+AWCicrAkKik/Zq0mW1QWtUxrqCJ9PsY7V9TMvhFFj3JqykfoDM+QAzgNIj9+x4M4Ehvddb2nMe7JCJaflo9C0sO41bSFdNI22iq6Dc=|20001000000100005761||
Tfd.verifySignature('Muestra_nomina_tfd.xml') returns 0 ==> OK

ADD A TFD ELEMENT TO A SIGNED CFDI DOCUMENT USING PAC KEY:
Tfd.addSignedTfd('Prueba2Notario_iedu-signed.xml'-->'Prueba2Notario_iedu-tfd.xml') returns 0
Sat.validateXml('Prueba2Notario_iedu-tfd.xml') returns 0 ==> OK
Tfd.verifySignature('Prueba2Notario_iedu-tfd.xml') returns 0 ==> OK
DIGEST(sello, 'Prueba2Notario_iedu-tfd.xml')=
3E3C64225DAD9EE008D6F8F685E1E7215F8DBBF8
DIGEST(selloSAT, 'Prueba2Notario_iedu-tfd.xml')=
A45388EDB0CBA38576329EEA8CD44EAA9F523C21

SIGN XML FROM BYTES TO STRING:
File 'ejemplo_v32-base2012.xml'-->2084 UTF-8 bytes
XML-OUT=
---
?<?xml version="1.0" encoding="UTF-8"?>
<cfdi:Comprobante xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 cfdv32.xsd" xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2" fecha="2012-07-20T20:38:12" total="488.50" subTotal="488.50" formaDePago="Pago en una sola exhibición" tipoDeComprobante="ingreso" metodoDePago="Efectivo" LugarExpedicion="Queretaro, Qro." NumCtaPago="3850" FolioFiscalOrig="3464" SerieFolioFiscalOrig="ABC" FechaFolioFiscalOrig="2012-07-11T11:11:11" MontoFolioFiscalOrig="24499.99" noCertificado="20001000000100005867" certificado="MIIEdDCCA1ygAwIBAgIUMjAwMDEwMDAwMDAxMDAwMDU4NjcwDQYJKoZIhvcNAQEFBQAwggFvMRgwFgYDVQQDDA9BLkMuIGRlIHBydWViYXMxLzAtBgNVBAoMJlNlcnZpY2lvIGRlIEFkbWluaXN0cmFjacOzbiBUcmlidXRhcmlhMTgwNgYDVQQLDC9BZG1pbmlzdHJhY2nDs24gZGUgU2VndXJpZGFkIGRlIGxhIEluZm9ybWFjacOzbjEpMCcGCSqGSIb3DQEJARYaYXNpc25ldEBwcnVlYmFzLnNhdC5nb2IubXgxJjAkBgNVBAkMHUF2LiBIaWRhbGdvIDc3LCBDb2wuIEd1ZXJyZXJvMQ4wDAYDVQQRDAUwNjMwMDELMAkGA1UEBhMCTVgxGTAXBgNVBAgMEERpc3RyaXRvIEZlZGVyYWwxEjAQBgNVBAcMCUNveW9hY8OhbjEVMBMGA1UELRMMU0FUOTcwNzAxTk4zMTIwMAYJKoZIhvcNAQkCDCNSZXNwb25zYWJsZTogSMOpY3RvciBPcm5lbGFzIEFyY2lnYTAeFw0xMjA3MjcxNzAyMDBaFw0xNjA3MjcxNzAyMDBaMIHbMSkwJwYDVQQDEyBBQ0NFTSBTRVJWSUNJT1MgRU1QUkVTQVJJQUxFUyBTQzEpMCcGA1UEKRMgQUNDRU0gU0VSVklDSU9TIEVNUFJFU0FSSUFMRVMgU0MxKTAnBgNVBAoTIEFDQ0VNIFNFUlZJQ0lPUyBFTVBSRVNBUklBTEVTIFNDMSUwIwYDVQQtExxBQUEwMTAxMDFBQUEgLyBIRUdUNzYxMDAzNFMyMR4wHAYDVQQFExUgLyBIRUdUNzYxMDAzTURGUk5OMDkxETAPBgNVBAsTCFVuaWRhZCAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2TTQSPONBOVxpXv9wLYo8jezBrb34i/tLx8jGdtyy27BcesOav2c1NS/Gdv10u9SkWtwdy34uRAVe7H0a3VMRLHAkvp2qMCHaZc4T8k47Jtb9wrOEh/XFS8LgT4y5OQYo6civfXXdlvxWU/gdM/e6I2lg6FGorP8H4GPAJ/qCNwIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQUFAAOCAQEATxMecTpMbdhSHo6KVUg4QVF4Op2IBhiMaOrtrXBdJgzGotUFcJgdBCMjtTZXSlq1S4DG1jr8p4NzQlzxsdTxaB8nSKJ4KEMgIT7E62xRUj15jI49qFz7f2uMttZLNThipunsN/NF1XtvESMTDwQFvas/Ugig6qwEfSZc0MDxMpKLEkEePmQwtZD+zXFSMVa6hmOu4M+FzGiRXbj4YJXn9Myjd8xbL/c+9UIcrYoZskxDvMxc6/6M3rNNDY3OFhBK+V/sPMzWWGt8S1yjmtPfXgFs1t65AZ2hcTwTAuHrKwDatJ1ZPfa482ZBROAAX1waz7WwXp0gso7sDCm2/yUVww==" sello="JaeN6gdrrUV3P6ElOKxhDkAaAd9t0D2q6/kF651uQYInkl7ik3Oa8Xh81xtAYnjtMYa/HqvJz47UBVvWEconmk6T7NR7KOdgYeT1iSZkKruv3zt7PhgMNFMLJ43dpxe3X3z6GOv9MCn4dDnph590Lo+OEN6i3rJfIRAW1uioWMU=">
    <cfdi:Emisor rfc="PPL961114GZ1" nombre="PHARMA PLUS SA DE CV">
        <cfdi:DomicilioFiscal pais="Mexico" calle=" AV. RIO MIXCOAC " estado="MEXICO, D.F." colonia="ACACIAS" municipio="BENITO JUAREZ" noExterior="No. 140" codigoPostal="03240"></cfdi:DomicilioFiscal>
        <cfdi:ExpedidoEn pais="MÉXICO" calle="AV.  UNIVERSIDAD" estado="DISTRITO FEDERAL" colonia="OXTOPULCO" noExterior="1858" codigoPostal="03910"></cfdi:ExpedidoEn>
    <cfdi:RegimenFiscal Regimen="Regimen General de Ley"></cfdi:RegimenFiscal>
    <cfdi:RegimenFiscal Regimen="Otro regimen (opcional)"></cfdi:RegimenFiscal>
    </cfdi:Emisor>
    <cfdi:Receptor rfc="PEPJ8001019Q8" nombre="JUAN PEREZ    PEREZ">
        <cfdi:Domicilio pais="Mexico" calle="AV UNIVERSIDAD" estado="DISTRITO FEDERAL" colonia="COPILCO UNIVERSIDAD" municipio="COYOACAN" noExterior="16 EDF 3" noInterior="DPTO 101" codigoPostal="04360"></cfdi:Domicilio>
    </cfdi:Receptor>
    <cfdi:Conceptos>
        <cfdi:Concepto unidad="CAPSULAS" importe="244.00" cantidad="1.0" descripcion="VIBRAMICINA 100MG 10" valorUnitario="244.00"></cfdi:Concepto>
        <cfdi:Concepto unidad="BOTELLA" importe="137.93" cantidad="1.0" descripcion="CLORUTO 500M" valorUnitario="137.93"></cfdi:Concepto>
        <cfdi:Concepto unidad="TABLETAS" importe="84.50" cantidad="1.0" descripcion="SEDEPRON 250MG 10" valorUnitario="84.50"></cfdi:Concepto>
    </cfdi:Conceptos>
    <cfdi:Impuestos>
        <cfdi:Traslados>
            <cfdi:Traslado tasa="0.00" importe="0.00" impuesto="IVA"></cfdi:Traslado>
            <cfdi:Traslado tasa="16.00" importe="22.07" impuesto="IVA"></cfdi:Traslado>
        </cfdi:Traslados>
    </cfdi:Impuestos>
    <cfdi:Complemento></cfdi:Complemento>
    <cfdi:Addenda></cfdi:Addenda>
</cfdi:Comprobante>
---


SIGN XML FROM BYTES TO STRING USING EMPTY-ELEMENT TAGS:
XML-OUT(UseEmptyElements)=
---
?<?xml version="1.0" encoding="UTF-8"?>
<cfdi:Comprobante xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 cfdv32.xsd" xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2" fecha="2012-07-20T20:38:12" total="488.50" subTotal="488.50" formaDePago="Pago en una sola exhibición" tipoDeComprobante="ingreso" metodoDePago="Efectivo" LugarExpedicion="Queretaro, Qro." NumCtaPago="3850" FolioFiscalOrig="3464" SerieFolioFiscalOrig="ABC" FechaFolioFiscalOrig="2012-07-11T11:11:11" MontoFolioFiscalOrig="24499.99" noCertificado="20001000000100005867" certificado="MIIEdDCCA1ygAwIBAgIUMjAwMDEwMDAwMDAxMDAwMDU4NjcwDQYJKoZIhvcNAQEFBQAwggFvMRgwFgYDVQQDDA9BLkMuIGRlIHBydWViYXMxLzAtBgNVBAoMJlNlcnZpY2lvIGRlIEFkbWluaXN0cmFjacOzbiBUcmlidXRhcmlhMTgwNgYDVQQLDC9BZG1pbmlzdHJhY2nDs24gZGUgU2VndXJpZGFkIGRlIGxhIEluZm9ybWFjacOzbjEpMCcGCSqGSIb3DQEJARYaYXNpc25ldEBwcnVlYmFzLnNhdC5nb2IubXgxJjAkBgNVBAkMHUF2LiBIaWRhbGdvIDc3LCBDb2wuIEd1ZXJyZXJvMQ4wDAYDVQQRDAUwNjMwMDELMAkGA1UEBhMCTVgxGTAXBgNVBAgMEERpc3RyaXRvIEZlZGVyYWwxEjAQBgNVBAcMCUNveW9hY8OhbjEVMBMGA1UELRMMU0FUOTcwNzAxTk4zMTIwMAYJKoZIhvcNAQkCDCNSZXNwb25zYWJsZTogSMOpY3RvciBPcm5lbGFzIEFyY2lnYTAeFw0xMjA3MjcxNzAyMDBaFw0xNjA3MjcxNzAyMDBaMIHbMSkwJwYDVQQDEyBBQ0NFTSBTRVJWSUNJT1MgRU1QUkVTQVJJQUxFUyBTQzEpMCcGA1UEKRMgQUNDRU0gU0VSVklDSU9TIEVNUFJFU0FSSUFMRVMgU0MxKTAnBgNVBAoTIEFDQ0VNIFNFUlZJQ0lPUyBFTVBSRVNBUklBTEVTIFNDMSUwIwYDVQQtExxBQUEwMTAxMDFBQUEgLyBIRUdUNzYxMDAzNFMyMR4wHAYDVQQFExUgLyBIRUdUNzYxMDAzTURGUk5OMDkxETAPBgNVBAsTCFVuaWRhZCAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2TTQSPONBOVxpXv9wLYo8jezBrb34i/tLx8jGdtyy27BcesOav2c1NS/Gdv10u9SkWtwdy34uRAVe7H0a3VMRLHAkvp2qMCHaZc4T8k47Jtb9wrOEh/XFS8LgT4y5OQYo6civfXXdlvxWU/gdM/e6I2lg6FGorP8H4GPAJ/qCNwIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQUFAAOCAQEATxMecTpMbdhSHo6KVUg4QVF4Op2IBhiMaOrtrXBdJgzGotUFcJgdBCMjtTZXSlq1S4DG1jr8p4NzQlzxsdTxaB8nSKJ4KEMgIT7E62xRUj15jI49qFz7f2uMttZLNThipunsN/NF1XtvESMTDwQFvas/Ugig6qwEfSZc0MDxMpKLEkEePmQwtZD+zXFSMVa6hmOu4M+FzGiRXbj4YJXn9Myjd8xbL/c+9UIcrYoZskxDvMxc6/6M3rNNDY3OFhBK+V/sPMzWWGt8S1yjmtPfXgFs1t65AZ2hcTwTAuHrKwDatJ1ZPfa482ZBROAAX1waz7WwXp0gso7sDCm2/yUVww==" sello="JaeN6gdrrUV3P6ElOKxhDkAaAd9t0D2q6/kF651uQYInkl7ik3Oa8Xh81xtAYnjtMYa/HqvJz47UBVvWEconmk6T7NR7KOdgYeT1iSZkKruv3zt7PhgMNFMLJ43dpxe3X3z6GOv9MCn4dDnph590Lo+OEN6i3rJfIRAW1uioWMU=">
    <cfdi:Emisor rfc="PPL961114GZ1" nombre="PHARMA PLUS SA DE CV">
        <cfdi:DomicilioFiscal pais="Mexico" calle=" AV. RIO MIXCOAC " estado="MEXICO, D.F." colonia="ACACIAS" municipio="BENITO JUAREZ" noExterior="No. 140" codigoPostal="03240" />
        <cfdi:ExpedidoEn pais="MÉXICO" calle="AV.  UNIVERSIDAD" estado="DISTRITO FEDERAL" colonia="OXTOPULCO" noExterior="1858" codigoPostal="03910" />
    <cfdi:RegimenFiscal Regimen="Regimen General de Ley" />
    <cfdi:RegimenFiscal Regimen="Otro regimen (opcional)" />
    </cfdi:Emisor>
    <cfdi:Receptor rfc="PEPJ8001019Q8" nombre="JUAN PEREZ    PEREZ">
        <cfdi:Domicilio pais="Mexico" calle="AV UNIVERSIDAD" estado="DISTRITO FEDERAL" colonia="COPILCO UNIVERSIDAD" municipio="COYOACAN" noExterior="16 EDF 3" noInterior="DPTO 101" codigoPostal="04360" />
    </cfdi:Receptor>
    <cfdi:Conceptos>
        <cfdi:Concepto unidad="CAPSULAS" importe="244.00" cantidad="1.0" descripcion="VIBRAMICINA 100MG 10" valorUnitario="244.00" />
        <cfdi:Concepto unidad="BOTELLA" importe="137.93" cantidad="1.0" descripcion="CLORUTO 500M" valorUnitario="137.93" />
        <cfdi:Concepto unidad="TABLETAS" importe="84.50" cantidad="1.0" descripcion="SEDEPRON 250MG 10" valorUnitario="84.50" />
    </cfdi:Conceptos>
    <cfdi:Impuestos>
        <cfdi:Traslados>
            <cfdi:Traslado tasa="0.00" importe="0.00" impuesto="IVA" />
            <cfdi:Traslado tasa="16.00" importe="22.07" impuesto="IVA" />
        </cfdi:Traslados>
    </cfdi:Impuestos>
    <cfdi:Complemento />
    <cfdi:Addenda />
</cfdi:Comprobante>
---


GENERATE 3 FRESH UUIDs:
Sat.uuid()=443370f7-40dd-412f-86ca-d6d269d4c87b
Sat.uuid()=cadc2ad3-e3b7-4ee4-8ecd-b2fa2f282702
Sat.uuid()=d1c9d8e8-920c-43ef-8aa8-3b2a0d25f451

PASS XML DATA AS A STRING:
Non-US-ASCII characters in String *must* be written as XML entities when XML encoding is UTF-8
Dummy test XML string=[<?xml version='1.0' encoding='UTF-8'?><Comprobante version='3.2' pais='M&#xC9;XICO' />]
xmlReceiptVersion()=32
getXmlAttribute(Combrobante/@pais)=MÉXICO

WORK WITH A `RETENCIONES` DOCUMENT:
FILE=Ejemplo_Retenciones-base.xml
Sat.xmlReceiptVersion() returns 1010 (expecting 1010)
Sat.makeDigestFromXml() -> d48c1bb1e11001ace95aa130a448a3b3a39c40de
File root element is 'retenciones:Retenciones'

WORK WITH `CONTABILIDAD` DOCUMENTS:
CATALOGOCUENTAS FILE=AAA010101AAA201501CT-base.xml
Sat.xmlReceiptVersion() returns ID=2011 (expecting 2011)
SIGN A CATALOGOCUENTAS DOCUMENT...
Sat.signXml() returns 0 (expecting 0)
Sat.verifySignature() returns 0 (expecting 0)
BALANZA FILE=AAA010101AAA201501BN-base.xml
Sat.xmlReceiptVersion() returns ID=2111 (expecting 2111)
MAKE THE SIGNATURE STRING FOR BALANZA...
Sat.makeSignatureFromXml() ->
tAjpeR12wMWB0lj18HJ1oEw8+KUlU4mHECeHl89Zt3dlxNe675PoN9lIzENA01sI0h5EBADTOwR0YnEIIaO6mHBRmzLO9aduUX/u/WaP17AK+/YNXIg1NsEznHyIZ70vgKJjuN2OdXAsvxLt1DwGaa1wcLoQo+as7GgOvEKzZRA=
SELLODIGITALCONTELEC FILE=contab-SelloDigitalContElec-signed.xml
Sat.xmlReceiptVersion() returns ID=2511 (expecting 2511)
VERIFY SIGNATURE FOR SELLODIGITALCONTELEC USING PAC CERTIFICATE...
Sat.verifySignature() returns 0 (expecting 0)

WORK WITH `CONTROLESVOLUMETRICOS` DOCUMENT:
FILE=ConVolE12345-base.xml
Sat.xmlReceiptVersion() returns ID=4011 (expecting 4011)
SIGN A CONVOL DOCUMENT WITH BIGFILE FLAG...
Sat.signXmlEx(BigFile) returns 0 (expecting 0)
Sat.verifySignature() returns 0 (expecting 0)

FirmaSAT DLL Version=70000 [Jan 12 2015 14:48:08]