test_crypto_secretbox.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /**
  2. * Created by bmf on 10/31/13.
  3. */
  4. "use strict";
  5. var assert = require('assert');
  6. var crypto = require('crypto');
  7. var sodium = require('../build/Release/sodium');
  8. var keyA = [
  9. 0x1b,0x27,0x55,0x64,0x73,0xe9,0x85,0xd4,
  10. 0x62,0xcd,0x51,0x19,0x7a,0x9a,0x46,0xc7,
  11. 0x60,0x09,0x54,0x9e,0xac,0x64,0x74,0xf2,
  12. 0x06,0xc4,0xee,0x08,0x44,0xf6,0x83,0x89
  13. ];
  14. var nonceA = [
  15. 0x69,0x69,0x6e,0xe9,0x55,0xb6,0x2b,0x73,
  16. 0xcd,0x62,0xbd,0xa8,0x75,0xfc,0x73,0xd6,
  17. 0x82,0x19,0xe0,0x03,0x6b,0x7a,0x0b,0x37
  18. ];
  19. var plainTextA = [
  20. 0, 0, 0, 0, 0, 0, 0, 0
  21. , 0, 0, 0, 0, 0, 0, 0, 0
  22. , 0, 0, 0, 0, 0, 0, 0, 0
  23. , 0, 0, 0, 0, 0, 0, 0, 0
  24. ,0xbe,0x07,0x5f,0xc5,0x3c,0x81,0xf2,0xd5
  25. ,0xcf,0x14,0x13,0x16,0xeb,0xeb,0x0c,0x7b
  26. ,0x52,0x28,0xc5,0x2a,0x4c,0x62,0xcb,0xd4
  27. ,0x4b,0x66,0x84,0x9b,0x64,0x24,0x4f,0xfc
  28. ,0xe5,0xec,0xba,0xaf,0x33,0xbd,0x75,0x1a
  29. ,0x1a,0xc7,0x28,0xd4,0x5e,0x6c,0x61,0x29
  30. ,0x6c,0xdc,0x3c,0x01,0x23,0x35,0x61,0xf4
  31. ,0x1d,0xb6,0x6c,0xce,0x31,0x4a,0xdb,0x31
  32. ,0x0e,0x3b,0xe8,0x25,0x0c,0x46,0xf0,0x6d
  33. ,0xce,0xea,0x3a,0x7f,0xa1,0x34,0x80,0x57
  34. ,0xe2,0xf6,0x55,0x6a,0xd6,0xb1,0x31,0x8a
  35. ,0x02,0x4a,0x83,0x8f,0x21,0xaf,0x1f,0xde
  36. ,0x04,0x89,0x77,0xeb,0x48,0xf5,0x9f,0xfd
  37. ,0x49,0x24,0xca,0x1c,0x60,0x90,0x2e,0x52
  38. ,0xf0,0xa0,0x89,0xbc,0x76,0x89,0x70,0x40
  39. ,0xe0,0x82,0xf9,0x37,0x76,0x38,0x48,0x64
  40. ,0x5e,0x07,0x05
  41. ];
  42. var plainTextB = [
  43. 0xbe,0x07,0x5f,0xc5,0x3c,0x81,0xf2,0xd5
  44. ,0xcf,0x14,0x13,0x16,0xeb,0xeb,0x0c,0x7b
  45. ,0x52,0x28,0xc5,0x2a,0x4c,0x62,0xcb,0xd4
  46. ,0x4b,0x66,0x84,0x9b,0x64,0x24,0x4f,0xfc
  47. ,0xe5,0xec,0xba,0xaf,0x33,0xbd,0x75,0x1a
  48. ,0x1a,0xc7,0x28,0xd4,0x5e,0x6c,0x61,0x29
  49. ,0x6c,0xdc,0x3c,0x01,0x23,0x35,0x61,0xf4
  50. ,0x1d,0xb6,0x6c,0xce,0x31,0x4a,0xdb,0x31
  51. ,0x0e,0x3b,0xe8,0x25,0x0c,0x46,0xf0,0x6d
  52. ,0xce,0xea,0x3a,0x7f,0xa1,0x34,0x80,0x57
  53. ,0xe2,0xf6,0x55,0x6a,0xd6,0xb1,0x31,0x8a
  54. ,0x02,0x4a,0x83,0x8f,0x21,0xaf,0x1f,0xde
  55. ,0x04,0x89,0x77,0xeb,0x48,0xf5,0x9f,0xfd
  56. ,0x49,0x24,0xca,0x1c,0x60,0x90,0x2e,0x52
  57. ,0xf0,0xa0,0x89,0xbc,0x76,0x89,0x70,0x40
  58. ,0xe0,0x82,0xf9,0x37,0x76,0x38,0x48,0x64
  59. ,0x5e,0x07,0x05
  60. ];
  61. var cipherTextA = [
  62. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  63. ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  64. ,0xf3,0xff,0xc7,0x70,0x3f,0x94,0x00,0xe5
  65. ,0x2a,0x7d,0xfb,0x4b,0x3d,0x33,0x05,0xd9
  66. ,0x8e,0x99,0x3b,0x9f,0x48,0x68,0x12,0x73
  67. ,0xc2,0x96,0x50,0xba,0x32,0xfc,0x76,0xce
  68. ,0x48,0x33,0x2e,0xa7,0x16,0x4d,0x96,0xa4
  69. ,0x47,0x6f,0xb8,0xc5,0x31,0xa1,0x18,0x6a
  70. ,0xc0,0xdf,0xc1,0x7c,0x98,0xdc,0xe8,0x7b
  71. ,0x4d,0xa7,0xf0,0x11,0xec,0x48,0xc9,0x72
  72. ,0x71,0xd2,0xc2,0x0f,0x9b,0x92,0x8f,0xe2
  73. ,0x27,0x0d,0x6f,0xb8,0x63,0xd5,0x17,0x38
  74. ,0xb4,0x8e,0xee,0xe3,0x14,0xa7,0xcc,0x8a
  75. ,0xb9,0x32,0x16,0x45,0x48,0xe5,0x26,0xae
  76. ,0x90,0x22,0x43,0x68,0x51,0x7a,0xcf,0xea
  77. ,0xbd,0x6b,0xb3,0x73,0x2b,0xc0,0xe9,0xda
  78. ,0x99,0x83,0x2b,0x61,0xca,0x01,0xb6,0xde
  79. ,0x56,0x24,0x4a,0x9e,0x88,0xd5,0xf9,0xb3
  80. ,0x79,0x73,0xf6,0x22,0xa4,0x3d,0x14,0xa6
  81. ,0x59,0x9b,0x1f,0x65,0x4c,0xb4,0x5a,0x74
  82. ,0xe3,0x55,0xa5
  83. ];
  84. var key = Buffer.from(keyA);
  85. var nonce = Buffer.from(nonceA);
  86. var plainText = Buffer.from(plainTextB);
  87. var cipherText = Buffer.from(cipherTextA);
  88. var cipherTextEasy = cipherText.slice(16, cipherText.length);
  89. describe('Secretbox', function() {
  90. it('crypto_secretbox should return a buffer', function(done) {
  91. var r = sodium.crypto_secretbox(plainText,nonce,key);
  92. assert.deepEqual(r, cipherText);
  93. done();
  94. });
  95. it('crypto_secretbox/crypto_secretbox_open should encrypt/decrypt', function(done) {
  96. //var plainMsg = crypto.randomBytes(1000);
  97. var cipherMsg = sodium.crypto_secretbox(plainText,nonce,key);
  98. var plainMsg = sodium.crypto_secretbox_open(cipherMsg,nonce,key);
  99. assert.deepEqual(plainMsg, plainText);
  100. done();
  101. });
  102. });
  103. describe('Secretbox_easy', function() {
  104. it('crypto_secretbox_easy should return a buffer', function(done) {
  105. var r = sodium.crypto_secretbox_easy(plainText,nonce,key);
  106. assert.deepEqual(r, cipherTextEasy);
  107. done();
  108. });
  109. it('crypto_secretbox_easy/crypto_secretbox_open_easy should encrypt/decrypt', function(done) {
  110. //var plainMsg = crypto.randomBytes(1000);
  111. var cipherMsg = sodium.crypto_secretbox_easy(plainText,nonce,key);
  112. var plainMsg = sodium.crypto_secretbox_open_easy(cipherMsg,nonce,key);
  113. assert.deepEqual(plainMsg, plainText);
  114. done();
  115. });
  116. });
  117. function method_parameter_types (name, fn, good, bad) {
  118. describe(name + ' verify parameters', function () {
  119. good.forEach(function(v, i) {
  120. bad.forEach(function (bad) {
  121. var input = good.slice()
  122. input[i] = bad
  123. it('bad param '+(i+1)+' ' + typeof bad, function (done) {
  124. assert.throws(function() {
  125. var cipherMsg = fn.apply(null, input);
  126. });
  127. done();
  128. });
  129. });
  130. });
  131. });
  132. }
  133. var areBuffers = [plainText, nonce, key]
  134. var notBuffers = [1, 'hello', null, true]
  135. var nonceAndKey = [nonce, key]
  136. var smallBuffers = [Buffer.allocUnsafe(2), Buffer.allocUnsafe(12)]
  137. ;[
  138. 'crypto_secretbox',
  139. 'crypto_secretbox_easy',
  140. 'crypto_secretbox_open',
  141. 'crypto_secretbox_open_easy',
  142. ].forEach(function (name) {
  143. method_parameter_types(
  144. name,
  145. sodium[name],
  146. areBuffers,
  147. notBuffers
  148. )
  149. method_parameter_types(
  150. name,
  151. sodium[name].bind(null, plainText),
  152. nonceAndKey,
  153. smallBuffers
  154. )
  155. })