home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1999 April / DPPCPRO0499.ISO / April / Notes / 50b2wic.exe / DATA1.CAB / DominoDesignerDominoDesignerDataHtml / NCSO.cab / com / ibm / sslight / SSLClient.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-11-16  |  5.8 KB  |  492 lines

  1. package com.ibm.sslight;
  2.  
  3. import java.io.IOException;
  4.  
  5. class SSLClient extends SSLConnection {
  6.    static final int CERT_REQ = 32;
  7.    static final int HELLO_REQ = 64;
  8.    static final int HELLO_DONE = 128;
  9.    private int server_port;
  10.    private boolean auth;
  11.  
  12.    int install(boolean var1) {
  13.       if (var1 && super.handshake_state != 64) {
  14.          return 0;
  15.       } else {
  16.          super.handshake_state = 2;
  17.          if (!var1 || !SSLSession.reinstall(super.session, this)) {
  18.             super.session = SSLSession.allocate(super.context.cm_list, super.context.cs_list, super.sock.getInetAddress().getAddress(), this.server_port, super.context.timeout[1]);
  19.          }
  20.  
  21.          return this.sendClientHello();
  22.       }
  23.    }
  24.  
  25.    boolean uninstall(boolean var1) {
  26.       return SSLSession.uninstall(super.session, this, var1);
  27.    }
  28.  
  29.    int alert(byte var1, byte var2) {
  30.       ((SSLConnection)this).sendAlert((byte)2, (byte)40);
  31.       return -1;
  32.    }
  33.  
  34.    int handshake(byte[] var1, byte var2, int var3, int var4, int var5) {
  35.       switch (var2) {
  36.          case 0:
  37.             if ((64 & super.handshake_state) != 0) {
  38.                return ((SSLConnection)this).reopen();
  39.             }
  40.  
  41.             return 0;
  42.          case 2:
  43.             if ((2 & super.handshake_state) != 0) {
  44.                return this.serverHello(var1, var3, var4);
  45.             }
  46.             break;
  47.          case 11:
  48.             if ((4 & super.handshake_state) != 0) {
  49.                return this.serverCertificate(var1, var3, var4);
  50.             }
  51.             break;
  52.          case 12:
  53.             if ((8 & super.handshake_state) != 0) {
  54.                return this.serverKeyExchange(var1, var3, var4);
  55.             }
  56.             break;
  57.          case 13:
  58.             if ((32 & super.handshake_state) != 0) {
  59.                return this.serverCertificateRequest(var1, var3, var4);
  60.             }
  61.             break;
  62.          case 14:
  63.             if ((128 & super.handshake_state) != 0) {
  64.                return this.serverHelloDone(var1, var3, var4);
  65.             }
  66.             break;
  67.          case 20:
  68.             if ((16 & super.handshake_state) != 0) {
  69.                if (((SSLConnection)this).finished(var1, var3, var4) == 0) {
  70.                   SSLSession.install(super.session, this);
  71.                   ((SSLConnection)this).reset();
  72.                   super.handshake_state = 64;
  73.                   return 0;
  74.                }
  75.  
  76.                return -1;
  77.             }
  78.       }
  79.  
  80.       ((SSLConnection)this).sendAlert((byte)2, (byte)10);
  81.       return -1;
  82.    }
  83.  
  84.    private int serverKeyExchange(byte[] var1, int var2, int var3) {
  85.       int var4 = var3 - 4;
  86.       int var5 = var2 + 4;
  87.       int var7 = 0;
  88.       super.key_exchange = new byte[3][];
  89.       int var9 = (SSLConnection.cipherSuite[super.session.cipher_suite & 255] & 3840) == 256 ? 2 : 3;
  90.  
  91.       try {
  92.          int var6;
  93.          while(var4 >= 3 && (var6 = (int)Crypto.msbf(var1, var5, 2)) >= 1 && var6 <= 65535) {
  94.             var5 += 2;
  95.             int var8;
  96.             super.key_exchange[var7] = new byte[var6 + (var8 = var1[var5] == 0 ? 0 : 1)];
  97.             System.arraycopy(var1, var5, super.key_exchange[var7], var8, var6);
  98.             var5 += var6;
  99.             var4 -= var6 + 2;
  100.             ++var7;
  101.             if (var7 >= var9) {
  102.                break;
  103.             }
  104.          }
  105.  
  106.          if (var7 == var9) {
  107.             int var10 = var3 - 4 - var4;
  108.             SSLCert var11 = null;
  109.             if ((var6 = super.session.peer_cert == null ? 0 : ((var11 = super.session.peer_cert[0]).alg == 1 ? var11.keyL : 40)) == var4 - 2) {
  110.                var4 = (int)Crypto.msbf(var1, var5, 2);
  111.                var5 += 2;
  112.             }
  113.  
  114.             if (var6 == var4) {
  115.                if ((SSLConnection.cipherSuite[super.session.cipher_suite & 255] & '\uf000') == 0 || super.key_exchange[0].length - (super.key_exchange[0][0] == 0 ? 1 : 0) <= 64) {
  116.                   boolean var12 = true;
  117.                   if (var6 != 0) {
  118.                      byte[] var13 = new byte[36];
  119.                      ((SSLConnection)this).paramHash(var1, var2 + 4, var10, var13, 0, var11.alg == 1 ? 1 : 0);
  120.                      if (var11.alg == 1) {
  121.                         boolean var22;
  122.                         label79: {
  123.                            byte[] var14 = Crypto.rsa(false, 1, var11.key(), var1, var5, var6);
  124.                            if (var14 != null && var14.length == 36) {
  125.                               int var15 = 0;
  126.                               int var16 = 0;
  127.                               int var17 = 36;
  128.  
  129.                               while(true) {
  130.                                  --var17;
  131.                                  if (var17 < 0) {
  132.                                     var22 = true;
  133.                                     break;
  134.                                  }
  135.  
  136.                                  if (var14[var15++] != var13[var16++]) {
  137.                                     var22 = false;
  138.                                     break;
  139.                                  }
  140.                               }
  141.  
  142.                               if (var22) {
  143.                                  var22 = true;
  144.                                  break label79;
  145.                               }
  146.                            }
  147.  
  148.                            var22 = false;
  149.                         }
  150.  
  151.                         var12 = var22;
  152.                      }
  153.                   }
  154.  
  155.                   if (var12) {
  156.                      ((SSLConnection)this).register(var1, var2, var3);
  157.                      super.handshake_state = super.handshake_state & 32 | 128;
  158.                      return 0;
  159.                   }
  160.                }
  161.  
  162.                ((SSLConnection)this).sendAlert((byte)2, (byte)40);
  163.                return -1;
  164.             }
  165.          }
  166.       } catch (Exception var18) {
  167.       }
  168.  
  169.       ((SSLConnection)this).sendAlert((byte)2, (byte)47);
  170.       return -1;
  171.    }
  172.  
  173.    private int serverHelloDone(byte[] var1, int var2, int var3) {
  174.       ((SSLConnection)this).register(var1, var2, var3);
  175.       if (this.auth) {
  176.          if (super.conn_cert == null) {
  177.             if (((SSLConnection)this).sendAlert((byte)1, (byte)41) == -1) {
  178.                return -1;
  179.             }
  180.          } else if (((SSLConnection)this).sendCertificate() == -1) {
  181.             return -1;
  182.          }
  183.       }
  184.  
  185.       if (this.sendClientKeyExchange() == 0) {
  186.          if (super.conn_cert != null && this.sendCertificateVerify() == -1) {
  187.             return -1;
  188.          } else {
  189.             ((SSLConnection)this).update();
  190.             super.handshake_state = 1;
  191.             return ((SSLConnection)this).sendFinished(true);
  192.          }
  193.       } else {
  194.          return -1;
  195.       }
  196.    }
  197.  
  198.    private int serverCertificate(byte[] var1, int var2, int var3) {
  199.       if (((SSLConnection)this).certificate(var1, var2, var3) == -1) {
  200.          return -1;
  201.       } else {
  202.          SSLCert var4 = super.session.peer_cert[0];
  203.          int var5 = SSLConnection.cipherSuite[super.session.cipher_suite & 255];
  204.          int var6 = var5 >>> 16;
  205.          byte var7 = 0;
  206.  
  207.          do {
  208.             if ((var6 & 127) == 1 && var4.alg == 1) {
  209.                var7 = 1;
  210.                if ((var5 & 3840) == 256 && ((var5 & '\uf000') == 0 || var4.keyL <= 64)) {
  211.                   var7 = 2;
  212.                }
  213.                break;
  214.             }
  215.  
  216.             if ((var6 & 127) == 2 && var4.alg != 1) {
  217.                var7 = 1;
  218.                break;
  219.             }
  220.          } while((var6 >>>= 8) != 0);
  221.  
  222.          if (var7 == 0) {
  223.             ((SSLConnection)this).sendAlert((byte)2, (byte)47);
  224.             return -1;
  225.          } else {
  226.             super.handshake_state = var7 == 1 ? 40 : 168;
  227.             ((SSLConnection)this).register(var1, var2, var3);
  228.             return 0;
  229.          }
  230.       }
  231.    }
  232.  
  233.    private int serverCertificateRequest(byte[] var1, int var2, int var3) {
  234.       if (super.session.peer_cert == null) {
  235.          ((SSLConnection)this).sendAlert((byte)2, (byte)40);
  236.          return -1;
  237.       } else {
  238.          int var4 = var3 - 4;
  239.          int var5 = var2 + 4;
  240.          int var9 = 0;
  241.          int var10 = SSLConnection.cipherSuite[super.session.cipher_suite & 255];
  242.  
  243.          try {
  244.             if (var4 > 1) {
  245.                byte var6 = var1[var5++];
  246.                --var4;
  247.                if (var6 > 0 && var6 <= 255 && var4 > var6) {
  248.                   int var7 = 0;
  249.  
  250.                   do {
  251.                      byte var8 = var1[var5 + var7];
  252.                      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))) {
  253.                         throw new SSLException();
  254.                      }
  255.  
  256.                      if (var7 < 4) {
  257.                         var9 |= var8 << 8 * var7;
  258.                      }
  259.  
  260.                      ++var7;
  261.                   } while(var7 < var6);
  262.  
  263.                   var5 += var6;
  264.                   var4 -= var6;
  265.                   if (var4 >= 5) {
  266.                      var4 -= 2;
  267.                      if (var4 <= 65535 && (int)Crypto.msbf(var1, var5, 2) == var4) {
  268.                         Object[] var11;
  269.                         if ((var11 = super.context.getCert(var9, var1, var5 + 2, var4)) != null) {
  270.                            super.conn_cert = (SSLCert[])var11[0];
  271.                            super.conn_key = (byte[][])var11[1];
  272.                         }
  273.  
  274.                         this.auth = true;
  275.                         super.handshake_state = 128;
  276.                         ((SSLConnection)this).register(var1, var2, var3);
  277.                         return 0;
  278.                      }
  279.                   }
  280.                }
  281.             }
  282.          } catch (Exception var12) {
  283.          }
  284.  
  285.          ((SSLConnection)this).sendAlert((byte)2, (byte)47);
  286.          return -1;
  287.       }
  288.    }
  289.  
  290.    private int serverHello(byte[] var1, int var2, int var3) {
  291.       int var4 = var3 - 4;
  292.       int var5 = var2 + 4;
  293.       byte[] var7 = null;
  294.       byte var8 = 0;
  295.       short var9 = -1;
  296.       if (var4 >= 35 && var1[var5] == 3 && var1[var5 + 1] == 0) {
  297.          ((SSLConnection)this).peerRandom(var1, var5 + 2, 32);
  298.          var5 += 34;
  299.          var4 -= 34;
  300.          byte var6 = var1[var5++];
  301.          --var4;
  302.          if (var6 >= 0 && var6 <= 32 && var4 >= var6) {
  303.             if (var6 > 0) {
  304.                var7 = new byte[var6];
  305.                System.arraycopy(var1, var5, var7, 0, var6);
  306.                var5 += var6;
  307.                var4 -= var6;
  308.             }
  309.  
  310.             if (var4 == 3) {
  311.                var9 = (short)((int)Crypto.msbf(var1, var5, 2));
  312.                var5 += 2;
  313.                var4 -= 2;
  314.                var8 = var1[var5];
  315.             }
  316.          }
  317.       }
  318.  
  319.       if (var9 != -1) {
  320.          ((SSLConnection)this).register(var1, var2, var3);
  321.  
  322.          try {
  323.             if (super.session.session_id != null) {
  324.                SSLSession var10 = super.session;
  325.                if (var10.session_id != null && var10.session_id.length == var7.length) {
  326.                   byte[] var11 = var10.session_id;
  327.                   int var12 = 0;
  328.                   int var13 = 0;
  329.                   int var14 = var7.length;
  330.  
  331.                   boolean var24;
  332.                   while(true) {
  333.                      --var14;
  334.                      if (var14 < 0) {
  335.                         var24 = true;
  336.                         break;
  337.                      }
  338.  
  339.                      if (var11[var12++] != var7[var13++]) {
  340.                         var24 = false;
  341.                         break;
  342.                      }
  343.                   }
  344.  
  345.                   if (var24 || false) {
  346.                      if (super.session.cipher_suite == var9 && super.session.compression_method == var8 && ((SSLConnection.cipherSuite[var9 & 255] & -65536) != 0 || super.context.handleNoPeerCertificate())) {
  347.                         ((SSLConnection)this).update();
  348.                         super.handshake_state = 1;
  349.                         return 0;
  350.                      }
  351.  
  352.                      throw new Exception();
  353.                   }
  354.                }
  355.  
  356.                SSLSession.uninstall(super.session, this, false);
  357.                super.session = new SSLSession(super.sock.getInetAddress().getAddress(), this.server_port, super.context.timeout[1]);
  358.             }
  359.  
  360.             int var22;
  361.             for(var22 = 0; var22 < super.context.cs_list.length && super.context.cs_list[var22] != var9; ++var22) {
  362.             }
  363.  
  364.             if (var22 != super.context.cs_list.length && ((SSLConnection.cipherSuite[var9 & 255] & -65536) != 0 || super.context.handleNoPeerCertificate())) {
  365.                for(var22 = 0; var22 < super.context.cm_list.length && super.context.cm_list[var22] != var8; ++var22) {
  366.                }
  367.  
  368.                if (var22 == super.context.cm_list.length) {
  369.                   throw new Exception();
  370.                }
  371.  
  372.                super.session.session_id = var7;
  373.                super.session.compression_method = var8;
  374.                super.session.cipher_suite = var9;
  375.                super.handshake_state = (SSLConnection.cipherSuite[var9 & 255] & -65536) != 0 ? 4 : 8;
  376.                return 0;
  377.             }
  378.  
  379.             throw new SSLException();
  380.          } catch (Exception var15) {
  381.          }
  382.       }
  383.  
  384.       ((SSLConnection)this).sendAlert((byte)2, (byte)47);
  385.       return -1;
  386.    }
  387.  
  388.    private int sendClientHello() {
  389.       super.out.enable(false);
  390.       byte[] var1 = super.context.cm_list;
  391.       short[] var2 = super.context.cs_list;
  392.       ((SSLConnection)this).helloRandom();
  393.       byte var3 = (byte)(super.session.session_id == null ? 0 : super.session.session_id.length);
  394.       int var4 = 35 + var3 + 2 + 2 * var2.length + 1 + var1.length;
  395.       int var5 = ((SSLConnection)this).register((byte[])null, 0, 4 + var4);
  396.       int var6 = var5 + 4;
  397.       byte[] var7 = super.handshake;
  398.       var7[var6++] = 3;
  399.       var7[var6++] = 0;
  400.       System.arraycopy(super.random[0], 0, var7, var6, 32);
  401.       var6 += 32;
  402.       if ((var7[var6++] = var3) != 0) {
  403.          System.arraycopy(super.session.session_id, 0, var7, var6, var3);
  404.          var6 += var3;
  405.       }
  406.  
  407.       int var8 = 2 * var2.length;
  408.       int var9 = var6;
  409.       int var10 = 2;
  410.  
  411.       do {
  412.          int var23 = var9++;
  413.          --var10;
  414.          var7[var23] = (byte)(var8 >>> var10 * 8);
  415.       } while(var10 > 0);
  416.  
  417.       var6 += 2;
  418.  
  419.       for(int var18 = 0; var18 < var2.length; var6 += 2) {
  420.          var9 = var2[var18];
  421.          var10 = var6;
  422.          int var11 = 2;
  423.  
  424.          do {
  425.             int var24 = var10++;
  426.             --var11;
  427.             var7[var24] = (byte)(var9 >>> var11 * 8);
  428.          } while(var11 > 0);
  429.  
  430.          ++var18;
  431.       }
  432.  
  433.       var7[var6++] = (byte)var1.length;
  434.       System.arraycopy(var1, 0, var7, var6, var1.length);
  435.       int var10000 = var6 + var1.length;
  436.       return ((SSLConnection)this).sendHandshake((byte)1, var7, var5, var4, true);
  437.    }
  438.  
  439.    private int sendCertificateVerify() {
  440.       int var1 = super.conn_cert[0].alg == 1 ? 1 : 0;
  441.       byte[] var2 = new byte[20 * ((var1 ^ 1) + 1) + 16 * var1];
  442.       ((SSLConnection)this).handshakeHash((byte[])null, var2, 0, var1);
  443.       if (var1 == 1) {
  444.          var2 = Crypto.rsa(true, 1, super.conn_key, var2, 0, 36);
  445.       }
  446.  
  447.       int var3 = ((SSLConnection)this).register((byte[])null, 0, var2.length + 2 + 4);
  448.       int var4 = var2.length;
  449.       byte[] var5 = super.handshake;
  450.       int var6 = var3 + 4;
  451.       int var7 = 2;
  452.  
  453.       do {
  454.          int var10001 = var6++;
  455.          --var7;
  456.          var5[var10001] = (byte)(var4 >>> var7 * 8);
  457.       } while(var7 > 0);
  458.  
  459.       System.arraycopy(var2, 0, super.handshake, var3 + 6, var2.length);
  460.       return ((SSLConnection)this).sendHandshake((byte)15, super.handshake, var3, var2.length + 2, false) == 0 ? 0 : -1;
  461.    }
  462.  
  463.    private int sendClientKeyExchange() {
  464.       byte[] var1 = null;
  465.       byte[] var2 = null;
  466.       if ((SSLConnection.cipherSuite[super.session.cipher_suite & 255] & 3840) == 256) {
  467.          var1 = new byte[48];
  468.          var1[0] = 3;
  469.          var1[1] = 0;
  470.          Crypto.random(var1, 2, 46);
  471.          SSLCert var3 = super.session.peer_cert[0];
  472.          var2 = Crypto.rsa(true, 2, super.key_exchange == null ? var3.key() : super.key_exchange, var1, 0, 48);
  473.       }
  474.  
  475.       int var4 = ((SSLConnection)this).register((byte[])null, 0, 4 + var2.length);
  476.       System.arraycopy(var2, 0, super.handshake, var4 + 4, var2.length);
  477.       super.key_exchange = null;
  478.       if (((SSLConnection)this).sendHandshake((byte)16, super.handshake, var4, var2.length, false) == 0) {
  479.          ((SSLConnection)this).blockHash(var1, var1, 0);
  480.          super.session.master_secret = var1;
  481.          return 0;
  482.       } else {
  483.          return -1;
  484.       }
  485.    }
  486.  
  487.    SSLClient(SSLSocket var1, boolean var2, SSLContext var3, int var4, boolean var5) throws IOException, SSLException {
  488.       this.server_port = var4;
  489.       ((SSLConnection)this).install(var1, var2, 0, var3, var5);
  490.    }
  491. }
  492.