Construye tus propias funciones SHA-256 y HMAC
Etapa 3 de 7v2 · e462126c

Expansión del mensaje

Expande dieciséis palabras iniciales a las sesenta y cuatro palabras de cada bloque.

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.

Expansión del Horario de Mensaje (Message Schedule: sigma0sigma_0 y sigma1sigma_1)

A partir de las 16 palabras iniciales (W0…W15W_0 \dots W_{15}), SHA-256 expande el bloque hasta generar 64 palabras (W0…W63W_0 \dots W_{63}) utilizando funciones de rotación y desplazamiento de bits.

Modelo mental: La fórmula de expansión de SHA-256

Para cualquier índice i≥16i \ge 16:

Wi=sigma1(Wi−2)+Wi−7+sigma0(Wi−15)+Wi−16pmod232W_i = sigma_1(W_{i-2}) + W_{i-7} + sigma_0(W_{i-15}) + W_{i-16} pmod{2^{32}}

Donde las funciones auxiliares se definen con rotaciones hacia la derecha (ROTR) y desplazamientos lógicos (SHR):

  • sigma0(x)=ROTR7(x)⊕ROTR18(x)⊕SHR3(x)sigma_0(x) = \text{ROTR}^7(x) \oplus \text{ROTR}^{18}(x) \oplus \text{SHR}^3(x)
  • sigma1(x)=ROTR17(x)⊕ROTR19(x)⊕SHR10(x)sigma_1(x) = \text{ROTR}^{17}(x) \oplus \text{ROTR}^{19}(x) \oplus \text{SHR}^{10}(x) Todas las sumas son módulo 2322^{32} (usando (a + b) >>> 0).

Tu objetivo en esta etapa

Leer por stdin un JSON con op: "schedule-word", la lista de palabras anteriores words y el index ii a calcular (i≥16i \ge 16). Devolver el valor de la palabra calculada WiW_i en word.

Formato de Entrada

json
{
  "op": "schedule-word",
  "words": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24],
  "index": 16
}

Formato de Salida

json
{
  "word": 0
}

Qué debes hacer paso a paso

  1. Implementa ROTR y SHR para 32 bits:
    • ROTR(x, n) = ((x >>> n) | (x << (32 - n))) >>> 0
    • SHR(x, n) = (x >>> n)
  2. Implementa sigma0(x)sigma_0(x) y sigma1(x)sigma_1(x):
    • s0(x) = (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)) >>> 0
    • s1(x) = (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)) >>> 0
  3. Calcula WiW_i:
    • Toma Wi−2,Wi−7,Wi−15,Wi−16W_{i-2}, W_{i-7}, W_{i-15}, W_{i-16} de words.
    • Suma: (s1(w_im2) + w_im7 + s0(w_im15) + w_im16) >>> 0.
  4. Emite la salida: Escribe {"word": resultado} en stdout.

Criterios de aceptación

  • ✅ Implementa con exactitud las funciones sigma0sigma_0 y sigma1sigma_1.
  • ✅ Realiza aritmética módulo 2322^{32}.

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.