img

APDUGT.dll

APDUGT.dll es una librería nativa realizada en C para sistemas Windows, que lee directamente el chip de identificación de Guatemala (DPI). Se comunica con el lector a través de la API estándar de Windows y entrega los datos del documento —personales, de registro civil y biométricos, incluida la fotografía— en una sola estructura, sin depender de servicios externos.

Desde 2009 el chip de identificación de Guatemala ha pasado por cinco generaciones, cada una con su propio conjunto de campos. La librería las reconoce todas y las expone bajo la misma API: tu aplicación no necesita saber qué versión tiene la tarjeta que está en el lector, ni mantener un camino de código distinto para cada una.

DLL Nativo para Sistemas Windows

No depnde de Java ni de ningún otro lenguaje de medio nivel, el SDK es Nativo para Sistemas Windows y garantizar la lectura del chip de identificación de Guatemala

Libería Nativa .dll Beta
Versión
5.0.0.2-beta
Dependencia
winscard.dll
Arquitecturas
x64 / x86
Convención
__stdcall
⚙️

Lenguaje y ABI

  • Librería nativa en C con ABI estable y compatible con C/C++
  • Exportaciones sin name-mangling (extern "C" en compilación C++)
  • Convención de llamada: __stdcall (WINAPI)
  • Alineación de estructuras: predeterminada del compilador (8 bytes en x64, 4 bytes en x86)
🔗

Compatibilidad de ABI

La combinación de extern "C" + __stdcall garantiza compatibilidad binaria con cualquier lenguaje que soporte llamadas a DLLs de Windows (FFI):

C / C++ Header directo
C# / .NET P/Invoke
Java JNI / JNA
Python ctypes
Delphi external
Rust / Go / Node.js FFI nativo
📦

Funciones Exportadas

APDUGT_GetVersion
APDUGT_ListReaders
APDUGT_ReadDPI
APDUGT_GetChipVersion
APDUGT_FreeDPIData
APDUGT_GetErrorMessage
APDUGT_IsCardPresent
🗂️

Estructura Principal

  • APDUGT_DPIData — Contiene datos personales, biométricos, datos de documento y campos de error
  • Foto JPEG: unsigned char* Foto + unsigned int FotoSize
💳

Datos por Versión de Chip

Cada versión del chip contiene diferentes campos. La siguiente tabla muestra los datos disponibles según la versión del chip:

V1 Chip 2009

Datos personales: CUI, PrimerNombre, SegundoNombre, PrimerApellido, SegundoApellido, ApellidoCasada, Sexo

Nacimiento: FechaNacimiento, MunicipioNacimiento, DepartamentoNacimiento, PaisNacimiento

Documento: FechaEmision, FechaVencimiento

Vecindad: MunicipioVecindad, DepartamentoVecindad, Nacionalidad, EstadoCivil

Residencia: DireccionResidencia1, DireccionResidencia2, MunicipioResidencia, DepartamentoResidencia, CodigoPostal, PaisResidencia

Registro civil: Libro, Folio, Partida, NumeroCedula, MunicipioCedula, DepartamentoCedula

Otros: Profesion, LimitacionesFisicas, SabeLeer, SabeEscribir, OficialActivo, MRZ

Biométricos: Foto JPEG

V2 Chip 2014

Datos personales: CUI, Gentilicio, PrimerNombre, SegundoNombre, OtrosNombres, PrimerApellido, SegundoApellido, ApellidoCasada, Sexo

Nacimiento: FechaNacimiento, MunicipioNacimiento, DepartamentoNacimiento, PaisNacimiento

Documento: FechaEmision, FechaVencimiento, Serie

Vecindad: MunicipioVecindad, DepartamentoVecindad, Nacionalidad, EstadoCivil

Registro civil: Libro, Folio, Partida, NumeroCedula, MunicipioCedula, DepartamentoCedula

Educación: Idioma, EtniaComunidadLinguistica, Oficio, Profesion

Otros: LimitacionesFisicas, SabeLeer, SabeEscribir, PuedeFirmar, OficialActivo

Biométricos: Foto JPEG, NumeroHuellasAlmacenadas, Huellas (lista de dedos)

V3 Chip 2017

Datos personales: CUI, PrimerNombre, SegundoNombre, OtrosNombres, PrimerApellido, SegundoApellido, ApellidoCasada, Sexo

Nacimiento: FechaNacimiento, MunicipioNacimiento, DepartamentoNacimiento, PaisNacimiento

Documento: FechaEmision, FechaVencimiento, NumeroRenovacion, Serie

Vecindad: MunicipioVecindad, DepartamentoVecindad, Nacionalidad, EstadoCivil

Residencia: MunicipioResidencia, DepartamentoResidencia, Telefono1

Registro civil: Libro, Folio, Partida, NumeroCedula

Educación: Idioma, Oficio, Profesion

Otros: LimitacionesFisicas, SabeLeer, SabeEscribir, PuedeFirmar, OficialActivo

