home *** CD-ROM | disk | FTP | other *** search
- package com.ibm.sslight;
-
- import java.io.IOException;
-
- class SSLClient extends SSLConnection {
- static final int CERT_REQ = 32;
- static final int HELLO_REQ = 64;
- static final int HELLO_DONE = 128;
- private int server_port;
- private boolean auth;
-
- int install(boolean var1) {
- if (var1 && super.handshake_state != 64) {
- return 0;
- } else {
- super.handshake_state = 2;
- if (!var1 || !SSLSession.reinstall(super.session, this)) {
- super.session = SSLSession.allocate(super.context.cm_list, super.context.cs_list, super.sock.getInetAddress().getAddress(), this.server_port, super.context.timeout[1]);
- }
-
- return this.sendClientHello();
- }
- }
-
- boolean uninstall(boolean var1) {
- return SSLSession.uninstall(super.session, this, var1);
- }
-
- int alert(byte var1, byte var2) {
- ((SSLConnection)this).sendAlert((byte)2, (byte)40);
- return -1;
- }
-
- int handshake(byte[] var1, byte var2, int var3, int var4, int var5) {
- switch (var2) {
- case 0:
- if ((64 & super.handshake_state) != 0) {
- return ((SSLConnection)this).reopen();
- }
-
- return 0;
- case 2:
- if ((2 & super.handshake_state) != 0) {
- return this.serverHello(var1, var3, var4);
- }
- break;
- case 11:
- if ((4 & super.handshake_state) != 0) {
- return this.serverCertificate(var1, var3, var4);
- }
- break;
- case 12:
- if ((8 & super.handshake_state) != 0) {
- return this.serverKeyExchange(var1, var3, var4);
- }
- break;
- case 13:
- if ((32 & super.handshake_state) != 0) {
- return this.serverCertificateRequest(var1, var3, var4);
- }
- break;
- case 14:
- if ((128 & super.handshake_state) != 0) {
- return this.serverHelloDone(var1, var3, var4);
- }
- break;
- case 20:
- if ((16 & super.handshake_state) != 0) {
- if (((SSLConnection)this).finished(var1, var3, var4) == 0) {
- SSLSession.install(super.session, this);
- ((SSLConnection)this).reset();
- super.handshake_state = 64;
- return 0;
- }
-
- return -1;
- }
- }
-
- ((SSLConnection)this).sendAlert((byte)2, (byte)10);
- return -1;
- }
-
- private int serverKeyExchange(byte[] var1, int var2, int var3) {
- int var4 = var3 - 4;
- int var5 = var2 + 4;
- int var7 = 0;
- super.key_exchange = new byte[3][];
- int var9 = (SSLConnection.cipherSuite[super.session.cipher_suite & 255] & 3840) == 256 ? 2 : 3;
-
- try {
- int var6;
- while(var4 >= 3 && (var6 = (int)Crypto.msbf(var1, var5, 2)) >= 1 && var6 <= 65535) {
- var5 += 2;
- int var8;
- super.key_exchange[var7] = new byte[var6 + (var8 = var1[var5] == 0 ? 0 : 1)];
- System.arraycopy(var1, var5, super.key_exchange[var7], var8, var6);
- var5 += var6;
- var4 -= var6 + 2;
- ++var7;
- if (var7 >= var9) {
- break;
- }
- }
-
- if (var7 == var9) {
- int var10 = var3 - 4 - var4;
- SSLCert var11 = null;
- if ((var6 = super.session.peer_cert == null ? 0 : ((var11 = super.session.peer_cert[0]).alg == 1 ? var11.keyL : 40)) == var4 - 2) {
- var4 = (int)Crypto.msbf(var1, var5, 2);
- var5 += 2;
- }
-
- if (var6 == var4) {
- if ((SSLConnection.cipherSuite[super.session.cipher_suite & 255] & '\uf000') == 0 || super.key_exchange[0].length - (super.key_exchange[0][0] == 0 ? 1 : 0) <= 64) {
- boolean var12 = true;
- if (var6 != 0) {
- byte[] var13 = new byte[36];
- ((SSLConnection)this).paramHash(var1, var2 + 4, var10, var13, 0, var11.alg == 1 ? 1 : 0);
- if (var11.alg == 1) {
- boolean var22;
- label79: {
- byte[] var14 = Crypto.rsa(false, 1, var11.key(), var1, var5, var6);
- if (var14 != null && var14.length == 36) {
- int var15 = 0;
- int var16 = 0;
- int var17 = 36;
-
- while(true) {
- --var17;
- if (var17 < 0) {
- var22 = true;
- break;
- }
-
- if (var14[var15++] != var13[var16++]) {
- var22 = false;
- break;
- }
- }
-
- if (var22) {
- var22 = true;
- break label79;
- }
- }
-
- var22 = false;
- }
-
- var12 = var22;
- }
- }
-
- if (var12) {
- ((SSLConnection)this).register(var1, var2, var3);
- super.handshake_state = super.handshake_state & 32 | 128;
- return 0;
- }
- }
-
- ((SSLConnection)this).sendAlert((byte)2, (byte)40);
- return -1;
- }
- }
- } catch (Exception var18) {
- }
-
- ((SSLConnection)this).sendAlert((byte)2, (byte)47);
- return -1;
- }
-
- private int serverHelloDone(byte[] var1, int var2, int var3) {
- ((SSLConnection)this).register(var1, var2, var3);
- if (this.auth) {
- if (super.conn_cert == null) {
- if (((SSLConnection)this).sendAlert((byte)1, (byte)41) == -1) {
- return -1;
- }
- } else if (((SSLConnection)this).sendCertificate() == -1) {
- return -1;
- }
- }
-
- if (this.sendClientKeyExchange() == 0) {
- if (super.conn_cert != null && this.sendCertificateVerify() == -1) {
- return -1;
- } else {
- ((SSLConnection)this).update();
- super.handshake_state = 1;
- return ((SSLConnection)this).sendFinished(true);
- }
- } else {
- return -1;
- }
- }
-
- private int serverCertificate(byte[] var1, int var2, int var3) {
- if (((SSLConnection)this).certificate(var1, var2, var3) == -1) {
- return -1;
- } else {
- SSLCert var4 = super.session.peer_cert[0];
- int var5 = SSLConnection.cipherSuite[super.session.cipher_suite & 255];
- int var6 = var5 >>> 16;
- byte var7 = 0;
-
- do {
- if ((var6 & 127) == 1 && var4.alg == 1) {
- var7 = 1;
- if ((var5 & 3840) == 256 && ((var5 & '\uf000') == 0 || var4.keyL <= 64)) {
- var7 = 2;
- }
- break;
- }
-
- if ((var6 & 127) == 2 && var4.alg != 1) {
- var7 = 1;
- break;
- }
- } while((var6 >>>= 8) != 0);
-
- if (var7 == 0) {
- ((SSLConnection)this).sendAlert((byte)2, (byte)47);
- return -1;
- } else {
- super.handshake_state = var7 == 1 ? 40 : 168;
- ((SSLConnection)this).register(var1, var2, var3);
- return 0;
- }
- }
- }
-
- private int serverCertificateRequest(byte[] var1, int var2, int var3) {
- if (super.session.peer_cert == null) {
- ((SSLConnection)this).sendAlert((byte)2, (byte)40);
- return -1;
- } else {
- int var4 = var3 - 4;
- int var5 = var2 + 4;
- int var9 = 0;
- int var10 = SSLConnection.cipherSuite[super.session.cipher_suite & 255];
-
- try {
- if (var4 > 1) {
- byte var6 = var1[var5++];
- --var4;
- if (var6 > 0 && var6 <= 255 && var4 > var6) {
- int var7 = 0;
-
- do {
- byte var8 = var1[var5 + var7];
- if (((var10 & 3840) != 256 || var8 != 1 && var8 != 2) && ((var10 & 3840) != 768 || (super.session.peer_cert[0].alg != 1 || var8 != 1) && (super.session.peer_cert[0].alg == 1 || var8 != 2))) {
- throw new SSLException();
- }
-
- if (var7 < 4) {
- var9 |= var8 << 8 * var7;
- }
-
- ++var7;
- } while(var7 < var6);
-
- var5 += var6;
- var4 -= var6;
- if (var4 >= 5) {
- var4 -= 2;
- if (var4 <= 65535 && (int)Crypto.msbf(var1, var5, 2) == var4) {
- Object[] var11;
- if ((var11 = super.context.getCert(var9, var1, var5 + 2, var4)) != null) {
- super.conn_cert = (SSLCert[])var11[0];
- super.conn_key = (byte[][])var11[1];
- }
-
- this.auth = true;
- super.handshake_state = 128;
- ((SSLConnection)this).register(var1, var2, var3);
- return 0;
- }
- }
- }
- }
- } catch (Exception var12) {
- }
-
- ((SSLConnection)this).sendAlert((byte)2, (byte)47);
- return -1;
- }
- }
-
- private int serverHello(byte[] var1, int var2, int var3) {
- int var4 = var3 - 4;
- int var5 = var2 + 4;
- byte[] var7 = null;
- byte var8 = 0;
- short var9 = -1;
- if (var4 >= 35 && var1[var5] == 3 && var1[var5 + 1] == 0) {
- ((SSLConnection)this).peerRandom(var1, var5 + 2, 32);
- var5 += 34;
- var4 -= 34;
- byte var6 = var1[var5++];
- --var4;
- if (var6 >= 0 && var6 <= 32 && var4 >= var6) {
- if (var6 > 0) {
- var7 = new byte[var6];
- System.arraycopy(var1, var5, var7, 0, var6);
- var5 += var6;
- var4 -= var6;
- }
-
- if (var4 == 3) {
- var9 = (short)((int)Crypto.msbf(var1, var5, 2));
- var5 += 2;
- var4 -= 2;
- var8 = var1[var5];
- }
- }
- }
-
- if (var9 != -1) {
- ((SSLConnection)this).register(var1, var2, var3);
-
- try {
- if (super.session.session_id != null) {
- SSLSession var10 = super.session;
- if (var10.session_id != null && var10.session_id.length == var7.length) {
- byte[] var11 = var10.session_id;
- int var12 = 0;
- int var13 = 0;
- int var14 = var7.length;
-
- boolean var24;
- while(true) {
- --var14;
- if (var14 < 0) {
- var24 = true;
- break;
- }
-
- if (var11[var12++] != var7[var13++]) {
- var24 = false;
- break;
- }
- }
-
- if (var24 || false) {
- if (super.session.cipher_suite == var9 && super.session.compression_method == var8 && ((SSLConnection.cipherSuite[var9 & 255] & -65536) != 0 || super.context.handleNoPeerCertificate())) {
- ((SSLConnection)this).update();
- super.handshake_state = 1;
- return 0;
- }
-
- throw new Exception();
- }
- }
-
- SSLSession.uninstall(super.session, this, false);
- super.session = new SSLSession(super.sock.getInetAddress().getAddress(), this.server_port, super.context.timeout[1]);
- }
-
- int var22;
- for(var22 = 0; var22 < super.context.cs_list.length && super.context.cs_list[var22] != var9; ++var22) {
- }
-
- if (var22 != super.context.cs_list.length && ((SSLConnection.cipherSuite[var9 & 255] & -65536) != 0 || super.context.handleNoPeerCertificate())) {
- for(var22 = 0; var22 < super.context.cm_list.length && super.context.cm_list[var22] != var8; ++var22) {
- }
-
- if (var22 == super.context.cm_list.length) {
- throw new Exception();
- }
-
- super.session.session_id = var7;
- super.session.compression_method = var8;
- super.session.cipher_suite = var9;
- super.handshake_state = (SSLConnection.cipherSuite[var9 & 255] & -65536) != 0 ? 4 : 8;
- return 0;
- }
-
- throw new SSLException();
- } catch (Exception var15) {
- }
- }
-
- ((SSLConnection)this).sendAlert((byte)2, (byte)47);
- return -1;
- }
-
- private int sendClientHello() {
- super.out.enable(false);
- byte[] var1 = super.context.cm_list;
- short[] var2 = super.context.cs_list;
- ((SSLConnection)this).helloRandom();
- byte var3 = (byte)(super.session.session_id == null ? 0 : super.session.session_id.length);
- int var4 = 35 + var3 + 2 + 2 * var2.length + 1 + var1.length;
- int var5 = ((SSLConnection)this).register((byte[])null, 0, 4 + var4);
- int var6 = var5 + 4;
- byte[] var7 = super.handshake;
- var7[var6++] = 3;
- var7[var6++] = 0;
- System.arraycopy(super.random[0], 0, var7, var6, 32);
- var6 += 32;
- if ((var7[var6++] = var3) != 0) {
- System.arraycopy(super.session.session_id, 0, var7, var6, var3);
- var6 += var3;
- }
-
- int var8 = 2 * var2.length;
- int var9 = var6;
- int var10 = 2;
-
- do {
- int var23 = var9++;
- --var10;
- var7[var23] = (byte)(var8 >>> var10 * 8);
- } while(var10 > 0);
-
- var6 += 2;
-
- for(int var18 = 0; var18 < var2.length; var6 += 2) {
- var9 = var2[var18];
- var10 = var6;
- int var11 = 2;
-
- do {
- int var24 = var10++;
- --var11;
- var7[var24] = (byte)(var9 >>> var11 * 8);
- } while(var11 > 0);
-
- ++var18;
- }
-
- var7[var6++] = (byte)var1.length;
- System.arraycopy(var1, 0, var7, var6, var1.length);
- int var10000 = var6 + var1.length;
- return ((SSLConnection)this).sendHandshake((byte)1, var7, var5, var4, true);
- }
-
- private int sendCertificateVerify() {
- int var1 = super.conn_cert[0].alg == 1 ? 1 : 0;
- byte[] var2 = new byte[20 * ((var1 ^ 1) + 1) + 16 * var1];
- ((SSLConnection)this).handshakeHash((byte[])null, var2, 0, var1);
- if (var1 == 1) {
- var2 = Crypto.rsa(true, 1, super.conn_key, var2, 0, 36);
- }
-
- int var3 = ((SSLConnection)this).register((byte[])null, 0, var2.length + 2 + 4);
- int var4 = var2.length;
- byte[] var5 = super.handshake;
- int var6 = var3 + 4;
- int var7 = 2;
-
- do {
- int var10001 = var6++;
- --var7;
- var5[var10001] = (byte)(var4 >>> var7 * 8);
- } while(var7 > 0);
-
- System.arraycopy(var2, 0, super.handshake, var3 + 6, var2.length);
- return ((SSLConnection)this).sendHandshake((byte)15, super.handshake, var3, var2.length + 2, false) == 0 ? 0 : -1;
- }
-
- private int sendClientKeyExchange() {
- byte[] var1 = null;
- byte[] var2 = null;
- if ((SSLConnection.cipherSuite[super.session.cipher_suite & 255] & 3840) == 256) {
- var1 = new byte[48];
- var1[0] = 3;
- var1[1] = 0;
- Crypto.random(var1, 2, 46);
- SSLCert var3 = super.session.peer_cert[0];
- var2 = Crypto.rsa(true, 2, super.key_exchange == null ? var3.key() : super.key_exchange, var1, 0, 48);
- }
-
- int var4 = ((SSLConnection)this).register((byte[])null, 0, 4 + var2.length);
- System.arraycopy(var2, 0, super.handshake, var4 + 4, var2.length);
- super.key_exchange = null;
- if (((SSLConnection)this).sendHandshake((byte)16, super.handshake, var4, var2.length, false) == 0) {
- ((SSLConnection)this).blockHash(var1, var1, 0);
- super.session.master_secret = var1;
- return 0;
- } else {
- return -1;
- }
- }
-
- SSLClient(SSLSocket var1, boolean var2, SSLContext var3, int var4, boolean var5) throws IOException, SSLException {
- this.server_port = var4;
- ((SSLConnection)this).install(var1, var2, 0, var3, var5);
- }
- }
-