diff --git a/package.json b/package.json index dbd2f80..402d91b 100644 --- a/package.json +++ b/package.json @@ -42,14 +42,11 @@ "lodash.get": "^4.1.2", "lodash.merge": "^4.3.0", "minecraft-data": "^2.17.0", + "node-rsa": "^0.4.2", "prismarine-nbt": "^1.0.0", "protodef": "^1.5.1", "readable-stream": "^2.0.5", - "ursa-purejs": "^0.0.3", "uuid-1345": "^0.99.6", "yggdrasil": "^1.0.0" - }, - "optionalDependencies": { - "ursa": "^0.9.1" } } diff --git a/src/client/encrypt.js b/src/client/encrypt.js index 510526d..145adf2 100644 --- a/src/client/encrypt.js +++ b/src/client/encrypt.js @@ -2,7 +2,6 @@ const crypto = require('crypto'); const yggserver = require('yggdrasil').server({}); -const ursa=require("../ursa"); const debug = require('debug')('minecraft-protocol'); module.exports = function(client, options) { @@ -42,9 +41,9 @@ module.exports = function(client, options) { } function sendEncryptionKeyResponse() { - const pubKey = mcPubKeyToURsa(packet.publicKey); - const encryptedSharedSecretBuffer = pubKey.encrypt(sharedSecret, undefined, undefined, ursa.RSA_PKCS1_PADDING); - const encryptedVerifyTokenBuffer = pubKey.encrypt(packet.verifyToken, undefined, undefined, ursa.RSA_PKCS1_PADDING); + const pubKey = mcPubKeyToPem(packet.publicKey); + const encryptedSharedSecretBuffer = crypto.publicEncrypt({key:pubKey,padding:crypto.constants.RSA_PKCS1_PADDING},sharedSecret); + const encryptedVerifyTokenBuffer = crypto.publicEncrypt({key:pubKey,padding:crypto.constants.RSA_PKCS1_PADDING},packet.verifyToken); client.write('encryption_begin', { sharedSecret: encryptedSharedSecretBuffer, verifyToken: encryptedVerifyTokenBuffer @@ -55,7 +54,7 @@ module.exports = function(client, options) { } }; -function mcPubKeyToURsa(mcPubKeyBuffer) { +function mcPubKeyToPem(mcPubKeyBuffer) { let pem = "-----BEGIN PUBLIC KEY-----\n"; let base64PubKey = mcPubKeyBuffer.toString('base64'); const maxLineLength = 65; @@ -64,5 +63,5 @@ function mcPubKeyToURsa(mcPubKeyBuffer) { base64PubKey = base64PubKey.substring(maxLineLength); } pem += "-----END PUBLIC KEY-----\n"; - return ursa.createPublicKey(pem, 'utf8'); + return pem; } diff --git a/src/createServer.js b/src/createServer.js index 930de40..c9ca5de 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,6 +1,5 @@ 'use strict'; -const ursa=require("./ursa"); const crypto = require('crypto'); const yggserver = require('yggdrasil').server({}); const states = require("./states"); @@ -9,6 +8,7 @@ const Server = require('./server'); const UUID = require('uuid-1345'); const endianToggle = require('endian-toggle'); const pluginChannels = require('./client/pluginChannels'); +const NodeRSA = require('node-rsa'); module.exports=createServer; @@ -36,7 +36,7 @@ function createServer(options) { const mcData=require("minecraft-data")(optVersion); const version = mcData.version; - const serverKey = ursa.generatePrivateKey(1024); + const serverKey = new NodeRSA({b: 1024}); const server = new Server(version.minecraftVersion,options.customPackets); server.motd = options.motd || "A Minecraft server"; @@ -175,9 +175,9 @@ function createServer(options) { if(needToVerify) { serverId = crypto.randomBytes(4).toString('hex'); client.verifyToken = crypto.randomBytes(4); - const publicKeyStrArr = serverKey.toPublicPem("utf8").split("\n"); + const publicKeyStrArr = serverKey.exportKey('pkcs8-public-pem').split("\n"); let publicKeyStr = ""; - for(let i = 1; i < publicKeyStrArr.length - 2; i++) { + for(let i = 1; i < publicKeyStrArr.length - 1; i++) { publicKeyStr += publicKeyStrArr[i] } client.publicKey = new Buffer(publicKeyStr, 'base64'); @@ -210,12 +210,12 @@ function createServer(options) { function onEncryptionKeyResponse(packet) { let sharedSecret; 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)) { client.end('DidNotEncryptVerifyTokenProperly'); 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) { client.end('DidNotEncryptVerifyTokenProperly'); return; diff --git a/src/ursa.js b/src/ursa.js deleted file mode 100644 index c478df6..0000000 --- a/src/ursa.js +++ /dev/null @@ -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;