🔵 SDK Oficial para Golang (Manual Técnico & API de Métodos)
El paquete validlicense es el SDK oficial para Golang. Ha sido diseñado para microservicios concurrentes, daemons de infraestructura, APIs de alto rendimiento y herramientas CLI utilizando el paquete estándar crypto/ed25519 del compilador de Go.
🏛️ 1. Estructuras de Datos (Structs)
ClientOptions
Opciones de inicialización del cliente:
type ClientOptions struct {
ServerURL string // URL base del servidor VPS (ej: "https://licencias.labtec.sbs")
PublicKeyHex string // Clave Pública Ed25519 de 32 bytes en formato Hexadecimal (64 caracteres)
ClientVersion string // Versión del cliente (por defecto "2026.1")
HTTPTimeout time.Duration // Timeout para peticiones de red (por defecto 6 segundos)
}
ValidLicenseRecord
Estado inmutable retornado tras la verificación:
type ValidLicenseRecord struct {
IsActive bool `json:"isActive"` // true si la licencia está vigente y no revocada
Status string `json:"status"` // "ACTIVE", "SUSPENDED", "EXPIRED", "REVOKED"
CompanyName string `json:"companyName"` // Razón social del cliente
CompanyNit string `json:"companyNit"` // NIT tributario
Plan string `json:"plan"` // Nombre del plan comercial
ExpiresAt string `json:"expiresAt"` // Fecha de expiración ISO 8601
DaysLeft int `json:"daysLeft"` // Días restantes
IsTrial bool `json:"isTrial"` // Indica si es una licencia de prueba
MaxUsers int `json:"maxUsers"` // Límite de usuarios simultáneos
DianQuota int `json:"dianQuota"` // Cuota autorizada de facturas electrónicas
DianUsed int `json:"dianUsed"` // Facturas electrónicas consumidas
Features []string `json:"features"` // Lista de módulos contratados
CustomData map[string]interface{} `json:"customData"` // Metadatos personalizados
ServerMessage string `json:"serverMessage"` // Mensaje o motivo de respuesta
Token string `json:"token"` // Token criptográfico renovado
}
⚙️ 2. Métodos de ValidLicenseClient
NewClient(options ClientOptions) *ValidLicenseClient
Inicializa una nueva instancia del cliente configurando el pool HTTP y normalizando la clave pública.
(c *ValidLicenseClient) GetMachineID() (string, error)
- Propósito: Calcula la huella única de hardware del equipo actual en formato
REX-XXXX-XXXX-XXXX. - Implementación:
- En Windows: Consulta el registro
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid. - En Linux: Lee
/etc/machine-ido/var/lib/dbus/machine-id. - En macOS: Consulta
IOPlatformUUIDvíaioreg. - Genera una suma SHA-256 dividida en 4 bloques hexadecimales.
- En Windows: Consulta el registro
(c *ValidLicenseClient) VerifyTokenSignature(token string) bool
- Propósito: Valida matemáticamente si la firma digital Ed25519 del token es legítima.
- Implementación:
- Decodifica la clave pública hexadecimal a 32 bytes
ed25519.PublicKey. - Decodifica la firma hexadecimal de 128 caracteres a 64 bytes de firma.
- Ejecuta
ed25519.Verify(pubKey, payloadBytes, signatureBytes).
- Decodifica la clave pública hexadecimal a 32 bytes
(c *ValidLicenseClient) Verify(companyNit, currentToken string, customData map[string]interface{}) (*ValidLicenseRecord, error)
- Propósito: Ejecuta el ciclo de vida de verificación en 2 fases:
- Fase 1 (Online): Realiza un POST a
/api/v1/license/verifyen el VPS. Si el servidor responde200 OK, actualiza los datos y renueva el token. - Fase 2 (Fallback Offline): Si no hay conexión, decodifica el
currentTokenlocal, valida la firma asimétrica conVerifyTokenSignaturey comprueba que la fecha actual sea menor aExpiresAt.
- Fase 1 (Online): Realiza un POST a
(r *ValidLicenseRecord) HasFeature(featureName string) bool
- Propósito: Retorna
truesi el módulo solicitado se encuentra dentro de la lista deFeaturesautorizadas en la licencia.
🛡️ 3. Módulo Anti-Tamper en Go
Funciones a nivel de paquete para fortificar binarios en Go:
validlicense.DeriveEncryptionKey(rawToken, salt):- Deriva una clave AES-256 a partir de la firma del token para cifrar bases de datos locales o estructuras en memoria.
validlicense.VerifyClockIntegrity(lastIso, checksum, runCount, machineId, salt, toleranceMinutes):- Verifica que el reloj de Windows o Linux no haya sido retrasado deliberadamente.
validlicense.IsDebuggerAttached():- Detecta si el binario Go está siendo ejecutado bajo
gdb,lldbo inspeccionado por un proceso padre.
- Detecta si el binario Go está siendo ejecutado bajo
🔒 4. Módulo UiGuard (Protección de Vistas en Go)
Permite proteger vistas HTML, templates o respuestas de endpoints:
// 1. Proteger una vista completa
viewOutput := validlicense.UiGuard{}.GuardView(
status,
func() string { return renderDashboardHtml() }, // Solo si es válida
func() string { return renderLockScreenHtml() }, // Fallback si no está activa
)
// 2. Proteger por Feature Flag
billingView := validlicense.UiGuard{}.GuardFeature(
status,
"electronic_billing",
func() string { return renderFacturacionDian() },
func() string { return "Módulo no autorizado." },
)
// 3. Proteger páginas React / Vue compiladas
finalHtml := validlicense.UiGuard{}.GuardAsset(status, bundledReactHtml, "")
💻 5. Ejemplo Completo de Integración en Go
package main
import (
"fmt"
"log"
"os"
"time"
"validlicense"
)
func main() {
// 1. Configurar cliente
client := validlicense.NewClient(validlicense.ClientOptions{
ServerURL: os.Getenv("VALID_LICENSE_SERVER_URL"),
PublicKeyHex: os.Getenv("ED25519_PUBLIC_KEY"),
HTTPTimeout: 5 * time.Second,
})
// 2. Obtener Machine ID
machineID, err := client.GetMachineID()
if err != nil {
log.Fatalf("❌ Error obteniendo Machine ID: %v", err)
}
fmt.Printf("🔒 Hardware ID: %s\n", machineID)
// 3. Verificar Licencia
status, err := client.Verify("900.888.777-1", os.Getenv("LICENSE_TOKEN"), map[string]interface{}{
"tier": "enterprise",
})
if err != nil || !status.IsActive {
log.Fatalf("❌ Acceso Denegado: %v", status.ServerMessage)
}
fmt.Printf("✅ Licencia Activa para: %s (Plan: %s)\n", status.CompanyName, status.Plan)
fmt.Printf("📅 Válida hasta: %s (%d días restantes)\n", status.ExpiresAt, status.DaysLeft)
fmt.Printf("📑 Cuota DIAN: %d / %d\n", status.DianUsed, status.DianQuota)
// 4. Validar Feature Flag
if status.HasFeature("electronic_billing") {
fmt.Println("⚡ Módulo de Facturación Electrónica Activo")
}
}