test_crypto_box_easy.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  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. 0xf3,0xff,0xc7,0x70,0x3f,0x94,0x00,0xe5
  69. ,0x2a,0x7d,0xfb,0x4b,0x3d,0x33,0x05,0xd9
  70. ,0x8e,0x99,0x3b,0x9f,0x48,0x68,0x12,0x73
  71. ,0xc2,0x96,0x50,0xba,0x32,0xfc,0x76,0xce
  72. ,0x48,0x33,0x2e,0xa7,0x16,0x4d,0x96,0xa4
  73. ,0x47,0x6f,0xb8,0xc5,0x31,0xa1,0x18,0x6a
  74. ,0xc0,0xdf,0xc1,0x7c,0x98,0xdc,0xe8,0x7b
  75. ,0x4d,0xa7,0xf0,0x11,0xec,0x48,0xc9,0x72
  76. ,0x71,0xd2,0xc2,0x0f,0x9b,0x92,0x8f,0xe2
  77. ,0x27,0x0d,0x6f,0xb8,0x63,0xd5,0x17,0x38
  78. ,0xb4,0x8e,0xee,0xe3,0x14,0xa7,0xcc,0x8a
  79. ,0xb9,0x32,0x16,0x45,0x48,0xe5,0x26,0xae
  80. ,0x90,0x22,0x43,0x68,0x51,0x7a,0xcf,0xea
  81. ,0xbd,0x6b,0xb3,0x73,0x2b,0xc0,0xe9,0xda
  82. ,0x99,0x83,0x2b,0x61,0xca,0x01,0xb6,0xde
  83. ,0x56,0x24,0x4a,0x9e,0x88,0xd5,0xf9,0xb3
  84. ,0x79,0x73,0xf6,0x22,0xa4,0x3d,0x14,0xa6
  85. ,0x59,0x9b,0x1f,0x65,0x4c,0xb4,0x5a,0x74
  86. ,0xe3,0x55,0xa5
  87. ];
  88. var secretA = [
  89. 0x1b,0x27,0x55,0x64,0x73,0xe9,0x85,0xd4
  90. ,0x62,0xcd,0x51,0x19,0x7a,0x9a,0x46,0xc7
  91. ,0x60,0x09,0x54,0x9e,0xac,0x64,0x74,0xf2
  92. ,0x06,0xc4,0xee,0x08,0x44,0xf6,0x83,0x89
  93. ];
  94. var nonce = Buffer.from(nonceA);
  95. var plainText = Buffer.from(plainTextB);
  96. var alicesk = Buffer.from(aliceskA);
  97. var bobpk = Buffer.from(bobpkA);
  98. var cipherText = Buffer.from(cipherTextA);
  99. var secret = Buffer.from(secretA);
  100. describe('crypto_box_easy', function() {
  101. it('crypto_box_easy should encrypt to known cipher text', function(done) {
  102. var cipherMsg = sodium.crypto_box_easy(plainText,nonce, bobpk, alicesk);
  103. if( !cipherMsg ) {
  104. should.fail();
  105. }
  106. assert.equal(cipherMsg.toString('hex'), cipherText.toString('hex'));
  107. done();
  108. });
  109. // Test bad params
  110. it('should fail on bad param 1', function(done) {
  111. var p = "";
  112. var n = nonce;
  113. var pk = bobpk
  114. var sk = alicesk;
  115. assert.throws(function() {
  116. var cipherMsg = sodium.crypto_box_easy(p, n, pk, sk);
  117. });
  118. p = 10;
  119. assert.throws(function() {
  120. var cipherMsg = sodium.crypto_box_easy(p, n, pk, sk);
  121. });
  122. done();
  123. });
  124. it('should fail on bad param 2', function(done) {
  125. var p = plainText;
  126. var n = "nonce";
  127. var pk = bobpk
  128. var sk = alicesk;
  129. assert.throws(function() {
  130. var cipherMsg = sodium.crypto_box_easy(p, n, pk, sk);
  131. });
  132. n = Buffer.allocUnsafe(10);
  133. assert.throws(function() {
  134. var cipherMsg = sodium.crypto_box_easy(p, n, pk, sk);
  135. });
  136. n = 10;
  137. assert.throws(function() {
  138. var cipherMsg = sodium.crypto_box_easy(p, n, pk, sk);
  139. });
  140. done();
  141. });
  142. it('should fail on bad param 3', function(done) {
  143. var p = plainText;
  144. var n = nonce;
  145. var pk = "bobpk"
  146. var sk = alicesk;
  147. assert.throws(function() {
  148. var cipherMsg = sodium.crypto_box_easy(p, n, pk, sk);
  149. });
  150. pk = Buffer.allocUnsafe(10);
  151. assert.throws(function() {
  152. var cipherMsg = sodium.crypto_box_easy(p, n, pk, sk);
  153. });
  154. pk = 10;
  155. assert.throws(function() {
  156. var cipherMsg = sodium.crypto_box_easy(p, n, pk, sk);
  157. });
  158. done();
  159. });
  160. it('should fail on bad param 4', function(done) {
  161. var p = plainText;
  162. var n = nonce;
  163. var pk = bobpk
  164. var sk = "alicesk";
  165. assert.throws(function() {
  166. var cipherMsg = sodium.crypto_box_easy(p, n, pk, sk);
  167. });
  168. sk = Buffer.allocUnsafe(10);
  169. assert.throws(function() {
  170. var cipherMsg = sodium.crypto_box_easy(p, n, pk, sk);
  171. });
  172. sk = 10;
  173. assert.throws(function() {
  174. var cipherMsg = sodium.crypto_box_easy(p, n, pk, sk);
  175. });
  176. done();
  177. });
  178. });
  179. describe('crypto_box_open_easy', function() {
  180. var sender = sodium.crypto_box_keypair();
  181. var receiver = sodium.crypto_box_keypair();
  182. // Encrypt
  183. var cipherMsg = sodium.crypto_box_easy(plainText, nonce, receiver.publicKey, sender.secretKey);
  184. it('crypto_box_easy/crypto_box_open_easy should encrypt/decrypt', function(done) {
  185. // Decrypt
  186. var plainMsg = sodium.crypto_box_open_easy(cipherMsg,nonce,sender.publicKey, receiver.secretKey);
  187. // We should get the same plainText!
  188. assert.deepEqual(plainMsg, plainText);
  189. done();
  190. });
  191. it('crypto_box_afternm should encrypt/decrypt', function(done) {
  192. // Create shared secret
  193. var secret = sodium.crypto_box_beforenm(sender.publicKey, receiver.secretKey);
  194. // Encrypt message, ensure we get the same cipherText!
  195. var cipherText = sodium.crypto_box_easy_afternm(plainText,nonce,secret);
  196. assert.deepEqual(cipherMsg, cipherText);
  197. // Decrypt cipherText, ensure we get the same plainText!
  198. var plainMsg = sodium.crypto_box_open_easy_afternm(cipherMsg,nonce,secret);
  199. assert.deepEqual(plainMsg, plainText);
  200. done();
  201. });
  202. // test bad params
  203. it('should fail on bad argument 1', function(done) {
  204. var ctxt = "cipherMsg";
  205. var n = nonce;
  206. var pk = sender.publicKey;
  207. var sk = receiver.privateKey;
  208. assert.throws(function() {
  209. var plainMsg = sodium.crypto_box_open_easy(ctxt,n,pk, sk);
  210. });
  211. ctxt = Buffer.allocUnsafe(10);
  212. assert.throws(function() {
  213. var plainMsg = sodium.crypto_box_open_easy(ctxt,n,pk, sk);
  214. });
  215. ctxt = 10;
  216. assert.throws(function() {
  217. var plainMsg = sodium.crypto_box_open_easy(ctxt,n,pk, sk);
  218. });
  219. done();
  220. });
  221. it('should fail on bad argument 2', function(done) {
  222. var ctxt = cipherMsg;
  223. var n = "nonce";
  224. var pk = sender.publicKey;
  225. var sk = receiver.privateKey;
  226. assert.throws(function() {
  227. var plainMsg = sodium.crypto_box_open_easy(ctxt,n,pk, sk);
  228. });
  229. n = Buffer.allocUnsafe(10);
  230. assert.throws(function() {
  231. var plainMsg = sodium.crypto_box_open_easy(ctxt,n,pk, sk);
  232. });
  233. n = 10;
  234. assert.throws(function() {
  235. var plainMsg = sodium.crypto_box_open_easy(ctxt,n,pk, sk);
  236. });
  237. done();
  238. });
  239. it('should fail on bad argument 3', function(done) {
  240. var ctxt = cipherMsg;
  241. var n = nonce;
  242. var pk = "sender.publicKey";
  243. var sk = receiver.privateKey;
  244. assert.throws(function() {
  245. var plainMsg = sodium.crypto_box_open_easy(ctxt,n,pk, sk);
  246. });
  247. pk = Buffer.allocUnsafe(10);
  248. assert.throws(function() {
  249. var plainMsg = sodium.crypto_box_open_easy(ctxt,n,pk, sk);
  250. });
  251. pk = 10;
  252. assert.throws(function() {
  253. var plainMsg = sodium.crypto_box_open_easy(ctxt,n,pk, sk);
  254. });
  255. done();
  256. });
  257. it('should fail on bad argument 4', function(done) {
  258. var ctxt = cipherMsg;
  259. var n = nonce;
  260. var pk = sender.publicKey;
  261. var sk = "receiver.privateKey";
  262. assert.throws(function() {
  263. var plainMsg = sodium.crypto_box_open_easy(ctxt,n,pk, sk);
  264. });
  265. sk = Buffer.allocUnsafe(10);
  266. assert.throws(function() {
  267. var plainMsg = sodium.crypto_box_open_easy(ctxt,n,pk, sk);
  268. });
  269. sk = 10;
  270. assert.throws(function() {
  271. var plainMsg = sodium.crypto_box_open_easy(ctxt,n,pk, sk);
  272. });
  273. done();
  274. });
  275. });