index.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /*!
  2. * keygrip
  3. * Copyright(c) 2011-2014 Jed Schmidt
  4. * MIT Licensed
  5. */
  6. 'use strict'
  7. var compare = require('tsscmp')
  8. var crypto = require("crypto")
  9. function Keygrip(keys, algorithm, encoding) {
  10. if (!algorithm) algorithm = "sha1";
  11. if (!encoding) encoding = "base64";
  12. if (!(this instanceof Keygrip)) return new Keygrip(keys, algorithm, encoding)
  13. if (!keys || !(0 in keys)) {
  14. throw new Error("Keys must be provided.")
  15. }
  16. function sign(data, key) {
  17. return crypto
  18. .createHmac(algorithm, key)
  19. .update(data).digest(encoding)
  20. .replace(/\/|\+|=/g, function(x) {
  21. return ({ "/": "_", "+": "-", "=": "" })[x]
  22. })
  23. }
  24. this.sign = function(data){ return sign(data, keys[0]) }
  25. this.verify = function(data, digest) {
  26. return this.index(data, digest) > -1
  27. }
  28. this.index = function(data, digest) {
  29. for (var i = 0, l = keys.length; i < l; i++) {
  30. if (compare(digest, sign(data, keys[i]))) {
  31. return i
  32. }
  33. }
  34. return -1
  35. }
  36. }
  37. Keygrip.sign = Keygrip.verify = Keygrip.index = function() {
  38. throw new Error("Usage: require('keygrip')(<array-of-keys>)")
  39. }
  40. module.exports = Keygrip