cl.sii.dte
Class Codigo

java.lang.Object
  |
  +--cl.sii.dte.Codigo

public class Codigo
extends Object

Esta clase es utilizada tanto para generar como verificar códigos de autorización de folios (CAF) entregados por el Servicio de Impuestos Internos (SII) a los contribuyentes.

Para generar, instancie la clase y enseguida complete los campos necesarios con las funciones set*, para finalmente firmar el codigo con la funcion sign. Debe tener presente que esta funcionalidad está orientada a SII o para pruebas; un contribuyente no debe usar jamás las funciones set* sobre un CAF entregado por SII.

El elemento XML según el formato definido por SII se obtiene con la función getDOMElement.

Para cargar un codigo puede utilizar la funcion setDOMElement o loadXML dependiendo si el CAF lo tiene en un elemento XML o en un String.

Para verificar el CAF puede utilizar la función verify

Version:
1.0
Author:
Tomas Barros bbarros@nic.cl

Field Summary
private  String dsaG
           
private  String dsaP
           
private  String dsaQ
           
private  String dsaY
           
private  Date fecha
           
private  Integer fin
           
private  String firmaAlg
           
private  byte[] firmaValue
           
private  Integer idk
           
private  Integer inicio
           
private  PublicKey llave
           
static org.jdom.output.XMLOutputter out
           
private  String razonSocial
           
private  String rsaE
           
private  String rsaM
           
private  RUT rutEmisor
           
private  SimpleDateFormat sdf
           
private  Integer tipo
           
private  String version
           
private  String xml
           
 
Constructor Summary
Codigo()
          Al crear la clase Codigo, se auto asigna la versión (1.0) y la fecha a la fecha actual.
 
Method Summary
private  PublicKey DOMToKey(org.jdom.Element sKey)
          Obtiene una llave pública desde un elemento XML según la especificación de SII
 boolean filled()
          Verifica si los datos necesarios para el código han sido completados (no considera la firma)
private  String genCode()
          Genera el string que se debe firmar por SII en este CAF
private  org.jdom.Element genDOMCode()
          Genera un elemento con los datos a firmar del CAF, el cual es usado por genCode para obtener el string a firmar.
private  org.jdom.Element genDOMCode(org.jdom.Namespace ns)
          Genera el elemento que representa este CAF.
 org.jdom.Element getDOMElement(String tagName, org.jdom.Namespace ns)
          Obtiene el CAF en XML con sus namespaces.
 Date getFecha()
          Obtiene la fecha contenida en el código
 String getFechaAsString()
          Obtiene la fecha contenida en el código como string
 Integer getFinal()
          Obtiene el número de folio final del rango que autoriza este CAF
 Integer getIdk()
          Obtiene el Identificador de la llave del CAF
 Integer getInicio()
          Obtiene el número de folio inicial del rango que autoriza este CAF
 PublicKey getPublicKey()
          Obtiene la llave pública del contribuyente que autoriza este código
protected  org.jdom.Element getPureDOMElement()
          Obtiene el CAF en XML puro, es decir, sin identación ni namespaces.
 String getRazonSocial()
           
 RUT getRutEmisor()
          Retorna el RUT del emisor que autoriza este CAF
 Integer getTipo()
          Obtiene el tipo de documento que autoriza este CAF
 String getVersion()
          Retorna la versión de esta implementación del CAF
 String getXml()
           
private  org.jdom.Element keyToDOM(PublicKey pKey)
          Transforma una llave pública a un elemento XML según la definición de SII
private  org.jdom.Element keyToDOM(PublicKey pKey, org.jdom.Namespace ns)
          Transforma una llave pública a un elemento XML según la definición de SII
 void loadXML(String data)
          Carga un código desde un string.
 void setDOMElement(org.jdom.Element data)
          Carga un código desde un Elemento XML que contiene un CAF, según la definición de SII
 void setFecha(Date fecha)
          Asigna el valor de la fecha de autorización del código.
 void setFecha(String fecha)
          Asigna el valor de la fecha de autorización del código.
 void setFinal(Integer fin)
          Asigna el número de folio final del rango que autoriza este CAF
 void setIdk(Integer idk)
          Asigna el Identificador de la llave del CAF
 void setInicio(Integer inicio)
          Asigna el número de folio inicial del rango que autoriza este CAF