Biométricos: Foto JPEG, NumeroHuellasAlmacenadas, Huellas (lista de dedos)

V4 Chip 2018

Datos personales: CUI, PrimerNombre, SegundoNombre, OtrosNombres, PrimerApellido, SegundoApellido, ApellidoCasada, NombreUsual, Sexo

Nacimiento: FechaNacimiento, MunicipioNacimiento, DepartamentoNacimiento, PaisNacimiento

Documento: FechaEmision, FechaVencimiento, NumeroRenovacion, Serie

Vecindad: MunicipioVecindad, DepartamentoVecindad, Nacionalidad, EstadoCivil

Residencia: MunicipioResidencia, DepartamentoResidencia, Telefono1, Telefono2

Contacto: CorreoElectronico, NombreCompletoContacto, ParentescoContacto

Registro civil: Libro, Folio, Partida, NumeroCedula, MunicipioCedula

Educación: Estudia, Escolaridad, Idioma, EtniaComunidadLinguistica, Profesion

Otros: LimitacionesFisicas, OficialActivo

Biométricos: Foto JPEG, HuellasSTR

V5 Chip 2024

Datos personales: CUI, PrimerNombre, SegundoNombre, OtrosNombres, PrimerApellido, SegundoApellido, ApellidoCasada, NombreCompleto, NombreUsual, Sexo

Nacimiento: FechaNacimiento, MunicipioNacimiento, DepartamentoNacimiento, PaisNacimiento

Documento: FechaEmision, FechaVencimiento, NumeroRenovacion, Serie

Vecindad: MunicipioVecindad, DepartamentoVecindad, Nacionalidad, EstadoCivil

Contacto: Telefono1, Telefono2, CorreoElectronico, NombreCompletoContacto, ParentescoContacto

Registro civil: Libro, Folio, Partida, NumeroInscripcion, NumeroCedula, MunicipioCedula

Educación: Estudia, Escolaridad, Idioma, Oficio, Profesion

Características físicas: ColorTez, ColorOjos, ColorCabello, EspecificacionesCabello, LimitacionesFisicas, Lunares, Cicatrices

Otros: NIT, IdentificacionPersona, SabeLeer, SabeEscribir, PuedeFirmar, OficialActivo

Biométricos: Foto JPEG, HuellasSTR

Nota: Todos los campos están disponibles en la estructura APDUGT_DPIData. Los campos no aplicables a una versión específica se devuelven vacíos.
⚠️

Códigos de Error

  • APDUGT_SUCCESS — Operación exitosa
  • APDUGT_ERROR_NO_READERS — No se encontraron lectores
  • APDUGT_ERROR_NO_CARD — No hay tarjeta presente
  • APDUGT_ERROR_CONNECT — Error de conexión
🏷️

Versión

Version String
5.0.0.2-beta
Product Version
5.0.0.2-beta
📎

Dependencias

  • Única dependencia externa: winscard.dll (Windows SmartCard API)
Sin instalación adicional: La librería winscard.dll viene incluida de forma nativa en todas las versiones de Windows (XP, Vista, 7, 8, 10, 11), por lo que no se requiere instalar ningún componente adicional.
🖥️

Arquitectura

x64
bin/x64/APDUGT.dll
x86
bin/x86/APDUGT.dll
Los wrappers de Java y .NET detectan automáticamente la arquitectura del proceso host y cargan la DLL correspondiente.
🔷

