home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Internet 2000 May / MICD_2000_05.iso / CBuilder5 / INSTALL / DATA1.CAB / Program_Built_Files / Include / schannel.h < prev    next >
C/C++ Source or Header  |  2000-02-01  |  21KB  |  632 lines

  1. //+---------------------------------------------------------------------------
  2. //
  3. //  Microsoft Windows
  4. //  Copyright (C) Microsoft Corporation, 1992-1999.
  5. //
  6. //  File:       schannel.h
  7. //
  8. //  Contents:   Public Definitions for SCHANNEL Security Provider
  9. //
  10. //  Classes:
  11. //
  12. //  Functions:
  13. //
  14. //----------------------------------------------------------------------------
  15.  
  16.  
  17.  
  18. #ifndef __SCHANNEL_H__
  19. #pragma option push -b -a8 -pc -A- /*P_O_Push*/
  20. #define __SCHANNEL_H__
  21.  
  22. #if _MSC_VER > 1000
  23. #pragma once
  24. #endif
  25.  
  26. #include <wincrypt.h>
  27.  
  28.  
  29. //
  30. // Security package names.
  31. //
  32.  
  33. #define UNISP_NAME_A    "Microsoft Unified Security Protocol Provider"
  34. #define UNISP_NAME_W    L"Microsoft Unified Security Protocol Provider"
  35.  
  36. #define SSL2SP_NAME_A    "Microsoft SSL 2.0"
  37. #define SSL2SP_NAME_W    L"Microsoft SSL 2.0"
  38.  
  39. #define SSL3SP_NAME_A    "Microsoft SSL 3.0"
  40. #define SSL3SP_NAME_W    L"Microsoft SSL 3.0"
  41.  
  42. #define TLS1SP_NAME_A    "Microsoft TLS 1.0"
  43. #define TLS1SP_NAME_W    L"Microsoft TLS 1.0"
  44.  
  45. #define PCT1SP_NAME_A    "Microsoft PCT 1.0"
  46. #define PCT1SP_NAME_W    L"Microsoft PCT 1.0"
  47.  
  48.  
  49. #ifdef UNICODE
  50.  
  51. #define UNISP_NAME  UNISP_NAME_W
  52. #define PCT1SP_NAME  PCT1SP_NAME_W
  53. #define SSL2SP_NAME  SSL2SP_NAME_W
  54. #define SSL3SP_NAME  SSL3SP_NAME_W
  55. #define TLS1SP_NAME  TLS1SP_NAME_W
  56.  
  57. #else
  58.  
  59. #define UNISP_NAME  UNISP_NAME_A
  60. #define PCT1SP_NAME  PCT1SP_NAME_A
  61. #define SSL2SP_NAME  SSL2SP_NAME_A
  62. #define SSL3SP_NAME  SSL3SP_NAME_A
  63. #define TLS1SP_NAME  TLS1SP_NAME_A
  64.  
  65. #endif
  66.  
  67.  
  68. //
  69. // RPC constants.
  70. //
  71.  
  72. #define UNISP_RPC_ID    14
  73.  
  74.  
  75. //
  76. // QueryContextAttributes/QueryCredentialsAttribute extensions
  77. //
  78.  
  79. #define SECPKG_ATTR_ISSUER_LIST          0x50   // (OBSOLETE) returns SecPkgContext_IssuerListInfo
  80. #define SECPKG_ATTR_REMOTE_CRED          0x51   // (OBSOLETE) returns SecPkgContext_RemoteCredentialInfo
  81. #define SECPKG_ATTR_LOCAL_CRED           0x52   // (OBSOLETE) returns SecPkgContext_LocalCredentialInfo
  82. #define SECPKG_ATTR_REMOTE_CERT_CONTEXT  0x53   // returns PCCERT_CONTEXT
  83. #define SECPKG_ATTR_LOCAL_CERT_CONTEXT   0x54   // returns PCCERT_CONTEXT
  84. #define SECPKG_ATTR_ROOT_STORE           0x55   // returns HCERTCONTEXT to the root store
  85. #define SECPKG_ATTR_SUPPORTED_ALGS       0x56   // returns SecPkgCred_SupportedAlgs
  86. #define SECPKG_ATTR_CIPHER_STRENGTHS     0x57   // returns SecPkgCred_CipherStrengths
  87. #define SECPKG_ATTR_SUPPORTED_PROTOCOLS  0x58   // returns SecPkgCred_SupportedProtocols
  88. #define SECPKG_ATTR_ISSUER_LIST_EX       0x59   // returns SecPkgContext_IssuerListInfoEx
  89. #define SECPKG_ATTR_CONNECTION_INFO      0x5a   // returns SecPkgContext_ConnectionInfo
  90. #define SECPKG_ATTR_EAP_KEY_BLOCK        0x5b   // returns SecPkgContext_EapKeyBlock
  91. #define SECPKG_ATTR_MAPPED_CRED_ATTR     0x5c   // returns SecPkgContext_MappedCredAttr
  92. #define SECPKG_ATTR_CACHE_INFO_ATTR      0x5d   // returns SecPkgCred_CacheInfo
  93.  
  94.  
  95. // OBSOLETE - included here for backward compatibility only
  96. typedef struct _SecPkgContext_IssuerListInfo
  97. {
  98.     DWORD   cbIssuerList;
  99.     PBYTE   pIssuerList;
  100. } SecPkgContext_IssuerListInfo, *PSecPkgContext_IssuerListInfo;
  101.  
  102.  
  103. // OBSOLETE - included here for backward compatibility only
  104. typedef struct _SecPkgContext_RemoteCredentialInfo
  105. {
  106.     DWORD   cbCertificateChain;
  107.     PBYTE   pbCertificateChain;
  108.     DWORD   cCertificates;
  109.     DWORD   fFlags;
  110.     DWORD   dwBits;
  111. } SecPkgContext_RemoteCredentialInfo, *PSecPkgContext_RemoteCredentialInfo;
  112.  
  113. typedef SecPkgContext_RemoteCredentialInfo SecPkgContext_RemoteCredenitalInfo, *PSecPkgContext_RemoteCredenitalInfo;
  114.  
  115. #define RCRED_STATUS_NOCRED          0x00000000
  116. #define RCRED_CRED_EXISTS            0x00000001
  117. #define RCRED_STATUS_UNKNOWN_ISSUER  0x00000002
  118.  
  119.  
  120. // OBSOLETE - included here for backward compatibility only
  121. typedef struct _SecPkgContext_LocalCredentialInfo
  122. {
  123.     DWORD   cbCertificateChain;
  124.     PBYTE   pbCertificateChain;
  125.     DWORD   cCertificates;
  126.     DWORD   fFlags;
  127.     DWORD   dwBits;
  128. } SecPkgContext_LocalCredentialInfo, *PSecPkgContext_LocalCredentialInfo;
  129.  
  130. typedef SecPkgContext_LocalCredentialInfo SecPkgContext_LocalCredenitalInfo, *PSecPkgContext_LocalCredenitalInfo;
  131.  
  132. #define LCRED_STATUS_NOCRED          0x00000000
  133. #define LCRED_CRED_EXISTS            0x00000001
  134. #define LCRED_STATUS_UNKNOWN_ISSUER  0x00000002
  135.  
  136.  
  137. typedef struct _SecPkgCred_SupportedAlgs
  138. {
  139.     DWORD        cSupportedAlgs;
  140.     ALG_ID        *palgSupportedAlgs;
  141. } SecPkgCred_SupportedAlgs, *PSecPkgCred_SupportedAlgs;
  142.  
  143.  
  144. typedef struct _SecPkgCred_CipherStrengths
  145. {
  146.     DWORD       dwMinimumCipherStrength;
  147.     DWORD       dwMaximumCipherStrength;
  148. } SecPkgCred_CipherStrengths, *PSecPkgCred_CipherStrengths;
  149.  
  150.  
  151. typedef struct _SecPkgCred_SupportedProtocols
  152. {
  153.     DWORD          grbitProtocol;
  154. } SecPkgCred_SupportedProtocols, *PSecPkgCred_SupportedProtocols;
  155.  
  156.  
  157. typedef struct _SecPkgContext_IssuerListInfoEx
  158. {
  159.     PCERT_NAME_BLOB       aIssuers;
  160.     DWORD               cIssuers;
  161. } SecPkgContext_IssuerListInfoEx, *PSecPkgContext_IssuerListInfoEx;
  162.  
  163.  
  164. typedef struct _SecPkgContext_ConnectionInfo
  165. {
  166.     DWORD   dwProtocol;
  167.     ALG_ID  aiCipher;
  168.     DWORD   dwCipherStrength;
  169.     ALG_ID  aiHash;
  170.     DWORD   dwHashStrength;
  171.     ALG_ID  aiExch;
  172.     DWORD   dwExchStrength;
  173. } SecPkgContext_ConnectionInfo, *PSecPkgContext_ConnectionInfo;
  174.  
  175.  
  176. typedef struct _SecPkgContext_EapKeyBlock
  177. {
  178.     BYTE    rgbKeys[128];
  179.     BYTE    rgbIVs[64];
  180. } SecPkgContext_EapKeyBlock, *PSecPkgContext_EapKeyBlock;
  181.  
  182.  
  183. typedef struct _SecPkgContext_MappedCredAttr
  184. {
  185.     DWORD   dwAttribute;
  186.     PVOID   pvBuffer;
  187. } SecPkgContext_MappedCredAttr, *PSecPkgContext_MappedCredAttr;
  188.  
  189.  
  190. typedef struct _SecPkgCred_CacheInfo
  191. {
  192.     DWORD cbBytesCommitted;
  193.     DWORD cMaxCacheEntries;
  194.     DWORD cEntries;
  195.     DWORD cUsed;
  196.     DWORD cOrphans;
  197.     DWORD cExpiredOrphans;
  198.     DWORD cExpiredAbortedOrphans;
  199.     DWORD cHandshaking;
  200. } SecPkgCred_CacheInfo, *PSecPkgCred_CacheInfo;
  201.  
  202.  
  203. //
  204. // Schannel credentials data structure.
  205. //
  206.  
  207. #define SCH_CRED_V1              0x00000001
  208. #define SCH_CRED_V2              0x00000002  // for legacy code
  209. #define SCH_CRED_VERSION         0x00000002  // for legacy code
  210. #define SCH_CRED_V3              0x00000003  // for legacy code
  211. #define SCHANNEL_CRED_VERSION    0x00000004
  212.  
  213.  
  214. struct _HMAPPER;
  215.  
  216. typedef struct _SCHANNEL_CRED
  217. {
  218.     DWORD           dwVersion;      // always SCHANNEL_CRED_VERSION
  219.     DWORD           cCreds;
  220.     PCCERT_CONTEXT *paCred;
  221.     HCERTSTORE      hRootStore;
  222.  
  223.     DWORD           cMappers;
  224.     struct _HMAPPER **aphMappers;
  225.  
  226.     DWORD           cSupportedAlgs;
  227.     ALG_ID *        palgSupportedAlgs;
  228.  
  229.     DWORD           grbitEnabledProtocols;
  230.     DWORD           dwMinimumCipherStrength;
  231.     DWORD           dwMaximumCipherStrength;
  232.     DWORD           dwSessionLifespan;
  233.     DWORD           dwFlags;
  234.     DWORD           reserved;
  235. } SCHANNEL_CRED, *PSCHANNEL_CRED;
  236.  
  237.  
  238. //+-------------------------------------------------------------------------
  239. // Flags for use with SCHANNEL_CRED
  240. //
  241. // SCH_CRED_NO_SYSTEM_MAPPER
  242. //      This flag is intended for use by server applications only. If this
  243. //      flag is set, then schannel does *not* attempt to map received client
  244. //      certificate chains to an NT user account using the built-in system
  245. //      certificate mapper.This flag is ignored by non-NT5 versions of
  246. //      schannel.
  247. //
  248. // SCH_CRED_NO_SERVERNAME_CHECK
  249. //      This flag is intended for use by client applications only. If this
  250. //      flag is set, then when schannel validates the received server
  251. //      certificate chain, is does *not* compare the passed in target name
  252. //      with the subject name embedded in the certificate. This flag is
  253. //      ignored by non-NT5 versions of schannel. This flag is also ignored
  254. //      if the SCH_CRED_MANUAL_CRED_VALIDATION flag is set.
  255. //
  256. // SCH_CRED_MANUAL_CRED_VALIDATION
  257. //      This flag is intended for use by client applications only. If this
  258. //      flag is set, then schannel will *not* automatically attempt to
  259. //      validate the received server certificate chain. This flag is
  260. //      ignored by non-NT5 versions of schannel, but all client applications
  261. //      that wish to validate the certificate chain themselves should
  262. //      specify this flag, so that there's at least a chance they'll run
  263. //      correctly on NT5.
  264. //
  265. // SCH_CRED_NO_DEFAULT_CREDS
  266. //      This flag is intended for use by client applications only. If this
  267. //      flag is set, and the server requests client authentication, then
  268. //      schannel will *not* attempt to automatically acquire a suitable
  269. //      default client certificate chain. This flag is ignored by non-NT5
  270. //      versions of schannel, but all client applications that wish to
  271. //      manually specify their certicate chains should specify this flag,
  272. //      so that there's at least a chance they'll run correctly on NT5.
  273. //
  274. // SCH_CRED_AUTO_CRED_VALIDATION
  275. //      This flag is the opposite of SCH_CRED_MANUAL_CRED_VALIDATION.
  276. //      Conservatively written client applications will always specify one
  277. //      flag or the other.
  278. //
  279. // SCH_CRED_USE_DEFAULT_CREDS
  280. //      This flag is the opposite of SCH_CRED_NO_DEFAULT_CREDS.
  281. //      Conservatively written client applications will always specify one
  282. //      flag or the other.
  283. //
  284. // SCH_CRED_REVOCATION_CHECK_END_CERT
  285. // SCH_CRED_REVOCATION_CHECK_CHAIN
  286. // SCH_CRED_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT
  287. //      These flags specify that when schannel automatically validates a
  288. //      received certificate chain, some or all of the certificates are to
  289. //      be checked for revocation. Only one of these flags may be specified.
  290. //      See the CertGetCertificateChain function. These flags are ignored by
  291. //      non-NT5 versions of schannel.
  292. //
  293. // SCH_CRED_IGNORE_NO_REVOCATION_CHECK
  294. // SCH_CRED_IGNORE_REVOCATION_OFFLINE
  295. //      These flags instruct schannel to ignore the
  296. //      CRYPT_E_NO_REVOCATION_CHECK and CRYPT_E_REVOCATION_OFFLINE errors
  297. //      respectively if they are encountered when attempting to check the
  298. //      revocation status of a received certificate chain. These flags are
  299. //      ignored if none of the above flags are set.
  300. //
  301. //+-------------------------------------------------------------------------
  302. #define SCH_CRED_NO_SYSTEM_MAPPER                    0x00000002
  303. #define SCH_CRED_NO_SERVERNAME_CHECK                 0x00000004
  304. #define SCH_CRED_MANUAL_CRED_VALIDATION              0x00000008
  305. #define SCH_CRED_NO_DEFAULT_CREDS                    0x00000010
  306. #define SCH_CRED_AUTO_CRED_VALIDATION                0x00000020
  307. #define SCH_CRED_USE_DEFAULT_CREDS                   0x00000040
  308.  
  309. #define SCH_CRED_REVOCATION_CHECK_END_CERT           0x00000100
  310. #define SCH_CRED_REVOCATION_CHECK_CHAIN              0x00000200
  311. #define SCH_CRED_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT 0x00000400
  312. #define SCH_CRED_IGNORE_NO_REVOCATION_CHECK          0x00000800
  313. #define SCH_CRED_IGNORE_REVOCATION_OFFLINE           0x00001000
  314.  
  315.  
  316. //
  317. //
  318. // ApplyControlToken PkgParams types
  319. //
  320. // These identifiers are the DWORD types
  321. // to be passed into ApplyControlToken
  322. // through a PkgParams buffer.
  323.  
  324. #define SCHANNEL_RENEGOTIATE    0   // renegotiate a connection
  325. #define SCHANNEL_SHUTDOWN       1   // gracefully close down a connection
  326. #define SCHANNEL_ALERT          2   // build an error message
  327.  
  328.  
  329. // Alert token structure.
  330. typedef struct _SCHANNEL_ALERT_TOKEN
  331. {
  332.     DWORD   dwTokenType;            // SCHANNEL_ALERT
  333.     DWORD   dwAlertType;
  334.     DWORD   dwAlertNumber;
  335. } SCHANNEL_ALERT_TOKEN;
  336.  
  337. // Alert types.
  338. #define TLS1_ALERT_WARNING              1
  339. #define TLS1_ALERT_FATAL                2
  340.  
  341. // Alert messages.
  342. #define TLS1_ALERT_CLOSE_NOTIFY         0       // warning
  343. #define TLS1_ALERT_UNEXPECTED_MESSAGE   10      // error
  344. #define TLS1_ALERT_BAD_RECORD_MAC       20      // error
  345. #define TLS1_ALERT_DECRYPTION_FAILED    21      // error
  346. #define TLS1_ALERT_RECORD_OVERFLOW      22      // error
  347. #define TLS1_ALERT_DECOMPRESSION_FAIL   30      // error
  348. #define TLS1_ALERT_HANDSHAKE_FAILURE    40      // error
  349. #define TLS1_ALERT_BAD_CERTIFICATE      42      // warning or error
  350. #define TLS1_ALERT_UNSUPPORTED_CERT     43      // warning or error
  351. #define TLS1_ALERT_CERTIFICATE_REVOKED  44      // warning or error
  352. #define TLS1_ALERT_CERTIFICATE_EXPIRED  45      // warning or error
  353. #define TLS1_ALERT_CERTIFICATE_UNKNOWN  46      // warning or error
  354. #define TLS1_ALERT_ILLEGAL_PARAMETER    47      // error
  355. #define TLS1_ALERT_UNKNOWN_CA           48      // error
  356. #define TLS1_ALERT_ACCESS_DENIED        49      // error
  357. #define TLS1_ALERT_DECODE_ERROR         50      // error
  358. #define TLS1_ALERT_DECRYPT_ERROR        51      // error
  359. #define TLS1_ALERT_EXPORT_RESTRICTION   60      // error
  360. #define TLS1_ALERT_PROTOCOL_VERSION     70      // error
  361. #define TLS1_ALERT_INSUFFIENT_SECURITY  71      // error
  362. #define TLS1_ALERT_INTERNAL_ERROR       80      // error
  363. #define TLS1_ALERT_USER_CANCELED        90      // warning or error
  364. #define TLS1_ALERT_NO_RENEGOTIATATION   100     // warning
  365.  
  366.  
  367. //
  368. //
  369. // ADDITIONAL SCHANNEL CERTIFICATE PROPERTIES
  370. //
  371. //
  372.  
  373.  
  374. // This property specifies the DER private key data associated with this
  375. // certificate.  It is for use with legacy IIS style private keys.
  376. //
  377. // PBYTE
  378. //
  379. #define CERT_SCHANNEL_IIS_PRIVATE_KEY_PROP_ID  (CERT_FIRST_USER_PROP_ID + 0)
  380.  
  381. // The password used to crack the private key associated with the certificate.
  382. // It is for use with legacy IIS style private keys.
  383. //
  384. // PBYTE
  385. #define CERT_SCHANNEL_IIS_PASSWORD_PROP_ID  (CERT_FIRST_USER_PROP_ID + 1)
  386.  
  387. // This is the unique ID of a Server Gated Cryptography certificate associated
  388. // with this certificate.
  389. //
  390. // CRYPT_BIT_BLOB
  391. #define CERT_SCHANNEL_SGC_CERTIFICATE_PROP_ID  (CERT_FIRST_USER_PROP_ID + 2)
  392.  
  393.  
  394.  
  395. //
  396. // Flags for identifying the various different protocols.
  397. //
  398.  
  399. /* flag/identifiers for protocols we support */
  400. #define SP_PROT_PCT1_SERVER             0x00000001
  401. #define SP_PROT_PCT1_CLIENT             0x00000002
  402. #define SP_PROT_PCT1                    (SP_PROT_PCT1_SERVER | SP_PROT_PCT1_CLIENT)
  403.  
  404. #define SP_PROT_SSL2_SERVER             0x00000004
  405. #define SP_PROT_SSL2_CLIENT             0x00000008
  406. #define SP_PROT_SSL2                    (SP_PROT_SSL2_SERVER | SP_PROT_SSL2_CLIENT)
  407.  
  408. #define SP_PROT_SSL3_SERVER             0x00000010
  409. #define SP_PROT_SSL3_CLIENT             0x00000020
  410. #define SP_PROT_SSL3                    (SP_PROT_SSL3_SERVER | SP_PROT_SSL3_CLIENT)
  411.  
  412. #define SP_PROT_TLS1_SERVER             0x00000040
  413. #define SP_PROT_TLS1_CLIENT             0x00000080
  414. #define SP_PROT_TLS1                    (SP_PROT_TLS1_SERVER | SP_PROT_TLS1_CLIENT)
  415.  
  416. #define SP_PROT_SSL3TLS1_CLIENTS        (SP_PROT_TLS1_CLIENT | SP_PROT_SSL3_CLIENT)
  417. #define SP_PROT_SSL3TLS1_SERVERS        (SP_PROT_TLS1_SERVER | SP_PROT_SSL3_SERVER)
  418. #define SP_PROT_SSL3TLS1                (SP_PROT_SSL3 | SP_PROT_TLS1)
  419.  
  420. #define SP_PROT_UNI_SERVER              0x40000000
  421. #define SP_PROT_UNI_CLIENT              0x80000000
  422. #define SP_PROT_UNI                     (SP_PROT_UNI_SERVER | SP_PROT_UNI_CLIENT)
  423.  
  424. #define SP_PROT_ALL                     0xffffffff
  425. #define SP_PROT_NONE                    0
  426. #define SP_PROT_CLIENTS                 (SP_PROT_PCT1_CLIENT | SP_PROT_SSL2_CLIENT | SP_PROT_SSL3_CLIENT | SP_PROT_UNI_CLIENT | SP_PROT_TLS1_CLIENT)
  427. #define SP_PROT_SERVERS                 (SP_PROT_PCT1_SERVER | SP_PROT_SSL2_SERVER | SP_PROT_SSL3_SERVER | SP_PROT_UNI_SERVER | SP_PROT_TLS1_SERVER)
  428.  
  429.  
  430. // A call for IIS to empty the cache.
  431. BOOL
  432. SslEmptyCache(VOID);
  433.  
  434.  
  435. //
  436. //
  437. //  Support for legacy applications
  438. //  NOTE: Do not use the following
  439. //  API's and structures for new code.
  440. //
  441.  
  442. #define SSLOLD_NAME_A    "Microsoft SSL"
  443. #define SSLOLD_NAME_W    L"Microsoft SSL"
  444. #define PCTOLD_NAME_A    "Microsoft PCT"
  445. #define PCTOLD_NAME_W    L"Microsoft PCT"
  446.  
  447. #ifdef UNICODE
  448. #define SSLOLD_NAME SSLOLD_NAME_W
  449. #define PCTOLD_NAME PCTOLD_NAME_W
  450. #else
  451. #define SSLOLD_NAME SSLOLD_NAME_A
  452. #define PCTOLD_NAME PCTOLD_NAME_A
  453. #endif
  454.  
  455. #define NETWORK_DREP    0x00000000
  456.  
  457.  
  458.  
  459. // Structures for compatability with the
  460. // NT 4.0 SP2 / IE 3.0 schannel interface, do
  461. // not use.
  462.  
  463. typedef struct _SSL_CREDENTIAL_CERTIFICATE {
  464.     DWORD   cbPrivateKey;
  465.     PBYTE   pPrivateKey;
  466.     DWORD   cbCertificate;
  467.     PBYTE   pCertificate;
  468.     PSTR    pszPassword;
  469. } SSL_CREDENTIAL_CERTIFICATE, * PSSL_CREDENTIAL_CERTIFICATE;
  470.  
  471.  
  472.  
  473.  
  474. // Structures for use with the
  475. // NT 4.0 SP3 Schannel interface,
  476. // do not use.
  477. #define SCHANNEL_SECRET_TYPE_CAPI   0x00000001
  478. #define SCHANNEL_SECRET_PRIVKEY     0x00000002
  479. #define SCH_CRED_X509_CERTCHAIN     0x00000001
  480. #define SCH_CRED_X509_CAPI          0x00000002
  481. #define SCH_CRED_CERT_CONTEXT       0x00000003
  482.  
  483. struct _HMAPPER;
  484. typedef struct _SCH_CRED
  485. {
  486.     DWORD     dwVersion;                // always SCH_CRED_VERSION.
  487.     DWORD     cCreds;                   // Number of credentials.
  488.     PVOID     *paSecret;                // Array of SCH_CRED_SECRET_* pointers
  489.     PVOID     *paPublic;                // Array of SCH_CRED_PUBLIC_* pointers
  490.     DWORD     cMappers;                 // Number of credential mappers.
  491.     struct _HMAPPER   **aphMappers;     // pointer to an array of pointers to credential mappers
  492. } SCH_CRED, * PSCH_CRED;
  493.  
  494. // Structures for use with the
  495. // NT 4.0 SP3 Schannel interface,
  496. // do not use.
  497. typedef struct _SCH_CRED_SECRET_CAPI
  498. {
  499.     DWORD           dwType;      // SCHANNEL_SECRET_TYPE_CAPI
  500.     HCRYPTPROV      hProv;       // credential secret information.
  501.  
  502. } SCH_CRED_SECRET_CAPI, * PSCH_CRED_SECRET_CAPI;
  503.  
  504.  
  505. // Structures for use with the
  506. // NT 4.0 SP3 Schannel interface,
  507. // do not use.
  508. typedef struct _SCH_CRED_SECRET_PRIVKEY
  509. {
  510.     DWORD           dwType;       // SCHANNEL_SECRET_PRIVKEY
  511.     PBYTE           pPrivateKey;   // Der encoded private key
  512.     DWORD           cbPrivateKey;
  513.     PSTR            pszPassword;  // Password to crack the private key.
  514.  
  515. } SCH_CRED_SECRET_PRIVKEY, * PSCH_CRED_SECRET_PRIVKEY;
  516.  
  517.  
  518. // Structures for use with the
  519. // NT 4.0 SP3 Schannel interface,
  520. // do not use.
  521. typedef struct _SCH_CRED_PUBLIC_CERTCHAIN
  522. {
  523.     DWORD       dwType;
  524.     DWORD       cbCertChain;
  525.     PBYTE       pCertChain;
  526. } SCH_CRED_PUBLIC_CERTCHAIN, *PSCH_CRED_PUBLIC_CERTCHAIN;
  527.  
  528. // Structures for use with the
  529. // NT 4.0 SP3 Schannel interface,
  530. // do not use.
  531. typedef struct _SCH_CRED_PUBLIC_CAPI
  532. {
  533.     DWORD           dwType;      // SCH_CRED_X509_CAPI
  534.     HCRYPTPROV      hProv;       // CryptoAPI handle (usually a token CSP)
  535.  
  536. } SCH_CRED_PUBLIC_CAPI, * PSCH_CRED_PUBLIC_CAPI;
  537.  
  538.  
  539.  
  540.  
  541. // Structures needed for Pre NT4.0 SP2 calls.
  542. typedef struct _PctPublicKey
  543. {
  544.     DWORD Type;
  545.     DWORD cbKey;
  546.     UCHAR pKey[1];
  547. } PctPublicKey;
  548.  
  549. typedef struct _X509Certificate {
  550.     DWORD           Version;
  551.     DWORD           SerialNumber[4];
  552.     ALG_ID          SignatureAlgorithm;
  553.     FILETIME        ValidFrom;
  554.     FILETIME        ValidUntil;
  555.     PSTR            pszIssuer;
  556.     PSTR            pszSubject;
  557.     PctPublicKey    *pPublicKey;
  558. } X509Certificate, * PX509Certificate;
  559.  
  560.  
  561.  
  562. // Pre NT4.0 SP2 calls.  Call CAPI1 or CAPI2
  563. // to get the same functionality instead.
  564. BOOL
  565. SslGenerateKeyPair(
  566.     PSSL_CREDENTIAL_CERTIFICATE pCerts,
  567.     PSTR pszDN,
  568.     PSTR pszPassword,
  569.     DWORD Bits );
  570.  
  571. // Pre NT4.0 SP2 calls.  Call CAPI1 or CAPI2
  572. // to get the same functionality instead.
  573. VOID
  574. SslGenerateRandomBits(
  575.     PUCHAR      pRandomData,
  576.     LONG        cRandomData
  577.     );
  578.  
  579. // Pre NT4.0 SP2 calls.  Call CAPI1 or CAPI2
  580. // to get the same functionality instead.
  581. BOOL
  582. SslCrackCertificate(
  583.     PUCHAR              pbCertificate,
  584.     DWORD               cbCertificate,
  585.     DWORD               dwFlags,
  586.     PX509Certificate *  ppCertificate
  587.     );
  588.  
  589. // Pre NT4.0 SP2 calls.  Call CAPI1 or CAPI2
  590. // to get the same functionality instead.
  591. VOID
  592. SslFreeCertificate(
  593.     PX509Certificate    pCertificate
  594.     );
  595.  
  596. DWORD
  597. WINAPI
  598. SslGetMaximumKeySize(
  599.     DWORD   Reserved );
  600.  
  601. BOOL
  602. SslGetDefaultIssuers(
  603.     PBYTE pbIssuers,
  604.     DWORD *pcbIssuers);
  605.  
  606. #define SSL_CRACK_CERTIFICATE_NAME  TEXT("SslCrackCertificate")
  607. #define SSL_FREE_CERTIFICATE_NAME   TEXT("SslFreeCertificate")
  608.  
  609. // Pre NT4.0 SP2 calls.  Call CAPI1 or CAPI2
  610. // to get the same functionality instead.
  611. typedef BOOL
  612. (WINAPI * SSL_CRACK_CERTIFICATE_FN)
  613. (
  614.     PUCHAR              pbCertificate,
  615.     DWORD               cbCertificate,
  616.     BOOL                VerifySignature,
  617.     PX509Certificate *  ppCertificate
  618. );
  619.  
  620.  
  621. // Pre NT4.0 SP2 calls.  Call CAPI1 or CAPI2
  622. // to get the same functionality instead.
  623. typedef VOID
  624. (WINAPI * SSL_FREE_CERTIFICATE_FN)
  625. (
  626.     PX509Certificate    pCertificate
  627. );
  628.  
  629.  
  630. #pragma option pop /*P_O_Pop*/
  631. #endif //__SCHANNEL_H__
  632.