1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// All files in the project carrying such notice may not be copied, modified, or distributed
// except according to those terms.
use shared::guiddef::GUID;
use shared::minwindef::{BOOL, BYTE, DWORD};
use um::winnt::LPWSTR;
pub const eapPropCipherSuiteNegotiation: DWORD = 0x00000001;
pub const eapPropMutualAuth: DWORD = 0x00000002;
pub const eapPropIntegrity: DWORD = 0x00000004;
pub const eapPropReplayProtection: DWORD = 0x00000008;
pub const eapPropConfidentiality: DWORD = 0x00000010;
pub const eapPropKeyDerivation: DWORD = 0x00000020;
pub const eapPropKeyStrength64: DWORD = 0x00000040;
pub const eapPropKeyStrength128: DWORD = 0x00000080;
pub const eapPropKeyStrength256: DWORD = 0x00000100;
pub const eapPropKeyStrength512: DWORD = 0x00000200;
pub const eapPropKeyStrength1024: DWORD = 0x00000400;
pub const eapPropDictionaryAttackResistance: DWORD = 0x00000800;
pub const eapPropFastReconnect: DWORD = 0x00001000;
pub const eapPropCryptoBinding: DWORD = 0x00002000;
pub const eapPropSessionIndependence: DWORD = 0x00004000;
pub const eapPropFragmentation: DWORD = 0x00008000;
pub const eapPropChannelBinding: DWORD = 0x00010000;
pub const eapPropNap: DWORD = 0x00020000;
pub const eapPropStandalone: DWORD = 0x00040000;
pub const eapPropMppeEncryption: DWORD = 0x00080000;
pub const eapPropTunnelMethod: DWORD = 0x00100000;
pub const eapPropSupportsConfig: DWORD = 0x00200000;
pub const eapPropCertifiedMethod: DWORD = 0x00400000;
pub const eapPropHiddenMethod: DWORD = 0x00800000;
pub const eapPropMachineAuth: DWORD = 0x01000000;
pub const eapPropUserAuth: DWORD = 0x02000000;
pub const eapPropIdentityPrivacy: DWORD = 0x04000000;
pub const eapPropMethodChaining: DWORD = 0x08000000;
pub const eapPropSharedStateEquivalence: DWORD = 0x10000000;
pub const eapPropReserved: DWORD = 0x80000000;
pub const EAP_VALUENAME_PROPERTIES: &'static str = "Properties";
pub type EAP_SESSIONID = DWORD;
STRUCT!{struct EAP_TYPE {
    type_: BYTE,
    dwVendorId: DWORD,
    dwVendorType: DWORD,
}}
STRUCT!{struct EAP_METHOD_TYPE {
    eapType: EAP_TYPE,
    dwAuthorId: DWORD,
}}
STRUCT!{struct EAP_METHOD_INFO {
    eaptype: EAP_METHOD_TYPE,
    pwszAuthorName: LPWSTR,
    pwszFriendlyName: LPWSTR,
    eapProperties: DWORD,
    pInnerMethodInfo: *mut EAP_METHOD_INFO,
}}
STRUCT!{struct EAP_METHOD_INFO_EX {
    eaptype: EAP_METHOD_TYPE,
    pwszAuthorName: LPWSTR,
    pwszFriendlyName: LPWSTR,
    eapProperties: DWORD,
    pInnerMethodInfoArray: *mut EAP_METHOD_INFO_ARRAY_EX,
}}
STRUCT!{struct EAP_METHOD_INFO_ARRAY {
    dwNumberOfMethods: DWORD,
    pEapMethods: *mut EAP_METHOD_INFO,
}}
STRUCT!{struct EAP_METHOD_INFO_ARRAY_EX {
    dwNumberOfMethods: DWORD,
    pEapMethods: *mut EAP_METHOD_INFO_EX,
}}
STRUCT!{struct EAP_ERROR {
    dwWinError: DWORD,
    type_: EAP_METHOD_TYPE,
    dwReasonCode: DWORD,
    rootCauseGuid: GUID,
    repairGuid: GUID,
    helpLinkGuid: GUID,
    pRootCauseString: LPWSTR,
    pRepairString: LPWSTR,
}}
ENUM!{enum EAP_ATTRIBUTE_TYPE {
    eatMinimum = 0,
    eatUserName = 1,
    eatUserPassword = 2,
    eatMD5CHAPPassword = 3,
    eatNASIPAddress = 4,
    eatNASPort = 5,
    eatServiceType = 6,
    eatFramedProtocol = 7,
    eatFramedIPAddress = 8,
    eatFramedIPNetmask = 9,
    eatFramedRouting = 10,
    eatFilterId = 11,
    eatFramedMTU = 12,
    eatFramedCompression = 13,
    eatLoginIPHost = 14,
    eatLoginService = 15,
    eatLoginTCPPort = 16,
    eatUnassigned17 = 17,
    eatReplyMessage = 18,
    eatCallbackNumber = 19,
    eatCallbackId = 20,
    eatUnassigned21 = 21,
    eatFramedRoute = 22,
    eatFramedIPXNetwork = 23,
    eatState = 24,
    eatClass = 25,
    eatVendorSpecific = 26,
    eatSessionTimeout = 27,
    eatIdleTimeout = 28,
    eatTerminationAction = 29,
    eatCalledStationId = 30,
    eatCallingStationId = 31,
    eatNASIdentifier = 32,
    eatProxyState = 33,
    eatLoginLATService = 34,
    eatLoginLATNode = 35,
    eatLoginLATGroup = 36,
    eatFramedAppleTalkLink = 37,
    eatFramedAppleTalkNetwork = 38,
    eatFramedAppleTalkZone = 39,
    eatAcctStatusType = 40,
    eatAcctDelayTime = 41,
    eatAcctInputOctets = 42,
    eatAcctOutputOctets = 43,
    eatAcctSessionId = 44,
    eatAcctAuthentic = 45,
    eatAcctSessionTime = 46,
    eatAcctInputPackets = 47,
    eatAcctOutputPackets = 48,
    eatAcctTerminateCause = 49,
    eatAcctMultiSessionId = 50,
    eatAcctLinkCount = 51,
    eatAcctEventTimeStamp = 55,
    eatMD5CHAPChallenge = 60,
    eatNASPortType = 61,
    eatPortLimit = 62,
    eatLoginLATPort = 63,
    eatTunnelType = 64,
    eatTunnelMediumType = 65,
    eatTunnelClientEndpoint = 66,
    eatTunnelServerEndpoint = 67,
    eatARAPPassword = 70,
    eatARAPFeatures = 71,
    eatARAPZoneAccess = 72,
    eatARAPSecurity = 73,
    eatARAPSecurityData = 74,
    eatPasswordRetry = 75,
    eatPrompt = 76,
    eatConnectInfo = 77,
    eatConfigurationToken = 78,
    eatEAPMessage = 79,
    eatSignature = 80,
    eatARAPChallengeResponse = 84,
    eatAcctInterimInterval = 85,
    eatNASIPv6Address = 95,
    eatFramedInterfaceId = 96,
    eatFramedIPv6Prefix = 97,
    eatLoginIPv6Host = 98,
    eatFramedIPv6Route = 99,
    eatFramedIPv6Pool = 100,
    eatARAPGuestLogon = 8096,
    eatCertificateOID = 8097,
    eatEAPConfiguration = 8098,
    eatPEAPEmbeddedEAPTypeId = 8099,
    eatPEAPFastRoamedSession = 8100,
    eatFastRoamedSession = 8100,
    eatEAPTLV = 8102,
    eatCredentialsChanged = 8103,
    eatInnerEapMethodType = 8104,
    eatClearTextPassword = 8107,
    eatQuarantineSoH = 8150,
    eatCertificateThumbprint = 8250,
    eatPeerId = 9000,
    eatServerId = 9001,
    eatMethodId = 9002,
    eatEMSK = 9003,
    eatSessionId = 9004,
    eatReserved = 0xFFFFFFFF,
}}
pub type EapAttributeType = EAP_ATTRIBUTE_TYPE;
STRUCT!{struct EAP_ATTRIBUTE {
    eaType: EAP_ATTRIBUTE_TYPE,
    dwLength: DWORD,
    pValue: *mut BYTE,
}}
pub type EapAttribute = EAP_ATTRIBUTE;
STRUCT!{struct EAP_ATTRIBUTES {
    dwNumberOfAttributes: DWORD,
    pAttribs: *mut EAP_ATTRIBUTE,
}}
pub type EapAttributes = EAP_ATTRIBUTES;
pub const EAP_FLAG_Reserved1: DWORD = 0x00000001;
pub const EAP_FLAG_NON_INTERACTIVE: DWORD = 0x00000002;
pub const EAP_FLAG_LOGON: DWORD = 0x00000004;
pub const EAP_FLAG_PREVIEW: DWORD = 0x00000008;
pub const EAP_FLAG_Reserved2: DWORD = 0x00000010;
pub const EAP_FLAG_MACHINE_AUTH: DWORD = 0x00000020;
pub const EAP_FLAG_GUEST_ACCESS: DWORD = 0x00000040;
pub const EAP_FLAG_Reserved3: DWORD = 0x00000080;
pub const EAP_FLAG_Reserved4: DWORD = 0x00000100;
pub const EAP_FLAG_RESUME_FROM_HIBERNATE: DWORD = 0x00000200;
pub const EAP_FLAG_Reserved5: DWORD = 0x00000400;
pub const EAP_FLAG_Reserved6: DWORD = 0x00000800;
pub const EAP_FLAG_FULL_AUTH: DWORD = 0x00001000;
pub const EAP_FLAG_PREFER_ALT_CREDENTIALS: DWORD = 0x00002000;
pub const EAP_FLAG_Reserved7: DWORD = 0x00004000;
pub const EAP_PEER_FLAG_HEALTH_STATE_CHANGE: DWORD = 0x00008000;
pub const EAP_FLAG_SUPRESS_UI: DWORD = 0x00010000;
pub const EAP_FLAG_PRE_LOGON: DWORD = 0x00020000;
pub const EAP_FLAG_USER_AUTH: DWORD = 0x00040000;
pub const EAP_FLAG_CONFG_READONLY: DWORD = 0x00080000;
pub const EAP_FLAG_Reserved8: DWORD = 0x00100000;
pub const EAP_FLAG_Reserved9: DWORD = 0x00400000;
pub const EAP_FLAG_VPN: DWORD = 0x00800000;
pub const EAP_CONFIG_INPUT_FIELD_PROPS_DEFAULT: DWORD = 0x00000000;
pub const EAP_CONFIG_INPUT_FIELD_PROPS_NON_DISPLAYABLE: DWORD = 0x00000001;
pub const EAP_CONFIG_INPUT_FIELD_PROPS_NON_PERSIST: DWORD = 0x00000002;
pub const EAP_UI_INPUT_FIELD_PROPS_DEFAULT: DWORD = EAP_CONFIG_INPUT_FIELD_PROPS_DEFAULT;
pub const EAP_UI_INPUT_FIELD_PROPS_NON_DISPLAYABLE: DWORD =
    EAP_CONFIG_INPUT_FIELD_PROPS_NON_DISPLAYABLE;
