@@ -35,6 +35,7 @@ use super::cred_injection::{
3535 PROXY_USER , TARGET_PASSWORD , TARGET_USER , encode_pcb, next_id, provision_credentials, provision_mapping,
3636 unsigned_jws,
3737} ;
38+ use super :: tls_fixtures:: { CERT_PEM , KEY_PEM } ;
3839
3940const REALM : & str = "EXAMPLE.INVALID" ;
4041// sspi-rs downgrades Negotiate to NTLM when the SPN host is an IP address.
@@ -539,9 +540,23 @@ impl sspi::credssp::CredentialsProxy for IdentityProxy {
539540 }
540541}
541542
543+ const HANDSHAKE_TIMEOUT : Duration = Duration :: from_secs ( 20 ) ;
544+
542545async fn connect_ntlm_client (
543546 gateway_tcp : u16 ,
544547 association_jwt : & str ,
548+ ) -> anyhow:: Result < tokio_rustls:: client:: TlsStream < TcpStream > > {
549+ tokio:: time:: timeout (
550+ HANDSHAKE_TIMEOUT ,
551+ connect_ntlm_client_inner ( gateway_tcp, association_jwt) ,
552+ )
553+ . await
554+ . context ( "timed out connecting NTLM client to Gateway" ) ?
555+ }
556+
557+ async fn connect_ntlm_client_inner (
558+ gateway_tcp : u16 ,
559+ association_jwt : & str ,
545560) -> anyhow:: Result < tokio_rustls:: client:: TlsStream < TcpStream > > {
546561 let mut stream = TcpStream :: connect ( ( "127.0.0.1" , gateway_tcp) )
547562 . await
@@ -582,6 +597,22 @@ async fn complete_client_credssp(
582597 raw_ntlm : bool ,
583598 proxy_replies : Option < & Mutex < Vec < ObservedKdcReply > > > ,
584599 proxy_requests : Option < & Mutex < Vec < ObservedKdcReq > > > ,
600+ ) -> anyhow:: Result < ( ) > {
601+ tokio:: time:: timeout (
602+ HANDSHAKE_TIMEOUT ,
603+ complete_client_credssp_inner ( tls, username, kdc_proxy_url, raw_ntlm, proxy_replies, proxy_requests) ,
604+ )
605+ . await
606+ . context ( "timed out completing client CredSSP" ) ?
607+ }
608+
609+ async fn complete_client_credssp_inner (
610+ tls : tokio_rustls:: client:: TlsStream < TcpStream > ,
611+ username : & str ,
612+ kdc_proxy_url : Option < & str > ,
613+ raw_ntlm : bool ,
614+ proxy_replies : Option < & Mutex < Vec < ObservedKdcReply > > > ,
615+ proxy_requests : Option < & Mutex < Vec < ObservedKdcReq > > > ,
585616) -> anyhow:: Result < ( ) > {
586617 use sspi:: credssp:: { ClientMode , ClientState , CredSspClient , CredSspMode , TsRequest } ;
587618 use sspi:: ntlm:: NtlmConfig ;
@@ -1600,52 +1631,3 @@ async fn ironrdp_agent_rdcleanpath_kerberos_injection() -> anyhow::Result<()> {
16001631 let _ = gateway. process . start_kill ( ) ;
16011632 Ok ( ( ) )
16021633}
1603-
1604- const CERT_PEM : & str = r#"-----BEGIN CERTIFICATE-----
1605- MIIDCzCCAfOgAwIBAgIUPRJa8i280unV3/kW6TE2fSUw8PwwDQYJKoZIhvcNAQEL
1606- BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MCAXDTI1MTEyNTA5NDAzMFoYDzIxMjUx
1607- MTAxMDk0MDMwWjAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEB
1608- AQUAA4IBDwAwggEKAoIBAQDHpBlyRgUx/V9cQGw/eqDFc6odxB2hvnbudi67LvEj
1609- cNIWOU79R1e/NswME4oecqT9W05n4UyxkABfm2qjODO0nDf47W0DsgbEA87qE715
1610- RWg8AtC529CZAazqTV3gqYyRMsCuVKzPVxgWa8rhPc7E6In1uDRak0lWKQPQSBbc
1611- 34nxMOVIusZNlkAEar8/aYPr/YWvdEqkobEvXp+g9WsuMaU913ecacWDjyWDkf80
1612- pPPtf+uet7WMysKMhzGQtpbgilT8XCo8uTsgUbK+TMWvkF9bcxAQDnJsrZRL7Jfh
1613- ofsFfQbTIvbvpn+4J4kmHN36BTohlNL8TX1jrU3cPA7dAgMBAAGjUzBRMB0GA1Ud
1614- DgQWBBTT+m6dyc/c3mXF3JAsZr9OqUwgWTAfBgNVHSMEGDAWgBTT+m6dyc/c3mXF
1615- 3JAsZr9OqUwgWTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBB
1616- i/yonZY3ztaeGElzD8xkI+rJ+daJ5WzdfKnzudJllg/Ht8m7wO5SdQnMt2T44gbH
1617- 05uekc1zXnXb7fJKqs3R6DacctG0nQ3acuI+IMtTaBbbAcf3PJJlo0Pap0ypVC0R
1618- IUiUhJGFNi4cCBOvJqsly0d3T5xqOXU1Q5j3mIwRBY68+m9btwwuZWvASRADtCyZ
1619- RpisBzS4a6jSeHXa4iG/VhskbiZkcnfHNTw7yNJJdv125y2zQkWWF9wlLbYwWr40
1620- x9Ba6YbssOz6epATKhvt80yclO34AzUyimssvViIUpgFEyaPhZZTw46Q/6X3ixK4
1621- /v4eYM0cCHN0h+rynSor
1622- -----END CERTIFICATE-----"# ;
1623-
1624- const KEY_PEM : & str = r#"-----BEGIN PRIVATE KEY-----
1625- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDHpBlyRgUx/V9c
1626- QGw/eqDFc6odxB2hvnbudi67LvEjcNIWOU79R1e/NswME4oecqT9W05n4UyxkABf
1627- m2qjODO0nDf47W0DsgbEA87qE715RWg8AtC529CZAazqTV3gqYyRMsCuVKzPVxgW
1628- a8rhPc7E6In1uDRak0lWKQPQSBbc34nxMOVIusZNlkAEar8/aYPr/YWvdEqkobEv
1629- Xp+g9WsuMaU913ecacWDjyWDkf80pPPtf+uet7WMysKMhzGQtpbgilT8XCo8uTsg
1630- UbK+TMWvkF9bcxAQDnJsrZRL7JfhofsFfQbTIvbvpn+4J4kmHN36BTohlNL8TX1j
1631- rU3cPA7dAgMBAAECggEAKh7KK5zwTaq6atlAvWfe8anEk4EkC1MG/qq6k02FHMgZ
1632- 2wx+SNu7fKFQDaA1vNTNUJLqCOq05qWOHp3IsuURq6JmAMP/Aw+Vc9el2ScPC74E
1633- Dt09MmlZKl77H3fxPYwoFx5RHrbIuvoSH/DgHgOPU2YIbWpOyWlXyLDgmBoNkM3N
1634- fXYLXJONpStPHeQLhh7LcHO3CZgn6kycJyByEO2NtcchS5zITiJuwL+qR5/QIlvD
1635- Yo7jdCjelJat38MZ9dE1us8xlIjQtsYF/acZZtcpYho+7ZpDCNcb+xF8KStKei+B
1636- MMpWISsa+Zh9g7lPYTnG/i1dSMMT100XCEw8o4rBoQKBgQDnptz8acp7DB2wJH4L
1637- c0xuw8IlrSl3BGUEj8H+RyFlpH3+//i6/fE9MrtF8b4FSYUp5AG4NVFGcRbwJVGW
1638- jeL13YwIKMdXjmx8fDIylCgBB1tzBS9T/0ws3HS8avxhKvjgoXIZm6D3XDcBslrH
1639- c9/LojT8YGI1wx7jWI2qKj8yeQKBgQDcn+kQ1QjzgIz6bAVWY3t1jr5uHHyaS+5G
1640- ihY/mx4Mn3DURgPXZHz/HrN9rZkax0zuq9wuIlqgZ2KI37iCF49M4aZxC788LyDo
1641- Hp0Cak3wt3g0Tj6J7SJiQe8h/6VBS4R5dRD2vhEc3xPAOf7WIFdlLYBOOvE/LmOt
1642- N6ChkfgGhQKBgQDSiDqLRPJ7BjXtIh1T9sPeXxeR+mCXBG1yydx7ZtYZdHf2S1kZ
1643- STX4cqT1GpGiaIEX41sUuZBWPu2j76bI98bvwRxFRhp1nsFGGfHdOf1pgfBBBtNO
1644- udXXZ7zIiUs6XD24mcIDOAgBB9QOPLR4VP1uKsuRG1/mkKD/6jlGEANDsQKBgQDC
1645- AoEygxQnBVFz2c/rwvnLS+Zb8AMGsGTtdPrRnjeThBX1JUi1fbGJq1bN2v27Fa2q
1646- aEjr7NvjGGcG1C1tgQhL5Fa4LEtTwmHenSUW/aJiXwR+gpvuMDC/VRnTvPp2a9En
1647- +XEcedGUoPq+XIGjjLctyxB8Osrw83tF1JgV3MXN/QKBgQC83B54rYDd4QmVH5nL
1648- WLw834fgr+Z1hA6UqJIaahlD/bDwzbbJEv0pHCBxe01ywQFivqWBdVbuoy9YSeLS
1649- KKEklzh+L0SorrYoBA5F63qx0zy05bba0ASplgDUEUNZn7oIFi7x5pVsNNaNxZpR
1650- bQGM8UrNQvWQ+tutRmp7PM6VuQ==
1651- -----END PRIVATE KEY-----"# ;
0 commit comments