94 lines
4.7 KiB
HTML
94 lines
4.7 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>RSSSSA - Keygen</title>
|
|
</head>
|
|
<body style="display: flex; flex-direction: column; align-items: center; text-align: center;">
|
|
<h1>Rainbownapkins's Super Stupid Simple Stream Authenticator</h1>
|
|
<h2 style="margin-bottom: 0;">Your stream key hash:</h2>
|
|
<h4 style="margin-top: 0;">(Send this to your server's administrator so they can add your key to the server.)</h4>
|
|
<h1 id="hash" style="user-select: all;">NULL</h1>
|
|
<h2 style="margin-bottom: 0;">Your Stream Key:</h2>
|
|
<h4 style="margin-top: 0;">(Keep this in your password manager to authenticate with, <span style='color:red;'>DO NOT SHARE THIS!</span>)</h4>
|
|
<h1 id="key" style="user-select: all;">NULL</h1>
|
|
<button style="margin-top: 2em; height: 4em; width: 10em;">Generate Key</button>
|
|
</body>
|
|
<footer>
|
|
<script type="module">
|
|
import bcrypt from '/lib/bcrypt.js';
|
|
|
|
function displayKey(){
|
|
//Gen a new key
|
|
let key = genKey();
|
|
//Display that shit
|
|
document.querySelector('#key').innerText = key;
|
|
//Display hash
|
|
document.querySelector('#hash').innerText = hashKey(key);
|
|
}
|
|
|
|
function genKey(){
|
|
//Number of chars to generate
|
|
let keyLength = 25;
|
|
//Generate a set of cryptographically secure random numbers to derive a stream key from
|
|
let rnum = crypto.getRandomValues(new Uint8Array(keyLength));
|
|
//Make a string to hold the key
|
|
let key = '';
|
|
|
|
//For each random digit
|
|
rnum.forEach((num) => {
|
|
//This function makes more sense when you realize I originally thought this'd be passed as part of the query string for some reason.
|
|
//Turns out nginx makes the smarter decision of sticking it in a POST body, so this didn't need to be so complicated :P
|
|
//Either way it's a good function for generating cryptographically secure URL-Safe NONCE's in the browser
|
|
|
|
//We cant use the entire ascii table since most of those chars aren't URL safe
|
|
//Instead we first adjust the number to fit between the range of 0-77, then map parts of said range to the ascii table
|
|
//to generate a url-safe and crpytographically secure stream key
|
|
let adjustedNum = Math.round(((num * 87) / 255));
|
|
|
|
//If we pulled a 9
|
|
if(adjustedNum <= 9){
|
|
//Adjust number to proper ascii range for 0-9 and convert to char
|
|
key += String.fromCharCode(adjustedNum + 48);
|
|
//If we pulled between a 10 and 35
|
|
}else if(adjustedNum >= 10 && adjustedNum <= 35){
|
|
//Adjust number to proper ascii range for A-Z and convert to char
|
|
key += String.fromCharCode((adjustedNum - 10) + 65);
|
|
//If we pulled between a 36 and 61
|
|
}else if(adjustedNum >= 36 && adjustedNum <= 61){
|
|
//Adjust number to proper ascii range for A-Z and convert to char
|
|
key += String.fromCharCode((adjustedNum - 36) + 97);
|
|
//If we pulled between a 61 and 66 (weighted to ensure occurance)
|
|
}else if(adjustedNum >= 61 && adjustedNum <= 66){
|
|
//Add a dash
|
|
key += '-';
|
|
//If we pulled between a 67 and 72 (weighted to ensure occurance)
|
|
}else if(adjustedNum >= 67 && adjustedNum <= 72){
|
|
//Add a period
|
|
key += '.';
|
|
//If we pulled between a 73 and 78 (weighted to ensure occurance)
|
|
}else if(adjustedNum >= 73 && adjustedNum <= 78){
|
|
//Add an underscore
|
|
key += '_';
|
|
//If we pulled between a 79 and 84 (weighted to ensure occurance)
|
|
}else if(adjustedNum >= 79 && adjustedNum <= 84){
|
|
//Add a tilde
|
|
key += '~';
|
|
}
|
|
});
|
|
|
|
//return our key
|
|
return key;
|
|
}
|
|
|
|
function hashKey(key){
|
|
return bcrypt.hashSync(key, 10);
|
|
}
|
|
|
|
//Display a new key on refresh
|
|
displayKey();
|
|
|
|
//Make the button do the thing
|
|
document.querySelector('button').addEventListener('click', displayKey);
|
|
</script>
|
|
</footer>
|
|
</html> |