示例#1
0
  /**
   * @param key
   * @param update_key
   * @return
   * @throws CryptoException
   */
  public byte[] update(byte[] key, byte[] update_key) throws CryptoException {
    byte[] shasig = new byte[20];
    byte[] update = new byte[this.keylength]; // changed from 8 - rdesktop
    // 1.2.0
    byte[] thekey = new byte[key.length];

    synchronized (digestLock) {
      sha1.reset();
      sha1.update(update_key, 0, keylength);
      sha1.update(pad_54, 0, 40);
      sha1.update(key, 0, keylength); // changed from 8 - rdesktop
      // 1.2.0
      shasig = sha1.digest();
      sha1.reset();

      md5.reset();
      md5.update(update_key, 0, keylength); // changed from 8 - rdesktop
      // 1.2.0
      md5.update(pad_92, 0, 48);
      md5.update(shasig, 0, 20);
      thekey = md5.digest();
      md5.reset();

      System.arraycopy(thekey, 0, update, 0, this.keylength);
      rc4_update.engineInitDecrypt(update);
      // added
      thekey = rc4_update.crypt(thekey, 0, this.keylength);

      if (this.keylength == 8) {
        this.make40bit(thekey);
      }
    }

    return thekey;
  }
示例#2
0
  /**
   * Generate encryption keys of applicable size for connection
   *
   * @param rc4_key_size Size of keys to generate (1 if 40-bit encryption, otherwise 128-bit)
   * @throws CryptoException
   */
  public void generate_keys(int rc4_key_size) throws CryptoException {
    byte[] session_key = new byte[48];
    byte[] temp_hash = new byte[48];
    byte[] input = new byte[48];

    System.arraycopy(this.client_random, 0, input, 0, 24);
    System.arraycopy(this.server_random, 0, input, 24, 24);

    temp_hash = this.hash48(input, this.client_random, this.server_random, 65);
    session_key = this.hash48(temp_hash, this.client_random, this.server_random, 88);

    System.arraycopy(session_key, 0, this.sec_sign_key, 0, 16);
    // changed from 8 - rdesktop 1.2.0

    this.sec_decrypt_key = this.hash16(session_key, this.client_random, this.server_random, 16);
    this.sec_encrypt_key = this.hash16(session_key, this.client_random, this.server_random, 32);

    if (rc4_key_size == 1) {
      logger.info("40 Bit Encryption enabled");
      this.make40bit(this.sec_sign_key);
      this.make40bit(this.sec_decrypt_key);
      this.make40bit(this.sec_encrypt_key);
      this.keylength = 8;
    } else {
      logger.info("128 Bit Encryption enabled");
      this.keylength = 16;
    }

    System.arraycopy(
        this.sec_decrypt_key,
        0,
        this.sec_decrypt_update_key,
        0,
        16); // changed from 8 - rdesktop 1.2.0
    System.arraycopy(
        this.sec_encrypt_key,
        0,
        this.sec_encrypt_update_key,
        0,
        16); // changed from 8 - rdesktop 1.2.0

    byte[] key = new byte[this.keylength];
    System.arraycopy(this.sec_encrypt_key, 0, key, 0, this.keylength);
    rc4_enc.engineInitEncrypt(key);
    System.arraycopy(this.sec_decrypt_key, 0, key, 0, this.keylength);
    rc4_dec.engineInitDecrypt(key);
  }