/**
   * Remove all the keys of the specified principal in the specified keytab file.
   *
   * @param keytabFile The keytab file
   * @param principalName The principal name
   * @throws KrbException
   */
  static void removeKeytabEntriesOf(File keytabFile, String principalName) throws KrbException {
    Keytab keytab = loadKeytab(keytabFile);

    keytab.removeKeytabEntries(new PrincipalName(principalName));

    storeKeytab(keytab, keytabFile);
  }
  @Test
  public void testKeytab() {
    assertThat(keytab).isNotNull();

    List<PrincipalName> principals = keytab.getPrincipals();
    PrincipalName principal = principals.get(0);
    List<KeytabEntry> entries = keytab.getKeytabEntries(principal);
    for (KeytabEntry ke : entries) {
      assertThat(ke.getKvno() == 1).isTrue();
    }
  }
 /**
  * Store the keytab to keytab file.
  *
  * @param keytab The keytab
  * @param keytabFile The keytab file
  * @throws KrbException
  */
 static void storeKeytab(Keytab keytab, File keytabFile) throws KrbException {
   try {
     keytab.store(keytabFile);
   } catch (IOException e) {
     throw new KrbException("Failed to store keytab", e);
   }
 }
  /**
   * Load keytab from keytab file.
   *
   * @param keytabFile The keytab file
   * @return The keytab load from keytab file
   * @throws KrbException
   */
  static Keytab loadKeytab(File keytabFile) throws KrbException {
    Keytab keytab;
    try {
      keytab = Keytab.loadKeytab(keytabFile);
    } catch (IOException e) {
      throw new KrbException("Failed to load keytab", e);
    }

    return keytab;
  }
  /**
   * Remove all the old keys of the specified principal in the specified keytab file.
   *
   * @param keytabFile The keytab file
   * @param principalName The principal name
   * @throws KrbException
   */
  static void removeOldKeytabEntriesOf(File keytabFile, String principalName) throws KrbException {
    Keytab keytab = loadKeytab(keytabFile);

    List<KeytabEntry> entries = keytab.getKeytabEntries(new PrincipalName(principalName));

    int maxKvno = 0;
    for (KeytabEntry entry : entries) {
      if (maxKvno < entry.getKvno()) {
        maxKvno = entry.getKvno();
      }
    }

    for (KeytabEntry entry : entries) {
      if (entry.getKvno() < maxKvno) {
        keytab.removeKeytabEntry(entry);
      }
    }

    storeKeytab(keytab, keytabFile);
  }
  /**
   * Export all the keys of the specified identity into the keytab.
   *
   * @param keytab The keytab
   * @param identity The identity
   * @throws KrbException
   */
  static void exportToKeytab(Keytab keytab, KrbIdentity identity) throws KrbException {

    // Add principal to keytab.
    PrincipalName principal = identity.getPrincipal();
    KerberosTime timestamp = KerberosTime.now();
    for (EncryptionType encType : identity.getKeys().keySet()) {
      EncryptionKey ekey = identity.getKeys().get(encType);
      int keyVersion = ekey.getKvno();
      keytab.addEntry(new KeytabEntry(principal, timestamp, keyVersion, ekey));
    }
  }
  /**
   * If keytab file does not exist, create a new keytab, otherwise load keytab from keytab file.
   *
   * @param keytabFile The keytab file
   * @return The keytab load from keytab file
   * @throws KrbException
   */
  static Keytab createOrLoadKeytab(File keytabFile) throws KrbException {

    Keytab keytab;
    try {
      if (!keytabFile.exists()) {
        if (!keytabFile.createNewFile()) {
          throw new KrbException("Failed to create keytab file " + keytabFile.getAbsolutePath());
        }
        keytab = new Keytab();
      } else {
        keytab = Keytab.loadKeytab(keytabFile);
      }
    } catch (IOException e) {
      throw new KrbException("Failed to load or create keytab", e);
    }

    return keytab;
  }
 public static void main(String[] args) throws IOException {
   InputStream kis = KeytabTest.class.getResourceAsStream("test.keytab");
   Keytab keytab = Keytab.loadKeytab(kis);
   System.out.println("Principals:" + keytab.getPrincipals().size());
 }
 @Before
 public void setUp() throws IOException {
   InputStream kis = KeytabTest.class.getResourceAsStream("/test.keytab");
   keytab = Keytab.loadKeytab(kis);
 }