hmacSha256 function

Uint8List hmacSha256(
  1. List<int> key,
  2. List<int> message
)

Calcula HMAC-SHA256 para message usando key.

Retorna 32 bytes (256 bits).

final tag = hmacSha256(key, utf8.encode('mensagem'));
// tag.length == 32

Implementation

Uint8List hmacSha256(List<int> key, List<int> message) {
  // --- 1. Normaliza a chave para exatamente 64 bytes ---
  List<int> normalizedKey;
  if (key.length > _blockSize) {
    // Chave longa: faz hash dela primeiro
    normalizedKey = sha256(key);
  } else {
    normalizedKey = key;
  }

  // Padding com zeros até 64 bytes
  final k = Uint8List(_blockSize);
  for (int i = 0; i < normalizedKey.length; i++) {
    k[i] = normalizedKey[i];
  }

  // --- 2. Calcula ipad e opad ---
  final iKeyPad = Uint8List(_blockSize);
  final oKeyPad = Uint8List(_blockSize);
  for (int i = 0; i < _blockSize; i++) {
    iKeyPad[i] = k[i] ^ 0x36;
    oKeyPad[i] = k[i] ^ 0x5c;
  }

  // --- 3. HMAC = SHA256(opad || SHA256(ipad || message)) ---
  final innerInput = Uint8List(iKeyPad.length + message.length)
    ..setAll(0, iKeyPad)
    ..setAll(iKeyPad.length, message);

  final innerHash = sha256(innerInput);

  final outerInput = Uint8List(oKeyPad.length + innerHash.length)
    ..setAll(0, oKeyPad)
    ..setAll(oKeyPad.length, innerHash);

  return sha256(outerInput);
}