createTimeBasedHMAC static method

String createTimeBasedHMAC({
  1. required Object body,
  2. required String key,
  3. required String timeToSync,
  4. required String validityInSeconds,
})

Crea un HMAC basado en tiempo usando el contenido del body y una clave secreta

Params:

  • body: El mapa que se serializará a JSON
  • key: La clave secreta para la generación del HMAC

Returns: String con el HMAC generado

Implementation

static String createTimeBasedHMAC(
    {required Object body,
    required String key,
    required String timeToSync,
    required String validityInSeconds}) {
  logDebug(
      'createTimeBasedHMAC ==> body => $body, key => $key, timeToSync => $timeToSync');
  if (key.isEmpty) {
    throw ArgumentError('La clave HMAC no puede estar vacía');
  }

  try {
    final timeSlot =
        _getCurrentTimeSlot(int.tryParse(timeToSync) ?? 0, validityInSeconds);

    // Usar un separador distintivo para evitar colisiones
    // final bodyString = '${jsonEncode(body)}$timeSlot';
    final bodyString100 =
        ('$body'.length > 100) ? '$body'.substring(0, 100) : '$body';

    final bodyString = '$bodyString100$timeSlot';

    final hmac = Hmac(sha256, utf8.encode(key));
    final digest = hmac.convert(utf8.encode(bodyString));

    logDebug(
        'createTimeBasedHMAC ==> .. timeSlot => $bodyString100 $timeSlot .. bodyString => $bodyString .. digest => $digest');

    return '$digest';
  } catch (e) {
    if (e is JsonUnsupportedObjectError) {
      throw ArgumentError(
          'El body contiene objetos que no se pueden serializar a JSON');
    }
    rethrow; // Propagar otros errores
  }
}