decode_test.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. //for browser compatibility
  2. if (!chai) var chai = require('chai');
  3. if (!sinon) var sinon = require("sinon");
  4. if (!sinonChai) var sinonChai = require("sinon-chai");
  5. if (!fernet) var fernet = require('../fernet');
  6. var assert = chai.assert
  7. chai.use(sinonChai);
  8. var testData = {
  9. "token": "gAAAAAAdwJ6wAAECAwQFBgcICQoLDA0ODy021cpGVWKZ_eEwCGM4BLLF_5CV9dOPmrhuVUPgJobwOz7JcbmrR64jVmpU4IwqDA==",
  10. "now": "1985-10-26T01:20:00-07:00",
  11. "iv": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
  12. "src": "hello",
  13. "secret": "cw_0x689RpI-jtRR7oE8h_eQsKImvJapLeSbXpwF4e4="
  14. }
  15. var unacceptableClockSkewTestData = {
  16. "token": "gAAAAAAdwStRAAECAwQFBgcICQoLDA0OD3HkMATM5lFqGaerZ-fWPAnja1xKYyhd-Y6mSkTOyTGJmw2Xc2a6kBd-iX9b_qXQcw==",
  17. "now": "1985-10-26T01:20:01-07:00",
  18. "secret": "cw_0x689RpI-jtRR7oE8h_eQsKImvJapLeSbXpwF4e4="
  19. }
  20. suite('fernet.Token.prototype.decode', function () {
  21. var _fernet = new fernet({ ttl: 0 })
  22. var secret = new fernet.Secret(testData.secret);
  23. test("decode()", function () {
  24. var token = new _fernet.Token({
  25. secret: secret,
  26. token: testData.token
  27. })
  28. assert.equal("hello", token.decode())
  29. assert.equal("hello", token.toString())
  30. })
  31. test("decode(token)", function () {
  32. var token = new _fernet.Token({ secret: secret })
  33. assert.equal("hello", token.decode(testData.token))
  34. assert.equal("hello", token.toString())
  35. })
  36. test("decode(token) with top-level secret", function () {
  37. var f = new fernet({ secret: testData.secret, ttl: 0 })
  38. var token = new f.Token()
  39. assert.equal("hello", token.decode(testData.token))
  40. assert.equal("hello", token.toString())
  41. })
  42. test('recovers version', function () {
  43. var token = new _fernet.Token({
  44. secret: secret,
  45. token: testData.token,
  46. version: 1
  47. })
  48. assert.equal(token.version, 1);
  49. token.decode();
  50. assert.equal(token.version, 128);
  51. })
  52. test('recovers time', function () {
  53. var token = new _fernet.Token({
  54. secret: secret,
  55. token: testData.token
  56. })
  57. token.decode();
  58. var now = new Date(Date.parse(testData.now));
  59. assert.equal(token.time.toUTCString(), now.toUTCString());
  60. })
  61. test('recovers iv', function () {
  62. var token = new _fernet.Token({
  63. secret: secret,
  64. token: testData.token
  65. })
  66. token.decode();
  67. var ivHex = fernet.ArrayToHex(testData.iv);
  68. assert.equal(token.ivHex, ivHex);
  69. })
  70. test('recovers hmac', function () {
  71. var token = new _fernet.Token({
  72. secret: secret,
  73. token: testData.token
  74. })
  75. token.decode();
  76. var computedHmac = fernet.createHmac(secret.signingKey, fernet.timeBytes(token.time), token.iv, token.cipherText);
  77. assert.equal(token.hmacHex, computedHmac.toString(fernet.Hex));
  78. })
  79. test('inherits parent TTL', function () {
  80. var f = new fernet({ ttl: 1 });
  81. var token = new f.Token({
  82. secret: secret,
  83. token: testData.token,
  84. })
  85. assert.throws(function () {
  86. token.decode();
  87. }, Error, 'Invalid Token: TTL');
  88. })
  89. test('raises new Error("Invalid Token: TTL") on invalid ttl', function () {
  90. var token = new fernet.Token({
  91. secret: secret,
  92. token: testData.token,
  93. ttl: 1
  94. })
  95. assert.throws(function () {
  96. token.decode();
  97. }, Error, 'Invalid Token: TTL');
  98. })
  99. test('raises new Error("Invalid version") on wrong version byte', function () {
  100. var tokenHex = fernet.decode64toHex(testData.token);
  101. var versionOffset = fernet.hexBits(8);
  102. var dirtyToken = '01' + tokenHex.slice(versionOffset);
  103. var tokenWords = fernet.Hex.parse(dirtyToken);
  104. var token = fernet.urlsafe(tokenWords.toString(fernet.Base64));
  105. var t = new _fernet.Token({ secret: secret })
  106. assert.throws(function () {
  107. t.decode(token);
  108. }, Error, 'Invalid version');
  109. })
  110. test('raises new Error("Invalid Token: HMAC") on wrong Hmac', function () {
  111. var s = testData.token;
  112. var i = s.length - 5;
  113. var mutation = String.fromCharCode(s.charCodeAt(i) + 1);
  114. var dirtyHmacString = s.slice(0, i) + mutation + s.slice(i + 1);
  115. var token = new _fernet.Token({
  116. secret: secret,
  117. token: dirtyHmacString
  118. })
  119. assert.throws(function () {
  120. token.decode();
  121. }, Error, 'Invalid Token: HMAC');
  122. })
  123. test('raises new Error("far-future timestamp") on unacceptable clock skew', function () {
  124. var token = new fernet.Token({
  125. secret: new fernet.Secret(unacceptableClockSkewTestData.secret),
  126. token: unacceptableClockSkewTestData.token,
  127. ttl: 1
  128. })
  129. clock = sinon.useFakeTimers(new Date(Date.parse(unacceptableClockSkewTestData.now)).getTime());
  130. assert.throws(function () {
  131. token.decode();
  132. }, Error, 'far-future timestamp');
  133. clock.restore();
  134. })
  135. })