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):
-
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.
-
Sia mHash = Hash(M), una stringa di ottetti di lunghezza hLen.
-
Se emLen < hLen + sLen + 2, restituire "encoding error" e fermarsi.
-
Generare una stringa di ottetti casuale salt di lunghezza sLen.
-
Sia M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt ; M' è una stringa di ottetti di lunghezza 8 + hLen + sLen.
-
Sia H = Hash(M'), una stringa di ottetti di lunghezza hLen.
-
Generare una stringa di ottetti PS composta da emLen - sLen - hLen - 2 ottetti zero.
-
Sia DB = PS || 0x01 || salt ; DB è una stringa di ottetti di lunghezza emLen - hLen - 1.
-
Sia dbMask = MGF(H, emLen - hLen - 1).
-
Sia maskedDB = DB ⊕ dbMask.
-
Impostare i 8emLen - emBits bit più a sinistra di maskedDB a zero.
-
Sia EM = maskedDB || H || 0xbc.
-
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):
-
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.
-
Utilizzando la tecnica della nota nella Sezione 9.2, codificare il valore DigestInfo come T per la funzione hash.
-
Se emLen < tLen + 11, restituire "intended encoded message length too short" e fermarsi.
-
Generare una stringa di ottetti PS composta da emLen - tLen - 3 ottetti di valore 0xff.
-
Concatenare PS e altri padding per formare il messaggio codificato EM: EM = 0x00 || 0x01 || PS || 0x00 || T
-
Restituire EM.