5776629 [rkeene@sledge /home/rkeene/archive/floydssh/ssh]$ cat -n SshMisc.java
  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 }
5776630 [rkeene@sledge /home/rkeene/archive/floydssh/ssh]$

Click here to go back to the directory listing.
Click here to download this file.
last modified: 2004-03-06 22:44:06