diff --git a/nodejs-version/index.html b/nodejs-version/index.html new file mode 100755 index 0000000..1375ecb --- /dev/null +++ b/nodejs-version/index.html @@ -0,0 +1,39 @@ + + + + + + + + + + SuperMicro IPMI License Generator + + + +
+
+
+
+

SuperMicro IPMI License Generator

+

This is a helpful tool, It can generate the SuperMicro's motherboard IPMI Activate License keys, And it is free and open-source.

+
+

First, input your IPMI BMC-MAC here:

+

+ + + + +

+

Then, click the Generate button, your will get the license key:

+

+

If you like this tool, please give me a star, thank you.

+
+

Github project: kasuganosoras/SuperMicro-IPMI-LicenseGenerator

+

Thanks for: @azh7138m, @Seldaek

+
+
+
+ + + diff --git a/nodejs-version/package.json b/nodejs-version/package.json new file mode 100755 index 0000000..3b30346 --- /dev/null +++ b/nodejs-version/package.json @@ -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" + } +} \ No newline at end of file diff --git a/nodejs-version/src/index.js b/nodejs-version/src/index.js new file mode 100755 index 0000000..dba28db --- /dev/null +++ b/nodejs-version/src/index.js @@ -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); diff --git a/nodejs-version/src/main.js b/nodejs-version/src/main.js new file mode 100644 index 0000000..45ba60d --- /dev/null +++ b/nodejs-version/src/main.js @@ -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 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]); diff --git a/nodejs-version/src/sha1hmac.js b/nodejs-version/src/sha1hmac.js new file mode 100755 index 0000000..362a2a9 --- /dev/null +++ b/nodejs-version/src/sha1hmac.js @@ -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;