Skip to content

Commit bc9ca9e

Browse files
committed
Fix IsolateRealmsConsistently behavior in ticket enc-part
1 parent 49ab904 commit bc9ca9e

2 files changed

Lines changed: 43 additions & 14 deletions

File tree

Kerberos.NET/Entities/Krb/KrbKdcRep.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ KrbEncryptionKey sessionKey
212212
var encTicketPart = new KrbEncTicketPart()
213213
{
214214
CName = cname,
215-
CRealm = request.ClientRealmName,
215+
CRealm = request.Compatibility.HasFlag(KerberosCompatibilityFlags.IsolateRealmsConsistently) ? request.ClientRealmName : request.RealmName,
216216
Key = sessionKey,
217217
AuthTime = request.Now,
218218
StartTime = request.StartTime,

Tests/Tests.Kerberos.NET/Messages/KrbKdcRepTests.cs

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ namespace Tests.Kerberos.NET
1414
[TestClass]
1515
public class KrbKdcRepTests
1616
{
17-
private const string LowerCaseRealm = "realm.com";
18-
private const string UpperCaseRealm = "REALM.COM";
17+
private const string LowerCaseRealm1 = "realm.com";
18+
private const string UpperCaseRealm1 = "REALM.COM";
19+
private const string LowerCaseRealm2 = "test.com";
20+
private const string UpperCaseRealm2 = "TEST.COM";
1921

2022
[TestMethod]
2123
[ExpectedException(typeof(InvalidOperationException))]
@@ -72,41 +74,68 @@ public void CreateServiceTicket()
7274
{
7375
var key = KrbEncryptionKey.Generate(EncryptionType.AES128_CTS_HMAC_SHA1_96).AsKey();
7476

75-
var ticket = KrbKdcRep.GenerateServiceTicket<KrbTgsRep>(new ServiceTicketRequest
77+
var tgsRep = KrbKdcRep.GenerateServiceTicket<KrbTgsRep>(new ServiceTicketRequest
7678
{
7779
EncryptedPartKey = key,
7880
ServicePrincipal = new FakeKerberosPrincipal("blah@blah.com"),
7981
ServicePrincipalKey = key,
8082
Principal = new FakeKerberosPrincipal("blah@blah2.com"),
8183
RealmName = "blah.com",
8284
ClientRealmName = "test.com",
85+
Compatibility = KerberosCompatibilityFlags.IsolateRealmsConsistently,
8386
});
8487

85-
Assert.IsNotNull(ticket);
88+
Assert.IsNotNull(tgsRep);
89+
Assert.AreEqual("blah.com", tgsRep.Ticket.Realm);
90+
Assert.AreEqual("blah@blah.com/blah.com", tgsRep.Ticket.SName.FullyQualifiedName);
91+
Assert.AreEqual("test.com", tgsRep.CRealm);
92+
Assert.AreEqual("blah@blah2.com", tgsRep.CName.FullyQualifiedName);
93+
94+
var ticketEncPart = tgsRep.Ticket.EncryptedPart.Decrypt(key, KeyUsage.Ticket, KrbEncTicketPart.DecodeApplication);
95+
Assert.AreEqual("test.com", ticketEncPart.CRealm);
96+
Assert.AreEqual("blah@blah2.com", ticketEncPart.CName.FullyQualifiedName);
8697
}
8798

8899
[TestMethod]
89-
[DataRow(LowerCaseRealm, KerberosCompatibilityFlags.None, LowerCaseRealm)]
90-
[DataRow(LowerCaseRealm, KerberosCompatibilityFlags.NormalizeRealmsUppercase, UpperCaseRealm)]
91-
[DataRow(UpperCaseRealm, KerberosCompatibilityFlags.None, UpperCaseRealm)]
92-
[DataRow(UpperCaseRealm, KerberosCompatibilityFlags.NormalizeRealmsUppercase, UpperCaseRealm)]
93-
public void CreateServiceTicketOnCompatibilitySetting(string realm, KerberosCompatibilityFlags compatibilityFlags, string expectedRealm)
100+
// Check that no uppercasing or realm isolation happens by default.
101+
[DataRow(LowerCaseRealm1, LowerCaseRealm2, KerberosCompatibilityFlags.None, LowerCaseRealm1, LowerCaseRealm1)]
102+
[DataRow(UpperCaseRealm1, UpperCaseRealm2, KerberosCompatibilityFlags.None, UpperCaseRealm1, UpperCaseRealm1)]
103+
// Check that KerberosCompatibilityFlags.NormalizeRealmsUppercase uppercases the realm.
104+
[DataRow(LowerCaseRealm1, LowerCaseRealm2, KerberosCompatibilityFlags.NormalizeRealmsUppercase, UpperCaseRealm1, UpperCaseRealm1)]
105+
[DataRow(UpperCaseRealm1, UpperCaseRealm2, KerberosCompatibilityFlags.NormalizeRealmsUppercase, UpperCaseRealm1, UpperCaseRealm1)]
106+
// Check that KerberosCompatibilityFlags.IsolateRealmsConsistently does isolate the realm and crealm
107+
[DataRow(LowerCaseRealm1, LowerCaseRealm2, KerberosCompatibilityFlags.IsolateRealmsConsistently, LowerCaseRealm1, LowerCaseRealm2)]
108+
[DataRow(UpperCaseRealm1, UpperCaseRealm2, KerberosCompatibilityFlags.IsolateRealmsConsistently, UpperCaseRealm1, UpperCaseRealm2)]
109+
// Check that both flags together uppercase and isolate the realms.
110+
[DataRow(LowerCaseRealm1, LowerCaseRealm2, KerberosCompatibilityFlags.NormalizeRealmsUppercase | KerberosCompatibilityFlags.IsolateRealmsConsistently, UpperCaseRealm1, UpperCaseRealm2)]
111+
[DataRow(UpperCaseRealm1, UpperCaseRealm2, KerberosCompatibilityFlags.NormalizeRealmsUppercase | KerberosCompatibilityFlags.IsolateRealmsConsistently, UpperCaseRealm1, UpperCaseRealm2)]
112+
public void CreateServiceTicketOnCompatibilitySetting(
113+
string realm,
114+
string crealm,
115+
KerberosCompatibilityFlags compatibilityFlags,
116+
string expectedRealm,
117+
string expectedCRealm
118+
)
94119
{
95120
var key = KrbEncryptionKey.Generate(EncryptionType.AES128_CTS_HMAC_SHA1_96).AsKey();
96121

97-
var ticket = KrbKdcRep.GenerateServiceTicket<KrbTgsRep>(new ServiceTicketRequest
122+
var tgsRep = KrbKdcRep.GenerateServiceTicket<KrbTgsRep>(new ServiceTicketRequest
98123
{
99124
EncryptedPartKey = key,
100125
ServicePrincipal = new FakeKerberosPrincipal("blah@blah.com"),
101126
ServicePrincipalKey = key,
102127
Principal = new FakeKerberosPrincipal("blah@blah2.com"),
103128
RealmName = realm,
104-
ClientRealmName = realm,
129+
ClientRealmName = crealm,
105130
Compatibility = compatibilityFlags,
106131
});
107132

108-
Assert.IsNotNull(ticket);
109-
Assert.AreEqual(expectedRealm, ticket.CRealm);
133+
Assert.IsNotNull(tgsRep);
134+
Assert.AreEqual(expectedRealm, tgsRep.Ticket.Realm);
135+
136+
var ticketEncPart = tgsRep.Ticket.EncryptedPart.Decrypt(key, KeyUsage.Ticket, KrbEncTicketPart.DecodeApplication);
137+
Assert.AreEqual(expectedCRealm, ticketEncPart.CRealm);
138+
Assert.AreEqual(expectedCRealm, tgsRep.CRealm);
110139
}
111140
}
112141
}

0 commit comments

Comments
 (0)