test_crypto_stream.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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 cipherTextA = [
  43. 0xee,0xa6,0xa7,0x25,0x1c,0x1e,0x72,0x91
  44. ,0x6d,0x11,0xc2,0xcb,0x21,0x4d,0x3c,0x25
  45. ,0x25,0x39,0x12,0x1d,0x8e,0x23,0x4e,0x65
  46. ,0x2d,0x65,0x1f,0xa4,0xc8,0xcf,0xf8,0x80
  47. ,0x8e,0x99,0x3b,0x9f,0x48,0x68,0x12,0x73
  48. ,0xc2,0x96,0x50,0xba,0x32,0xfc,0x76,0xce
  49. ,0x48,0x33,0x2e,0xa7,0x16,0x4d,0x96,0xa4
  50. ,0x47,0x6f,0xb8,0xc5,0x31,0xa1,0x18,0x6a
  51. ,0xc0,0xdf,0xc1,0x7c,0x98,0xdc,0xe8,0x7b
  52. ,0x4d,0xa7,0xf0,0x11,0xec,0x48,0xc9,0x72
  53. ,0x71,0xd2,0xc2,0x0f,0x9b,0x92,0x8f,0xe2
  54. ,0x27,0x0d,0x6f,0xb8,0x63,0xd5,0x17,0x38
  55. ,0xb4,0x8e,0xee,0xe3,0x14,0xa7,0xcc,0x8a
  56. ,0xb9,0x32,0x16,0x45,0x48,0xe5,0x26,0xae
  57. ,0x90,0x22,0x43,0x68,0x51,0x7a,0xcf,0xea
  58. ,0xbd,0x6b,0xb3,0x73,0x2b,0xc0,0xe9,0xda
  59. ,0x99,0x83,0x2b,0x61,0xca,0x01,0xb6,0xde
  60. ,0x56,0x24,0x4a,0x9e,0x88,0xd5,0xf9,0xb3
  61. ,0x79,0x73,0xf6,0x22,0xa4,0x3d,0x14,0xa6
  62. ,0x59,0x9b,0x1f,0x65,0x4c,0xb4,0x5a,0x74
  63. ,0xe3,0x55,0xa5
  64. ];
  65. var key = Buffer.from(keyA);
  66. var nonce = Buffer.from(nonceA);
  67. var plainText = Buffer.from(plainTextA);
  68. var cipherText = Buffer.from(cipherTextA);
  69. describe('Stream', function() {
  70. it('crypto_stream should return a buffer', function(done) {
  71. var buf = Buffer.allocUnsafe(1000);
  72. var r = sodium.crypto_stream(1000,nonce,key);
  73. assert.ok(r);
  74. var h = sodium.crypto_hash_sha256(r);
  75. var sha256 = h.toString('hex');
  76. assert.equal(sha256, "daa587120d5cd7f84d68d76457e4e176cadd8853de1de6136311731057728ba1");
  77. done();
  78. });
  79. it('crypto_stream_xor should encrypt', function(done) {
  80. var r = sodium.crypto_stream_xor(plainText,nonce,key);
  81. assert.ok(r);
  82. assert.equal(r.toString('hex'), cipherText.toString('hex'));
  83. done();
  84. });
  85. it('crypto_stream_xor should decrypt', function(done) {
  86. var r = sodium.crypto_stream_xor(cipherText,nonce,key);
  87. assert.ok(r);
  88. assert.equal(r.toString('hex'), plainText.toString('hex'));
  89. done();
  90. });
  91. it('crypto_stream_xor should encrypt/decrypt', function(done) {
  92. var plainMsg = crypto.randomBytes(1000);
  93. var cipherMsg = sodium.crypto_stream_xor(plainMsg,nonce,key);
  94. assert.ok(cipherMsg);
  95. var plainMsg2 = sodium.crypto_stream_xor(cipherMsg,nonce,key);
  96. if( !plainMsg2 ) {
  97. should.fail();
  98. }
  99. assert.deepEqual(plainMsg2, plainMsg);
  100. done();
  101. });
  102. });
  103. describe("crypto_stream verify parameters", function () {
  104. var len = 1000;
  105. it('bad param 1 string', function(done) {
  106. len = "123";
  107. assert.throws(function() {
  108. var r = sodium.crypto_stream(len, nonce, key);
  109. });
  110. done();
  111. });
  112. it('bad param 1 number', function(done) {
  113. len = -123;
  114. assert.throws(function() {
  115. var r = sodium.crypto_stream(len, nonce, key);
  116. });
  117. done();
  118. });
  119. it('bad param 1 buffer', function(done) {
  120. len = Buffer.allocUnsafe(2);
  121. assert.throws(function() {
  122. var r = sodium.crypto_stream(len, nonce, key);
  123. });
  124. done();
  125. });
  126. it('bad param 2 string', function(done) {
  127. nonce = "123";
  128. assert.throws(function() {
  129. var r = sodium.crypto_stream(len, nonce, key);
  130. });
  131. done();
  132. });
  133. it('bad param 2 number', function(done) {
  134. nonce = -123;
  135. assert.throws(function() {
  136. var r = sodium.crypto_stream(len, nonce, key);
  137. });
  138. done();
  139. });
  140. it('bad param 2 buffer', function(done) {
  141. nonce = Buffer.allocUnsafe(2);
  142. assert.throws(function() {
  143. var r = sodium.crypto_stream(len, nonce, key);
  144. });
  145. done();
  146. });
  147. it('bad param 1 string', function(done) {
  148. key = "123";
  149. assert.throws(function() {
  150. var r = sodium.crypto_stream(len, nonce, key);
  151. });
  152. done();
  153. });
  154. it('bad param 1 number', function(done) {
  155. key = -123;
  156. assert.throws(function() {
  157. var r = sodium.crypto_stream(len, nonce, key);
  158. });
  159. done();
  160. });
  161. it('bad param 1 buffer', function(done) {
  162. key = Buffer.allocUnsafe(2);
  163. assert.throws(function() {
  164. var r = sodium.crypto_stream(len, nonce, key);
  165. });
  166. done();
  167. });
  168. });
  169. describe("crypto_stream_xor verify parameters", function () {
  170. it('bad param 1 string', function(done) {
  171. plainText = "123";
  172. assert.throws(function() {
  173. var r = sodium.crypto_stream_xor(plainText,nonce,key);
  174. });
  175. done();
  176. });
  177. it('bad param 1 number', function(done) {
  178. plainText = 123;
  179. assert.throws(function() {
  180. var r = sodium.crypto_stream_xor(plainText,nonce,key);
  181. });
  182. done();
  183. });
  184. it('bad param 2 string', function(done) {
  185. nonce = "123";
  186. assert.throws(function() {
  187. var r = sodium.crypto_stream_xor(plainText,nonce,key);
  188. });
  189. done();
  190. });
  191. it('bad param 2 number', function(done) {
  192. nonce = 123;
  193. assert.throws(function() {
  194. var r = sodium.crypto_stream_xor(plainText,nonce,key);
  195. });
  196. done();
  197. });
  198. it('bad param 2 small buffer', function(done) {
  199. nonce = Buffer.allocUnsafe(2);
  200. assert.throws(function() {
  201. var r = sodium.crypto_stream_xor(plainText,nonce,key);
  202. });
  203. done();
  204. });
  205. it('bad param 3 string', function(done) {
  206. key = "123";
  207. assert.throws(function() {
  208. var r = sodium.crypto_stream_xor(plainText,nonce,key);
  209. });
  210. done();
  211. });
  212. it('bad param 3 number', function(done) {
  213. key = 123;
  214. assert.throws(function() {
  215. var r = sodium.crypto_stream_xor(plainText,nonce,key);
  216. });
  217. done();
  218. });
  219. it('bad param 3 small buffer', function(done) {
  220. key = Buffer.allocUnsafe(2);
  221. assert.throws(function() {
  222. var r = sodium.crypto_stream_xor(plainText,nonce,key);
  223. });
  224. done();
  225. });
  226. });