index.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. 'use strict';
  2. var Buffer = require('safe-buffer').Buffer;
  3. var createHash = require('create-hash');
  4. var stream = require('readable-stream');
  5. var inherits = require('inherits');
  6. var sign = require('./sign');
  7. var verify = require('./verify');
  8. var algorithms = require('./algorithms.json');
  9. Object.keys(algorithms).forEach(function (key) {
  10. algorithms[key].id = Buffer.from(algorithms[key].id, 'hex');
  11. algorithms[key.toLowerCase()] = algorithms[key];
  12. });
  13. function Sign(algorithm) {
  14. stream.Writable.call(this);
  15. var data = algorithms[algorithm];
  16. if (!data) { throw new Error('Unknown message digest'); }
  17. this._hashType = data.hash;
  18. this._hash = createHash(data.hash);
  19. this._tag = data.id;
  20. this._signType = data.sign;
  21. }
  22. inherits(Sign, stream.Writable);
  23. Sign.prototype._write = function _write(data, _, done) {
  24. this._hash.update(data);
  25. done();
  26. };
  27. Sign.prototype.update = function update(data, enc) {
  28. this._hash.update(typeof data === 'string' ? Buffer.from(data, enc) : data);
  29. return this;
  30. };
  31. Sign.prototype.sign = function signMethod(key, enc) {
  32. this.end();
  33. var hash = this._hash.digest();
  34. var sig = sign(hash, key, this._hashType, this._signType, this._tag);
  35. return enc ? sig.toString(enc) : sig;
  36. };
  37. function Verify(algorithm) {
  38. stream.Writable.call(this);
  39. var data = algorithms[algorithm];
  40. if (!data) { throw new Error('Unknown message digest'); }
  41. this._hash = createHash(data.hash);
  42. this._tag = data.id;
  43. this._signType = data.sign;
  44. }
  45. inherits(Verify, stream.Writable);
  46. Verify.prototype._write = function _write(data, _, done) {
  47. this._hash.update(data);
  48. done();
  49. };
  50. Verify.prototype.update = function update(data, enc) {
  51. this._hash.update(typeof data === 'string' ? Buffer.from(data, enc) : data);
  52. return this;
  53. };
  54. Verify.prototype.verify = function verifyMethod(key, sig, enc) {
  55. var sigBuffer = typeof sig === 'string' ? Buffer.from(sig, enc) : sig;
  56. this.end();
  57. var hash = this._hash.digest();
  58. return verify(sigBuffer, hash, key, this._signType, this._tag);
  59. };
  60. function createSign(algorithm) {
  61. return new Sign(algorithm);
  62. }
  63. function createVerify(algorithm) {
  64. return new Verify(algorithm);
  65. }
  66. module.exports = {
  67. Sign: createSign,
  68. Verify: createVerify,
  69. createSign: createSign,
  70. createVerify: createVerify
  71. };