classicfm-discord-bot/node_modules/sodium/lib/keys/dh-key.js
2024-05-09 14:45:10 -04:00

71 lines
1.8 KiB
JavaScript
Executable file

/**
* Created by bmf on 11/2/13.
*/
var util = require('util');
var binding = require('../../build/Release/sodium');
var KeyPair = require('./keypair');
var DHKey = function DHKey(publicKey, secretKey, encoding) {
var self = this;
KeyPair.call(this);
self.basePoint = undefined;
self.init({
publicKeySize: binding.crypto_scalarmult_BYTES,
secretKeySize: binding.crypto_scalarmult_BYTES,
publicKey: publicKey,
secretKey: secretKey,
type: 'DHKey'
});
self.setBasePoint = function (point, encoding) {
var b = toBuffer(point, encoding);
if (b.length != binding.crypto_scalarmult_BYTES) {
throw new Error('invalid base point length');
}
self.basePoint = b;
};
self.resetBasePoint = function () {
if (!self.basePoint) {
self.basePoint = Buffer.allocUnsafe(binding.crypto_scalarmult_BYTES);
}
self.basePoint.fill(0);
self.basePoint[0] = 9;
};
self.generate = function () {
self.secretKey.generate();
var pk = binding.crypto_scalarmult(self.secretKey.get(), self.basePoint);
self.publicKey.set(pk);
};
self.makePublicKey = function (secretKey, encoding) {
self.secretKey.set(secretKey, encoding);
var pk = binding.crypto_scalarmult(self.secretKey.get(), self.basePoint);
self.publicKey.set(pk);
};
self.resetBasePoint();
if (!publicKey || !secretKey || !self.isValid({
'publicKey': publicKey,
'secretKey': secretKey
})) {
if (secretKey) {
self.makePublicKey(secretKey);
} else {
// Generate the keys
self.generate();
}
}
};
util.inherits(DHKey, KeyPair);
module.exports = DHKey;