private  void setPublicKey(PublicKey key)
          Asigna la llave pública del contribuyente que autoriza este CAF
 void setPublicKey(X509Certificate cert)
          Asigna la llave pública del contribuyente que autoriza este CAF
 void setRazonSocial(String string)
           
 void setRutEmisor(RUT rutEmisor)
          Asigna el RUT del emisor que autoriza este CAF
 void setRutEmisor(String rut)
          Asigna el RUT del emisor a quién autoriza este CAF
 void setTipo(Integer tipo)
          Asigna el tipo de documento que autoriza este CAF
 void setVersion(String version)
          Asigna la versión de este CAF
 void setXml(String string)
           
 void sign(PrivateKey pKey)
          Autoriza (firma) los valores del código
 boolean signed()
          Verifica si el código ya ha sido firmado y que además están todos los datos necesarios que verifica la firma
 boolean verify(PublicKey verificador)
          Verifica la firma que autoriza este código.
 boolean verify(X509Certificate cert)
          Verifica la firma que autoriza este código.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

firmaAlg

private String firmaAlg

firmaValue

private byte[] firmaValue

version

private String version

rutEmisor

private RUT rutEmisor

razonSocial

private String razonSocial

fecha

private Date fecha

sdf

private SimpleDateFormat sdf

tipo

private Integer tipo

inicio

private Integer inicio

fin

private Integer fin

idk

private Integer idk

llave

private PublicKey llave

rsaM

private String rsaM

rsaE

private String rsaE

dsaY

private String dsaY

dsaP

private String dsaP

dsaQ

private String dsaQ

dsaG

private String dsaG

out

public static org.jdom.output.XMLOutputter out

xml

private String xml
Constructor Detail

Codigo

public Codigo()
Al crear la clase Codigo, se auto asigna la versión (1.0) y la fecha a la fecha actual.

Method Detail

filled

public boolean filled()
Verifica si los datos necesarios para el código han sido completados (no considera la firma)

Returns:
true si el código ya tiene los datos necesarios o false en caso contrario
See Also:
signed()

signed

public boolean signed()
Verifica si el código ya ha sido firmado y que además están todos los datos necesarios que verifica la firma

Returns:
true si esta firmado o false en caso contrario

getVersion

public String getVersion()
Retorna la versión de esta implementación del CAF


setVersion

public void setVersion(String version)
Asigna la versión de este CAF

Parameters:
version - la versión a asignar

getRutEmisor

public RUT getRutEmisor()
Retorna el RUT del emisor que autoriza este CAF

Returns:
RUT el RUT del emisor

setRutEmisor

public void setRutEmisor(RUT rutEmisor)
Asigna el RUT del emisor que autoriza este CAF

Parameters:
rutEmisor - el RUT del emisor

getRazonSocial

public String getRazonSocial()
Returns:

setRazonSocial

public void setRazonSocial(String string)
Parameters:
string -

setRutEmisor

public void setRutEmisor(String rut)
                  throws RUTException
Asigna el RUT del emisor a quién autoriza este CAF

Parameters:
rut - el RUT del emisor como String en formato "xxxxxxxx-x"
Throws:
RUTException - en caso de que no se sumpla el formato del String o que el dígito verificador no corresponda

getFechaAsString

public String getFechaAsString()
Obtiene la fecha contenida en el código como string

Returns:
La fecha como string en formato AAAA-MM-DD, es decir, los primeros cuatro dígitos señalando el año, los siguientes dos el mes y los últimos dos el día
See Also:
getFecha()

getFecha

public Date getFecha()
Obtiene la fecha contenida en el código

See Also:
getFechaAsString()

