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