Passa al contenuto principale

5.2.6 Sign (Firma)

5.2.6 Sign (Firma)

Gli ingressi della procedura di firma sono la chiave privata, una stringa di 57 ottetti, un flag F che vale 0 per Ed448 e 1 per Ed448ph, un contesto C di al più 255 ottetti, e un messaggio M di dimensione arbitraria.

  1. Applicare SHAKE256(x, 114) alla chiave privata di 57 ottetti. Sia h il digest risultante. Costruire lo scalare segreto s dalla prima metà del digest e la chiave pubblica A corrispondente, come descritto nella sezione precedente. Sia prefix la seconda metà del digest di hash, h[57],...,h[113].

  2. Calcolare SHAKE256(dom4(F, C) || prefix || PH(M), 114), dove M è il messaggio da firmare, F è 1 per Ed448ph e 0 per Ed448, e C è il contesto da usare. Interpretare il digest di 114 ottetti come intero little-endian r.

  3. Calcolare il punto [r]B. Per efficienza, ridurre prima r modulo L, l'ordine del gruppo di B. Sia R la stringa che codifica tale punto.

  4. Calcolare SHAKE256(dom4(F, C) || R || A || PH(M), 114) e interpretare il digest di 114 ottetti come intero little-endian k.

  5. Calcolare S = (r + k * s) mod L. Per efficienza, ridurre di nuovo prima k modulo L.

  6. Formare la firma come concatenazione di R (57 ottetti) e della codifica little-endian di S (57 ottetti; i dieci bit più significativi degli ottetti finali sono sempre zero).