pub const EAP_UI_INPUT_FIELD_PROPS_NON_PERSIST: DWORD = 0x00000002;
pub const EAP_UI_INPUT_FIELD_PROPS_READ_ONLY: DWORD = 0x00000004;
ENUM!{enum EAP_CONFIG_INPUT_FIELD_TYPE {
    EapConfigInputUsername = 0,
    EapConfigInputPassword = 1,
    EapConfigInputNetworkUsername = 2,
    EapConfigInputNetworkPassword = 3,
    EapConfigInputPin = 4,
    EapConfigInputPSK = 5,
    EapConfigInputEdit = 6,
    EapConfigSmartCardUsername = 7,
    EapConfigSmartCardError = 8,
}}
pub type PEAP_CONFIG_INPUT_FIELD_TYPE = *mut EAP_CONFIG_INPUT_FIELD_TYPE;
pub const EAP_CREDENTIAL_VERSION: i32 = 1;
pub const EAP_INTERACTIVE_UI_DATA_VERSION: i32 = 1;
pub const EAPHOST_PEER_API_VERSION: i32 = 1;
pub const EAPHOST_METHOD_API_VERSION: i32 = 1;
pub const MAX_EAP_CONFIG_INPUT_FIELD_LENGTH: i32 = 256;
pub const MAX_EAP_CONFIG_INPUT_FIELD_VALUE_LENGTH: i32 = 1024;
STRUCT!{struct EAP_CONFIG_INPUT_FIELD_DATA {
    dwSize: DWORD,
    Type: EAP_CONFIG_INPUT_FIELD_TYPE,
    dwFlagProps: DWORD,
    pwszLabel: LPWSTR,
    pwszData: LPWSTR,
    dwMinDataLength: DWORD,
    dwMaxDataLength: DWORD,
}}
pub type PEAP_CONFIG_INPUT_FIELD_DATA = *mut EAP_CONFIG_INPUT_FIELD_DATA;
STRUCT!{struct EAP_CONFIG_INPUT_FIELD_ARRAY {
    dwVersion: DWORD,
    dwNumberOfFields: DWORD,
    pFields: *mut EAP_CONFIG_INPUT_FIELD_DATA,
}}
pub type PEAP_CONFIG_INPUT_FIELD_ARRAY = *mut EAP_CONFIG_INPUT_FIELD_ARRAY;
ENUM!{enum EAP_INTERACTIVE_UI_DATA_TYPE {
    EapCredReq = 0,
    EapCredResp = 1,
    EapCredExpiryReq = 2,
    EapCredExpiryResp = 3,
    EapCredLogonReq = 4,
    EapCredLogonResp = 5,
}}
pub type EAP_CRED_REQ = EAP_CONFIG_INPUT_FIELD_ARRAY;
pub type EAP_CRED_RESP = EAP_CONFIG_INPUT_FIELD_ARRAY;
pub type EAP_CRED_LOGON_REQ = EAP_CONFIG_INPUT_FIELD_ARRAY;
pub type EAP_CRED_LOGON_RESP = EAP_CONFIG_INPUT_FIELD_ARRAY;
STRUCT!{struct EAP_CRED_EXPIRY_REQ {
    curCreds: EAP_CONFIG_INPUT_FIELD_ARRAY,
    newCreds: EAP_CONFIG_INPUT_FIELD_ARRAY,
}}
pub type EAP_CRED_EXPIRY_RESP = EAP_CRED_EXPIRY_REQ;
UNION!{union EAP_UI_DATA_FORMAT {
    [usize; 1],
    credData credData_mut: *mut EAP_CRED_REQ,
    credExpiryData credExpiryData_mut: *mut EAP_CRED_EXPIRY_REQ,
    credLogonData credLogonData_mut: *mut EAP_CRED_LOGON_REQ,
}}
STRUCT!{struct EAP_INTERACTIVE_UI_DATA {
    dwVersion: DWORD,
    dwSize: DWORD,
    dwDataType: EAP_INTERACTIVE_UI_DATA_TYPE,
    cbUiData: DWORD,
    pbUiData: EAP_UI_DATA_FORMAT,
}}
ENUM!{enum EAP_METHOD_PROPERTY_TYPE {
    emptPropCipherSuiteNegotiation = 0,
    emptPropMutualAuth = 1,
    emptPropIntegrity = 2,
    emptPropReplayProtection = 3,
    emptPropConfidentiality = 4,
    emptPropKeyDerivation = 5,
    emptPropKeyStrength64 = 6,
    emptPropKeyStrength128 = 7,
    emptPropKeyStrength256 = 8,
    emptPropKeyStrength512 = 9,
    emptPropKeyStrength1024 = 10,
    emptPropDictionaryAttackResistance = 11,
    emptPropFastReconnect = 12,
    emptPropCryptoBinding = 13,
    emptPropSessionIndependence = 14,
    emptPropFragmentation = 15,
    emptPropChannelBinding = 16,
    emptPropNap = 17,
    emptPropStandalone = 18,
    emptPropMppeEncryption = 19,
    emptPropTunnelMethod = 20,
    emptPropSupportsConfig = 21,
    emptPropCertifiedMethod = 22,
    emptPropHiddenMethod = 23,
    emptPropMachineAuth = 24,
    emptPropUserAuth = 25,
    emptPropIdentityPrivacy = 26,
    emptPropMethodChaining = 27,
    emptPropSharedStateEquivalence = 28,
    emptLegacyMethodPropertyFlag = 31,
    emptPropVendorSpecific = 255,
}}
ENUM!{enum EAP_METHOD_PROPERTY_VALUE_TYPE {
    empvtBool = 0,
    empvtDword = 1,
    empvtString = 2,
}}
STRUCT!{struct EAP_METHOD_PROPERTY_VALUE_BOOL {
    length: DWORD,
    value: BOOL,
}}
STRUCT!{struct EAP_METHOD_PROPERTY_VALUE_DWORD {
    length: DWORD,
    value: DWORD,
}}
STRUCT!{struct EAP_METHOD_PROPERTY_VALUE_STRING {
    length: DWORD,
    value: *mut BYTE,
}}
UNION!{union EAP_METHOD_PROPERTY_VALUE {
    [usize; 2],
    empvBool empvBool_mut: EAP_METHOD_PROPERTY_VALUE_BOOL,
    empvDword empvDword_mut: EAP_METHOD_PROPERTY_VALUE_DWORD,
    empvString empvString_mut: EAP_METHOD_PROPERTY_VALUE_STRING,
}}
STRUCT!{struct EAP_METHOD_PROPERTY {
    eapMethodPropertyType: EAP_METHOD_PROPERTY_TYPE,
    eapMethodPropertyValueType: EAP_METHOD_PROPERTY_VALUE_TYPE,
    eapMethodPropertyValue: EAP_METHOD_PROPERTY_VALUE,
}}
STRUCT!{struct EAP_METHOD_PROPERTY_ARRAY {
    dwNumberOfProperties: DWORD,
    pMethodProperty: *mut EAP_METHOD_PROPERTY,
}}
STRUCT!{struct EAPHOST_IDENTITY_UI_PARAMS {
    eapMethodType: EAP_METHOD_TYPE,
    dwFlags: DWORD,
    dwSizeofConnectionData: DWORD,
    pConnectionData: *mut BYTE,
    dwSizeofUserData: DWORD,
    pUserData: *mut BYTE,
    dwSizeofUserDataOut: DWORD,
    pUserDataOut: *mut BYTE,
    pwszIdentity: LPWSTR,
    dwError: DWORD,
    pEapError: *mut EAP_ERROR,
}}
STRUCT!{struct EAPHOST_INTERACTIVE_UI_PARAMS {
    dwSizeofContextData: DWORD,
    pContextData: *mut BYTE,
    dwSizeofInteractiveUIData: DWORD,
    pInteractiveUIData: *mut BYTE,
    dwError: DWORD,
    pEapError: *mut EAP_ERROR,
}}
ENUM!{enum EapCredentialType {
    EAP_EMPTY_CREDENTIAL = 0,
    EAP_USERNAME_PASSWORD_CREDENTIAL = 1,
    EAP_WINLOGON_CREDENTIAL = 2,
    EAP_CERTIFICATE_CREDENTIAL = 3,
    EAP_SIM_CREDENTIAL = 4,
}}
STRUCT!{struct EapUsernamePasswordCredential {
    username: LPWSTR,
    password: LPWSTR,
}}
pub const CERTIFICATE_HASH_LENGTH: usize = 20;
STRUCT!{struct EapCertificateCredential {
    certHash: [BYTE; CERTIFICATE_HASH_LENGTH],
    password: LPWSTR,
}}
STRUCT!{struct EapSimCredential {
    iccID: LPWSTR,
}}
UNION!{union EapCredentialTypeData {
    [u32; 6] [u64; 4],
    username_password username_password_mut: EapUsernamePasswordCredential,
    certificate certificate_mut: EapCertificateCredential,
    sim sim_mut: EapSimCredential,
}}
STRUCT!{struct EapCredential {
    credType: EapCredentialType,
    credData: EapCredentialTypeData,
}}