test_crypto_box.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  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 aliceskA = [
  9. 0x77,0x07,0x6d,0x0a,0x73,0x18,0xa5,0x7d
  10. ,0x3c,0x16,0xc1,0x72,0x51,0xb2,0x66,0x45
  11. ,0xdf,0x4c,0x2f,0x87,0xeb,0xc0,0x99,0x2a
  12. ,0xb1,0x77,0xfb,0xa5,0x1d,0xb9,0x2c,0x2a
  13. ];
  14. var bobpkA = [
  15. 0xde,0x9e,0xdb,0x7d,0x7b,0x7d,0xc1,0xb4
  16. ,0xd3,0x5b,0x61,0xc2,0xec,0xe4,0x35,0x37
  17. ,0x3f,0x83,0x43,0xc8,0x5b,0x78,0x67,0x4d
  18. ,0xad,0xfc,0x7e,0x14,0x6f,0x88,0x2b,0x4f
  19. ];
  20. var nonceA = [
  21. 0x69,0x69,0x6e,0xe9,0x55,0xb6,0x2b,0x73,
  22. 0xcd,0x62,0xbd,0xa8,0x75,0xfc,0x73,0xd6,
  23. 0x82,0x19,0xe0,0x03,0x6b,0x7a,0x0b,0x37
  24. ];
  25. var plainTextA = [
  26. 0, 0, 0, 0, 0, 0, 0, 0
  27. , 0, 0, 0, 0, 0, 0, 0, 0
  28. , 0, 0, 0, 0, 0, 0, 0, 0
  29. , 0, 0, 0, 0, 0, 0, 0, 0
  30. ,0xbe,0x07,0x5f,0xc5,0x3c,0x81,0xf2,0xd5
  31. ,0xcf,0x14,0x13,0x16,0xeb,0xeb,0x0c,0x7b
  32. ,0x52,0x28,0xc5,0x2a,0x4c,0x62,0xcb,0xd4
  33. ,0x4b,0x66,0x84,0x9b,0x64,0x24,0x4f,0xfc
  34. ,0xe5,0xec,0xba,0xaf,0x33,0xbd,0x75,0x1a
  35. ,0x1a,0xc7,0x28,0xd4,0x5e,0x6c,0x61,0x29
  36. ,0x6c,0xdc,0x3c,0x01,0x23,0x35,0x61,0xf4
  37. ,0x1d,0xb6,0x6c,0xce,0x31,0x4a,0xdb,0x31
  38. ,0x0e,0x3b,0xe8,0x25,0x0c,0x46,0xf0,0x6d
  39. ,0xce,0xea,0x3a,0x7f,0xa1,0x34,0x80,0x57
  40. ,0xe2,0xf6,0x55,0x6a,0xd6,0xb1,0x31,0x8a
  41. ,0x02,0x4a,0x83,0x8f,0x21,0xaf,0x1f,0xde
  42. ,0x04,0x89,0x77,0xeb,0x48,0xf5,0x9f,0xfd
  43. ,0x49,0x24,0xca,0x1c,0x60,0x90,0x2e,0x52
  44. ,0xf0,0xa0,0x89,0xbc,0x76,0x89,0x70,0x40
  45. ,0xe0,0x82,0xf9,0x37,0x76,0x38,0x48,0x64
  46. ,0x5e,0x07,0x05
  47. ];
  48. var plainTextB = [
  49. 0xbe,0x07,0x5f,0xc5,0x3c,0x81,0xf2,0xd5
  50. ,0xcf,0x14,0x13,0x16,0xeb,0xeb,0x0c,0x7b
  51. ,0x52,0x28,0xc5,0x2a,0x4c,0x62,0xcb,0xd4
  52. ,0x4b,0x66,0x84,0x9b,0x64,0x24,0x4f,0xfc
  53. ,0xe5,0xec,0xba,0xaf,0x33,0xbd,0x75,0x1a
  54. ,0x1a,0xc7,0x28,0xd4,0x5e,0x6c,0x61,0x29
  55. ,0x6c,0xdc,0x3c,0x01,0x23,0x35,0x61,0xf4
  56. ,0x1d,0xb6,0x6c,0xce,0x31,0x4a,0xdb,0x31
  57. ,0x0e,0x3b,0xe8,0x25,0x0c,0x46,0xf0,0x6d
  58. ,0xce,0xea,0x3a,0x7f,0xa1,0x34,0x80,0x57
  59. ,0xe2,0xf6,0x55,0x6a,0xd6,0xb1,0x31,0x8a
  60. ,0x02,0x4a,0x83,0x8f,0x21,0xaf,0x1f,0xde
  61. ,0x04,0x89,0x77,0xeb,0x48,0xf5,0x9f,0xfd
  62. ,0x49,0x24,0xca,0x1c,0x60,0x90,0x2e,0x52
  63. ,0xf0,0xa0,0x89,0xbc,0x76,0x89,0x70,0x40
  64. ,0xe0,0x82,0xf9,0x37,0x76,0x38,0x48,0x64
  65. ,0x5e,0x07,0x05
  66. ];
  67. var cipherTextA = [
  68. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  69. ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  70. ,0xf3,0xff,0xc7,0x70,0x3f,0x94,0x00,0xe5
  71. ,0x2a,0x7d,0xfb,0x4b,0x3d,0x33,0x05,0xd9
  72. ,0x8e,0x99,0x3b,0x9f,0x48,0x68,0x12,0x73
  73. ,0xc2,0x96,0x50,0xba,0x32,0xfc,0x76,0xce
  74. ,0x48,0x33,0x2e,0xa7,0x16,0x4d,0x96,0xa4
  75. ,0x47,0x6f,0xb8,0xc5,0x31,0xa1,0x18,0x6a
  76. ,0xc0,0xdf,0xc1,0x7c,0x98,0xdc,0xe8,0x7b
  77. ,0x4d,0xa7,0xf0,0x11,0xec,0x48,0xc9,0x72
  78. ,0x71,0xd2,0xc2,0x0f,0x9b,0x92,0x8f,0xe2
  79. ,0x27,0x0d,0x6f,0xb8,0x63,0xd5,0x17,0x38
  80. ,0xb4,0x8e,0xee,0xe3,0x14,0xa7,0xcc,0x8a
  81. ,0xb9,0x32,0x16,0x45,0x48,0xe5,0x26,0xae
  82. ,0x90,0x22,0x43,0x68,0x51,0x7a,0xcf,0xea
  83. ,0xbd,0x6b,0xb3,0x73,0x2b,0xc0,0xe9,0xda
  84. ,0x99,0x83,0x2b,0x61,0xca,0x01,0xb6,0xde
  85. ,0x56,0x24,0x4a,0x9e,0x88,0xd5,0xf9,0xb3
  86. ,0x79,0x73,0xf6,0x22,0xa4,0x3d,0x14,0xa6
  87. ,0x59,0x9b,0x1f,0x65,0x4c,0xb4,0x5a,0x74
  88. ,0xe3,0x55,0xa5
  89. ];
  90. var secretA = [
  91. 0x1b,0x27,0x55,0x64,0x73,0xe9,0x85,0xd4
  92. ,0x62,0xcd,0x51,0x19,0x7a,0x9a,0x46,0xc7
  93. ,0x60,0x09,0x54,0x9e,0xac,0x64,0x74,0xf2
  94. ,0x06,0xc4,0xee,0x08,0x44,0xf6,0x83,0x89
  95. ];
  96. var nonce = Buffer.from(nonceA);
  97. var plainText = Buffer.from(plainTextB);
  98. var alicesk = Buffer.from(aliceskA);
  99. var bobpk = Buffer.from(bobpkA);
  100. var cipherText = Buffer.from(cipherTextA);
  101. var secret = Buffer.from(secretA);
  102. describe('crypto_box', function() {
  103. it('crypto_box should encrypt to known cipher text', function(done) {
  104. var cipherMsg = sodium.crypto_box(plainText,nonce, bobpk, alicesk);
  105. if( !cipherMsg ) {
  106. should.fail();
  107. }
  108. assert.equal(cipherMsg.toString('hex'), cipherText.toString('hex'));
  109. done();
  110. });
  111. // Test bad params
  112. it('should fail on bad param 1', function(done) {
  113. var p = "";
  114. var n = nonce;
  115. var pk = bobpk
  116. var sk = alicesk;
  117. assert.throws(function() {
  118. var cipherMsg = sodium.crypto_box(p, n, pk, sk);
  119. });
  120. p = 10;
  121. assert.throws(function() {
  122. var cipherMsg = sodium.crypto_box(p, n, pk, sk);
  123. });
  124. done();
  125. });
  126. it('should fail on bad param 2', function(done) {
  127. var p = plainText;
  128. var n = "nonce";
  129. var pk = bobpk
  130. var sk = alicesk;
  131. assert.throws(function() {
  132. var cipherMsg = sodium.crypto_box(p, n, pk, sk);
  133. });
  134. n = Buffer.allocUnsafe(10);
  135. assert.throws(function() {
  136. var cipherMsg = sodium.crypto_box(p, n, pk, sk);
  137. });
  138. n = 10;
  139. assert.throws(function() {
  140. var cipherMsg = sodium.crypto_box(p, n, pk, sk);
  141. });
  142. done();
  143. });
  144. it('should fail on bad param 3', function(done) {
  145. var p = plainText;
  146. var n = nonce;
  147. var pk = "bobpk"
  148. var sk = alicesk;
  149. assert.throws(function() {
  150. var cipherMsg = sodium.crypto_box(p, n, pk, sk);
  151. });
  152. pk = Buffer.allocUnsafe(10);
  153. assert.throws(function() {
  154. var cipherMsg = sodium.crypto_box(p, n, pk, sk);
  155. });
  156. pk = 10;
  157. assert.throws(function() {
  158. var cipherMsg = sodium.crypto_box(p, n, pk, sk);
  159. });
  160. done();
  161. });
  162. it('should fail on bad param 4', function(done) {
  163. var p = plainText;
  164. var n = nonce;
  165. var pk = bobpk
  166. var sk = "alicesk";
  167. assert.throws(function() {
  168. var cipherMsg = sodium.crypto_box(p, n, pk, sk);
  169. });
  170. sk = Buffer.allocUnsafe(10);
  171. assert.throws(function() {
  172. var cipherMsg = sodium.crypto_box(p, n, pk, sk);
  173. });
  174. sk = 10;
  175. assert.throws(function() {
  176. var cipherMsg = sodium.crypto_box(p, n, pk, sk);
  177. });
  178. done();
  179. });
  180. describe('_BeforeNM', function() {
  181. it('crypto_box_beforenm should output known shared secret', function(done) {
  182. var computed_secret = sodium.crypto_box_beforenm(bobpk, alicesk);
  183. if( !computed_secret ) {
  184. should.fail();
  185. }
  186. assert.equal(computed_secret.toString('hex'), secret.toString('hex'));
  187. done();
  188. });
  189. it('should fail on bad param 1', function(done) {
  190. var pk = "bobpk";
  191. var sk = alicesk;
  192. assert.throws(function() {
  193. var computed_secret = sodium.crypto_box_beforenm(pk, sk);
  194. });
  195. pk = Buffer.allocUnsafe(10);
  196. assert.throws(function() {
  197. var computed_secret = sodium.crypto_box_beforenm(pk, sk);
  198. });
  199. pk = 10;
  200. assert.throws(function() {
  201. var computed_secret = sodium.crypto_box_beforenm(pk, sk);
  202. });
  203. done();
  204. });
  205. it('should fail on bad param 2', function(done) {
  206. var pk = bobpk;
  207. var sk = "alicesk";
  208. assert.throws(function() {
  209. var computed_secret = sodium.crypto_box_beforenm(pk, sk);
  210. });
  211. sk = Buffer.allocUnsafe(10);
  212. assert.throws(function() {
  213. var computed_secret = sodium.crypto_box_beforenm(pk, sk);
  214. });
  215. sk = 10;
  216. assert.throws(function() {
  217. var computed_secret = sodium.crypto_box_beforenm(pk, sk);
  218. });
  219. done();
  220. });
  221. });
  222. describe('_AfterNM', function() {
  223. it('crypto_box_afternm should encrypt to known cipher text', function(done) {
  224. var cipherMsg = sodium.crypto_box_afternm(plainText,nonce, secret);
  225. if( !cipherMsg ) {
  226. should.fail();
  227. }
  228. assert.equal(cipherMsg.toString('hex'), cipherText.toString('hex'));
  229. done();
  230. });
  231. it('should fail on bad param 1', function(done) {
  232. var p = "";
  233. var n = nonce;
  234. var s = secret;
  235. assert.throws(function() {
  236. var cipherMsg = sodium.crypto_box_afternm(p,n,s);
  237. });
  238. p = 10;
  239. assert.throws(function() {
  240. var cipherMsg = sodium.crypto_box_afternm(p,n,s);
  241. });
  242. done();
  243. });
  244. it('should fail on bad param 2', function(done) {
  245. var p = plainText;
  246. var n = "nonce";
  247. var s = secret;
  248. assert.throws(function() {
  249. var cipherMsg = sodium.crypto_box_afternm(p,n,s);
  250. });
  251. n = Buffer.allocUnsafe(10);
  252. assert.throws(function() {
  253. var cipherMsg = sodium.crypto_box_afternm(p,n,s);
  254. });
  255. n = 10;
  256. assert.throws(function() {
  257. var cipherMsg = sodium.crypto_box_afternm(p,n,s);
  258. });
  259. done();
  260. });
  261. it('should fail on bad param 3', function(done) {
  262. var p = plainText;
  263. var n = nonce;
  264. var s = "secret";
  265. assert.throws(function() {
  266. var cipherMsg = sodium.crypto_box_afternm(p,n,s);
  267. });
  268. s = Buffer.allocUnsafe(10);
  269. assert.throws(function() {
  270. var cipherMsg = sodium.crypto_box_afternm(p,n,s);
  271. });
  272. s = 10;
  273. assert.throws(function() {
  274. var cipherMsg = sodium.crypto_box_afternm(p,n,s);
  275. });
  276. done();
  277. });
  278. });
  279. });
  280. describe('crypto_box_open', function() {
  281. var sender = sodium.crypto_box_keypair();
  282. var receiver = sodium.crypto_box_keypair();
  283. // Encrypt
  284. var cipherMsg = sodium.crypto_box(plainText, nonce, receiver.publicKey, sender.secretKey);
  285. // Secret
  286. var secret = sodium.crypto_box_beforenm(receiver.publicKey, sender.secretKey);
  287. it('crypto_box/crypto_box_open should encrypt/decrypt', function(done) {
  288. // Decrypt
  289. var plainMsg = sodium.crypto_box_open(cipherMsg,nonce,sender.publicKey, receiver.secretKey);
  290. // We should get the same plainText!
  291. assert.deepEqual(plainMsg, plainText);
  292. done();
  293. });
  294. // test bad params
  295. it('should fail on bad argument 1', function(done) {
  296. var ctxt = "cipherMsg";
  297. var n = nonce;
  298. var pk = sender.publicKey;
  299. var sk = receiver.privateKey;
  300. assert.throws(function() {
  301. var plainMsg = sodium.crypto_box_open(ctxt,n,pk, sk);
  302. });
  303. ctxt = Buffer.allocUnsafe(10);
  304. assert.throws(function() {
  305. var plainMsg = sodium.crypto_box_open(ctxt,n,pk, sk);
  306. });
  307. ctxt = 10;
  308. assert.throws(function() {
  309. var plainMsg = sodium.crypto_box_open(ctxt,n,pk, sk);
  310. });
  311. done();
  312. });
  313. it('should fail on bad argument 2', function(done) {
  314. var ctxt = cipherMsg;
  315. var n = "nonce";
  316. var pk = sender.publicKey;
  317. var sk = receiver.privateKey;
  318. assert.throws(function() {
  319. var plainMsg = sodium.crypto_box_open(ctxt,n,pk, sk);
  320. });
  321. n = Buffer.allocUnsafe(10);
  322. assert.throws(function() {
  323. var plainMsg = sodium.crypto_box_open(ctxt,n,pk, sk);
  324. });
  325. n = 10;
  326. assert.throws(function() {
  327. var plainMsg = sodium.crypto_box_open(ctxt,n,pk, sk);
  328. });
  329. done();
  330. });
  331. it('should fail on bad argument 3', function(done) {
  332. var ctxt = cipherMsg;
  333. var n = nonce;
  334. var pk = "sender.publicKey";
  335. var sk = receiver.privateKey;
  336. assert.throws(function() {
  337. var plainMsg = sodium.crypto_box_open(ctxt,n,pk, sk);
  338. });
  339. pk = Buffer.allocUnsafe(10);
  340. assert.throws(function() {
  341. var plainMsg = sodium.crypto_box_open(ctxt,n,pk, sk);
  342. });
  343. pk = 10;
  344. assert.throws(function() {
  345. var plainMsg = sodium.crypto_box_open(ctxt,n,pk, sk);
  346. });
  347. done();
  348. });
  349. it('should fail on bad argument 4', function(done) {
  350. var ctxt = cipherMsg;
  351. var n = nonce;
  352. var pk = sender.publicKey;
  353. var sk = "receiver.privateKey";
  354. assert.throws(function() {
  355. var plainMsg = sodium.crypto_box_open(ctxt,n,pk, sk);
  356. });
  357. sk = Buffer.allocUnsafe(10);
  358. assert.throws(function() {
  359. var plainMsg = sodium.crypto_box_open(ctxt,n,pk, sk);
  360. });
  361. sk = 10;
  362. assert.throws(function() {
  363. var plainMsg = sodium.crypto_box_open(ctxt,n,pk, sk);
  364. });
  365. done();
  366. });
  367. describe('_AfterNM', function() {
  368. it('crypto_box_open_afternm should decrypt', function(done) {
  369. // Decrypt
  370. var plainMsg = sodium.crypto_box_open_afternm(cipherMsg,nonce,secret);
  371. // We should get the same plainText!
  372. assert.deepEqual(plainMsg, plainText);
  373. done();
  374. });
  375. it('should fail on bad param 1', function(done) {
  376. var ctxt = "cipherMsg";
  377. var n = nonce;
  378. var s = secret;
  379. assert.throws(function() {
  380. var plainMsg = sodium.crypto_box_open_afternm(ctxt,n,s);
  381. });
  382. ctxt = Buffer.allocUnsafe(10);
  383. assert.throws(function() {
  384. var plainMsg = sodium.crypto_box_open_afternm(ctxt,n,s);
  385. });
  386. ctxt = 10;
  387. assert.throws(function() {
  388. var plainMsg = sodium.crypto_box_open_afternm(ctxt,n,s);
  389. });
  390. done();
  391. });
  392. it('should fail on bad param 2', function(done) {
  393. var ctxt = cipherMsg;
  394. var n = "nonce";
  395. var s = secret;
  396. assert.throws(function() {
  397. var plainMsg = sodium.crypto_box_open_afternm(ctxt,n,s);
  398. });
  399. nonce = Buffer.allocUnsafe(10);
  400. assert.throws(function() {
  401. var plainMsg = sodium.crypto_box_open_afternm(ctxt,n,s);
  402. });
  403. nonce = 10;
  404. assert.throws(function() {
  405. var plainMsg = sodium.crypto_box_open_afternm(ctxt,n,s);
  406. });
  407. done();
  408. });
  409. it('should fail on bad param 3', function(done) {
  410. var ctxt = cipherMsg;
  411. var n = nonce;
  412. var s = "secret";
  413. assert.throws(function() {
  414. var plainMsg = sodium.crypto_box_open_afternm(ctxt,n,s);
  415. });
  416. secret = Buffer.allocUnsafe(10);
  417. assert.throws(function() {
  418. var plainMsg = sodium.crypto_box_open_afternm(ctxt,n,s);
  419. });
  420. secret = 10;
  421. assert.throws(function() {
  422. var plainMsg = sodium.crypto_box_open_afternm(ctxt,n,s);
  423. });
  424. done();
  425. });
  426. });
  427. });