Add nodejs version

This commit is contained in:
kasuganosoras 2019-06-25 03:56:52 +08:00
parent 4f20ec4834
commit ad9ef78e11
5 changed files with 539 additions and 0 deletions

39
nodejs-version/index.html Executable file
View file

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" crossorigin="anonymous" />
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" crossorigin="anonymous"></script>
<title>SuperMicro IPMI License Generator</title>
<style>body{background:#eee}.form-control{font-family:Consolas;}.main{margin-top:64px;border:1px solid #ccc;padding:10px 32px 16px 32px;background:#FFF;box-shadow:0px 0px 12px rgba(0,0,0,0.3)}</style>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-sm-3"></div>
<div class="col-sm-6 main">
<h3>SuperMicro IPMI License Generator</h3>
<p>This is a helpful tool, It can generate the SuperMicro's motherboard IPMI Activate License keys, And it is free and open-source.</p>
<hr />
<p>First, input your IPMI BMC-MAC here:</p>
<p><div class="input-group">
<input id="input" class="form-control" placeholder="You BMC-MAC" />
<span class="input-group-btn">
<button class="btn btn-default" id="button">Generate</button>
</span>
</div></p>
<p>Then, click the Generate button, your will get the license key:</p>
<p><input id="output" class="form-control" readonly placeholder="License Key" onclick="this.select()" /></p>
<p>If you like this tool, please give me a star, thank you.</p>
<hr>
<p>Github project: <a href="https://github.com/kasuganosoras/SuperMicro-IPMI-LicenseGenerator" target="_blank">kasuganosoras/SuperMicro-IPMI-LicenseGenerator</a></p>
<p>Thanks for: <a href="https://www.v2ex.com/member/azh7138m" target="_blank">@azh7138m</a>, <a href="https://github.com/Seldaek" target="_blank">@Seldaek</a></p>
</div>
</div>
</div>
<script src="./src/main.js"></script>
</body>
</html>

15
nodejs-version/package.json Executable file
View file

@ -0,0 +1,15 @@
{
"name": "parcel-sandbox",
"version": "1.0.0",
"description": "Simple Parcel Sandbox",
"main": "index.html",
"scripts": {
"start": "parcel index.html --open",
"build": "parcel build index.html"
},
"dependencies": {},
"devDependencies": {
"@babel/core": "7.2.0",
"parcel-bundler": "^1.6.1"
}
}

36
nodejs-version/src/index.js Executable file
View file

@ -0,0 +1,36 @@
var sha1hmac = require("./sha1hmac.js");
const input = document.getElementById("input");
const output = document.getElementById("output");
const button = document.getElementById("button");
function hex2bin(hex) {
let bytes = [];
for (let i = 0; i < hex.length - 1; i += 2) {
bytes.push(parseInt(hex.substr(i, 2), 16));
}
return String.fromCharCode.apply(String, bytes);
}
/**
*
* @param {string} mac
*/
function getKey(mac) {
return sha1hmac.Crypto.sha1_hmac(
hex2bin(mac.replace(/:/g, "")),
hex2bin("8544E3B47ECA58F9583043F8")
)
.toString()
.substr(0, 24);
}
function handler() {
output.value = getKey(input.value)
.match(/..../g)
.join("-");
}
button.addEventListener("click", handler);

245
nodejs-version/src/main.js Normal file
View file

@ -0,0 +1,245 @@
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
var sha1hmac = require("./sha1hmac.js");
const input = document.getElementById("input");
const output = document.getElementById("output");
const button = document.getElementById("button");
function hex2bin(hex) {
let bytes = [];
for (let i = 0; i < hex.length - 1; i += 2) {
bytes.push(parseInt(hex.substr(i, 2), 16));
}
return String.fromCharCode.apply(String, bytes);
}
/**
*
* @param {string} mac
*/
function getKey(mac) {
return sha1hmac.Crypto.sha1_hmac(
hex2bin(mac.replace(/:/g, "")),
hex2bin("8544E3B47ECA58F9583043F8")
)
.toString()
.substr(0, 24);
}
function handler() {
output.value = getKey(input.value)
.match(/..../g)
.join("-");
}
button.addEventListener("click", handler);
},{"./sha1hmac.js":2}],2:[function(require,module,exports){
var Crypto = {};
Crypto.sha1_hmac = function(msg, key) {
"use strict";
var oKeyPad, iKeyPad, iPadRes, bytes, i, len;
if (key.length > 64) {
// keys longer than blocksize are shortened
key = Crypto.sha1(key, true);
}
bytes = [];
len = key.length;
for (i = 0; i < 64; ++i) {
bytes[i] = len > i ? key.charCodeAt(i) : 0x00;
}
oKeyPad = "";
iKeyPad = "";
for (i = 0; i < 64; ++i) {
oKeyPad += String.fromCharCode(bytes[i] ^ 0x5c);
iKeyPad += String.fromCharCode(bytes[i] ^ 0x36);
}
iPadRes = Crypto.sha1(iKeyPad + msg, true);
return Crypto.sha1(oKeyPad + iPadRes);
};
Crypto.sha1 = function(msg, raw) {
function rotate_left(n, s) {
var t4 = (n << s) | (n >>> (32 - s));
return t4;
}
function lsb_hex(val) {
var str = "";
var i;
var vh;
var vl;
for (i = 0; i <= 6; i += 2) {
vh = (val >>> (i * 4 + 4)) & 0x0f;
vl = (val >>> (i * 4)) & 0x0f;
str += vh.toString(16) + vl.toString(16);
}
return str;
}
function cvt_hex(val, raw) {
var str = "";
var i;
var v;
for (i = 7; i >= 0; i--) {
v = (val >>> (i * 4)) & 0x0f;
str += raw ? String.fromCharCode(v) : v.toString(16);
}
return str;
}
var blockstart;
var i, j;
var W = new Array(80);
var H0 = 0x67452301;
var H1 = 0xefcdab89;
var H2 = 0x98badcfe;
var H3 = 0x10325476;
var H4 = 0xc3d2e1f0;
var A, B, C, D, E;
var result, rawResult;
var temp;
var msg_len = msg.length;
var word_array = [];
for (i = 0; i < msg_len - 3; i += 4) {
j =
(msg.charCodeAt(i) << 24) |
(msg.charCodeAt(i + 1) << 16) |
(msg.charCodeAt(i + 2) << 8) |
msg.charCodeAt(i + 3);
word_array.push(j);
}
switch (msg_len % 4) {
case 0:
i = 0x080000000;
break;
case 1:
i = (msg.charCodeAt(msg_len - 1) << 24) | 0x0800000;
break;
case 2:
i =
(msg.charCodeAt(msg_len - 2) << 24) |
(msg.charCodeAt(msg_len - 1) << 16) |
0x08000;
break;
case 3:
i =
(msg.charCodeAt(msg_len - 3) << 24) |
(msg.charCodeAt(msg_len - 2) << 16) |
(msg.charCodeAt(msg_len - 1) << 8) |
0x80;
break;
default:
break;
}
word_array.push(i);
while (word_array.length % 16 !== 14) word_array.push(0);
word_array.push(msg_len >>> 29);
word_array.push((msg_len << 3) & 0x0ffffffff);
for (blockstart = 0; blockstart < word_array.length; blockstart += 16) {
for (i = 0; i < 16; i++) W[i] = word_array[blockstart + i];
for (i = 16; i <= 79; i++)
W[i] = rotate_left(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
A = H0;
B = H1;
C = H2;
D = H3;
E = H4;
for (i = 0; i <= 19; i++) {
temp =
(rotate_left(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5a827999) &
0x0ffffffff;
E = D;
D = C;
C = rotate_left(B, 30);
B = A;
A = temp;
}
for (i = 20; i <= 39; i++) {
temp =
(rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ed9eba1) & 0x0ffffffff;
E = D;
D = C;
C = rotate_left(B, 30);
B = A;
A = temp;
}
for (i = 40; i <= 59; i++) {
temp =
(rotate_left(A, 5) +
((B & C) | (B & D) | (C & D)) +
E +
W[i] +
0x8f1bbcdc) &
0x0ffffffff;
E = D;
D = C;
C = rotate_left(B, 30);
B = A;
A = temp;
}
for (i = 60; i <= 79; i++) {
temp =
(rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0xca62c1d6) & 0x0ffffffff;
E = D;
D = C;
C = rotate_left(B, 30);
B = A;
A = temp;
}
H0 = (H0 + A) & 0x0ffffffff;
H1 = (H1 + B) & 0x0ffffffff;
H2 = (H2 + C) & 0x0ffffffff;
H3 = (H3 + D) & 0x0ffffffff;
H4 = (H4 + E) & 0x0ffffffff;
}
result = (
cvt_hex(H0) +
cvt_hex(H1) +
cvt_hex(H2) +
cvt_hex(H3) +
cvt_hex(H4)
).toLowerCase();
if (!raw) {
return result;
}
rawResult = "";
while (result.length) {
rawResult += String.fromCharCode(parseInt(result.substr(0, 2), 16));
result = result.substr(2);
}
return rawResult;
};
module.exports.Crypto = Crypto;
},{}]},{},[1]);

