Skip to content

Commit 40785e3

Browse files
feat(sspi): add NT_ENTERPRISE support in server-side Kerberos (#535)
Adds `NT_ENTERPRISE` support in server-side Kerberos. This is needed when want to connect using FQDN instead of down-level logon name.
1 parent 153900e commit 40785e3

2 files changed

Lines changed: 22 additions & 17 deletions

File tree

‎src/kerberos/server/extractors.rs‎

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ use picky::oids;
33
use picky_asn1::wrapper::ExplicitContextTag1;
44
use picky_krb::constants::gss_api::{ACCEPT_COMPLETE, AP_REQ_TOKEN_ID};
55
use picky_krb::constants::key_usages::{AP_REQ_AUTHENTICATOR, TICKET_REP};
6-
use picky_krb::constants::types::NT_PRINCIPAL;
6+
use picky_krb::constants::types::{NT_ENTERPRISE, NT_PRINCIPAL};
77
use picky_krb::crypto::CipherSuite;
8-
use picky_krb::data_types::{Authenticator, EncTicketPart, PrincipalName};
8+
use picky_krb::data_types::{Authenticator, EncTicketPart, KerberosStringAsn1, PrincipalName};
99
use picky_krb::gss_api::{
1010
ApplicationTag0, GssApiNegInit, KrbMessage, MechTypeList, NegTokenInit, NegTokenTarg, NegTokenTarg1,
1111
};
1212
use picky_krb::messages::{ApReq, TgtReq};
1313

14-
use crate::{Error, ErrorKind, Result};
14+
use crate::{Error, ErrorKind, Result, Username};
1515

1616
/// Extract TGT request and mech types from the first token returned by the Kerberos client.
1717
#[instrument(ret, level = "trace")]
@@ -170,17 +170,24 @@ pub(super) fn select_mech_type(mech_list: &MechTypeList) -> Result<ObjectIdentif
170170
))
171171
}
172172

173-
/// Extract username from the [PrincipalName].
174-
pub(super) fn extract_username(cname: &PrincipalName) -> Result<String> {
173+
/// Constructs [Username] from the client's [PrincipalName] and realm.
174+
pub(super) fn client_upn(cname: &PrincipalName, crealm: &KerberosStringAsn1) -> Result<Username> {
175+
let username = cname
176+
.name_string
177+
.0
178+
.0
179+
.first()
180+
.map(|name| name.to_string())
181+
.ok_or_else(|| Error::new(ErrorKind::InvalidToken, "missing cname value in token"))?;
182+
175183
let name_type = &cname.name_type.0 .0;
176184
if name_type == &[NT_PRINCIPAL] {
177-
cname
178-
.name_string
179-
.0
180-
.0
181-
.first()
182-
.map(|name| name.to_string())
183-
.ok_or_else(|| Error::new(ErrorKind::InvalidToken, "missing cname value in token"))
185+
Ok(Username::new_upn(
186+
&username,
187+
&crealm.0.to_string().to_ascii_lowercase(),
188+
)?)
189+
} else if name_type == &[NT_ENTERPRISE] {
190+
Ok(Username::parse(&username)?)
184191
} else {
185192
Err(Error::new(
186193
ErrorKind::InvalidToken,

‎src/kerberos/server/mod.rs‎

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::io::Write;
77
use std::time::Duration;
88

99
use cache::AuthenticatorCacheRecord;
10-
use extractors::{extract_client_mic_token, extract_username, select_mech_type};
10+
use extractors::{extract_client_mic_token, select_mech_type};
1111
use generators::{generate_mic_token, generate_tgt_rep};
1212
use picky::oids;
1313
use picky_asn1::restricted_string::IA5String;
@@ -30,6 +30,7 @@ use super::utils::validate_mic_token;
3030
use crate::builders::FilledAcceptSecurityContext;
3131
use crate::generator::YieldPointLocal;
3232
use crate::kerberos::flags::ApOptions;
33+
use crate::kerberos::server::extractors::client_upn;
3334
use crate::kerberos::DEFAULT_ENCRYPTION_TYPE;
3435
use crate::{
3536
AcceptSecurityContextResult, BufferType, CredentialsBuffers, Error, ErrorKind, Kerberos, KerberosState, Result,
@@ -288,10 +289,7 @@ pub async fn accept_security_context(
288289

289290
debug!("ApReq Ticket and Authenticator are valid!");
290291

291-
server_data.client = Some(Username::new_upn(
292-
&extract_username(&cname.0)?,
293-
&crealm.0 .0.to_string().to_ascii_lowercase(),
294-
)?);
292+
server_data.client = Some(client_upn(&cname.0, &crealm.0)?);
295293

296294
let ap_options_bytes = ap_req.0.ap_options.0 .0.as_bytes();
297295
// [5.5.1. KRB_AP_REQ Definition](https://www.rfc-editor.org/rfc/rfc4120#section-5.5.1)

0 commit comments

Comments
 (0)