En el software comercial estándar, un nivel de privilegios se maneja con roles ("Admin", "User"). En equipos de medición despachadores de hidrocarburos, el software no es suficiente. Los hackers pueden usar ingeniería inversa o *glitching* electromagnético para saltarse un if(password == 1234). La autoridad exige una barrera que no pueda ser superada mediante un ataque digital remoto.
Implementaremos la arquitectura de Doble Llave (Dual-Key Interlock):
HIGH a un pin especial del STM32, la pantalla mostrará una solicitud de PIN. Solo ingresando el PIN certificado, el procesador desbloqueará la escritura de la EEPROM para guardar el nuevo K-Factor.Cuando el inspector de la autoridad metrológica llega a la planta gasera con su "Serafín" de 20 Litros, debe seguir este protocolo extraído del Manual de Calibración de tu Despachador:
ON.OFF, colocará un alambre nuevo y lo morderá con su troqueladora, grabando un nuevo folio irrepetible en plomo.A nivel de C, si una rutina intenta llamar a la función EEPROM_Write_K_Factor(), el procesador debe validar en ese milisegundo exacto que el Pin Físico está activado. No basta con revisar una variable de estado en RAM, ya que un ataque de Buffer Overflow podría manipular la variable. Validamos el registro del GPIO crudo.
/**
* @file calibration_access.c
* @brief Gestión de Seguridad Metrológica de Doble Llave (NOM-005-SCFI)
*/
#include "stm32f4xx_hal.h"
#include <stdio.h>
#include <stdbool.h>
// Pin conectado físicamente al Interruptor debajo de la cubierta sellada
// Asumimos que usa lógica inversa: Abierto = HIGH (Pull-up), Cerrado (ON) = LOW a GND
#define CALIBRATION_PORT GPIOA
#define CALIBRATION_PIN GPIO_PIN_7
// PIN Maestro de calibración (En producción, esto sería un Hash Criptográfico)
#define AUTHORIZED_CAL_PIN (8246U)
extern void LCD_Clear(void);
extern void LCD_Print_Line(uint8_t line, const char* text);
extern uint16_t Keypad_Get_4Digit_PIN(void);
extern void Save_KFactor_To_EEPROM(uint32_t new_k_factor);
extern void Cloud_Telemetry_Log(const char* msg);
// =========================================================================
// VALIDACIÓN DE RUTINA DE CALIBRACIÓN (DOBLE LLAVE)
// =========================================================================
/**
* @brief Intenta ingresar al menú de calibración modificando la EEPROM.
* @retval bool: TRUE si el acceso fue concedido y el K-Factor actualizado.
*/
bool Metrology_Enter_Calibration_Mode(uint32_t proposed_k_factor) {
// 1. LLAVE FÍSICA (HARDWARE LOCKOUT)
// Leemos directamente el registro del puerto (IDR) para evadir variables cacheadas
if (HAL_GPIO_ReadPin(CALIBRATION_PORT, CALIBRATION_PIN) != GPIO_PIN_RESET) {
// El interruptor está en OFF. El hardware impide la calibración.
// Alertar por telemetría si alguien intenta calibrar por software sin abrir el equipo.
Cloud_Telemetry_Log("SECURITY ALERT: Intento de calibración por software rechazado. Sello físico intacto.");
LCD_Clear();
LCD_Print_Line(0, "!! ACCESO DENEGADO !!");
LCD_Print_Line(1, "SELLO FISICO ACTIVO");
LCD_Print_Line(2, "ROMPER PRECINTO PARA");
LCD_Print_Line(3, "CALIBRAR EQUIPO.");
HAL_Delay(3000);
return false;
}
// 2. LLAVE LÓGICA (SOFTWARE PIN)
// El interruptor físico está ON. Ahora exigimos la credencial del inspector.
LCD_Clear();
LCD_Print_Line(0, "MODO CALIBRACION NOM");
LCD_Print_Line(1, "Sello Físico Roto.");
LCD_Print_Line(2, "Ingrese PIN de");
LCD_Print_Line(3, "Inspector: _ _ _ _");
uint16_t entered_pin = Keypad_Get_4Digit_PIN(); // Función bloqueante
if (entered_pin != AUTHORIZED_CAL_PIN) {
// Fallo de autenticación
Cloud_Telemetry_Log("SECURITY ALERT: PIN de inspector inválido en Modo Calibración.");
LCD_Clear();
LCD_Print_Line(1, "PIN INCORRECTO");
HAL_Delay(2000);
return false;
}
// 3. ACCESO TOTAL CONCEDIDO
// Hardware y Software han validado el acceso. Procedemos a la memoria no volátil.
LCD_Clear();
LCD_Print_Line(0, "** CALIBRANDO... **");
Save_KFactor_To_EEPROM(proposed_k_factor);
Cloud_Telemetry_Log("INFO LEGAL: Calibración volumétrica ejecutada por Inspector. Nuevo K-Factor guardado.");
LCD_Print_Line(1, "K-FACTOR GUARDADO.");
LCD_Print_Line(2, "Apague Interruptor");
LCD_Print_Line(3, "y coloque Precinto.");
// Bucle para obligar al inspector a apagar el switch antes de reanudar despacho
while(HAL_GPIO_ReadPin(CALIBRATION_PORT, CALIBRATION_PIN) == GPIO_PIN_RESET) {
HAL_Delay(500); // Esperar a que lo pongan en OFF
}
return true;
}
Objetivo del día: Cumplimiento de Metrología Legal y Arquitectura Anti-Fraude (Tamper-Proofing).
La tecnología es irrelevante si no cumple con la ley. Muchos estudiantes de ingeniería construyen medidores de flujo espectaculares que son rechazados el primer día en la industria porque ignoran la normativa NOM-005-SCFI o su equivalente internacional. La ley dicta que el instrumento de medición debe garantizar la inalterabilidad del dispositivo de ajuste volumétrico. Un menú protegido por contraseña en la pantalla no basta; una contraseña puede filtrarse a los despachadores de la planta.
Al diseñar el **Manual de Calibración** y forzar la arquitectura de **Doble Llave**, has protegido al dueño de la gasera de sus propios empleados y has protegido al consumidor final del dueño de la gasera. El firmware `Metrology_Enter_Calibration_Mode()` lee crudamente el registro del hardware antes de permitir escribir en la EEPROM. El inspector de PROFECO debe destruir físicamente el alambre y el plomo seriado para girar el interruptor a ON. Si hay fraude, el sello roto es la prueba pericial irrefutable. Tu Tesis ya no es un proyecto de laboratorio; es un instrumento jurídico auditable y legalmente comercializable.