/**
   * encrypt exactly 16 bytes using the session key
   *
   * @param payload plaintext data, 16 bytes starting at inIndex
   * @param sessionKey private session key
   * @param out out parameter, 16 bytes starting at outIndex
   */
  @Override
  public final void encryptBlock(
      byte payload[], int inIndex, SessionKey sessionKey, byte out[], int outIndex) {
    if (sessionKey.getPreparedKey() == null) {
      try {
        Object key = CryptixRijndael_Algorithm.makeKey(sessionKey.getData(), 16);
        sessionKey.setPreparedKey(key);
      } catch (InvalidKeyException ike) {
        _log.log(Log.CRIT, "Invalid key", ike);
        throw new IllegalArgumentException("wtf, invalid key?  " + ike.getMessage());
      }
    }

    CryptixRijndael_Algorithm.blockEncrypt(
        payload, out, inIndex, outIndex, sessionKey.getPreparedKey());
  }
  /**
   * decrypt exactly 16 bytes of data with the session key provided
   *
   * @param payload encrypted data, 16 bytes starting at inIndex
   * @param sessionKey private session key
   * @param rv out parameter, 16 bytes starting at outIndex
   */
  @Override
  public final void decryptBlock(
      byte payload[], int inIndex, SessionKey sessionKey, byte rv[], int outIndex) {
    // just let it throw NPE or IAE later for speed, you'll figure it out
    // if ( (payload == null) || (rv == null) )
    //    throw new IllegalArgumentException("null block args");
    // if (payload.length - inIndex > rv.length - outIndex)
    //    throw new IllegalArgumentException("bad block args [payload.len=" + payload.length
    //                                       + " inIndex=" + inIndex + " rv.len=" + rv.length
    //                                       + " outIndex="+outIndex);
    if (sessionKey.getPreparedKey() == null) {
      try {
        Object key = CryptixRijndael_Algorithm.makeKey(sessionKey.getData(), 16);
        sessionKey.setPreparedKey(key);
      } catch (InvalidKeyException ike) {
        _log.log(Log.CRIT, "Invalid key", ike);
        throw new IllegalArgumentException("wtf, invalid key?  " + ike.getMessage());
      }
    }

    CryptixRijndael_Algorithm.blockDecrypt(
        payload, rv, inIndex, outIndex, sessionKey.getPreparedKey());
  }