HOME

TheInfoList



OR:

One-key MAC (OMAC) is a family of message authentication codes constructed from a block cipher much like the CBC-MAC algorithm. It may be used to provide assurance of the authenticity and, hence, the integrity of data. Two versions are defined: * The original OMAC of February 2003, which is rarely used. The preferred name is now "OMAC2". * The OMAC1 refinement, which became an NIST recommendation in May 2005 under the name CMAC. OMAC is free for all uses: it is not covered by any patents.


History

The core of the CMAC algorithm is a variation of CBC-MAC that Black and Rogaway proposed and analyzed under the name "XCBC" and submitted to NIST. The XCBC algorithm efficiently addresses the security deficiencies of CBC-MAC, but requires three keys. Iwata and Kurosawa proposed an improvement of XCBC that requires less key material (just one key) and named the resulting algorithm ''One-Key CBC-MAC'' (OMAC) in their papers. They later submitted the OMAC1 (= CMAC), a refinement of OMAC, and additional security analysis.


Algorithm

To generate an -bit CMAC tag (''t'') of a message (''m'') using a ''b''-bit block cipher (''E'') and a secret key (''k''), one first generates two ''b''-bit sub-keys (''k''1 and ''k''2) using the following algorithm (this is equivalent to multiplication by ''x'' and ''x''2 in a
finite field In mathematics, a finite field or Galois field (so-named in honor of Évariste Galois) is a field (mathematics), field that contains a finite number of Element (mathematics), elements. As with any field, a finite field is a Set (mathematics), s ...
GF(2''b'')). Let ≪ denote the standard left-shift operator and ⊕ denote bit-wise exclusive or: # Calculate a temporary value ''k''0 = ''Ek''(0). # If msb(''k''0) = 0, then ''k''1 = ''k''0 ≪ 1, else ''k''1 = (''k''0 ≪ 1) ⊕ ''C''; where ''C'' is a certain constant that depends only on ''b''. (Specifically, ''C'' is the non-leading coefficients of the lexicographically first irreducible degree-''b'' binary polynomial with the minimal number of ones: for 64-bit, for 128-bit, and for 256-bit blocks.) # If , then , else . # Return keys (''k''1, ''k''2) for the MAC generation process. As a small example, suppose , , and . Then and . The CMAC tag generation process is as follows: # Divide message into ''b''-bit blocks , where ''m''1, ..., ''m''''n''−1 are complete blocks. (The empty message is treated as one incomplete block.) # If ''mn'' is a complete block then else . # Let . # For , calculate . # # Output . The verification process is as follows: # Use the above algorithm to generate the tag. # Check that the generated tag is equal to the received tag.


Variants

CMAC-C1 is a variant of CMAC that provides additional commitment and context-discovery security guarantees.


Implementations

* Python implementation: see the usage of the AES_CMAC() function in
impacket/blob/master/tests/misc/test_crypto.py
, and its definition in
impacket/blob/master/impacket/crypto.py
* Ruby implementation


References


External links

* The AES-CMAC Algorithm * The AES-CMAC-96 Algorithm and Its Use with IPsec * The Advanced Encryption Standard-Cipher-based Message Authentication Code-Pseudo-Random Function-128 (AES-CMAC-PRF-128) * OMA
Online Test



Rust implementation
{{Cryptography navbox , hash Message authentication codes Finite fields