1 // SoftEther VPN Source Code - Developer Edition Master Branch
2 // Cedar Communication Module
3 
4 
5 // Protocol.h
6 // Header of Protocol.c
7 
8 #ifndef	PROTOCOL_H
9 #define	PROTOCOL_H
10 
11 #include "Connection.h"
12 
13 // The parameters that will be passed to the certificate confirmation thread
14 struct CHECK_CERT_THREAD_PROC
15 {
16 	CONNECTION *Connection;
17 	X *ServerX;
18 	CHECK_CERT_PROC *CheckCertProc;
19 	bool UserSelected;
20 	bool Expired;
21 	bool Ok;
22 };
23 
24 // The parameters that will be passed to the secure device signature thread
25 struct SECURE_SIGN_THREAD_PROC
26 {
27 	SECURE_SIGN_PROC *SecureSignProc;
28 	CONNECTION *Connection;
29 	SECURE_SIGN *SecureSign;
30 	bool UserFinished;
31 	bool Ok;
32 };
33 
34 // Signature sending thread parameters
35 struct SEND_SIGNATURE_PARAM
36 {
37 	char Hostname[MAX_PATH];		// Host name
38 	UINT Port;						// Port number
39 	BUF *Buffer;					// Packet contents
40 };
41 
42 // Software update client callback
43 typedef void (UPDATE_NOTIFY_PROC)(UPDATE_CLIENT *c, UINT latest_build, UINT64 latest_date, char *latest_ver, char *url, volatile bool *halt_flag, void *param);
44 typedef bool (UPDATE_ISFOREGROUND_PROC)(UPDATE_CLIENT *c, void *param);
45 
46 // Configure the software update client
47 struct UPDATE_CLIENT_SETTING
48 {
49 	bool DisableCheck;				// Disable the update check
50 	UINT LatestIgnoreBuild;			// Ignore for earlier or identical to this build number
51 };
52 
53 // Software update client
54 struct UPDATE_CLIENT
55 {
56 	char FamilyName[MAX_SIZE];		// Product family name
57 	char SoftwareName[MAX_SIZE];	// Software Name
58 	wchar_t SoftwareTitle[MAX_SIZE];	// Software display name
59 	char ClientId[128];				// Client ID
60 	UINT MyBuild;					// Build number of myself
61 	UINT64 MyDate;					// Build date of myself
62 	char MyLanguage[MAX_SIZE];		// My language
63 	UPDATE_CLIENT_SETTING Setting;	// Setting
64 	UINT LatestBuild;				// Latest build number that was successfully acquired
65 	volatile bool HaltFlag;			// Halting flag
66 	EVENT *HaltEvent;				// Halting event
67 	void *Param;					// Any parameters
68 	THREAD *Thread;					// Thread
69 	UPDATE_NOTIFY_PROC *Callback;	// Callback function
70 	UPDATE_ISFOREGROUND_PROC *IsForegroundCb;	// Callback function for retrieving whether foreground
71 };
72 
73 //// Constant related to updating of the software
74 
75 // Family
76 #define	UPDATE_FAMILY_NAME			_SS("PRODUCT_FAMILY_NAME")
77 
78 // Software update server certificate hash
79 #define	UPDATE_SERVER_CERT_HASH		DDNS_CERT_HASH
80 
81 // URL
82 #define	UPDATE_SERVER_URL_GLOBAL	"https://update-check.softether-network.net/update/update.aspx?family=%s&software=%s&mybuild=%u&lang=%s"
83 #define	UPDATE_SERVER_URL_CHINA		"https://update-check.uxcom.jp/update/update.aspx?family=%s&software=%s&mybuild=%u&lang=%s"
84 
85 // Update check interval
86 #define	UPDATE_CHECK_INTERVAL_MIN		(12 * 3600 * 1000)
87 #define	UPDATE_CHECK_INTERVAL_MAX		(24 * 7200 * 1000)
88 
89 // Connection parameters
90 #define	UPDATE_CONNECT_TIMEOUT			5000
91 #define	UPDATE_COMM_TIMEOUT				5000
92 
93 // Dynamic root cert fetch function
94 #define	CERT_HTTP_DOWNLOAD_MAXSIZE	65536
95 #define	CERT_HTTP_DOWNLOAD_TIMEOUT	(10 * 1000)
96 #define	ROOT_CERTS_FILENAME			"|root_certs.dat"
97 #define	AUTO_DOWNLOAD_CERTS_PREFIX	L".autodownload_"
98 #define	FIND_CERT_CHAIN_MAX_DEPTH	16
99 
100 #define	PROTO_SUPPRESS_CLIENT_UPDATE_NOTIFICATION_REGKEY	"Software\\" GC_REG_COMPANY_NAME "\\" CEDAR_PRODUCT_STR " VPN\\Client Update Notification"
101 #define	PROTO_SUPPRESS_CLIENT_UPDATE_NOTIFICATION_REGVALUE	"Suppress"
102 
103 // Function prototype
104 UPDATE_CLIENT *NewUpdateClient(UPDATE_NOTIFY_PROC *cb, UPDATE_ISFOREGROUND_PROC *isforeground_cb, void *param, char *family_name, char *software_name, wchar_t *software_title, UINT my_build, UINT64 my_date, char *my_lang, UPDATE_CLIENT_SETTING *current_setting, char *client_id);
105 void FreeUpdateClient(UPDATE_CLIENT *c);
106 void UpdateClientThreadProc(THREAD *thread, void *param);
107 void UpdateClientThreadMain(UPDATE_CLIENT *c);
108 void UpdateClientThreadProcessResults(UPDATE_CLIENT *c, BUF *b);
109 void SetUpdateClientSetting(UPDATE_CLIENT *c, UPDATE_CLIENT_SETTING *s);
110 UINT64 ShortStrToDate64(char *str);
111 
112 
113 bool ServerAccept(CONNECTION *c);
114 bool ClientConnect(CONNECTION *c);
115 SOCK *ClientConnectToServer(CONNECTION *c);
116 SOCK *TcpIpConnectEx(char *hostname, UINT port, bool *cancel_flag, void *hWnd, UINT *nat_t_error_code, bool no_nat_t, bool try_start_ssl, IP *ret_ip);
117 bool ClientUploadSignature(SOCK *s);
118 bool ClientDownloadHello(CONNECTION *c, SOCK *s);
119 bool ServerDownloadSignature(CONNECTION *c, char **error_detail_str);
120 bool ServerUploadHello(CONNECTION *c);
121 bool ClientUploadAuth(CONNECTION *c);
122 SOCK *ClientConnectGetSocket(CONNECTION *c, bool additional_connect);
123 SOCK *TcpConnectEx3(char *hostname, UINT port, UINT timeout, bool *cancel_flag, void *hWnd, bool no_nat_t, UINT *nat_t_error_code, bool try_start_ssl, IP *ret_ip);
124 
125 UINT ProxyCodeToCedar(UINT code);
126 
127 void InitProtocol();
128 void FreeProtocol();
129 
130 POLICY *PackGetPolicy(PACK *p);
131 void PackAddPolicy(PACK *p, POLICY *y);
132 PACK *PackWelcome(SESSION *s);
133 PACK *PackHello(void *random, UINT ver, UINT build, char *server_str);
134 bool GetHello(PACK *p, void *random, UINT *ver, UINT *build, char *server_str, UINT server_str_size);
135 PACK *PackLoginWithAnonymous(char *hubname, char *username);
136 PACK *PackLoginWithPassword(char *hubname, char *username, void *secure_password);
137 PACK *PackLoginWithPlainPassword(char *hubname, char *username, void *plain_password);
138 PACK *PackLoginWithCert(char *hubname, char *username, X *x, void *sign, UINT sign_size);
139 PACK *PackLoginWithWireGuardKey(char *key);
140 PACK *PackLoginWithOpenVPNCertificate(char *hubname, char *username, X *x);
141 bool GetMethodFromPack(PACK *p, char *method, UINT size);
142 bool GetHubnameAndUsernameFromPack(PACK *p, char *username, UINT username_size,
143 								   char *hubname, UINT hubname_size);
144 PACK *PackAdditionalConnect(UCHAR *session_key);
145 UINT GetAuthTypeFromPack(PACK *p);
146 UINT GetProtocolFromPack(PACK *p);
147 bool ParseWelcomeFromPack(PACK *p, char *session_name, UINT session_name_size,
148 						  char *connection_name, UINT connection_name_size,
149 						  POLICY **policy);
150 
151 
152 bool ClientAdditionalConnect(CONNECTION *c, THREAD *t);
153 SOCK *ClientAdditionalConnectToServer(CONNECTION *c);
154 bool ClientUploadAuth2(CONNECTION *c, SOCK *s);
155 bool GetSessionKeyFromPack(PACK *p, UCHAR *session_key, UINT *session_key_32);
156 
157 void CreateNodeInfo(NODE_INFO *info, CONNECTION *c);
158 UINT SecureSign(SECURE_SIGN *sign, UINT device_id, char *pin);
159 void ClientUploadNoop(CONNECTION *c);
160 bool ClientCheckServerCert(CONNECTION *c, bool *expired);
161 void ClientCheckServerCertThread(THREAD *thread, void *param);
162 bool ClientSecureSign(CONNECTION *c, UCHAR *sign, UCHAR *random, X **x);
163 void ClientSecureSignThread(THREAD *thread, void *param);
164 TOKEN_LIST *EnumHub(SESSION *s);
165 UINT ChangePasswordAccept(CONNECTION *c, PACK *p);
166 UINT ChangePassword(CEDAR *cedar, CLIENT_OPTION *o, char *hubname, char *username, char *old_pass, char *new_pass);
167 void PackAddClientVersion(PACK *p, CONNECTION *c);
168 void NodeInfoToStr(wchar_t *str, UINT size, NODE_INFO *info);
169 void GenerateMachineUniqueHash(void *data);
170 
171 LIST *NewCertList(bool load_root_and_chain);
172 void FreeCertList(LIST *o);
173 bool IsXInCertList(LIST *o, X *x);
174 void AddXToCertList(LIST *o, X *x);
175 void AddAllRootCertsToCertList(LIST *o);
176 void AddAllChainCertsToCertList(LIST *o);
177 X *DownloadCert(char *url);
178 X *FindCertIssuerFromCertList(LIST *o, X *x);
179 bool TryGetRootCertChain(LIST *o, X *x, bool auto_save, X **found_root_x);
180 bool TryGetParentCertFromCertList(LIST *o, X *x, LIST *found_chain);
181 bool DownloadAndSaveIntermediateCertificatesIfNecessary(X *x);
182 
183 #endif	// PROTOCOL_H
184