@@ -351,11 +351,12 @@ public void writeKtab(String tab, boolean append, String... names)
351351 name .indexOf ('/' ) < 0 ?
352352 PrincipalName .KRB_NT_UNKNOWN :
353353 PrincipalName .KRB_NT_SRV_HST );
354- ktab .addEntry (pn ,
355- getSalt (pn ),
356- pass ,
357- kvno ,
358- true );
354+ int [] etypes = EType .getDefaults ("default_tkt_enctypes" );
355+ EncryptionKey [] keys = new EncryptionKey [etypes .length ];
356+ for (int i = 0 ; i < etypes .length ; i ++) {
357+ keys [i ] = keyForUser (pn , etypes [i ], false );
358+ }
359+ ktab .addEntry (pn , keys , kvno , true );
359360 } else {
360361 nativeKdc .ktadd (name , tab );
361362 }
@@ -641,10 +642,7 @@ private static EncryptionKey generateRandomKey(int eType)
641642 */
642643 private char [] getPassword (PrincipalName p , boolean server )
643644 throws KrbException {
644- String pn = p .toString ();
645- if (p .getRealmString () == null ) {
646- pn = pn + "@" + getRealm ();
647- }
645+ String pn = nameOf (p );
648646 char [] pass = passwords .get (pn );
649647 if (pass == null ) {
650648 throw new KrbException (server ?
@@ -660,10 +658,7 @@ private char[] getPassword(PrincipalName p, boolean server)
660658 * @return the salt
661659 */
662660 protected String getSalt (PrincipalName p ) {
663- String pn = p .toString ();
664- if (p .getRealmString () == null ) {
665- pn = pn + "@" + getRealm ();
666- }
661+ String pn = nameOf (p );
667662 if (salts .containsKey (pn )) {
668663 return salts .get (pn );
669664 }
@@ -695,10 +690,7 @@ protected byte[] getParams(PrincipalName p, int etype) {
695690 case EncryptedData .ETYPE_AES256_CTS_HMAC_SHA1_96 :
696691 case EncryptedData .ETYPE_AES128_CTS_HMAC_SHA256_128 :
697692 case EncryptedData .ETYPE_AES256_CTS_HMAC_SHA384_192 :
698- String pn = p .toString ();
699- if (p .getRealmString () == null ) {
700- pn = pn + "@" + getRealm ();
701- }
693+ String pn = nameOf (p );
702694 if (s2kparamses .containsKey (pn )) {
703695 return s2kparamses .get (pn );
704696 }
@@ -712,6 +704,23 @@ protected byte[] getParams(PrincipalName p, int etype) {
712704 }
713705 }
714706
707+ /**
708+ * Returns the name of a PrincipalName inside KDC dbs.
709+ * @param p the principal name
710+ * @return the name
711+ */
712+ private String nameOf (PrincipalName p ) {
713+ String pn = p .toString ();
714+ if (p .getRealmString () == null ) {
715+ pn = pn + "@" + getRealm ();
716+ }
717+ if (pn .startsWith ("krbtgt/" )) {
718+ // We always register krbtgt using REALM
719+ pn = "krbtgt/" + pn .substring (7 ).toUpperCase (Locale .ROOT );
720+ }
721+ return pn ;
722+ }
723+
715724 /**
716725 * Returns the key for a given principal of the given encryption type
717726 * @param p the principal
0 commit comments