verify.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // Copyright 2015 Joyent, Inc.
  2. var assert = require('assert-plus');
  3. var crypto = require('crypto');
  4. ///--- Exported API
  5. module.exports = {
  6. /**
  7. * Verify RSA/DSA signature against public key. You are expected to pass in
  8. * an object that was returned from `parse()`.
  9. *
  10. * @param {Object} parsedSignature the object you got from `parse`.
  11. * @param {String} pubkey RSA/DSA private key PEM.
  12. * @return {Boolean} true if valid, false otherwise.
  13. * @throws {TypeError} if you pass in bad arguments.
  14. */
  15. verifySignature: function verifySignature(parsedSignature, pubkey) {
  16. assert.object(parsedSignature, 'parsedSignature');
  17. assert.string(pubkey, 'pubkey');
  18. var alg = parsedSignature.algorithm.match(/^(RSA|DSA)-(\w+)/);
  19. if (!alg || alg.length !== 3)
  20. throw new TypeError('parsedSignature: unsupported algorithm ' +
  21. parsedSignature.algorithm);
  22. var verify = crypto.createVerify(alg[0]);
  23. verify.update(parsedSignature.signingString);
  24. return verify.verify(pubkey, parsedSignature.params.signature, 'base64');
  25. },
  26. /**
  27. * Verify HMAC against shared secret. You are expected to pass in an object
  28. * that was returned from `parse()`.
  29. *
  30. * @param {Object} parsedSignature the object you got from `parse`.
  31. * @param {String} secret HMAC shared secret.
  32. * @return {Boolean} true if valid, false otherwise.
  33. * @throws {TypeError} if you pass in bad arguments.
  34. */
  35. verifyHMAC: function verifyHMAC(parsedSignature, secret) {
  36. assert.object(parsedSignature, 'parsedHMAC');
  37. assert.string(secret, 'secret');
  38. var alg = parsedSignature.algorithm.match(/^HMAC-(\w+)/);
  39. if (!alg || alg.length !== 2)
  40. throw new TypeError('parsedSignature: unsupported algorithm ' +
  41. parsedSignature.algorithm);
  42. var hmac = crypto.createHmac(alg[1].toUpperCase(), secret);
  43. hmac.update(parsedSignature.signingString);
  44. return (hmac.digest('base64') === parsedSignature.params.signature);
  45. }
  46. };