1 /**
2  * FreeRDP: A Remote Desktop Protocol Implementation
3  * Licensing API
4  *
5  * Copyright 2018 David Fort <contact@hardening-consulting.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_LICENSE_H
21 #define FREERDP_LICENSE_H
22 
23 #include <freerdp/api.h>
24 
25 typedef struct rdp_license rdpLicense;
26 
27 /** @brief Licensing Packet Types */
28 enum
29 {
30 	LICENSE_REQUEST = 0x01,
31 	PLATFORM_CHALLENGE = 0x02,
32 	NEW_LICENSE = 0x03,
33 	UPGRADE_LICENSE = 0x04,
34 	LICENSE_INFO = 0x12,
35 	NEW_LICENSE_REQUEST = 0x13,
36 	PLATFORM_CHALLENGE_RESPONSE = 0x15,
37 	ERROR_ALERT = 0xFF
38 };
39 
40 #define LICENSE_PKT_CS_MASK \
41 	(LICENSE_INFO | NEW_LICENSE_REQUEST | PLATFORM_CHALLENGE_RESPONSE | ERROR_ALERT)
42 #define LICENSE_PKT_SC_MASK \
43 	(LICENSE_REQUEST | PLATFORM_CHALLENGE | NEW_LICENSE | UPGRADE_LICENSE | ERROR_ALERT)
44 #define LICENSE_PKT_MASK (LICENSE_PKT_CS_MASK | LICENSE_PKT_SC_MASK)
45 
46 #define LICENSE_PREAMBLE_LENGTH 4
47 
48 /* Cryptographic Lengths */
49 
50 #define CLIENT_RANDOM_LENGTH 32
51 #define SERVER_RANDOM_LENGTH 32
52 #define MASTER_SECRET_LENGTH 48
53 #define PREMASTER_SECRET_LENGTH 48
54 #define SESSION_KEY_BLOB_LENGTH 48
55 #define MAC_SALT_KEY_LENGTH 16
56 #define LICENSING_ENCRYPTION_KEY_LENGTH 16
57 #define HWID_PLATFORM_ID_LENGTH 4
58 #define HWID_UNIQUE_DATA_LENGTH 16
59 #define HWID_LENGTH 20
60 #define LICENSING_PADDING_SIZE 8
61 
62 /* Preamble Flags */
63 
64 #define PREAMBLE_VERSION_2_0 0x02
65 #define PREAMBLE_VERSION_3_0 0x03
66 #define LicenseProtocolVersionMask 0x0F
67 #define EXTENDED_ERROR_MSG_SUPPORTED 0x80
68 
69 /** @brief binary Blob Types */
70 enum
71 {
72 	BB_ANY_BLOB = 0x0000,
73 	BB_DATA_BLOB = 0x0001,
74 	BB_RANDOM_BLOB = 0x0002,
75 	BB_CERTIFICATE_BLOB = 0x0003,
76 	BB_ERROR_BLOB = 0x0004,
77 	BB_ENCRYPTED_DATA_BLOB = 0x0009,
78 	BB_KEY_EXCHG_ALG_BLOB = 0x000D,
79 	BB_SCOPE_BLOB = 0x000E,
80 	BB_CLIENT_USER_NAME_BLOB = 0x000F,
81 	BB_CLIENT_MACHINE_NAME_BLOB = 0x0010
82 };
83 
84 /* License Key Exchange Algorithms */
85 
86 #define KEY_EXCHANGE_ALG_RSA 0x00000001
87 
88 /** @brief license Error Codes */
89 enum
90 {
91 	ERR_INVALID_SERVER_CERTIFICATE = 0x00000001,
92 	ERR_NO_LICENSE = 0x00000002,
93 	ERR_INVALID_MAC = 0x00000003,
94 	ERR_INVALID_SCOPE = 0x00000004,
95 	ERR_NO_LICENSE_SERVER = 0x00000006,
96 	STATUS_VALID_CLIENT = 0x00000007,
97 	ERR_INVALID_CLIENT = 0x00000008,
98 	ERR_INVALID_PRODUCT_ID = 0x0000000B,
99 	ERR_INVALID_MESSAGE_LENGTH = 0x0000000C
100 };
101 
102 /** @brief state Transition Codes */
103 enum
104 {
105 	ST_TOTAL_ABORT = 0x00000001,
106 	ST_NO_TRANSITION = 0x00000002,
107 	ST_RESET_PHASE_TO_START = 0x00000003,
108 	ST_RESEND_LAST_MESSAGE = 0x00000004
109 };
110 
111 /** @brief Platform Challenge Types */
112 enum
113 {
114 	WIN32_PLATFORM_CHALLENGE_TYPE = 0x0100,
115 	WIN16_PLATFORM_CHALLENGE_TYPE = 0x0200,
116 	WINCE_PLATFORM_CHALLENGE_TYPE = 0x0300,
117 	OTHER_PLATFORM_CHALLENGE_TYPE = 0xFF00
118 };
119 
120 /** @brief License Detail Levels */
121 enum
122 {
123 	LICENSE_DETAIL_SIMPLE = 0x0001,
124 	LICENSE_DETAIL_MODERATE = 0x0002,
125 	LICENSE_DETAIL_DETAIL = 0x0003
126 };
127 
128 /*
129  * PlatformId:
130  *
131  * The most significant byte of the PlatformId field contains the operating system version of the
132  * client. The second most significant byte of the PlatformId field identifies the ISV that provided
133  * the client image. The remaining two bytes in the PlatformId field are used by the ISV to identify
134  * the build number of the operating system.
135  *
136  * 0x04010000:
137  *
138  * CLIENT_OS_ID_WINNT_POST_52	(0x04000000)
139  * CLIENT_IMAGE_ID_MICROSOFT	(0x00010000)
140  */
141 enum
142 {
143 	CLIENT_OS_ID_WINNT_351 = 0x01000000,
144 	CLIENT_OS_ID_WINNT_40 = 0x02000000,
145 	CLIENT_OS_ID_WINNT_50 = 0x03000000,
146 	CLIENT_OS_ID_WINNT_POST_52 = 0x04000000,
147 
148 	CLIENT_IMAGE_ID_MICROSOFT = 0x00010000,
149 	CLIENT_IMAGE_ID_CITRIX = 0x00020000,
150 };
151 
152 #ifdef __cpluscplus
153 extern "C"
154 {
155 #endif
156 
157 	FREERDP_API BOOL license_send_valid_client_error_packet(rdpRdp* rdp);
158 
159 #ifdef __cpluscplus
160 }
161 #endif
162 
163 #endif /* FREERDP_LICENSE_H */
164