setFecha

public void setFecha(Date fecha)
Asigna el valor de la fecha de autorización del código.

See Also:
setFecha(String)

setFecha

public void setFecha(String fecha)
              throws ParseException
Asigna el valor de la fecha de autorización del código.

Si se desea modificar la fecha vía esta función, el valor entregado debe tener el mismo formato de la fecha que retorna la función getFecha(), es decir AAAA-MM-DD

Parameters:
fecha - La fecha en formato AAAA-MM-DD
Throws:
ParseException - en caso que el formato del string no sea correcto
See Also:
getFechaAsString(), setFecha(Date)

getTipo

public Integer getTipo()
Obtiene el tipo de documento que autoriza este CAF


setTipo

public void setTipo(Integer tipo)
Asigna el tipo de documento que autoriza este CAF


getInicio

public Integer getInicio()
Obtiene el número de folio inicial del rango que autoriza este CAF


setInicio

public void setInicio(Integer inicio)
Asigna el número de folio inicial del rango que autoriza este CAF


getFinal

public Integer getFinal()
Obtiene el número de folio final del rango que autoriza este CAF


setFinal

public void setFinal(Integer fin)
Asigna el número de folio final del rango que autoriza este CAF


getIdk

public Integer getIdk()
Obtiene el Identificador de la llave del CAF


setIdk

public void setIdk(Integer idk)
Asigna el Identificador de la llave del CAF


getPublicKey

public PublicKey getPublicKey()
Obtiene la llave pública del contribuyente que autoriza este código


setPublicKey

private void setPublicKey(PublicKey key)
Asigna la llave pública del contribuyente que autoriza este CAF


setPublicKey

public void setPublicKey(X509Certificate cert)
Asigna la llave pública del contribuyente que autoriza este CAF


verify

public boolean verify(PublicKey verificador)
               throws CodigoException
Verifica la firma que autoriza este código.

Parameters:
verificador - La llave pública del firmante que autorizó este código
Returns:
true en caso de verificar correctamente y false en caso contrario
Throws:
CodigoException - en caso de que el algoritmo de la llave pública del contribuyente o el algoritmo usado en la firma autorizadora, no sean soportados en esa versión, en caso que el código no tenga todos los datos necesarios o en caso de que el CAF no esté firmado

verify

public boolean verify(X509Certificate cert)
               throws CodigoException
Verifica la firma que autoriza este código.

Parameters:
cert - El certificado X509 del firmante que autorizó este código
Returns:
true en caso de verificar correctamente y false en caso contrario
Throws:
CodigoException - en caso de que el algoritmo de la llave pública del contribuyente o el algoritmo usado en la firma autorizadora, no sean soportados en esa versión, en caso que el código no tenga todos los datos necesarios o en caso de que el CAF no esté firmado

loadXML

public void loadXML(String data)
             throws CodigoException,
                    NoSuchAlgorithmException
Carga un código desde un string. Esta carga un código (con todos sus valores y la firma) que ha sido generado antes y pasado a un String que equivale al XML del CAF según la definición de SII

Parameters:
data - El string con la representación del XML generado por getDOMElement
Throws:
CodigoException - en caso que el string de entrada no esté bien estructurado
NoSuchAlgorithmException - en caso que la JVM no tenga implementados los algoritmos criptográficos necesarios

setDOMElement

public void setDOMElement(org.jdom.Element data)
                   throws CodigoException,
                          NoSuchAlgorithmException
Carga un código desde un Elemento XML que contiene un CAF, según la definición de SII

Parameters:
data - El elemento XML (DOM Element) del CAF
Throws:
MalformedCodigoException - en caso que el elemento de entrada no esté bien estructurado (no corresponda a un CAF)
CodigoException - en caso que el algoritmo de la llave pública del contribuyente no esté soportado en esta versión u otro problema en el CAF
NoSuchAlgorithmException - en caso que la JVM no tenga implementados los algoritmos criptográficos necesarios

genCode

