Construye tus propias funciones SHA-256 y HMAC
Etapa 5 de 7v2 · 645e2bee

Digest completo

Encadena las 64 rondas y valida el digest SHA-256 completo.

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.

Digest Completo de SHA-256

En esta etapa integrarás todos los componentes anteriores para construir la implementación completa de SHA-256: padding, inicialización de valores H0…H7H_0 \dots H_7, expansión de palabras y las 64 rondas de compresión por bloque.

Modelo mental: El algoritmo completo SHA-256

  1. Valores iniciales de hash (H0…H7H_0 \dots H_7): Las partes fraccionarias de las raíces cuadradas de los primeros 8 números primos.
  2. Relleno: Aplica el padding estándar al texto de entrada (codificado en UTF-8).
  3. Para cada bloque de 64 bytes:
    • Divide en W0…W15W_0 \dots W_{15} y expande hasta W63W_{63}.
    • Inicializa las variables de trabajo: a=H0,b=H1,…,h=H7a=H_0, b=H_1, \dots, h=H_7.
    • Ejecuta las 64 rondas usando las 64 constantes KiK_i: T1=h+Sigma1(e)+Ch(e,f,g)+Ki+WiT_1 = h + Sigma_1(e) + \text{Ch}(e, f, g) + K_i + W_i T2=Sigma0(a)+Maj(a,b,c)T_2 = Sigma_0(a) + \text{Maj}(a, b, c) h=g;g=f;f=e;e=(d+T1);d=c;c=b;b=a;a=(T1+T2)h = g; \quad g = f; \quad f = e; \quad e = (d + T_1); \quad d = c; \quad c = b; \quad b = a; \quad a = (T_1 + T_2)
    • Suma las variables de trabajo a los acumuladores: H0=H0+a,…,H7=H7+hH_0 = H_0 + a, \dots, H_7 = H_7 + h.
  4. Digest final: Concatena H0…H7H_0 \dots H_7 en hexadecimal minúsculo (64 caracteres hex).

Tu objetivo en esta etapa

Leer por stdin un JSON con op: "sha256" y una cadena de texto text. Devolver el hash SHA-256 en hexadecimal minúsculo en hex.

Formato de Entrada

json
{
  "op": "sha256",
  "text": "abc"
}

Output Format

json
{
  "hex": "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
}

Qué debes hacer paso a paso

  1. Codifica el texto a UTF-8 bytes: Convierte text a su secuencia de bytes UTF-8.
  2. Aplica padding: Añade 0x80, ceros hasta 56 mod 64 y la longitud en bits de 64 bits.
  3. Ejecuta la compresión en bloques de 64 bytes.
  4. Formatea la salida: Concatena los 8 acumuladores H0…H7H_0 \dots H_7 en una cadena de exactamente 64 caracteres hexadecimales en minúsculas.
  5. Emite la salida: Escribe {"hex": hashHex} en stdout.

Criterios de aceptación

  • ✅ Produce el digest exacto del estándar FIPS 180-4 para vectores de prueba conocidos (como "abc").
  • ✅ Devuelve una cadena de 64 caracteres hexadecimales en minúsculas.

Del bloque a las rondas

Antes de integrar, prepara las operaciones de 32 bits: rotación a la derecha, desplazamiento lógico, Choice y Majority. Distingue las sigmas pequeñas de expansión de las mayúsculas de compresión. Conserva el estado inicial de cada bloque para sumarlo al estado de trabajo después de las 64 rondas; todas las sumas son módulo 2^32. No derives las constantes con flotantes.

Usa FIPS 180-4: §4.1.2 define funciones, §4.2.2 las constantes, §5.3.3 el estado inicial y §6.2.2 el orden completo de actualización. Revisa una ronda en papel antes de procesar varios bloques.

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.