# Using GMAC for Authentication without encrypting the message

I am pretty new to cryptography and have a sample of GCM mode of operation for AES.
PFB the code

    Cipher c = Cipher.getInstance ("AES/GCM/NoPadding");
final int blockSize = 96;//c.getBlockSize();
final byte[] ivData = new byte[blockSize];
System.out.println("IV :- "+new String(ivData) );
final SecureRandom rnd = SecureRandom.getInstance("SHA1PRNG");
rnd.nextBytes(ivData);
System.out.println("IV :- "+new String(ivData) );
/**
*
*/
GCMParameterSpec params = new GCMParameterSpec(blockSize , ivData);
SecureRandom sr = new SecureRandom();
byte[] aesKey = MessageDigest.getInstance("MD5").digest(
"som3C0o7p@s5".getBytes());
byte[] ciphertext;
byte[] data = "Data to encrypt".getBytes();
sr.nextBytes(aesKey);
SecretKeySpec sks = new SecretKeySpec(aesKey, "AES");
c.init(Cipher.ENCRYPT_MODE, sks, params);
ciphertext = c.doFinal(data);
System.out.println("done   "+ new String(ciphertext));

c.init(Cipher.DECRYPT_MODE, sks, params);

ciphertext = c.doFinal(ciphertext);
System.out.println("done   "+ new String(ciphertext));


But I need to do Authentication using GMAC. How do I do authentication using GMAC without encrypting/decrypting? Any pointers or suggestions will be very helpful.

-
How about passing empty data to c.doFinal(data); ? –  Dmitry Yanushkevich Jul 16 '14 at 13:51
But how do i specify to use GMAC.Will it be used automactically –  Manu Jul 16 '14 at 13:59
Yes. GCM assumes GMAC, if I understand this correctly. Too bad official docs don't say much on this. –  Dmitry Yanushkevich Jul 16 '14 at 14:25
GMAC is just GCM with a empty "message to be encrypted" –  poncho Jul 16 '14 at 14:30
The "additional associated data"; that's the part of the data which is used to compute the tag, but is not encrypted. –  poncho Jul 16 '14 at 15:02

GMAC is quite simply GCM mode where all data is supplied as AAD (or additional authenticated data), or as NIST SP 800-38D puts it:

If the GCM input is restricted to data that is not to be encrypted, the resulting specialization of GCM, called GMAC, is simply an authentication mode on the input data.

If you don't have access to a cryptographic provider that supports GMAC directly (e.g. Bouncy Castle provides a AES-GMAC JCE Mac) you can simply use any AES/GCM implementation by providing all data as AAD, and an empty message for encryption.

... as for AES/GCM ...

If you need to be certain you're getting it right, the GCM/GMAC test vectors from the NIST CAVP page can be used (everything with a PTlen = 0 is a GMAC test vector).