@@ -362,11 +362,12 @@ public void writeKtab(String tab, boolean append, String... names)
362362 name .indexOf ('/' ) < 0 ?
363363 PrincipalName .KRB_NT_UNKNOWN :
364364 PrincipalName .KRB_NT_SRV_HST );
365- ktab .addEntry (pn ,
366- getSalt (pn ),
367- pass ,
368- kvno ,
369- true );
365+ int [] etypes = EType .getDefaults ("default_tkt_enctypes" );
366+ EncryptionKey [] keys = new EncryptionKey [etypes .length ];
367+ for (int i = 0 ; i < etypes .length ; i ++) {
368+ keys [i ] = keyForUser (pn , etypes [i ], false );
369+ }
370+ ktab .addEntry (pn , keys , kvno , true );
370371 } else {
371372 nativeKdc .ktadd (name , tab );
372373 }
@@ -667,10 +668,7 @@ private static EncryptionKey generateRandomKey(int eType)
667668 */
668669 private char [] getPassword (PrincipalName p , boolean server )
669670 throws KrbException {
670- String pn = p .toString ();
671- if (p .getRealmString () == null ) {
672- pn = pn + "@" + getRealm ();
673- }
671+ String pn = nameOf (p );
674672 char [] pass = passwords .get (pn );
675673 if (pass == null ) {
676674 throw new KrbException (server ?
@@ -686,10 +684,7 @@ private char[] getPassword(PrincipalName p, boolean server)
686684 * @return the salt
687685 */
688686 protected String getSalt (PrincipalName p ) {
689- String pn = p .toString ();
690- if (p .getRealmString () == null ) {
691- pn = pn + "@" + getRealm ();
692- }
687+ String pn = nameOf (p );
693688 if (salts .containsKey (pn )) {
694689 return salts .get (pn );
695690 }
@@ -721,10 +716,7 @@ protected byte[] getParams(PrincipalName p, int etype) {
721716 case EncryptedData .ETYPE_AES256_CTS_HMAC_SHA1_96 :
722717 case EncryptedData .ETYPE_AES128_CTS_HMAC_SHA256_128 :
723718 case EncryptedData .ETYPE_AES256_CTS_HMAC_SHA384_192 :
724- String pn = p .toString ();
725- if (p .getRealmString () == null ) {
726- pn = pn + "@" + getRealm ();
727- }
719+ String pn = nameOf (p );
728720 if (s2kparamses .containsKey (pn )) {
729721 return s2kparamses .get (pn );
730722 }
@@ -738,6 +730,23 @@ protected byte[] getParams(PrincipalName p, int etype) {
738730 }
739731 }
740732
733+ /**
734+ * Returns the name of a PrincipalName inside KDC dbs.
735+ * @param p the principal name
736+ * @return the name
737+ */
738+ private String nameOf (PrincipalName p ) {
739+ String pn = p .toString ();
740+ if (p .getRealmString () == null ) {
741+ pn = pn + "@" + getRealm ();
742+ }
743+ if (pn .startsWith ("krbtgt/" )) {
744+ // We always register krbtgt using REALM
745+ pn = "krbtgt/" + pn .substring (7 ).toUpperCase (Locale .ROOT );
746+ }
747+ return pn ;
748+ }
749+
741750 /**
742751 * Returns the key for a given principal of the given encryption type
743752 * @param p the principal
0 commit comments