docs: function ekskey(data, key, engine, heap32) {
          var i, off, sw;
          var L_offset = LR_offset >> 2,
              R_offset = L_offset + 1;
  
          heap32[L_offset] = 0;
          heap32[R_offset] = 0;
          
          off = 0;
          for (i = 0; i < P_LEN; i++) {
              sw = key[off++] << 24 | key[off++] << 16 | key[off++] << 8 | key[off++];
              heap32[P_offset >> 2 | i] ^= sw;
          }
          
          off = 0;
          for (i = 0; i < P_LEN; i += 2) {
              sw = data[off++] << 24 | data[off++] << 16 | data[off++] << 8 | data[off++];
              off &= 0xff0f;   // &0xff0f === %BCRYPT_SALT_LEN
              heap32[L_offset] ^= sw;
  
              sw = data[off++] << 24 | data[off++] << 16 | data[off++] << 8 | data[off++];
              off &= 0xff0f;
              heap32[R_offset] ^= sw;
  
              engine.encrypt(LR_offset);
              heap32[P_offset >> 2 | i] = heap32[L_offset];
              heap32[P_offset >> 2 | (i + 1)] = heap32[R_offset];
          }
          
          var s_offset = S_offset >> 2;
          for (i = 0; i < S_LEN; i += 2) {
              sw = data[off++] << 24 | data[off++] << 16 | data[off++] << 8 | data[off++];
              off &= 0xff0f;   // &0xff0f === %BCRYPT_SALT_LEN
              heap32[L_offset] ^= sw;
  
              sw = data[off++] << 24 | data[off++] << 16 | data[off++] << 8 | data[off++];
              off &= 0xff0f;
              heap32[R_offset] ^= sw;
  
              engine.encrypt(LR_offset);
              heap32[s_offset | i] = heap32[L_offset];
              heap32[s_offset | (i + 1)] = heap32[R_offset];
          }
      }