Passa al contenuto principale

9. Metodi di codifica per firme con appendice (Encoding Methods for Signatures with Appendix)

I metodi di codifica sono utilizzati per convertire un messaggio in un messaggio codificato, che può poi essere firmato dalle primitive di firma RSA. Questa sezione specifica due metodi di codifica: EMSA-PSS e EMSA-PKCS1-v1_5.

9.1. EMSA-PSS

EMSA-PSS (Encoding Method for Signatures with Appendix - Probabilistic Signature Scheme) è un metodo di codifica probabilistico che contiene casualità, e quindi può generare più messaggi codificati diversi per un dato messaggio.

9.1.1. Operazione di codifica (Encoding Operation)

EMSA-PSS-ENCODE (M, emBits)

Input (Input):

  • M: messaggio da codificare, una stringa di ottetti di lunghezza arbitraria
  • emBits: lunghezza massima in bit del messaggio codificato, almeno 8hLen + 8sLen + 9

Output (Output):

  • EM: messaggio codificato, una stringa di ottetti di lunghezza emLen = ⌈emBits/8⌉

Passi (Steps):

  1. Se la lunghezza di M è maggiore del limite di input della funzione hash Hash (2^61 - 1 ottetti per SHA-1), restituire "message too long" e fermarsi.

  2. Sia mHash = Hash(M), una stringa di ottetti di lunghezza hLen.

  3. Se emLen < hLen + sLen + 2, restituire "encoding error" e fermarsi.

  4. Generare una stringa di ottetti casuale salt di lunghezza sLen.

  5. Sia M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt ; M' è una stringa di ottetti di lunghezza 8 + hLen + sLen.

  6. Sia H = Hash(M'), una stringa di ottetti di lunghezza hLen.

  7. Generare una stringa di ottetti PS composta da emLen - sLen - hLen - 2 ottetti zero.

  8. Sia DB = PS || 0x01 || salt ; DB è una stringa di ottetti di lunghezza emLen - hLen - 1.

  9. Sia dbMask = MGF(H, emLen - hLen - 1).

  10. Sia maskedDB = DB ⊕ dbMask.

  11. Impostare i 8emLen - emBits bit più a sinistra di maskedDB a zero.

  12. Sia EM = maskedDB || H || 0xbc.

  13. Restituire EM.

9.1.2. Operazione di verifica (Verification Operation)

EMSA-PSS-VERIFY (M, EM, emBits)

Input (Input):

  • M: messaggio, una stringa di ottetti di lunghezza arbitraria
  • EM: messaggio codificato da verificare, una stringa di ottetti di lunghezza emLen = ⌈emBits/8⌉
  • emBits: lunghezza massima in bit del messaggio codificato

Output (Output):

  • "consistent" (coerente) o "inconsistent" (incoerente)

Passi: (I passi di verifica sono l'inverso dei passi di codifica, verificando tutti i vincoli)

9.2. EMSA-PKCS1-v1_5

EMSA-PKCS1-v1_5 (Encoding Method for Signatures with Appendix - PKCS #1 v1.5) è un metodo di codifica deterministico che genera sempre lo stesso messaggio codificato per un dato messaggio.

EMSA-PKCS1-v1_5-ENCODE (M, emLen)

Input (Input):

  • M: messaggio da codificare, una stringa di ottetti di lunghezza arbitraria
  • emLen: lunghezza attesa del messaggio codificato (in ottetti), almeno tLen + 11, dove tLen è la lunghezza in ottetti del valore DigestInfo

Output (Output):

  • EM: messaggio codificato, una stringa di ottetti di lunghezza emLen

Passi (Steps):

  1. Applicare la funzione hash al messaggio M per generare il valore hash H: H = Hash(M). Se la funzione hash restituisce "message too long", restituire "message too long" e fermarsi.

  2. Utilizzando la tecnica della nota nella Sezione 9.2, codificare il valore DigestInfo come T per la funzione hash.

  3. Se emLen < tLen + 11, restituire "intended encoded message length too short" e fermarsi.

  4. Generare una stringa di ottetti PS composta da emLen - tLen - 3 ottetti di valore 0xff.

  5. Concatenare PS e altri padding per formare il messaggio codificato EM: EM = 0x00 || 0x01 || PS || 0x00 || T

  6. Restituire EM.