<div class="container text-white mx-auto w-full max-w-xl mt-10 p-4 rounded-md">
  <h1 class="text-2xl text-center font-bold mb-6">RustCasino Blackjack Verifier</h1>
  
  <label for="serverSeed">Server Seed</label>
  <input id="serverSeed" type='text' class='w-full py-2 px-3 rounded-md mt-1 mb-2' />

  <label for="serverHash">Server Hash</label>
  <input id="serverHash" type='text' class='w-full py-2 px-3 rounded-md mt-1 mb-2' />

  <div id="verify" class='cursor-pointer text-center p-3 rounded-md mt-3'>
     Verify Game
  </div>
  
  <div id="result" class='mt-3'>
  </div>
</div>
body, input {
  background: #1a1e22;
}

.container {
  background: #22272d;
}

label {
  color: #aaa;
}

#verify {
  background-color: #ef4739;
}
/* global CryptoJS */

import seedrandom from 'https://cdn.skypack.dev/seedrandom@3.0.5'

const result = document.getElementById('result')

const error = message => {
  result.innerHTML = `<div class="text-red-500">${message}</div>`
}

document.getElementById('verify').onclick = () => {
  const serverSeed = document.getElementById('serverSeed').value
  const serverHash = document.getElementById('serverHash').value

  if (!serverSeed) return error('Server seed is required')
  if (!serverHash) return error('Server hash is required')

  const isHashValid = CryptoJS.SHA256(serverSeed).toString() === serverHash

  const deck = shuffleDeck(serverSeed);

  result.innerHTML = `<div class="text-center">
    <div class="font-bold my-2 uppercase text-xl">
      ${isHashValid
        ? '<div class="text-green-500">Game is valid</div><div>Deck: '+deck.join(" ")+'</div>'
        : '<div class="text-red-500">Game is invalid</div>'}
    </div>
  </div>`
}

function shuffleDeck(serverSeed, deckCount = 6) {
  // Create a multiple deck array
  let deck = [];
  for (let i = 0; i < deckCount; i++) {
    deck = deck.concat(createDeck());
  }

  // Seed the random number generator
  const rng = seedrandom(`${serverSeed}`);

  // Shuffle the deck using Fisher-Yates (Durstenfeld) shuffle algorithm
  for (let i = deck.length - 1; i > 0; i--) {
    const j = Math.floor(rng() * (i + 1));
    [deck[i], deck[j]] = [deck[j], deck[i]];
  }

  return deck;
}

function createDeck() {
  const suits = ["H", "D", "C", "S"];
  const values = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"];
  let deck = [];
  for (let suit of suits) {
    for (let value of values) {
      deck.push(`${value}|${suit}`);
    }
  }
  return deck;
}

External CSS

  1. https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/2.2.7/tailwind.min.css

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js