/**
   * 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;
  }