1 /* 2 * This file is part of "The Java Telnet Application". 3 * 4 * (c) Matthias L. Jugel, Marcus Meißner 1996-2002. All Rights Reserved. 5 * The file was changed by Radek Polak to work as midlet in MIDP 1.0 6 * 7 * Please visit http://javatelnet.org/ for updates and contact. 8 * 9 * --LICENSE NOTICE-- 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 2 13 * of the License, or (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 23 * --LICENSE NOTICE-- 24 */ 25 package ssh; 26 27 28 import java.io.IOException; 29 30 /** 31 * @author Marcus Meissner 32 * @version $Id: SshMisc.java,v 1.6 2002/10/26 07:15:59 leo Exp $ 33 */ 34 public class SshMisc { 35 static MD5 md5 = new MD5(); 36 37 /** 38 * return the strint at the position offset in the data 39 * First 4 bytes are the length of the string, msb first (not 40 * including the length itself). The following "length" bytes are 41 * the string value. There are no terminating null characters. 42 */ 43 static public String getString(int offset, byte[] byteArray) throws IOException { 44 45 46 short d0 = byteArray[offset++]; 47 short d1 = byteArray[offset++]; 48 short d2 = byteArray[offset++]; 49 short d3 = byteArray[offset++]; 50 51 if (d0 < 0) d0 = (short) (256 + d0); 52 if (d1 < 0) d1 = (short) (256 + d1); 53 if (d2 < 0) d2 = (short) (256 + d2); 54 if (d3 < 0) d3 = (short) (256 + d3); 55 56 int length = d0 * 16777216 //to be checked 57 + d1 * 65536 58 + d2 * 256 59 + d3; 60 String str = ""; //new String(byteArray,0); 61 for (int i = 0; i < length; i++) { 62 if (byteArray[offset] >= 0) 63 str += (char) (byteArray[offset++]); 64 else 65 str += (char) (256 + byteArray[offset++]); 66 } 67 return str; 68 } 69 70 static public byte getNotZeroRandomByte() { 71 72 java.util.Date date = new java.util.Date(); 73 String randomString = String.valueOf( SshIO.rnd.nextLong() * date.getTime()); // RADEK date.GetTime() * Math.random() 74 byte[] randomBytes = md5.digest(randomString.getBytes()); 75 int i = 0; 76 while (i < 20) { 77 byte b = 0; 78 if (i < randomBytes.length) b = randomBytes[i]; 79 if (b != 0) return b; 80 i++; 81 } 82 return getNotZeroRandomByte(); 83 } 84 85 static public byte[] addArrayOfBytes(byte[] a, byte[] b) { 86 if (a == null) return b; 87 if (b == null) return a; 88 byte[] temp = new byte[a.length + b.length]; 89 for (int i = 0; i < a.length; i++) temp[i] = a[i]; 90 for (int i = 0; i < b.length; i++) temp[i + a.length] = b[i]; 91 return temp; 92 } 93 94 95 static public byte[] XORArrayOfBytes(byte[] a, byte[] b) { 96 if (a == null) return null; 97 if (b == null) return null; 98 if (a.length != b.length) return null; 99 byte[] result = new byte[a.length]; 100 for (int i = 0; i < result.length; i++) result[i] = (byte) (((a[i] & 0xff) ^ (b[i] & 0xff)) & 0xff);// ^ xor operator 101 return result; 102 } 103 104 /** 105 * Return the mp-int at the position offset in the data 106 * First 2 bytes are the number of bits in the integer, msb first 107 * (for example, the value 0x00012345 would have 17 bits). The 108 * value zero has zero bits. It is permissible that the number of 109 * bits be larger than the real number of bits. 110 * The number of bits is followed by (bits + 7) / 8 bytes of binary 111 * data, msb first, giving the value of the integer. 112 */ 113 114 static public byte[] getMpInt(int offset, byte[] byteArray) throws IOException { 115 116 byte[] MpInt; 117 118 short d0 = byteArray[offset++]; 119 short d1 = byteArray[offset++]; 120 121 if (d0 < 0) d0 = (short) (256 + d0); 122 if (d1 < 0) d1 = (short) (256 + d1); 123 124 125 int byteLength = (d0 * 256 + d1 + 7) / 8; 126 MpInt = new byte[byteLength]; 127 for (int i = 0; i < byteLength; i++) MpInt[i] = byteArray[offset++]; 128 return MpInt; 129 } //getMpInt 130 131 132 /** 133 * Return a Arbitrary length binary string 134 * First 4 bytes are the length of the string, msb first (not 135 * including the length itself). The following "length" bytes are 136 * the string value. There are no terminating null characters. 137 */ 138 static public byte[] createString(String str) throws IOException { 139 140 int length = str.length(); 141 byte[] value = new byte[4 + length]; 142 143 value[3] = (byte) ((length) & 0xff); 144 value[2] = (byte) ((length >> 8) & 0xff); 145 value[1] = (byte) ((length >> 16) & 0xff); 146 value[0] = (byte) ((length >> 24) & 0xff); 147 148 byte[] strByte = str.getBytes(); 149 150 for (int i = 0; i < length; i++) value[i + 4] = strByte[i]; 151 return value; 152 } //createString 153 154 155 /** 156 * This table simply represent the results of eight shift/xor operations for 157 * all combinations of data and CRC register values. In other words, it caches 158 * all the possible resulting values such that they won't need to be computed. 159 */ 160 static private long crc32_tab[] = { 161 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 162 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, 163 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 164 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 165 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L, 166 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 167 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 168 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, 169 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 170 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL, 171 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 172 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 173 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, 174 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 175 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 176 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, 177 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 178 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L, 179 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 180 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 181 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, 182 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 183 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L, 184 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, 185 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 186 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L, 187 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 188 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 189 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, 190 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 191 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 192 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, 193 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 194 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL, 195 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 196 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 197 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, 198 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 199 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 200 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, 201 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 202 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L, 203 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 204 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 205 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L, 206 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 207 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 208 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, 209 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 210 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L, 211 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 212 0x2d02ef8dL 213 }; 214 215 216 217 218 219 /** 220 * Compute the crc Cyclic Redundancy Check, with the polynomial 0xedb88320, 221 * The polynomial is X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 222 * We take it "backwards" and put the highest-order term in the lowest-order bit. 223 * The X^32 term is "implied"; the LSB is the X^31 term, etc. 224 * The X^0 term (usually shown as "+1") results in the MSB being 1. 225 * so the poly is 0x04c11db7 (used for Ethernet) 226 * The buf will be the Padding, Packet type, and Data fields. 227 * The crc is computed before any encryption. 228 * R =X^n * M rem P M message P polynomial crc R : crc calculated. 229 * T(x) = x^n * M(x) + R(x) property: T rem P = 0 230 */ 231 232 233 234 // Return a 32-bit CRC of the byte using the feedback terms table 235 236 static public long crc32(byte[] s, int len) { 237 int i; 238 long crc32val = 0; 239 for (i = 0; i < len; i++) { 240 crc32val = 241 crc32_tab[(int) ((crc32val ^ s[i]) & 0xff)] ^ (crc32val >> 8); 242 } 243 return crc32val; 244 } 245 246 } |