1 // CoreUtil
2 //
3 // Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
4 // Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
5 //
6 // License: The Apache License, Version 2.0
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // DISCLAIMER
10 // ==========
11 //
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
17 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18 // SOFTWARE.
19 //
20 // THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN, UNDER
21 // JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY, MERGE, PUBLISH,
22 // DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS SOFTWARE, THAT ANY
23 // JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS SOFTWARE OR ITS CONTENTS,
24 // AGAINST US (SOFTETHER PROJECT, SOFTETHER CORPORATION, DAIYUU NOBORI OR OTHER
25 // SUPPLIERS), OR ANY JURIDICAL DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND
26 // OF USING, COPYING, MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING,
27 // AND/OR SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
28 // CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO EXCLUSIVE
29 // JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO, JAPAN. YOU MUST WAIVE
30 // ALL DEFENSES OF LACK OF PERSONAL JURISDICTION AND FORUM NON CONVENIENS.
31 // PROCESS MAY BE SERVED ON EITHER PARTY IN THE MANNER AUTHORIZED BY APPLICABLE
32 // LAW OR COURT RULE.
33 //
34 // USE ONLY IN JAPAN. DO NOT USE THIS SOFTWARE IN ANOTHER COUNTRY UNLESS YOU HAVE
35 // A CONFIRMATION THAT THIS SOFTWARE DOES NOT VIOLATE ANY CRIMINAL LAWS OR CIVIL
36 // RIGHTS IN THAT PARTICULAR COUNTRY. USING THIS SOFTWARE IN OTHER COUNTRIES IS
37 // COMPLETELY AT YOUR OWN RISK. THE SOFTETHER VPN PROJECT HAS DEVELOPED AND
38 // DISTRIBUTED THIS SOFTWARE TO COMPLY ONLY WITH THE JAPANESE LAWS AND EXISTING
39 // CIVIL RIGHTS INCLUDING PATENTS WHICH ARE SUBJECTS APPLY IN JAPAN. OTHER
40 // COUNTRIES' LAWS OR CIVIL RIGHTS ARE NONE OF OUR CONCERNS NOR RESPONSIBILITIES.
41 // WE HAVE NEVER INVESTIGATED ANY CRIMINAL REGULATIONS, CIVIL LAWS OR
42 // INTELLECTUAL PROPERTY RIGHTS INCLUDING PATENTS IN ANY OF OTHER 200+ COUNTRIES
43 // AND TERRITORIES. BY NATURE, THERE ARE 200+ REGIONS IN THE WORLD, WITH
44 // DIFFERENT LAWS. IT IS IMPOSSIBLE TO VERIFY EVERY COUNTRIES' LAWS, REGULATIONS
45 // AND CIVIL RIGHTS TO MAKE THE SOFTWARE COMPLY WITH ALL COUNTRIES' LAWS BY THE
46 // PROJECT. EVEN IF YOU WILL BE SUED BY A PRIVATE ENTITY OR BE DAMAGED BY A
47 // PUBLIC SERVANT IN YOUR COUNTRY, THE DEVELOPERS OF THIS SOFTWARE WILL NEVER BE
48 // LIABLE TO RECOVER OR COMPENSATE SUCH DAMAGES, CRIMINAL OR CIVIL
49 // RESPONSIBILITIES. NOTE THAT THIS LINE IS NOT LICENSE RESTRICTION BUT JUST A
50 // STATEMENT FOR WARNING AND DISCLAIMER.
51 //
52 // READ AND UNDERSTAND THE 'WARNING.TXT' FILE BEFORE USING THIS SOFTWARE.
53 // SOME SOFTWARE PROGRAMS FROM THIRD PARTIES ARE INCLUDED ON THIS SOFTWARE WITH
54 // LICENSE CONDITIONS WHICH ARE DESCRIBED ON THE 'THIRD_PARTY.TXT' FILE.
55 //
56 //
57 // SOURCE CODE CONTRIBUTION
58 // ------------------------
59 //
60 // Your contribution to SoftEther VPN Project is much appreciated.
61 // Please send patches to us through GitHub.
62 // Read the SoftEther VPN Patch Acceptance Policy in advance:
63 // http://www.softether.org/5-download/src/9.patch
64 //
65 //
66 // DEAR SECURITY EXPERTS
67 // ---------------------
68 //
69 // If you find a bug or a security vulnerability please kindly inform us
70 // about the problem immediately so that we can fix the security problem
71 // to protect a lot of users around the world as soon as possible.
72 //
73 // Our e-mail address for security reports is:
74 // softether-vpn-security [at] softether.org
75 //
76 // Please note that the above e-mail address is not a technical support
77 // inquiry address. If you need technical assistance, please visit
78 // http://www.softether.org/ and ask your question on the users forum.
79 //
80 // Thank you for your cooperation.
81 //
82 //
83 // NO MEMORY OR RESOURCE LEAKS
84 // ---------------------------
85 //
86 // The memory-leaks and resource-leaks verification under the stress
87 // test has been passed before release this source code.
88 
89 
90 using System;
91 using System.Threading;
92 using System.Data;
93 using System.Data.Sql;
94 using System.Data.SqlClient;
95 using System.Data.SqlTypes;
96 using System.Text;
97 using System.Configuration;
98 using System.Collections;
99 using System.Collections.Generic;
100 using System.Security.Cryptography;
101 using System.Web;
102 using System.Web.Security;
103 using System.Web.UI;
104 using System.Web.UI.WebControls;
105 using System.Web.UI.WebControls.WebParts;
106 using System.Web.UI.HtmlControls;
107 using System.IO;
108 using System.IO.Compression;
109 using System.Drawing;
110 using System.Drawing.Imaging;
111 using System.Drawing.Drawing2D;
112 using System.Runtime.InteropServices;
113 using CoreUtil.Internal;
114 
115 namespace CoreUtil
116 {
117 	[StructLayout(LayoutKind.Sequential, Pack = 1)]
118 	public struct GZipHeader
119 	{
120 		public byte ID1, ID2, CM, FLG;
121 		public uint MTIME;
122 		public byte XFL, OS;
123 	}
124 
125 	[StructLayout(LayoutKind.Sequential, Pack = 1)]
126 	public struct GZipFooter
127 	{
128 		public uint CRC32;
129 		public uint ISIZE;
130 	}
131 
132 	public static class GZipUtil
133 	{
Decompress(byte[] gzip)134 		public static byte[] Decompress(byte[] gzip)
135 		{
136 			using (GZipStream stream = new GZipStream(new MemoryStream(gzip), CompressionMode.Decompress))
137 			{
138 				const int size = 4096;
139 				byte[] buffer = new byte[size];
140 				using (MemoryStream memory = new MemoryStream())
141 				{
142 					int count = 0;
143 					do
144 					{
145 						count = stream.Read(buffer, 0, size);
146 						if (count > 0)
147 						{
148 							memory.Write(buffer, 0, count);
149 						}
150 					}
151 					while (count > 0);
152 					return memory.ToArray();
153 				}
154 			}
155 		}
156 	}
157 
158 	public class GZipPacker
159 	{
160 		Fifo fifo;
161 		ZStream zs;
162 		long currentSize;
163 		uint crc32;
164 		bool finished;
165 
166 		public bool Finished
167 		{
168 			get { return finished; }
169 		}
170 
171 		public Fifo GeneratedData
172 		{
173 			get
174 			{
175 				return this.fifo;
176 			}
177 		}
178 
GZipPacker()179 		public GZipPacker()
180 		{
181 			fifo = new Fifo();
182 
183 			zs = new ZStream();
184 			zs.deflateInit(-1, -15);
185 
186 			this.currentSize = 0;
187 			this.crc32 = 0xffffffff;
188 			this.finished = false;
189 
190 			GZipHeader h = new GZipHeader();
191 			h.ID1 = 0x1f;
192 			h.ID2 = 0x8b;
193 			h.FLG = 0;
194 			h.MTIME = Util.DateTimeToUnixTime(DateTime.Now.ToUniversalTime());
195 			h.XFL = 0;
196 			h.OS = 3;
197 			h.CM = 8;
198 
199 			fifo.Write(Util.StructToByte(h));
200 		}
201 
Write(byte[] data, int pos, int len, bool finish)202 		public void Write(byte[] data, int pos, int len, bool finish)
203 		{
204 			byte[] srcData = Util.ExtractByteArray(data, pos, len);
205 			byte[] dstData = new byte[srcData.Length * 2 + 100];
206 
207 			if (this.finished)
208 			{
209 				throw new ApplicationException("already finished");
210 			}
211 
212 			zs.next_in = srcData;
213 			zs.avail_in = srcData.Length;
214 			zs.next_in_index = 0;
215 
216 			zs.next_out = dstData;
217 			zs.avail_out = dstData.Length;
218 			zs.next_out_index = 0;
219 
220 			if (finish)
221 			{
222 				zs.deflate(zlibConst.Z_FINISH);
223 			}
224 			else
225 			{
226 				zs.deflate(zlibConst.Z_SYNC_FLUSH);
227 			}
228 
229 			fifo.Write(dstData, 0, dstData.Length - zs.avail_out);
230 
231 			currentSize += len;
232 
233 			this.crc32 = ZipUtil.Crc32Next(data, pos, len, this.crc32);
234 
235 			if (finish)
236 			{
237 				this.finished = true;
238 				this.crc32 = ~this.crc32;
239 
240 				GZipFooter f = new GZipFooter();
241 				f.CRC32 = this.crc32;
242 				f.ISIZE = (uint)(this.currentSize % 0x100000000);
243 
244 				fifo.Write(Util.StructToByte(f));
245 			}
246 		}
247 	}
248 }
249