1 /**
2  * FreeRDP: A Remote Desktop Protocol Implementation
3  * RDP Protocol Security Negotiation
4  *
5  * Copyright 2011-2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 
20 #ifndef FREERDP_LIB_CORE_NEGO_H
21 #define FREERDP_LIB_CORE_NEGO_H
22 
23 #include "transport.h"
24 
25 #include <freerdp/types.h>
26 #include <freerdp/settings.h>
27 #include <freerdp/log.h>
28 #include <freerdp/api.h>
29 
30 #include <winpr/stream.h>
31 
32 /* Protocol Security Negotiation Protocols
33  * [MS-RDPBCGR] 2.2.1.1.1 RDP Negotiation Request (RDP_NEG_REQ)
34  */
35 #define PROTOCOL_RDP 0x00000000
36 #define PROTOCOL_SSL 0x00000001
37 #define PROTOCOL_HYBRID 0x00000002
38 #define PROTOCOL_RDSTLS 0x00000004
39 #define PROTOCOL_HYBRID_EX 0x00000008
40 
41 #define PROTOCOL_FAILED_NEGO 0x80000000 /* only used internally, not on the wire */
42 
43 /* Protocol Security Negotiation Failure Codes */
44 enum RDP_NEG_FAILURE_FAILURECODES
45 {
46 	SSL_REQUIRED_BY_SERVER = 0x00000001,
47 	SSL_NOT_ALLOWED_BY_SERVER = 0x00000002,
48 	SSL_CERT_NOT_ON_SERVER = 0x00000003,
49 	INCONSISTENT_FLAGS = 0x00000004,
50 	HYBRID_REQUIRED_BY_SERVER = 0x00000005,
51 	SSL_WITH_USER_AUTH_REQUIRED_BY_SERVER = 0x00000006
52 };
53 
54 /* Authorization Result */
55 #define AUTHZ_SUCCESS 0x00000000
56 #define AUTHZ_ACCESS_DENIED 0x0000052E
57 
58 enum _NEGO_STATE
59 {
60 	NEGO_STATE_INITIAL,
61 	NEGO_STATE_EXT,  /* Extended NLA (NLA + TLS implicit) */
62 	NEGO_STATE_NLA,  /* Network Level Authentication (TLS implicit) */
63 	NEGO_STATE_TLS,  /* TLS Encryption without NLA */
64 	NEGO_STATE_RDP,  /* Standard Legacy RDP Encryption */
65 	NEGO_STATE_FAIL, /* Negotiation failure */
66 	NEGO_STATE_FINAL
67 };
68 typedef enum _NEGO_STATE NEGO_STATE;
69 
70 /* RDP Negotiation Messages */
71 enum RDP_NEG_MSG
72 {
73 	/* X224_TPDU_CONNECTION_REQUEST */
74 	TYPE_RDP_NEG_REQ = 0x1,
75 	/* X224_TPDU_CONNECTION_CONFIRM */
76 	TYPE_RDP_NEG_RSP = 0x2,
77 	TYPE_RDP_NEG_FAILURE = 0x3
78 };
79 
80 #define EXTENDED_CLIENT_DATA_SUPPORTED 0x01
81 #define DYNVC_GFX_PROTOCOL_SUPPORTED 0x02
82 #define RDP_NEGRSP_RESERVED 0x04
83 #define RESTRICTED_ADMIN_MODE_SUPPORTED 0x08
84 
85 #define PRECONNECTION_PDU_V1_SIZE 16
86 #define PRECONNECTION_PDU_V2_MIN_SIZE (PRECONNECTION_PDU_V1_SIZE + 2)
87 
88 #define PRECONNECTION_PDU_V1 1
89 #define PRECONNECTION_PDU_V2 2
90 
91 #define RESTRICTED_ADMIN_MODE_REQUIRED 0x01
92 #define REDIRECTED_AUTHENTICATION_MODE_REQUIRED 0x02
93 #define CORRELATION_INFO_PRESENT 0x08
94 
95 typedef struct rdp_nego rdpNego;
96 
97 FREERDP_LOCAL BOOL nego_connect(rdpNego* nego);
98 FREERDP_LOCAL BOOL nego_disconnect(rdpNego* nego);
99 
100 FREERDP_LOCAL int nego_recv(rdpTransport* transport, wStream* s, void* extra);
101 FREERDP_LOCAL BOOL nego_read_request(rdpNego* nego, wStream* s);
102 
103 FREERDP_LOCAL BOOL nego_send_negotiation_request(rdpNego* nego);
104 FREERDP_LOCAL BOOL nego_send_negotiation_response(rdpNego* nego);
105 
106 FREERDP_LOCAL rdpNego* nego_new(rdpTransport* transport);
107 FREERDP_LOCAL void nego_free(rdpNego* nego);
108 
109 FREERDP_LOCAL void nego_init(rdpNego* nego);
110 FREERDP_LOCAL BOOL nego_set_target(rdpNego* nego, const char* hostname, UINT16 port);
111 FREERDP_LOCAL void nego_set_negotiation_enabled(rdpNego* nego, BOOL NegotiateSecurityLayer);
112 FREERDP_LOCAL void nego_set_restricted_admin_mode_required(rdpNego* nego,
113                                                            BOOL RestrictedAdminModeRequired);
114 FREERDP_LOCAL void nego_set_gateway_enabled(rdpNego* nego, BOOL GatewayEnabled);
115 FREERDP_LOCAL void nego_set_gateway_bypass_local(rdpNego* nego, BOOL GatewayBypassLocal);
116 FREERDP_LOCAL void nego_enable_rdp(rdpNego* nego, BOOL enable_rdp);
117 FREERDP_LOCAL void nego_enable_tls(rdpNego* nego, BOOL enable_tls);
118 FREERDP_LOCAL void nego_enable_nla(rdpNego* nego, BOOL enable_nla);
119 FREERDP_LOCAL void nego_enable_ext(rdpNego* nego, BOOL enable_ext);
120 FREERDP_LOCAL const BYTE* nego_get_routing_token(rdpNego* nego, DWORD* RoutingTokenLength);
121 FREERDP_LOCAL BOOL nego_set_routing_token(rdpNego* nego, BYTE* RoutingToken,
122                                           DWORD RoutingTokenLength);
123 FREERDP_LOCAL BOOL nego_set_cookie(rdpNego* nego, char* cookie);
124 FREERDP_LOCAL void nego_set_cookie_max_length(rdpNego* nego, UINT32 CookieMaxLength);
125 FREERDP_LOCAL void nego_set_send_preconnection_pdu(rdpNego* nego, BOOL SendPreconnectionPdu);
126 FREERDP_LOCAL void nego_set_preconnection_id(rdpNego* nego, UINT32 PreconnectionId);
127 FREERDP_LOCAL void nego_set_preconnection_blob(rdpNego* nego, char* PreconnectionBlob);
128 
129 FREERDP_LOCAL UINT32 nego_get_selected_protocol(rdpNego* nego);
130 FREERDP_LOCAL BOOL nego_set_selected_protocol(rdpNego* nego, UINT32 SelectedProtocol);
131 
132 FREERDP_LOCAL UINT32 nego_get_requested_protocols(rdpNego* nego);
133 FREERDP_LOCAL BOOL nego_set_requested_protocols(rdpNego* nego, UINT32 RequestedProtocols);
134 
135 FREERDP_LOCAL BOOL nego_set_state(rdpNego* nego, NEGO_STATE state);
136 FREERDP_LOCAL NEGO_STATE nego_get_state(rdpNego* nego);
137 
138 FREERDP_LOCAL SEC_WINNT_AUTH_IDENTITY* nego_get_identity(rdpNego* nego);
139 
140 FREERDP_LOCAL void nego_free_nla(rdpNego* nego);
141 
142 #endif /* FREERDP_LIB_CORE_NEGO_H */
143