/** * MAC1 as described in the IEEE P1363 standard. It computes a HMAC message authentication code * tag from secret key KB and message M. */ public static int[] MAC1(int[] K, int[] M) { int[] HH = new int[0]; try { int i; int[] KK; MessageDigest sha = MessageDigest.getInstance("SHA"); // SHA1 Blocksize B = 512 if (K.length > (8 * 512)) { sha.update(Utils.toByteArray(K)); // kkLen = 20 octets, 160 bits KK = Utils.revIntArray(Utils.toIntArray(sha.digest())); } else KK = K; int[] P = new int[512 - KK.length]; for (i = 0; i < P.length; i++) { P[i] = 0; } int[] K0 = Utils.concatenate(KK, P); int[] iPad = new int[512]; for (i = 0; i < iPad.length; i++) { iPad[i] = 0x36; } int[] oPad = new int[512]; for (i = 0; i < oPad.length; i++) { oPad[i] = 0x54; } sha.reset(); sha.update(Utils.toByteArray(Utils.concatenate(Utils.xor(K0, iPad), M))); int[] H = Utils.revIntArray(Utils.toIntArray(sha.digest())); sha.reset(); sha.update(Utils.toByteArray(Utils.concatenate(Utils.xor(K0, oPad), H))); HH = Utils.revIntArray(Utils.toIntArray(sha.digest())); } catch (NoSuchAlgorithmException e) { } return HH; }