code: byte[] cryptRaw(long rounds, byte[] salt, byte[] password, int[] cdata) {
          if (rounds < 0) {
              throw new IllegalArgumentException("rounds must not be negative");
          }
  
          int clen = cdata.length;
  
          if (salt.length != BCrypt.SALT_LENGTH) {
              throw new IllegalArgumentException("bad salt length");
          }
  
          int[] P = P_orig.clone();
          int[] S = S_orig.clone();
  
          enhancedKeySchedule(P, S, salt, password);
  
          for (long roundCount = 0; roundCount != rounds; roundCount++) {
              key(P, S, password);
              key(P, S, salt);
          }
  
          for (int i = 0; i < 64; i++) {
              for (int j = 0; j < (clen >> 1); j++) {
                  encipher(P, S, cdata, j << 1);
              }
          }
  
          byte[] ret = new byte[clen * 4];
          for (int i = 0, j = 0; i < clen; i++) {
              ret[j++] = (byte) ((cdata[i] >> 24) & 0xff);
              ret[j++] = (byte) ((cdata[i] >> 16) & 0xff);
              ret[j++] = (byte) ((cdata[i] >> 8) & 0xff);
              ret[j++] = (byte) (cdata[i] & 0xff);
          }
  
          return ret;
      }
docs: Perform the central password hashing step in the
  bcrypt scheme
  
  @param rounds   the actual rounds, not the binary logarithm
  @param salt     the binary salt to hash with the password
  @param password the password to hash
  of rounds of hashing to apply
  @param cdata    the plaintext to encrypt
  @return an array containing the binary hashed password