package org.zz.gmhelper.test; import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; import org.junit.Assert; import org.junit.Test; import org.zz.gmhelper.SM4Util; import java.util.Arrays; public class SM4UtilTest extends GMBaseTest { @Test public void testEncryptAndDecrypt() { try { byte[] key = SM4Util.generateKey(); byte[] iv = SM4Util.generateKey(); byte[] cipherText = null; byte[] decryptedData = null; cipherText = SM4Util.encrypt_ECB_NoPadding(key, SRC_DATA_16B); System.out.println("SM4 ECB NoPadding encrypt result:\n" + Arrays.toString(cipherText)); decryptedData = SM4Util.decrypt_ECB_NoPadding(key, cipherText); System.out.println("SM4 ECB NoPadding decrypt result:\n" + Arrays.toString(decryptedData)); if (!Arrays.equals(decryptedData, SRC_DATA_16B)) { Assert.fail(); } cipherText = SM4Util.encrypt_ECB_Padding(key, SRC_DATA); System.out.println("SM4 ECB Padding encrypt result:\n" + Arrays.toString(cipherText)); decryptedData = SM4Util.decrypt_ECB_Padding(key, cipherText); System.out.println("SM4 ECB Padding decrypt result:\n" + Arrays.toString(decryptedData)); if (!Arrays.equals(decryptedData, SRC_DATA)) { Assert.fail(); } cipherText = SM4Util.encrypt_CBC_Padding(key, iv, SRC_DATA); System.out.println("SM4 CBC Padding encrypt result:\n" + Arrays.toString(cipherText)); decryptedData = SM4Util.decrypt_CBC_Padding(key, iv, cipherText); System.out.println("SM4 CBC Padding decrypt result:\n" + Arrays.toString(decryptedData)); if (!Arrays.equals(decryptedData, SRC_DATA)) { Assert.fail(); } cipherText = SM4Util.encrypt_CBC_NoPadding(key, iv, SRC_DATA_16B); System.out.println("SM4 CBC NoPadding encrypt result:\n" + Arrays.toString(cipherText)); decryptedData = SM4Util.decrypt_CBC_NoPadding(key, iv, cipherText); System.out.println("SM4 CBC NoPadding decrypt result:\n" + Arrays.toString(decryptedData)); if (!Arrays.equals(decryptedData, SRC_DATA_16B)) { Assert.fail(); } } catch (Exception ex) { ex.printStackTrace(); Assert.fail(); } } @Test public void testMac() throws Exception { byte[] key = SM4Util.generateKey(); byte[] iv = SM4Util.generateKey(); byte[] mac = SM4Util.doCMac(key, SRC_DATA_24B); System.out.println("CMAC:\n" + ByteUtils.toHexString(mac).toUpperCase()); mac = SM4Util.doGMac(key, iv, 16, SRC_DATA_24B); System.out.println("GMAC:\n" + ByteUtils.toHexString(mac).toUpperCase()); byte[] cipher = SM4Util.encrypt_CBC_NoPadding(key, iv, SRC_DATA_32B); byte[] cipherLast16 = Arrays.copyOfRange(cipher, cipher.length - 16, cipher.length); mac = SM4Util.doCBCMac(key, iv, null, SRC_DATA_32B); if (!Arrays.equals(cipherLast16, mac)) { Assert.fail(); } System.out.println("CBCMAC:\n" + ByteUtils.toHexString(mac).toUpperCase()); cipher = SM4Util.encrypt_CBC_Padding(key, iv, SRC_DATA_32B); cipherLast16 = Arrays.copyOfRange(cipher, cipher.length - 16, cipher.length); mac = SM4Util.doCBCMac(key, iv, SRC_DATA_32B); if (!Arrays.equals(cipherLast16, mac)) { Assert.fail(); } System.out.println("CBCMAC:\n" + ByteUtils.toHexString(mac).toUpperCase()); } }