derive/factors/stack.js

  1. /**
  2. * @file MFKDF Stack Factor Derivation
  3. * @copyright Multifactor 2022 All Rights Reserved
  4. *
  5. * @description
  6. * Derive key stacking factor for multi-factor key derivation
  7. *
  8. * @author Vivek Nair (https://nair.me) <vivek@nair.me>
  9. */
  10. const deriveKey = require('../key').key
  11. /**
  12. * Derive an MFKDF stacked key factor
  13. *
  14. * @example
  15. * // setup key with hmacsha1 factor
  16. * const setup = await mfkdf.setup.key([
  17. * await mfkdf.setup.factors.hmacsha1()
  18. * ], {size: 8})
  19. *
  20. * // calculate response; could be done using hardware device
  21. * const secret = setup.outputs.hmacsha1.secret
  22. * const challenge = Buffer.from(setup.policy.factors[0].params.challenge, 'hex')
  23. * const response = crypto.createHmac('sha1', secret).update(challenge).digest()
  24. *
  25. * // derive key with hmacsha1 factor
  26. * const derive = await mfkdf.derive.key(setup.policy, {
  27. * hmacsha1: mfkdf.derive.factors.hmacsha1(response)
  28. * })
  29. *
  30. * setup.key.toString('hex') // -> 01d0c7236adf2516
  31. * derive.key.toString('hex') // -> 01d0c7236adf2516
  32. *
  33. * @param {Object.<string, MFKDFFactor>} factors - Factors used to derive this key
  34. * @returns {function(config:Object): Promise<MFKDFFactor>} Async function to generate MFKDF factor information
  35. * @author Vivek Nair (https://nair.me) <vivek@nair.me>
  36. * @since 0.15.0
  37. * @memberof derive.factors
  38. */
  39. function stack (factors) {
  40. return async (params) => {
  41. const key = await deriveKey(params, factors)
  42. return {
  43. type: 'stack',
  44. data: key.key,
  45. params: async () => {
  46. return key.policy
  47. },
  48. output: async () => {
  49. return key
  50. }
  51. }
  52. }
  53. }
  54. module.exports.stack = stack