dh-key.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /**
  2. * Created by bmf on 11/2/13.
  3. */
  4. var util = require('util');
  5. var binding = require('../../build/Release/sodium');
  6. var KeyPair = require('./keypair');
  7. var DHKey = function DHKey(publicKey, secretKey, encoding) {
  8. var self = this;
  9. KeyPair.call(this);
  10. self.basePoint = undefined;
  11. self.init({
  12. publicKeySize: binding.crypto_scalarmult_BYTES,
  13. secretKeySize: binding.crypto_scalarmult_BYTES,
  14. publicKey: publicKey,
  15. secretKey: secretKey,
  16. type: 'DHKey'
  17. });
  18. self.setBasePoint = function (point, encoding) {
  19. var b = toBuffer(point, encoding);
  20. if (b.length != binding.crypto_scalarmult_BYTES) {
  21. throw new Error('invalid base point length');
  22. }
  23. self.basePoint = b;
  24. };
  25. self.resetBasePoint = function () {
  26. if (!self.basePoint) {
  27. self.basePoint = Buffer.allocUnsafe(binding.crypto_scalarmult_BYTES);
  28. }
  29. self.basePoint.fill(0);
  30. self.basePoint[0] = 9;
  31. };
  32. self.generate = function () {
  33. self.secretKey.generate();
  34. var pk = binding.crypto_scalarmult(self.secretKey.get(), self.basePoint);
  35. self.publicKey.set(pk);
  36. };
  37. self.makePublicKey = function (secretKey, encoding) {
  38. self.secretKey.set(secretKey, encoding);
  39. var pk = binding.crypto_scalarmult(self.secretKey.get(), self.basePoint);
  40. self.publicKey.set(pk);
  41. };
  42. self.resetBasePoint();
  43. if (!publicKey || !secretKey || !self.isValid({
  44. 'publicKey': publicKey,
  45. 'secretKey': secretKey
  46. })) {
  47. if (secretKey) {
  48. self.makePublicKey(secretKey);
  49. } else {
  50. // Generate the keys
  51. self.generate();
  52. }
  53. }
  54. };
  55. util.inherits(DHKey, KeyPair);
  56. module.exports = DHKey;