Construye tus propias funciones SHA-256 y HMAC
Etapa 6 de 7v3 · 9d901409

HMAC-SHA256

Combina claves normalizadas con los pads interior y exterior de HMAC.

Constrúyelo en tu lenguaje

El tester trata tu programa como una caja negra: sirve cualquier lenguaje. Estos son los más cómodos para este proyecto.

Autenticación de Mensajes: HMAC-SHA-256

HMAC (Hash-based Message Authentication Code) combina una clave secreta con una función hash (en este caso SHA-256) para garantizar la integridad y autenticidad de un mensaje frente a manipulaciones.

Modelo mental: La fórmula de HMAC

Dado un tamaño de bloque de 64 bytes (B=64B = 64):

  1. Normalización de la clave:
    • Si la clave mide más de 64 bytes, se reemplaza por su propio SHA-256(clave).
    • Si mide menos de 64 bytes, se rellena con ceros a la derecha hasta completar 64 bytes.
  2. Máscaras de relleno internas y externas:
    • ipad: Byte 0x36 repetido 64 veces.
    • opad: Byte 0x5c repetido 64 veces.
    • Clave interna: k_ipad = clave ^ ipad (XOR byte a byte).
    • Clave externa: k_opad = clave ^ opad (XOR byte a byte).
  3. Cálculo de dos pasos: HMAC(K,m)=SHA-256(kopadmathbinVertSHA-256(kipadmathbinVertm))\text{HMAC}(K, m) = \text{SHA-256}(k_opad mathbin{Vert} \text{SHA-256}(k_ipad mathbin{Vert} m))

Tu objetivo en esta etapa

Leer por stdin un JSON con op: "hmac-sha256", la clave secreta en hex keyHex y el mensaje text. Devolver el código HMAC en hex.

Formato de Entrada

json
{
  "op": "hmac-sha256",
  "keyHex": "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
  "text": "Hi There"
}

Formato de Salida

json
{
  "hex": "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7"
}

Qué debes hacer paso a paso

  1. Normaliza la clave:
    • Si la clave en bytes supera 64 bytes, calcula SHA-256(keyBytes) (32 bytes).
    • Rellena con ceros a la derecha hasta que la clave tenga exactamente 64 bytes.
  2. Calcula k_ipad y k_opad:
    • Para i=0…63i = 0 \dots 63: k_ipad[i] = key[i] ^ 0x36, k_opad[i] = key[i] ^ 0x5c.
  3. Primer pase (Hash interno):
    • Concatena k_ipad con los bytes UTF-8 de text.
    • Calcula innerHash = SHA-256(k_ipad + text).
  4. Segundo pase (Hash externo):
    • Concatena k_opad con innerHash.
    • Calcula hmac = SHA-256(k_opad + innerHash).
  5. Emite la salida: Escribe {"hex": hmacHex} en stdout.

Criterios de aceptación

  • ✅ Cumple la especificación RFC 2104 de HMAC.
  • ✅ Produce digests de 64 caracteres hex que coinciden con los vectores de prueba de RFC 4231.

Formato de salida y errores

Los ejemplos multilínea se muestran así para facilitar la lectura. Emite JSON compacto, sin espacios opcionales, con las propiedades en el orden de los ejemplos de salida y un salto de línea final. No escribas logs en stdout. Las pruebas comparan texto exacto. Para entradas inválidas, usa stderr con la palabra error, stdout vacío y código 1. Para entradas válidas, código 0. Usa números JSON enteros cuando el resultado sea entero.