title: OMAC/CMAC
text: # OMAC/CMAC
  
  OMAC è un codice di autenticazione per messaggi basato su cifratura a blocchi, progettato da Tetsu Iwata e Kaoru Kurosawa della Nagoya University; si tratta di una semplice variante del CBC-MAC (Cipher Block Chaining Message Authentication Code). L'acronimo OMAC sta per One-Key CBC-MAC.
  
  È sicuro per messaggi di qualsiasi lunghezza, a differenza di CBC-MAC, che lo è soltanto per messaggi di lunghezza fissa.
  
  OMAC è il nome generico per OMAC1 e OMAC2. Secondo le specifiche del NIST, OMAC1 è equivalente a CMAC.
  
  ## OMAC1
  
  Le operazioni preliminari sono la scelta di un algoritmo di crittografia a blocchi $E$ (indicheremo con n la lunghezza in bit del blocco) e della lunghezza del codice CMAC $t$. Non ci sono restrizioni sull'algoritmo crittografico da utilizzare.
  
  Occorre, inoltre, che i due interlocutori condividano una chiave segreta di $k$ bit che servirà come chiave per l'algoritmo $E$ precedentemente selezionato.
  
  ### Pre-processing
  
  A questo punto il processo di generazione si articola nei seguenti passi:
  
  * Per prima cosa si cripta un blocco di n bit tutti pari a 0 (chiamiamolo 0n) ottenendo un certo valore $L=E\ (K,\ 0n)$.
  * Si controlla se il bit più significativo di L è 0: se ciò accade si effettua uno shift di un bit nella direzione del bit più significativo. Il bit più significativo viene, quindi, scartato ed uno 0 viene posto nel bit meno significativo. Chiameremo il risultato $L.u$. Quindi $L.u\ =L<<1$, che equivale a quanto detto prima. In caso contrario $L.u=L<<1\oplus Costante$, dove $Costante$ is the n-bit constant.
  * Si controlla il bit più significativo di $L.u$. Se è pari a 0 allora $L.u^{2}=\ (L.u)<<1$, diversamente $L.u^{2}=\ ((L.u)<<1)\oplus Costante$.
  * A questo punto si memorizzano sia $L.u$ che $L.u^{2}$.
  
  ### Generazione del codice MAC
  
  Sia M il messaggio. Si suddivide il messaggio M in blocchi di n bit.
  
  * $Y[0]=0^{n}$, che significa riempire Y[0] con un numero n di 0.
  * Per ogni i da 1 a m-1: $Y[i]=E(K,M[i]\oplus Y[i-1])$.
  * Se la lunghezza dell'ultimo blocco del messaggio è di n bit allora $X[m]=M[m]\oplus Y[m-1]\oplus L.u$, altrimenti effettua il padding sull'ultimo blocco aggiungendo 1 seguito da tanti 0 quanti sono necessari a ricondurre il blocco ad una lunghezza di n bit e poi calcola $X[m]=M[m]\oplus Y[m-1]\oplus L.u^{2}$.
  * $T\ =E(K,X[m])$.
  * Il codice MAC sarà il troncamento di T a t bit.
  