onetime-auth.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /* jslint node: true */
  2. 'use strict';
  3. var assert = require('assert');
  4. var binding = require('../build/Release/sodium');
  5. var OneTimeKey = require('./keys/onetime-key');
  6. var toBuffer = require('./toBuffer');
  7. /**
  8. * One Time Message Authentication
  9. *
  10. *
  11. * The secretKey *MUST* remain secret or an attacker could forge valid
  12. * authenticator tokens
  13. *
  14. * If key is not given a new random key is generated
  15. *
  16. * @param {String|Buffer|Array} [secretKey] A valid auth secret key
  17. * @constructor
  18. */
  19. module.exports = function OneTimeAuth(secretKey, encoding) {
  20. var self = this;
  21. /** default encoding to use in all string operations */
  22. self.defaultEncoding = undefined;
  23. // Init key
  24. self.secretKey = new OneTimeKey(secretKey, encoding);
  25. /** Size of the authentication token */
  26. self.bytes = function() {
  27. return binding.crypto_onetimeauth_BYTES;
  28. };
  29. /** String name of the default crypto primitive used in onetimeauth operations */
  30. self.primitive = function() {
  31. return binding.crypto_onetimeauth_PRIMITIVE;
  32. };
  33. /**
  34. * Get the auth-key secret key object
  35. * @returns {AuthKey|*}
  36. */
  37. self.key = function() {
  38. return self.secretKey;
  39. };
  40. /**
  41. * Set the default encoding to use in all string conversions
  42. * @param {String} encoding encoding to use
  43. */
  44. self.setEncoding = function(encoding) {
  45. assert(!!encoding.match(/^(?:utf8|ascii|binary|hex|utf16le|ucs2|base64)$/), 'Encoding ' + encoding + ' is currently unsupported.');
  46. self.defaultEncoding = encoding;
  47. };
  48. /**
  49. * Get the current default encoding
  50. * @returns {undefined|String}
  51. */
  52. self.getEncoding = function() {
  53. return self.defaultEncoding;
  54. };
  55. /**
  56. * Generate authentication token for message, based on the secret key
  57. *
  58. * @param {string|Buffer|Array} message message to authenticate
  59. * @param {String} [encoding ] If v is a string you can specify the encoding
  60. */
  61. self.generate = function(message, encoding) {
  62. encoding = encoding || self.defaultEncoding;
  63. var messageBuf = toBuffer(message, encoding);
  64. return binding.crypto_onetimeauth(messageBuf, self.secretKey.get());
  65. };
  66. /**
  67. * Checks if the token authenticates the message
  68. *
  69. * @param {String|Buffer|Array} token message token
  70. * @param {String|Buffer|Array} message message to authenticate
  71. * @param {String} [encoding] If v is a string you can specify the encoding
  72. */
  73. self.validate = function(token, message, encoding) {
  74. if(!self.secretKey) {
  75. throw new Error('Auth: no secret key found');
  76. }
  77. encoding = encoding || self.defaultEncoding;
  78. var tokenBuf = toBuffer(token, encoding);
  79. var messageBuf = toBuffer(message, encoding);
  80. return binding.crypto_onetimeauth_verify(tokenBuf, messageBuf, self.secretKey.get()) ? false : true;
  81. };
  82. };