hmacSha256 function
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);
}