@@ -366,11 +366,12 @@ public void writeKtab(String tab, boolean append, String... names)
366366 name .indexOf ('/' ) < 0 ?
367367 PrincipalName .KRB_NT_UNKNOWN :
368368 PrincipalName .KRB_NT_SRV_HST );
369- ktab .addEntry (pn ,
370- getSalt (pn ),
371- pass ,
372- kvno ,
373- true );
369+ int [] etypes = EType .getDefaults ("default_tkt_enctypes" );
370+ EncryptionKey [] keys = new EncryptionKey [etypes .length ];
371+ for (int i = 0 ; i < etypes .length ; i ++) {
372+ keys [i ] = keyForUser (pn , etypes [i ], false );
373+ }
374+ ktab .addEntry (pn , keys , kvno , true );
374375 } else {
375376 nativeKdc .ktadd (name , tab );
376377 }
@@ -671,10 +672,7 @@ private static EncryptionKey generateRandomKey(int eType)
671672 */
672673 private char [] getPassword (PrincipalName p , boolean server )
673674 throws KrbException {
674- String pn = p .toString ();
675- if (p .getRealmString () == null ) {
676- pn = pn + "@" + getRealm ();
677- }
675+ String pn = nameOf (p );
678676 char [] pass = passwords .get (pn );
679677 if (pass == null ) {
680678 throw new KrbException (server ?
@@ -690,10 +688,7 @@ private char[] getPassword(PrincipalName p, boolean server)
690688 * @return the salt
691689 */
692690 protected String getSalt (PrincipalName p ) {
693- String pn = p .toString ();
694- if (p .getRealmString () == null ) {
695- pn = pn + "@" + getRealm ();
696- }
691+ String pn = nameOf (p );
697692 if (salts .containsKey (pn )) {
698693 return salts .get (pn );
699694 }
@@ -725,10 +720,7 @@ protected byte[] getParams(PrincipalName p, int etype) {
725720 case EncryptedData .ETYPE_AES256_CTS_HMAC_SHA1_96 :
726721 case EncryptedData .ETYPE_AES128_CTS_HMAC_SHA256_128 :
727722 case EncryptedData .ETYPE_AES256_CTS_HMAC_SHA384_192 :
728- String pn = p .toString ();
729- if (p .getRealmString () == null ) {
730- pn = pn + "@" + getRealm ();
731- }
723+ String pn = nameOf (p );
732724 if (s2kparamses .containsKey (pn )) {
733725 return s2kparamses .get (pn );
734726 }
@@ -742,6 +734,23 @@ protected byte[] getParams(PrincipalName p, int etype) {
742734 }
743735 }
744736
737+ /**
738+ * Returns the name of a PrincipalName inside KDC dbs.
739+ * @param p the principal name
740+ * @return the name
741+ */
742+ private String nameOf (PrincipalName p ) {
743+ String pn = p .toString ();
744+ if (p .getRealmString () == null ) {
745+ pn = pn + "@" + getRealm ();
746+ }
747+ if (pn .startsWith ("krbtgt/" )) {
748+ // We always register krbtgt using REALM
749+ pn = "krbtgt/" + pn .substring (7 ).toUpperCase (Locale .ROOT );
750+ }
751+ return pn ;
752+ }
753+
745754 /**
746755 * Returns the key for a given principal of the given encryption type
747756 * @param p the principal
0 commit comments