Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

636 lines
17 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992 - 1995.
  5. //
  6. // File: negotiat.hxx
  7. //
  8. // Contents: Negotiate Package prototypes
  9. //
  10. // Classes:
  11. //
  12. // Functions:
  13. //
  14. // History: 9-17-96 RichardW Created
  15. //
  16. //----------------------------------------------------------------------------
  17. #ifndef __NEGOTIAT_HXX__
  18. #define __NEGOTIAT_HXX__
  19. extern "C"
  20. {
  21. #include <spnego.h>
  22. #include <ntmsv1_0.h>
  23. #include <negossp.h>
  24. #include <ntlmsp.h>
  25. #include <windns.h>
  26. }
  27. SpInitializeFn NegInitialize;
  28. SpGetInfoFn NegGetInfo;
  29. LSA_AP_LOGON_USER NegOldLogonUser;
  30. SpAcceptCredentialsFn NegAcceptCredentials;
  31. SpAcquireCredentialsHandleFn NegAcquireCredentialsHandle;
  32. SpFreeCredentialsHandleFn NegFreeCredentialsHandle;
  33. SpSaveCredentialsFn NegSaveCredentials;
  34. SpGetCredentialsFn NegGetCredentials;
  35. SpDeleteCredentialsFn NegDeleteCredentials;
  36. SpInitLsaModeContextFn NegInitLsaModeContext;
  37. SpDeleteContextFn NegDeleteLsaModeContext;
  38. SpAcceptLsaModeContextFn NegAcceptLsaModeContext;
  39. LSA_AP_LOGON_TERMINATED NegLogoffNotify;
  40. SpApplyControlTokenFn NegApplyControlToken;
  41. SpShutdownFn NegShutdown;
  42. SpGetUserInfoFn NegGetUserInfo;
  43. SpQueryCredentialsAttributesFn NegQueryCredentialsAttributes;
  44. LSA_AP_CALL_PACKAGE NegCallPackage;
  45. LSA_AP_CALL_PACKAGE_UNTRUSTED NegCallPackageUntrusted;
  46. LSA_AP_CALL_PACKAGE_PASSTHROUGH NegCallPackagePassthrough;
  47. LSA_AP_LOGON_USER_EX2 NegLogonUserEx2;
  48. SpInitializeFn Neg2Initialize;
  49. SpGetInfoFn Neg2GetInfo;
  50. LSA_AP_LOGON_USER Neg2OldLogonUser;
  51. SpAcceptCredentialsFn Neg2AcceptCredentials;
  52. SpAcquireCredentialsHandleFn Neg2AcquireCredentialsHandle;
  53. SpFreeCredentialsHandleFn Neg2FreeCredentialsHandle;
  54. SpSaveCredentialsFn Neg2SaveCredentials;
  55. SpGetCredentialsFn Neg2GetCredentials;
  56. SpDeleteCredentialsFn Neg2DeleteCredentials;
  57. SpInitLsaModeContextFn Neg2InitLsaModeContext;
  58. SpDeleteContextFn Neg2DeleteLsaModeContext;
  59. SpAcceptLsaModeContextFn Neg2AcceptLsaModeContext;
  60. LSA_AP_LOGON_TERMINATED Neg2LogoffNotify;
  61. SpApplyControlTokenFn Neg2ApplyControlToken;
  62. SpShutdownFn Neg2Shutdown;
  63. SpGetUserInfoFn Neg2GetUserInfo;
  64. SpQueryCredentialsAttributesFn Neg2QueryCredentialsAttributes;
  65. LSA_AP_CALL_PACKAGE Neg2CallPackage;
  66. LSA_AP_CALL_PACKAGE_UNTRUSTED Neg2CallPackageUntrusted;
  67. SpGetExtendedInformationFn NegGetExtendedInformation ;
  68. SpGetExtendedInformationFn Neg2GetExtendedInformation ;
  69. SpQueryContextAttributesFn NegQueryContextAttributes ;
  70. typedef ASN1objectidentifier_t ObjectID;
  71. //
  72. // Negotiation control is performed via registry settings. These
  73. // settings control negotiation behavior, and compatibility with
  74. // prior, NT4, machines.
  75. //
  76. //
  77. // Level 0 means - no gain in security. NTLM is always allowed,
  78. // even if mutual authentication is requested
  79. //
  80. #define NEG_NEGLEVEL_NO_SECURITY 0
  81. //
  82. // Level 1 means best compatibility with NT4. NTLM is allowed
  83. // if there is a valid downgrade from a mutual auth protocol.
  84. // Mutual auth response is fudged in this case
  85. //
  86. #define NEG_NEGLEVEL_COMPATIBILITY 1
  87. //
  88. // Level 2 is the ideal level. Mutual auth is enforced, no
  89. // fallback to NTLM is allowed.
  90. //
  91. #define NEG_NEGLEVEL_NO_DOWNGRADE 2
  92. typedef struct _NEG_EXTRA_OID {
  93. ULONG Attributes ;
  94. ObjectID Oid ;
  95. } NEG_EXTRA_OID, * PNEG_EXTRA_OID ;
  96. typedef struct _NEG_PACKAGE {
  97. LIST_ENTRY List; // Package list
  98. PLSAP_SECURITY_PACKAGE LsaPackage; // LSA package structure
  99. ASN1objectidentifier_t ObjectId; // OID for this package
  100. struct _NEG_PACKAGE * RealPackage ; // pointer back to the "real" package
  101. ULONG Flags; // Flags
  102. ULONG TokenSize; // Token size
  103. ULONG PackageFlags; // Package Flags
  104. ULONG PrefixLen ;
  105. UCHAR Prefix[ NEGOTIATE_MAX_PREFIX ];
  106. } NEG_PACKAGE, * PNEG_PACKAGE ;
  107. //
  108. // Flags for the negotiate package structure:
  109. //
  110. #define NEG_PREFERRED 0x00000001 // Preferred package
  111. #define NEG_NT4_COMPAT 0x00000002 // NT4 compatible package
  112. #define NEG_PACKAGE_EXTRA_OID 0x00000004 // Package is an extra OID for existing package
  113. #define NEG_PACKAGE_INBOUND 0x00000008 // Package is available for inbound
  114. #define NEG_PACKAGE_OUTBOUND 0x00000010 // Package is available for outbound
  115. #define NEG_PACKAGE_LOOPBACK 0x00000020 // Package is preferred loopback handler
  116. #define NEG_PACKAGE_HAS_EXTRAS 0x00000040 // Package has extra OIDS.
  117. typedef struct _NEG_CRED_HANDLE {
  118. PNEG_PACKAGE Package;
  119. CredHandle Handle;
  120. ULONG Flags;
  121. } NEG_CRED_HANDLE, * PNEG_CRED_HANDLE ;
  122. #define NEG_CREDHANDLE_EXTRA_OID 0x00000001
  123. typedef struct _NEG_CREDS {
  124. ULONG Tag ;
  125. ULONG RefCount;
  126. LIST_ENTRY List;
  127. ULONG Flags ;
  128. ULONG_PTR DefaultPackage;
  129. RTL_CRITICAL_SECTION CredLock;
  130. LIST_ENTRY AdditionalCreds ;
  131. TimeStamp Expiry ;
  132. LUID ClientLogonId ;
  133. DWORD ClientProcessId ;
  134. DWORD Count ;
  135. PUCHAR ServerBuffer ;
  136. DWORD ServerBufferLength ;
  137. NEG_CRED_HANDLE Creds[ANYSIZE_ARRAY];
  138. } NEG_CREDS, * PNEG_CREDS;
  139. // deprecated in .NET server
  140. //#define NEGCRED_MULTI 0x00000004 // contains multiple credentials
  141. #define NEGCRED_USE_SNEGO 0x00000008 // Force snego use
  142. #define NEGCRED_KERNEL_CALLER 0x00000010 // This is a kernel caller
  143. #define NEGCRED_EXPLICIT_CREDS 0x00000020 // Explicit creds passed in
  144. // deprecated in .NET server
  145. //#define NEGCRED_MULTI_PART 0x00000040 // Is part of a multi-part credential
  146. #define NEGCRED_ALLOW_NTLM 0x00000080 // Allow negotiate down to NTLM
  147. #define NEGCRED_NEG_NTLM 0x00000100 // Negotiate NTLM
  148. #define NEGCRED_NTLM_LOOPBACK 0x00000200 // Use NTLM on loopbacks
  149. #define NEGCRED_DOMAIN_EXPLICIT_CREDS 0x00000400 // Explicit creds with supplied domain passed in
  150. //
  151. // Special flags to AcquireCredHandle:
  152. //
  153. #define NEG_CRED_DONT_LINK 0x80000000
  154. #
  155. #define NEGCRED_DUP_MASK ( NEGCRED_KERNEL_CALLER )
  156. #define NEGCRED_TAG 'drCN'
  157. typedef struct _NEG_CONTEXT {
  158. ULONG CheckMark;
  159. PNEG_CREDS Creds;
  160. ULONG_PTR CredIndex;
  161. CtxtHandle Handle;
  162. SECURITY_STRING Target;
  163. ULONG Attributes;
  164. SecBuffer MappedBuffer;
  165. BOOLEAN Mapped;
  166. UCHAR CallCount ;
  167. SECURITY_STATUS LastStatus;
  168. PCHECKSUM_FUNCTION Check;
  169. PCHECKSUM_BUFFER Buffer;
  170. TimeStamp Expiry;
  171. ULONG Flags;
  172. PUCHAR Message ;
  173. ULONG CurrentSize ;
  174. ULONG TotalSize ;
  175. struct MechTypeList *SupportedMechs;
  176. } NEG_CONTEXT, * PNEG_CONTEXT;
  177. #define NEGCONTEXT_CHECK 'XgeN'
  178. #define NEGCONTEXT2_CHECK '2geN'
  179. #define NEGOPT_HONOR_SERVER_PREF 0x00000001
  180. //
  181. // Negotiate context flags
  182. //
  183. #define NEG_CONTEXT_PACKAGE_CALLED 0x01 // Have called a package
  184. #define NEG_CONTEXT_FREE_EACH_MECH 0x02 // Free all mechs
  185. #define NEG_CONTEXT_NEGOTIATING 0x04 // Many round trips
  186. #define NEG_CONTEXT_FRAGMENTING 0x08 // Fragmented blob
  187. #define NEG_CONTEXT_FRAG_INBOUND 0x10 // assembling an input
  188. #define NEG_CONTEXT_FRAG_OUTBOUND 0x20 // providing an output
  189. #define NEG_CONTEXT_UPLEVEL 0x40 // Stick to the RFC2478
  190. #define NEG_CONTEXT_MUTUAL_AUTH 0x80 // set mutual auth bit
  191. #define NEG_INVALID_PACKAGE ((ULONG_PTR) -1)
  192. //
  193. // Fifteen minutes in standard time
  194. //
  195. #define FIFTEEN_MINUTES ( 15I64 * 60I64 * 10000000I64 )
  196. typedef struct _NEG_LOGON_SESSION {
  197. LIST_ENTRY List ;
  198. ULONG_PTR CreatingPackage ; // Package that created this logon
  199. ULONG_PTR DefaultPackage ; // Default package to use for this logon
  200. UNICODE_STRING AlternateName ; // Alternate name associated with this logon
  201. LUID LogonId ; // Logon Id of this logon
  202. LUID ParentLogonId ; // Logon Id of creating session
  203. ULONG RefCount ; // Ref
  204. } NEG_LOGON_SESSION, * PNEG_LOGON_SESSION ;
  205. typedef struct _NEG_TRUST_LIST {
  206. ULONG RefCount ; // Refcount for trust list
  207. ULONG TrustCount ; // Number of trusts
  208. PDS_DOMAIN_TRUSTS Trusts ; // Array of trusts
  209. } NEG_TRUST_LIST, *PNEG_TRUST_LIST ;
  210. typedef enum _NEG_DOMAIN_TYPES {
  211. NegUpLevelDomain,
  212. NegUpLevelTrustedDomain,
  213. NegDownLevelDomain,
  214. NegLocalDomain
  215. } NEG_DOMAIN_TYPES ;
  216. //
  217. // Variables global to the neg* source files:
  218. //
  219. extern LIST_ENTRY NegPackageList;
  220. extern LIST_ENTRY NegCredList;
  221. extern LIST_ENTRY NegLogonSessionList ;
  222. extern RTL_RESOURCE NegLock;
  223. extern RTL_CRITICAL_SECTION NegLogonSessionListLock ;
  224. extern RTL_CRITICAL_SECTION NegTrustListLock ;
  225. extern PNEG_TRUST_LIST NegTrustList ;
  226. extern LARGE_INTEGER NegTrustTime ;
  227. extern LIST_ENTRY NegDefaultCredList ;
  228. extern RTL_CRITICAL_SECTION NegComputerNamesLock;
  229. extern UNICODE_STRING NegNetbiosComputerName_U;
  230. extern UNICODE_STRING NegDnsComputerName_U;
  231. extern PVOID NegNotifyHandle;
  232. extern DWORD NegPackageCount;
  233. extern PUCHAR NegBlob;
  234. extern DWORD NegBlobSize;
  235. extern DWORD NegOptions;
  236. extern BOOL NegUplevelDomain ;
  237. extern DWORD_PTR NegPackageId ;
  238. extern DWORD_PTR NtlmPackageId ;
  239. extern UCHAR NegSpnegoMechEncodedOid[ 8 ];
  240. extern ULONG NegMachineState;
  241. extern ObjectID NegNtlmMechOid ;
  242. extern DWORD NegEventLogLevel ;
  243. extern UNICODE_STRING NegLocalHostName_U ;
  244. extern WCHAR NegLocalHostName[] ;
  245. #define NegWriteLockList() RtlAcquireResourceExclusive( &NegLock, TRUE )
  246. #define NegReadLockList() RtlAcquireResourceShared( &NegLock, TRUE )
  247. #define NegUnlockList() RtlReleaseResource( &NegLock )
  248. #define NegWriteLockComputerNames() RtlEnterCriticalSection( &NegComputerNamesLock )
  249. #define NegReadLockComputerNames() RtlEnterCriticalSection( &NegComputerNamesLock )
  250. #define NegUnlockComputerNames() RtlLeaveCriticalSection( &NegComputerNamesLock )
  251. #define NegWriteLockCredList() RtlAcquireResourceExclusive( &NegCredListLock, TRUE )
  252. #define NegReadLockCredList() RtlAcquireResourceShared( &NegCredListLock, TRUE )
  253. #define NegUnlockCredList() RtlReleaseResource( &NegCredListLock )
  254. ULONG
  255. NegGetPackageCaps(
  256. ULONG ContextReq
  257. );
  258. #define NegWriteLockCreds(p) RtlEnterCriticalSection( &((PNEG_CREDS) p)->CredLock );
  259. #define NegReadLockCreds(p) RtlEnterCriticalSection( &((PNEG_CREDS) p)->CredLock );
  260. #define NegUnlockCreds(p) RtlLeaveCriticalSection( &((PNEG_CREDS) p)->CredLock );
  261. #define NEG_MECH_LIMIT 16
  262. typedef enum _NEG_MATCH {
  263. MatchUnknown,
  264. PreferredSucceed,
  265. MatchSucceed,
  266. MatchFailed
  267. } NEG_MATCH ;
  268. #if DBG
  269. #define NegDumpOid(s,i) NegpDumpOid(s,i)
  270. #else
  271. #define NegDumpOid(s,i)
  272. #endif
  273. #if DBG
  274. #define NegpValidContext( C ) if (C) DsysAssert( ((PNEG_CONTEXT) C)->CheckMark == NEGCONTEXT_CHECK ) else DsysAssert( C )
  275. #else
  276. #define NegpValidContext( C )
  277. #endif
  278. #define NegpIsValidContext( C ) ((((PNEG_CONTEXT) C)->CheckMark == NEGCONTEXT_CHECK ) ? TRUE : FALSE )
  279. //
  280. // Prototypes
  281. //
  282. SECURITY_STATUS
  283. SpnegoInitAsn(
  284. IN OUT ASN1encoding_t * pEnc,
  285. IN OUT ASN1decoding_t * pDec
  286. );
  287. VOID
  288. SpnegoTermAsn(
  289. IN ASN1encoding_t pEnc,
  290. IN ASN1decoding_t pDec
  291. );
  292. SECURITY_STATUS
  293. SpnegoAsnErrorToSecStatus(
  294. IN ASN1error_e Asn1Err
  295. );
  296. SECURITY_STATUS
  297. SpnegoPackData(
  298. IN PVOID Data,
  299. IN ULONG PduValue,
  300. OUT PULONG DataSize,
  301. OUT PUCHAR * MarshalledData
  302. );
  303. SECURITY_STATUS
  304. SpnegoUnpackData(
  305. IN PUCHAR Data,
  306. IN ULONG DataSize,
  307. IN ULONG PduValue,
  308. OUT PVOID * DecodedData
  309. );
  310. VOID
  311. SpnegoFreeData(
  312. IN ULONG PduValue,
  313. IN PVOID Data
  314. );
  315. ObjectID
  316. NegpDecodeObjectId(
  317. PUCHAR Id,
  318. DWORD Len);
  319. ObjectID
  320. NegpCopyObjectId(
  321. IN ObjectID Id
  322. );
  323. VOID
  324. NegpFreeObjectId(
  325. ObjectID Id);
  326. SECURITY_STATUS
  327. NegpBuildMechListFromCreds(
  328. PNEG_CREDS Creds,
  329. ULONG fContextReq,
  330. ULONG MechAttributes,
  331. struct MechTypeList ** MechList);
  332. VOID
  333. NegpFreeMechList(
  334. struct MechTypeList *MechList);
  335. struct MechTypeList *
  336. NegpCopyMechList(
  337. struct MechTypeList *MechList);
  338. ULONG_PTR
  339. NegpFindPackageForOid(
  340. PNEG_CREDS Creds,
  341. ObjectID Oid);
  342. int
  343. NegpCompareOid(
  344. ObjectID A,
  345. ObjectID B);
  346. SECURITY_STATUS
  347. NegpParseBuffers(
  348. PSecBufferDesc pMessage,
  349. BOOL Map,
  350. PSecBuffer * pToken,
  351. PSecBuffer * pEmpty);
  352. VOID
  353. NegpDumpOid(
  354. PSTR Banner,
  355. ObjectID Id
  356. );
  357. ULONG
  358. NegoMapNegFlagsToPackageFlags(
  359. IN int NegFlags
  360. );
  361. int
  362. NegoMapNegFlasgToContextFlags(
  363. IN ULONG ContextFlags
  364. );
  365. int
  366. Neg_der_read_length(
  367. unsigned char **buf,
  368. LONG *bufsize,
  369. LONG * headersize
  370. );
  371. SECURITY_STATUS
  372. NegAddFragmentToContext(
  373. PNEG_CONTEXT Context,
  374. PSecBuffer Fragment
  375. );
  376. SECURITY_STATUS
  377. SEC_ENTRY
  378. NegCreateContextFromFragment(
  379. LSA_SEC_HANDLE dwCredHandle,
  380. LSA_SEC_HANDLE dwCtxtHandle,
  381. PSecBuffer Buffer,
  382. ULONG fContextReq,
  383. ULONG TargetDataRep,
  384. PLSA_SEC_HANDLE pdwNewContext,
  385. PSecBufferDesc pOutput,
  386. PULONG pfContextAttr
  387. );
  388. #ifdef __SPMGR_H__
  389. #endif
  390. PNEG_LOGON_SESSION
  391. NegpLocateLogonSession(
  392. PLUID LogonId
  393. );
  394. NEG_DOMAIN_TYPES
  395. NegpIsUplevelDomain(
  396. PLUID LogonId,
  397. SECURITY_LOGON_TYPE LogonType,
  398. PUNICODE_STRING Domain
  399. );
  400. VOID
  401. NegpDerefLogonSession(
  402. PNEG_LOGON_SESSION LogonSession
  403. );
  404. NTSTATUS
  405. NegpDetermineTokenPackage(
  406. IN ULONG_PTR CredHandle,
  407. IN PSecBuffer InitialToken,
  408. OUT PULONG PackageIndex
  409. );
  410. NTSTATUS
  411. NegpGetTokenOid(
  412. IN PUCHAR Buf,
  413. OUT ULONG BufSize,
  414. OUT ObjectID * ObjectId
  415. );
  416. VOID
  417. NegpReleaseCreds(
  418. PNEG_CREDS pCreds,
  419. BOOLEAN CleanupCall
  420. );
  421. NTSTATUS
  422. NegpCopyCredsToBuffer(
  423. IN PSECPKG_PRIMARY_CRED PrimaryCred,
  424. IN PSECPKG_SUPPLEMENTAL_CRED SupplementalCred,
  425. OUT PSECPKG_PRIMARY_CRED PrimaryCredCopy OPTIONAL,
  426. OUT PSECPKG_SUPPLEMENTAL_CRED SupplementalCredCopy OPTIONAL
  427. );
  428. BOOL
  429. NegpRearrangeMechsIfNeccessary(
  430. struct MechTypeList ** MechList,
  431. PSECURITY_STRING Target,
  432. PBOOL DirectPacket
  433. );
  434. VOID
  435. NegpReadRegistryParameters(
  436. HKEY Key
  437. );
  438. //
  439. // NT-specific functions
  440. //
  441. DWORD
  442. WINAPI
  443. NegParamChange(
  444. PVOID p
  445. );
  446. PNEG_TRUST_LIST
  447. NegpGetTrustList(
  448. VOID
  449. );
  450. VOID
  451. NegpDerefTrustList(
  452. PNEG_TRUST_LIST TrustList
  453. );
  454. VOID
  455. NegpReportEvent(
  456. IN WORD EventType,
  457. IN DWORD EventId,
  458. IN DWORD Category,
  459. IN NTSTATUS Status,
  460. IN DWORD NumberOfStrings,
  461. ...
  462. );
  463. VOID
  464. NTAPI
  465. NegLsaPolicyChangeCallback(
  466. IN POLICY_NOTIFICATION_INFORMATION_CLASS ChangedInfoClass
  467. );
  468. NTSTATUS
  469. NegEnumPackagePrefixesCall(
  470. IN PLSA_CLIENT_REQUEST ClientRequest,
  471. IN PVOID ProtocolSubmitBuffer,
  472. IN PVOID ClientBufferBase,
  473. IN ULONG SubmitBufferLength,
  474. OUT PVOID *ProtocolReturnBuffer,
  475. OUT PULONG ReturnBufferLength,
  476. OUT PNTSTATUS ProtocolStatus
  477. );
  478. NTSTATUS
  479. NegGetCallerNameCall(
  480. IN PLSA_CLIENT_REQUEST ClientRequest,
  481. IN PVOID ProtocolSubmitBuffer,
  482. IN PVOID ClientBufferBase,
  483. IN ULONG SubmitBufferLength,
  484. OUT PVOID *ProtocolReturnBuffer,
  485. OUT PULONG ReturnBufferLength,
  486. OUT PNTSTATUS ProtocolStatus
  487. );
  488. PNEG_LOGON_SESSION
  489. NegpBuildLogonSession(
  490. PLUID LogonId,
  491. ULONG_PTR LogonPackage,
  492. ULONG_PTR DefaultPackage
  493. );
  494. VOID
  495. NegpDerefLogonSession(
  496. PNEG_LOGON_SESSION LogonSession
  497. );
  498. VOID
  499. NegpDerefLogonSessionById(
  500. PLUID LogonId
  501. );
  502. PNEG_LOGON_SESSION
  503. NegpLocateLogonSession(
  504. PLUID LogonId
  505. );
  506. NTSTATUS
  507. NTAPI
  508. NegpMapLogonRequest(
  509. IN PVOID ProtocolSubmitBuffer,
  510. IN PVOID ClientBufferBase,
  511. IN ULONG SubmitBufferSize,
  512. OUT PMSV1_0_INTERACTIVE_LOGON * LogonInfo
  513. );
  514. #endif // __NEGOTIAT_HXX__