code: function (password, salt) {
              // Shortcut
              var cfg = this.cfg;
  
              // Init HMAC
              var hmac = HMAC.create(cfg.hasher, password);
  
              // Initial values
              var derivedKey = WordArray.create();
              var blockIndex = WordArray.create([0x00000001]);
  
              // Shortcuts
              var derivedKeyWords = derivedKey.words;
              var blockIndexWords = blockIndex.words;
              var keySize = cfg.keySize;
              var iterations = cfg.iterations;
  
              // Generate key
              while (derivedKeyWords.length < keySize) {
                  var block = hmac.update(salt).finalize(blockIndex);
                  hmac.reset();
  
                  // Shortcuts
                  var blockWords = block.words;
                  var blockWordsLength = blockWords.length;
  
                  // Iterations
                  var intermediate = block;
                  for (var i = 1; i < iterations; i++) {
                      intermediate = hmac.finalize(intermediate);
                      hmac.reset();
  
                      // Shortcut
                      var intermediateWords = intermediate.words;
  
                      // XOR intermediate with block
                      for (var j = 0; j < blockWordsLength; j++) {
                          blockWords[j] ^= intermediateWords[j];
                      }
                  }
  
                  derivedKey.concat(block);
                  blockIndexWords[0]++;
              }
              derivedKey.sigBytes = keySize * 4;
  
              return derivedKey;
          }
docs: Computes the Password-Based Key Derivation Function 2.
  
  @param {WordArray|string} password The password.
  @param {WordArray|string} salt A salt.
  
  @return {WordArray} The derived key.
  
  @example
  
  var key = kdf.compute(password, salt);