mirror of
https://github.com/unmojang/node-minecraft-protocol.git
synced 2025-09-28 13:45:37 -04:00
Merge pull request #506 from PrismarineJS/remove_ursa
remove ursa, uses crypto rsa functionalities instead, and keypair for keys generation
This commit is contained in:
commit
93e8d63249
@ -42,14 +42,11 @@
|
|||||||
"lodash.get": "^4.1.2",
|
"lodash.get": "^4.1.2",
|
||||||
"lodash.merge": "^4.3.0",
|
"lodash.merge": "^4.3.0",
|
||||||
"minecraft-data": "^2.17.0",
|
"minecraft-data": "^2.17.0",
|
||||||
|
"node-rsa": "^0.4.2",
|
||||||
"prismarine-nbt": "^1.0.0",
|
"prismarine-nbt": "^1.0.0",
|
||||||
"protodef": "^1.5.1",
|
"protodef": "^1.5.1",
|
||||||
"readable-stream": "^2.0.5",
|
"readable-stream": "^2.0.5",
|
||||||
"ursa-purejs": "^0.0.3",
|
|
||||||
"uuid-1345": "^0.99.6",
|
"uuid-1345": "^0.99.6",
|
||||||
"yggdrasil": "^1.0.0"
|
"yggdrasil": "^1.0.0"
|
||||||
},
|
|
||||||
"optionalDependencies": {
|
|
||||||
"ursa": "^0.9.1"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
const crypto = require('crypto');
|
const crypto = require('crypto');
|
||||||
const yggserver = require('yggdrasil').server({});
|
const yggserver = require('yggdrasil').server({});
|
||||||
const ursa=require("../ursa");
|
|
||||||
const debug = require('debug')('minecraft-protocol');
|
const debug = require('debug')('minecraft-protocol');
|
||||||
|
|
||||||
module.exports = function(client, options) {
|
module.exports = function(client, options) {
|
||||||
@ -42,9 +41,9 @@ module.exports = function(client, options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function sendEncryptionKeyResponse() {
|
function sendEncryptionKeyResponse() {
|
||||||
const pubKey = mcPubKeyToURsa(packet.publicKey);
|
const pubKey = mcPubKeyToPem(packet.publicKey);
|
||||||
const encryptedSharedSecretBuffer = pubKey.encrypt(sharedSecret, undefined, undefined, ursa.RSA_PKCS1_PADDING);
|
const encryptedSharedSecretBuffer = crypto.publicEncrypt({key:pubKey,padding:crypto.constants.RSA_PKCS1_PADDING},sharedSecret);
|
||||||
const encryptedVerifyTokenBuffer = pubKey.encrypt(packet.verifyToken, undefined, undefined, ursa.RSA_PKCS1_PADDING);
|
const encryptedVerifyTokenBuffer = crypto.publicEncrypt({key:pubKey,padding:crypto.constants.RSA_PKCS1_PADDING},packet.verifyToken);
|
||||||
client.write('encryption_begin', {
|
client.write('encryption_begin', {
|
||||||
sharedSecret: encryptedSharedSecretBuffer,
|
sharedSecret: encryptedSharedSecretBuffer,
|
||||||
verifyToken: encryptedVerifyTokenBuffer
|
verifyToken: encryptedVerifyTokenBuffer
|
||||||
@ -55,7 +54,7 @@ module.exports = function(client, options) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function mcPubKeyToURsa(mcPubKeyBuffer) {
|
function mcPubKeyToPem(mcPubKeyBuffer) {
|
||||||
let pem = "-----BEGIN PUBLIC KEY-----\n";
|
let pem = "-----BEGIN PUBLIC KEY-----\n";
|
||||||
let base64PubKey = mcPubKeyBuffer.toString('base64');
|
let base64PubKey = mcPubKeyBuffer.toString('base64');
|
||||||
const maxLineLength = 65;
|
const maxLineLength = 65;
|
||||||
@ -64,5 +63,5 @@ function mcPubKeyToURsa(mcPubKeyBuffer) {
|
|||||||
base64PubKey = base64PubKey.substring(maxLineLength);
|
base64PubKey = base64PubKey.substring(maxLineLength);
|
||||||
}
|
}
|
||||||
pem += "-----END PUBLIC KEY-----\n";
|
pem += "-----END PUBLIC KEY-----\n";
|
||||||
return ursa.createPublicKey(pem, 'utf8');
|
return pem;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const ursa=require("./ursa");
|
|
||||||
const crypto = require('crypto');
|
const crypto = require('crypto');
|
||||||
const yggserver = require('yggdrasil').server({});
|
const yggserver = require('yggdrasil').server({});
|
||||||
const states = require("./states");
|
const states = require("./states");
|
||||||
@ -9,6 +8,7 @@ const Server = require('./server');
|
|||||||
const UUID = require('uuid-1345');
|
const UUID = require('uuid-1345');
|
||||||
const endianToggle = require('endian-toggle');
|
const endianToggle = require('endian-toggle');
|
||||||
const pluginChannels = require('./client/pluginChannels');
|
const pluginChannels = require('./client/pluginChannels');
|
||||||
|
const NodeRSA = require('node-rsa');
|
||||||
|
|
||||||
module.exports=createServer;
|
module.exports=createServer;
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ function createServer(options) {
|
|||||||
const mcData=require("minecraft-data")(optVersion);
|
const mcData=require("minecraft-data")(optVersion);
|
||||||
const version = mcData.version;
|
const version = mcData.version;
|
||||||
|
|
||||||
const serverKey = ursa.generatePrivateKey(1024);
|
const serverKey = new NodeRSA({b: 1024});
|
||||||
|
|
||||||
const server = new Server(version.minecraftVersion,options.customPackets);
|
const server = new Server(version.minecraftVersion,options.customPackets);
|
||||||
server.motd = options.motd || "A Minecraft server";
|
server.motd = options.motd || "A Minecraft server";
|
||||||
@ -175,9 +175,9 @@ function createServer(options) {
|
|||||||
if(needToVerify) {
|
if(needToVerify) {
|
||||||
serverId = crypto.randomBytes(4).toString('hex');
|
serverId = crypto.randomBytes(4).toString('hex');
|
||||||
client.verifyToken = crypto.randomBytes(4);
|
client.verifyToken = crypto.randomBytes(4);
|
||||||
const publicKeyStrArr = serverKey.toPublicPem("utf8").split("\n");
|
const publicKeyStrArr = serverKey.exportKey('pkcs8-public-pem').split("\n");
|
||||||
let publicKeyStr = "";
|
let publicKeyStr = "";
|
||||||
for(let i = 1; i < publicKeyStrArr.length - 2; i++) {
|
for(let i = 1; i < publicKeyStrArr.length - 1; i++) {
|
||||||
publicKeyStr += publicKeyStrArr[i]
|
publicKeyStr += publicKeyStrArr[i]
|
||||||
}
|
}
|
||||||
client.publicKey = new Buffer(publicKeyStr, 'base64');
|
client.publicKey = new Buffer(publicKeyStr, 'base64');
|
||||||
@ -210,12 +210,12 @@ function createServer(options) {
|
|||||||
function onEncryptionKeyResponse(packet) {
|
function onEncryptionKeyResponse(packet) {
|
||||||
let sharedSecret;
|
let sharedSecret;
|
||||||
try {
|
try {
|
||||||
const verifyToken = serverKey.decrypt(packet.verifyToken, undefined, undefined, ursa.RSA_PKCS1_PADDING);
|
const verifyToken = crypto.privateDecrypt({key:serverKey.exportKey(),padding:crypto.constants.RSA_PKCS1_PADDING},packet.verifyToken);
|
||||||
if(!bufferEqual(client.verifyToken, verifyToken)) {
|
if(!bufferEqual(client.verifyToken, verifyToken)) {
|
||||||
client.end('DidNotEncryptVerifyTokenProperly');
|
client.end('DidNotEncryptVerifyTokenProperly');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sharedSecret = serverKey.decrypt(packet.sharedSecret, undefined, undefined, ursa.RSA_PKCS1_PADDING);
|
sharedSecret = crypto.privateDecrypt({key:serverKey.exportKey(),padding:crypto.constants.RSA_PKCS1_PADDING},packet.sharedSecret);
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
client.end('DidNotEncryptVerifyTokenProperly');
|
client.end('DidNotEncryptVerifyTokenProperly');
|
||||||
return;
|
return;
|
||||||
|
11
src/ursa.js
11
src/ursa.js
@ -1,11 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
let ursa;
|
|
||||||
try {
|
|
||||||
ursa = require("ursa");
|
|
||||||
} catch(e) {
|
|
||||||
console.log("You are using a pure-javascript implementation of RSA.");
|
|
||||||
console.log("Your performance might be subpar. Please consider installing URSA");
|
|
||||||
ursa = require("ursa-purejs");
|
|
||||||
}
|
|
||||||
module.exports=ursa;
|
|
Loading…
x
Reference in New Issue
Block a user