204
nodejs-version/src/sha1hmac.js Executable file
View file

@ -0,0 +1,204 @@
var Crypto = {};
Crypto.sha1_hmac = function(msg, key) {
"use strict";
var oKeyPad, iKeyPad, iPadRes, bytes, i, len;
if (key.length > 64) {
// keys longer than blocksize are shortened
key = Crypto.sha1(key, true);
}
bytes = [];
len = key.length;
for (i = 0; i < 64; ++i) {
bytes[i] = len > i ? key.charCodeAt(i) : 0x00;
}
oKeyPad = "";
iKeyPad = "";
for (i = 0; i < 64; ++i) {
oKeyPad += String.fromCharCode(bytes[i] ^ 0x5c);
iKeyPad += String.fromCharCode(bytes[i] ^ 0x36);
}
iPadRes = Crypto.sha1(iKeyPad + msg, true);
return Crypto.sha1(oKeyPad + iPadRes);
};
Crypto.sha1 = function(msg, raw) {
function rotate_left(n, s) {
var t4 = (n << s) | (n >>> (32 - s));
return t4;
}
function lsb_hex(val) {
var str = "";
var i;
var vh;
var vl;
for (i = 0; i <= 6; i += 2) {
vh = (val >>> (i * 4 + 4)) & 0x0f;
vl = (val >>> (i * 4)) & 0x0f;
str += vh.toString(16) + vl.toString(16);
}
return str;
}
function cvt_hex(val, raw) {
var str = "";
var i;
var v;
for (i = 7; i >= 0; i--) {
v = (val >>> (i * 4)) & 0x0f;
str += raw ? String.fromCharCode(v) : v.toString(16);
}
return str;
}
var blockstart;
var i, j;
var W = new Array(80);
var H0 = 0x67452301;
var H1 = 0xefcdab89;
var H2 = 0x98badcfe;
var H3 = 0x10325476;
var H4 = 0xc3d2e1f0;
var A, B, C, D, E;
var result, rawResult;
var temp;
var msg_len = msg.length;
var word_array = [];
for (i = 0; i < msg_len - 3; i += 4) {
j =
(msg.charCodeAt(i) << 24) |
(msg.charCodeAt(i + 1) << 16) |
(msg.charCodeAt(i + 2) << 8) |
msg.charCodeAt(i + 3);
word_array.push(j);
}
switch (msg_len % 4) {
case 0:
i = 0x080000000;
break;
case 1:
i = (msg.charCodeAt(msg_len - 1) << 24) | 0x0800000;
break;
case 2:
i =
(msg.charCodeAt(msg_len - 2) << 24) |
(msg.charCodeAt(msg_len - 1) << 16) |
0x08000;
break;
case 3:
i =
(msg.charCodeAt(msg_len - 3) << 24) |
(msg.charCodeAt(msg_len - 2) << 16) |
(msg.charCodeAt(msg_len - 1) << 8) |
0x80;
break;
default:
break;
}
word_array.push(i);
while (word_array.length % 16 !== 14) word_array.push(0);
word_array.push(msg_len >>> 29);
word_array.push((msg_len << 3) & 0x0ffffffff);
for (blockstart = 0; blockstart < word_array.length; blockstart += 16) {
for (i = 0; i < 16; i++) W[i] = word_array[blockstart + i];
for (i = 16; i <= 79; i++)
W[i] = rotate_left(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
A = H0;
B = H1;
C = H2;
D = H3;
E = H4;
for (i = 0; i <= 19; i++) {
temp =
(rotate_left(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5a827999) &
0x0ffffffff;
E = D;
D = C;
C = rotate_left(B, 30);
B = A;
A = temp;
}
for (i = 20; i <= 39; i++) {
temp =
(rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ed9eba1) & 0x0ffffffff;
E = D;
D = C;
C = rotate_left(B, 30);
B = A;
A = temp;
}
for (i = 40; i <= 59; i++) {
temp =
(rotate_left(A, 5) +
((B & C) | (B & D) | (C & D)) +
E +
W[i] +
0x8f1bbcdc) &
0x0ffffffff;
E = D;
D = C;
C = rotate_left(B, 30);
B = A;
A = temp;
}
for (i = 60; i <= 79; i++) {
temp =
(rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0xca62c1d6) & 0x0ffffffff;
E = D;
D = C;
C = rotate_left(B, 30);
B = A;
A = temp;
}
H0 = (H0 + A) & 0x0ffffffff;
H1 = (H1 + B) & 0x0ffffffff;
H2 = (H2 + C) & 0x0ffffffff;
H3 = (H3 + D) & 0x0ffffffff;
H4 = (H4 + E) & 0x0ffffffff;
}
result = (
cvt_hex(H0) +
cvt_hex(H1) +
cvt_hex(H2) +
cvt_hex(H3) +
cvt_hex(H4)
).toLowerCase();
if (!raw) {
return result;
}
rawResult = "";
while (result.length) {
rawResult += String.fromCharCode(parseInt(result.substr(0, 2), 16));
result = result.substr(2);
}
return rawResult;
};
module.exports.Crypto = Crypto;