private String genCode()
                throws CodigoException
Genera el string que se debe firmar por SII en este CAF

Returns:
String el String a firmar
Throws:
CodigoException - en caso que no se hayan completados todos los datos de este CAF

genDOMCode

private org.jdom.Element genDOMCode()
                             throws CodigoException
Genera un elemento con los datos a firmar del CAF, el cual es usado por genCode para obtener el string a firmar.

Returns:
Element el elemento con los datos a firmar
Throws:
CodigoException - en caso que no se hayan completados todos los datos de este CAF

genDOMCode

private org.jdom.Element genDOMCode(org.jdom.Namespace ns)
                             throws CodigoException
Genera el elemento que representa este CAF. Esta funcion es por la clase Timbre para incluir el CAF en su contenido.

Parameters:
ns - El namespace correspondiente a la especificación del CAF
Returns:
Element el elemento genreado con el CAF
Throws:
CodigoException - en caso que el CAF no tenga todos sus valores o no haya sido firmado aún.

keyToDOM

private org.jdom.Element keyToDOM(PublicKey pKey)
                           throws CodigoException
Transforma una llave pública a un elemento XML según la definición de SII

Parameters:
pKey - la llave pública a transformar
Returns:
Element el elemento generado
Throws:
CodigoException - en caso que la llave corresponda a un algoritmo no soportado por esta versión del CAF

keyToDOM

private org.jdom.Element keyToDOM(PublicKey pKey,
                                  org.jdom.Namespace ns)
                           throws CodigoException
Transforma una llave pública a un elemento XML según la definición de SII

Parameters:
pKey - la llave pública a transformar
ns - El namespace que corresponde a la definición de SII
Returns:
Element el elemento generado
Throws:
CodigoException - en caso que la llave corresponda a un algoritmo no soportado por esta versión del CAF

DOMToKey

private PublicKey DOMToKey(org.jdom.Element sKey)
                    throws CodigoException,
                           NoSuchAlgorithmException
Obtiene una llave pública desde un elemento XML según la especificación de SII

Parameters:
sKey - el elemento que contiene la llave
Returns:
PublicKey la llave pública obtenida
Throws:
MalformedCodigoException - en caso que el elemento no contenga una llave pública según la especificación de SII o en caso que el algoritmo criptográfico correspondiente a la llave no esté soportado en esta versión de CAF
NoSuchAlgorithmException - en caso que la JVM no soporte los algoritmos criptográficos necesarios
CodigoException

sign

public void sign(PrivateKey pKey)
          throws CodigoException
Autoriza (firma) los valores del código

Parameters:
pKey - la llave privada que se utiliza para firmar
Throws:
InvalidKeyException - en caso de haber problemas con la llave privada
SignatureException - en caso de haber problemas en el proceso de firma
NoSuchAlgorithmException - en caso que la JVM no soporte los algoritmos criptográficos necesarios
CodigoException - en caso que el código no tenga todos los datos necesarios o el algoritmo de la llave pública del contribuyente no sea soportado por esta versión de CAF

getPureDOMElement

protected org.jdom.Element getPureDOMElement()
                                      throws CodigoException
Obtiene el CAF en XML puro, es decir, sin identación ni namespaces. Esta función es utilizada por la clase Timbre para generar la firma del timbre y obtener el string que debe incluir el código de barras PDF 417

Returns:
Element el elemento XML puro
Throws:
CodigoException - en caso que no se tengan todos los valores del CAF o este no esté firmado

getDOMElement

public org.jdom.Element getDOMElement(String tagName,
                                      org.jdom.Namespace ns)
                               throws CodigoException
Obtiene el CAF en XML con sus namespaces. Esta función la utiliza la clase timbre para generar su propio elemento XML.

Returns:
Element el elemento XML puro
Throws:
CodigoException - en caso que no se tengan todos los valores del CAF o este no esté firmado

getXml

public String getXml()
Returns:

setXml

public void setXml(String string)
Parameters:
string -