docs: public void getUserSessionKey ( CIFSContext tc, byte[] chlng, byte[] dest, int offset ) throws SmbException {
          try {
              MessageDigest md4 = Crypto.getMD4();
              md4.update(Strings.getUNIBytes(this.password));
              switch ( tc.getConfig().getLanManCompatibility() ) {
              case 0:
              case 1:
              case 2:
                  md4.update(md4.digest());
                  md4.digest(dest, offset, 16);
                  break;
              case 3:
              case 4:
              case 5:
                  synchronized ( this ) {
                      if ( this.clientChallenge == null ) {
                          this.clientChallenge = new byte[8];
                          tc.getConfig().getRandom().nextBytes(this.clientChallenge);
                      }
                  }
  
                  MessageDigest hmac = Crypto.getHMACT64(md4.digest());
                  hmac.update(Strings.getUNIBytes(this.username.toUpperCase()));
                  hmac.update(Strings.getUNIBytes(this.domain.toUpperCase()));
                  byte[] ntlmv2Hash = hmac.digest();
                  hmac = Crypto.getHMACT64(ntlmv2Hash);
                  hmac.update(chlng);
                  hmac.update(this.clientChallenge);
                  MessageDigest userKey = Crypto.getHMACT64(ntlmv2Hash);
                  userKey.update(hmac.digest());
                  userKey.digest(dest, offset, 16);
                  break;
              default:
                  md4.update(md4.digest());
                  md4.digest(dest, offset, 16);
                  break;
              }
          }
          catch ( Exception e ) {
              throw new SmbException("", e);
          }
      }