# MAC d'una clau

MAC d'una clau (OMAC) és una família de codis d'autenticació de missatges construïts a partir d'un xifrat de blocs semblant a l'algorisme CBC-MAC. Es pot utilitzar per garantir l'autenticitat i, per tant, la integritat de les dades. Es defineixen dues versions:
* L'OMAC original de febrer de 2003, que s'utilitza poques vegades. El nom preferit és ara "OMAC2".
* El refinament OMAC1, que es va convertir en una recomanació del NIST el maig de 2005 sota el nom de CMAC.
OMAC és gratuït per a tots els usos: no està cobert per cap patent.

## Història

El nucli de l'algoritme CMAC és una variació de CBC-MAC que Black i Rogaway van proposar i analitzar amb el nom de "XCBC" i presentada al NIST. L'algorisme XCBC aborda de manera eficient les deficiències de seguretat de CBC-MAC, però requereix tres claus.
Iwata i Kurosawa van proposar una millora de XCBC que requereix menys material clau (només una clau) i van anomenar l'algorisme resultant One-Key CBC-MAC (OMAC) als seus articles. Més tard van presentar l'OMAC1 (=CMAC), un perfeccionament de l'OMAC i una anàlisi de seguretat addicional.

## Algorisme

Per generar una etiqueta CMAC de ℓ-bit (t) d'un missatge (m) utilitzant un xifratge de bloc de bits b(E) i una clau secreta (k), primer genera dues subclaus de bits b (k$_1$ i k$_2$) utilitzant el següent algorisme (això és equivalent a la multiplicació per x i x$^2$ en un camp finit GF(2$^b$)). Sigui ≪ l'operador estàndard de desplaçament a l'esquerra i ⊕ l'exclusiu per bits o:
* Calcula un valor temporal k $_0$ = E $_k$ (0).
* Si msb( k $_0$ ) = 0, aleshores k $_1$ = k $_0$ ≪ 1, sinó k $_1$ = ( k $_0$ ≪ 1) ⊕ C ; on C és una certa constant que només depèn de b. (Concretament, C són els coeficients no líders del primer polinomi binari de grau b irreductible lexicogràficament amb el nombre mínim d'uns: 0x1B per a blocs de 64 bits, 0x87 per a blocs de 128 bits i 0x425 per a blocs de 256 bits.)
* Si msb(k$_1$) = 0, aleshores k$_2$ = k$_1$ ≪ 1, sinó k$_2$ = (k$_1$ ≪ 1) ⊕ C.
* Retorna claus ( k $_1$, k $_2$ ) per al procés de generació MAC.
Com a petit exemple, suposem b = 4, C = 0011$_2$ i k$_0$ = E$_k$(0) = 0101$_2$. Aleshores k$_1$ = 1010$_2$ i k$_2$ = 0100 ⊕ 0011 = 0111$_2$.

## Implementacions

* Implementació de Python: vegeu l'ús de la funció AES_CMAC a " impacket/blob/master/tests/misc/test_crypto.py " i la seva definició a " impacket/blob/master/impacket/crypto.py "
* Implementació de Ruby

## Referències

* ↑ Rogaway, Phillip. «CMAC: Non-licensing» (en anglès). [Consulta: May 27, 2020].
* ↑ Black, John. Advances in Cryptology – CRYPTO 2000 (en anglès). Springer, Berlin, Heidelberg, 2000-08-20, p. 197–215. DOI 10.1007/3-540-44598-6_12. ISBN 978-3540445982.
* ↑ Black, J; Rogaway, P "Recommendation for Block Cipher Modes of Operation: The CMAC Mode for Authentication".
* ↑ Iwata, Tetsu. «OMAC: One-Key CBC MAC». A: Fast Software Encryption (en anglès). 2887. Springer, Berlin, Heidelberg, 2003-02-24, p. 129–153 (Lecture Notes in Computer Science). DOI 10.1007/978-3-540-39887-5_11. ISBN 978-3-540-20449-7.
* ↑ Iwata, Tetsu; Kurosawa, Kaoru Advances in Cryptology, 2003. «In this note, we propose OMAC1, a new choice of the parameters of OMAC-family (see [4] for the details). Test vectors are also presented. Accordingly, we rename the previous OMAC as OMAC2. (That is to say, test vectors for OMAC2 were already shown in [3].) We use OMAC as a generic name for OMAC1 and OMAC2.»
* ↑ Iwata, Tetsu. «Stronger Security Bounds for OMAC, TMAC, and XCBC». A: Johansson. Progress in Cryptology - INDOCRYPT 2003 (en anglès). 2904. Springer Berlin Heidelberg, 2003-12-08, p. 402–415 (Lecture Notes in Computer Science). DOI 10.1007/978-3-540-24582-7_30. ISBN 9783540206095.