Integración con .NET (C#)

El SDK incluye un wrapper P/Invoke completo para integrar APDUGT.dll en aplicaciones .NET (C#, VB.NET, F#).

Archivos incluidos:

  • examples/csharp/APDUGT.cs — Wrapper P/Invoke con todas las estructuras y funciones
  • examples/csharp/Program.cs — Ejemplo completo de uso

Compilar el ejemplo:

csc /out:test_APDUGT.exe Program.cs APDUGT.cs

Características del wrapper:

  • Estructuras completas: DPIData, ReaderList, Reader
  • Códigos de error como constantes en ErrorCodes
  • Tipos de licencia en LicenseType
  • Todas las funciones P/Invoke en la clase Native
  • Compatible con .NET Framework 4.x y .NET Core/.NET 5+
Importante: Coloca APDUGT.dll (x64 o x86 según tu aplicación) y apdugt.lic en el mismo directorio que tu ejecutable.
🐍

Integración con Python

Utiliza ctypes (incluido en Python) para cargar y llamar funciones de APDUGT.dll.

Ejemplo básico:

import ctypes
from ctypes import Structure, c_char, c_int, c_uint, POINTER, byref

# Estructuras
class Reader(Structure):
    _fields_ = [("Name", c_char * 256)]

class ReaderList(Structure):
    _fields_ = [
        ("Readers", Reader * 16),
        ("Count", c_int)
    ]

# Cargar DLL (usar x64 o x86 según Python instalado)
dll = ctypes.WinDLL("./APDUGT.dll")

# Configurar tipos de retorno
dll.APDUGT_GetVersion.restype = ctypes.c_char_p
dll.APDUGT_ListReaders.argtypes = [POINTER(ReaderList)]
dll.APDUGT_GetCUI.argtypes = [c_int, ctypes.c_char_p]

# Obtener versión
version = dll.APDUGT_GetVersion()
print(f"Version: {version.decode()}")

# Listar lectores
readers = ReaderList()
if dll.APDUGT_ListReaders(byref(readers)) == 0:
    for i in range(readers.Count):
        print(f"Lector {i}: {readers.Readers[i].Name.decode()}")

# Leer CUI
cui = ctypes.create_string_buffer(32)
if dll.APDUGT_GetCUI(0, cui) == 0:
    print(f"CUI: {cui.value.decode()}")
Nota: Asegúrate de usar la DLL que coincida con tu versión de Python (x64 o x86). Verifica con python -c "import struct; print(struct.calcsize('P')*8)"

Integración con Java

Utiliza JNA (Java Native Access) para integrar APDUGT.dll en aplicaciones Java.

Dependencia Maven:

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.14.0</version>
</dependency>

Interface JNA:

import com.sun.jna.*;
import com.sun.jna.ptr.*;

public interface APDUGT extends StdCallLibrary {
    // Cargar con ruta relativa o absoluta
    APDUGT INSTANCE = Native.load("./APDUGT.dll", APDUGT.class);
    // O ruta absoluta: Native.load("C:/ruta/APDUGT.dll", APDUGT.class);

    // Estructura Reader
    public static class Reader extends Structure {
        public byte[] Name = new byte[256];
    }

    // Estructura ReaderList
    public static class ReaderList extends Structure {
        public Reader[] Readers = new Reader[16];
        public int Count;
    }

    // Funciones exportadas
    String APDUGT_GetVersion();
    int APDUGT_ListReaders(ReaderList readerList);
    int APDUGT_IsCardPresent(int readerIndex);
    int APDUGT_GetChipVersion(int readerIndex, byte[] version);
    int APDUGT_GetATR(int readerIndex, byte[] atr);
    int APDUGT_GetCUI(int readerIndex, byte[] cui);
    int APDUGT_GetLicenseType();
    int APDUGT_IsLicenseValid();
}

Ejemplo de uso:

public class Main {
    public static void main(String[] args) {
        APDUGT lib = APDUGT.INSTANCE;

        // Verificar licencia
        System.out.println("Version: " + lib.APDUGT_GetVersion());
        System.out.println("Licencia valida: " + (lib.APDUGT_IsLicenseValid() == 1));

        // Listar lectores
        APDUGT.ReaderList readers = new APDUGT.ReaderList();
        if (lib.APDUGT_ListReaders(readers) == 0) {
            System.out.println("Lectores: " + readers.Count);

            // Leer CUI del primer lector
            byte[] cui = new byte[32];
            if (lib.APDUGT_GetCUI(0, cui) == 0) {
                System.out.println("CUI: " + new String(cui).trim());
            }
        }
    }
}
Nota: Coloca APDUGT.dll en el java.library.path o en el mismo directorio que el JAR. Usa la versión x64 con JVM de 64 bits.
⬇️

Descargar SDK

Descarga el paquete completo con DLLs compiladas, ejemplos y documentación.

📦 Descargar desde Google Drive
📋

Contenido del Paquete

El archivo APDUGT_v5.0.0.2-beta.zip incluye los siguientes componentes:

📂 Librerías y Ejemplos Compilados (bin/)

  • apdugt.lic — Licencia DEMO (compartida x64/x86)
  • x64/APDUGT.dll — Librería nativa 64 bits
  • x64/test_APDUGT_x64.exe — Ejemplo compilado 64 bits
  • x64/apdugt.lic — Licencia DEMO para x64
  • x86/APDUGT.dll — Librería nativa 32 bits
  • x86/test_APDUGT_x86.exe — Ejemplo compilado 32 bits
  • x86/apdugt.lic — Licencia DEMO para x86

🔧 Herramientas (tools/)

  • apdugt_request_gui.exe — Generador de solicitud de licencia (interfaz gráfica)

💻 Código Fuente (examples/)

  • test_APDUGT.c — Ejemplo en C
  • apdugt.h — Header público con definiciones de la API
  • csharp/APDUGT.cs — Wrapper P/Invoke para .NET (C#, VB.NET, F#)
  • csharp/Program.cs — Ejemplo de uso en C#

📄 Documentación (docs/)

  • index.html — Documentación técnica del SDK
  • README.txt — Guía rápida de inicio (en raíz)
Nota: La licencia DEMO incluida permite usar funciones básicas (ListReaders, IsCardPresent, GetChipVersion, GetATR, GetCUI). Para acceso completo a ReadDPI(), solicita una licencia FULL usando apdugt_request_gui.exe.

¿Necesitas una licencia FULL o integrarlo a tu sistema?

Escríbenos y te respondemos con una propuesta inicial en menos de 24 horas.

HABLEMOS HABLEMOS