index.spec.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. /*
  2. * Copyright 2018 Scytl Secure Electronic Voting SA
  3. *
  4. * All rights reserved
  5. *
  6. * See our extended copyright notice in *file 'Copyright.txt' which is part of this source code package
  7. */
  8. /* jshint node:true */
  9. 'use strict';
  10. var digitalEnvelope = require('../lib/index');
  11. var cryptoPolicy = require('scytl-cryptopolicy');
  12. var asymmetric = require('scytl-asymmetric');
  13. var symmetric = require('scytl-symmetric');
  14. var codec = require('scytl-codec');
  15. describe('The digital envelope module should be able to ...', function() {
  16. var PUBLIC_KEY_PEMS = [
  17. '-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAglypZU45bnf2opnRI+Y51VqouBpvDT33xIB/OtbwKzwVpi+JrjBFtfk33tE9t/dSRs79CK94HRhCWcOiLa2qWPrjeZ9SBiEyScrhIvRZVBF41zBgwQNuRvJCsKmAqlZaFNJDZxEP4repmlBn1CfVFmfrXmOKqwP5F7l9ZtucveRzsfmF1yVPFkW8TMuB3YqMiyymyqHlS8ujCsu5I8tpgPbwuxdMOY94fNhSXrYkY8IuX1g1zdq/Z1jluOaR/UqK4UpnbuJaH/F0VgDNiWh6cTD0DFGEk0b70i5wU4Q3L/S6XZQRvSuADoCbhwBKuFL5pW5n865oLVb5S3wuVdWaGwIDAQAB-----END PUBLIC KEY-----',
  18. '-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAngCJ2RYh3XOvghmAi2MT26/fx4Hx8gYkYS2zaf9c2H8Qns1hnIHO8pIlHze/stUmNzim6nlytbJLQHmVDu64Pf9dn1ClAW2caKqUo4ofjnOzDd6RocQByjTsvZ1nOcG5BMYtOWGua+QIVFrxvxZgL6T3ShQ+9J3/1LiQDUmWj0kMoct6vRJuNkJxVFegtIEqYZYTTFI1+Y25k040NFu0e9IDwDXQA63EqKL3DjrgxdjOY+KXu4zU6DUcL4VcKaTMs1+pDfU6bSOtrecuasKkEmNE9fuy9WejFqNGqlrNVCeYmOOnNXvI0vCdH1bw4/CpqddxvGZOStczF8vGJVcMVQIDAQAB-----END PUBLIC KEY-----'
  19. ];
  20. var PRIVATE_KEY_PEMS = [
  21. '-----BEGIN RSA PRIVATE KEY-----MIIEowIBAAKCAQEAglypZU45bnf2opnRI+Y51VqouBpvDT33xIB/OtbwKzwVpi+JrjBFtfk33tE9t/dSRs79CK94HRhCWcOiLa2qWPrjeZ9SBiEyScrhIvRZVBF41zBgwQNuRvJCsKmAqlZaFNJDZxEP4repmlBn1CfVFmfrXmOKqwP5F7l9ZtucveRzsfmF1yVPFkW8TMuB3YqMiyymyqHlS8ujCsu5I8tpgPbwuxdMOY94fNhSXrYkY8IuX1g1zdq/Z1jluOaR/UqK4UpnbuJaH/F0VgDNiWh6cTD0DFGEk0b70i5wU4Q3L/S6XZQRvSuADoCbhwBKuFL5pW5n865oLVb5S3wuVdWaGwIDAQABAoIBAC/tn34Wf3kE9BGeGc1oFLVDaqqdVVz5/oEpeR2J7q0GnzMFYUpAhzC7WvY52cYsUPyll1Q9Jx0TUTmteo/uvKWQQFfz4nVMeS+2PoXabolBDzuWlsv/1eiRo0FOYHa/3siu8YcQN9X0DpAkpbfTmT1uoZOHZ3EuucMmOFu7vGn38Grw8bSxpR0uvTtnb8ygC+aB51y38RMyhzQQanrM8FMeAfDAy6IB0Yo7b0c50Cxa6Ax4nqn9LXyGakr5WeAMkgTIOA/GId9SZD4e5eRpq+628pOeR4O9datFltgl6r1+A4ii2VrJsDqeatGtODlX6KRKqwFHoGIa2TjgSZLuorECgYEAxeSZDOOgFsI5mB7RkRzZaQ9znJ15sgdyZiAFZAOUah4hSGdAXNAnZTlrdacduXEu3EfkpuPToX7xZSv5FRYwfBwMwCLeytlGLPjQzWejZGbo4+KqgzWb9fECDYVtDPlJ/+yLih9nt67BHweJKxYydl18rVigdVyy22X86NijSykCgYEAqKPUrXZAo+TJvmTw4tgsibJgvXBYBhmsej8mGNQw+Nyp2gV28sgm61ifIeXKS8teq+MFwGA6cHQedbsCqhMHokdhESZmlbWxhSFLihQcewBxwvrBwbaxI23yXRzwMewznZFL032PpcbqrmwFmcSSEZ3nmbvTH6ShqLW+pzDNp6MCgYBQLzdgxJ7qedqSa/JohTMG4e7rh9d2rpPJE7J7ewPZF8pOpx+qO+Gqn2COdJ+Ts2vUcAETKn9nEaPIZc/wnmQY9dioxbhWo0FPGaaphBPtq9Ez/XUv4zoFppk5V1X/isdUPsmvttf00oeIBiqrXbwmv+yz5JRn2Z7TTXjz9Ev+OQKBgQCUuoCMRzl1EgcXIqEL/0kwW6BUEqufHa9u1Ri9Vw6lvL8T6DPipMEmWK9nzuid9gtVns/ovTVtDgv7GuabplLaPQePf4WDzY11c0rSyS/hDyBFrK+LL5uEOqhAlJAGB2HyOj1clWVF+GvrTpuV5LZKUS/79pmZU7G7QCaX/0Ow7wKBgC/kDH7cmWQnWvvJ5izrx/7PogQVPOLELeUIGLu/hjsSdDKiFCxCUZ948+9NuG+DnpXDWzw//r8mPBRRGGsqFws5Aipp7yjQ3kRDCCzGelPCVhHyfmKqA+8ewXPulKS3/wIyHIvaXmsuAtTfurHtpRyzjKmCBK1Y6WQ3trIXvo7s-----END RSA PRIVATE KEY-----',
  22. '-----BEGIN RSA PRIVATE KEY-----MIIEogIBAAKCAQEAngCJ2RYh3XOvghmAi2MT26/fx4Hx8gYkYS2zaf9c2H8Qns1hnIHO8pIlHze/stUmNzim6nlytbJLQHmVDu64Pf9dn1ClAW2caKqUo4ofjnOzDd6RocQByjTsvZ1nOcG5BMYtOWGua+QIVFrxvxZgL6T3ShQ+9J3/1LiQDUmWj0kMoct6vRJuNkJxVFegtIEqYZYTTFI1+Y25k040NFu0e9IDwDXQA63EqKL3DjrgxdjOY+KXu4zU6DUcL4VcKaTMs1+pDfU6bSOtrecuasKkEmNE9fuy9WejFqNGqlrNVCeYmOOnNXvI0vCdH1bw4/CpqddxvGZOStczF8vGJVcMVQIDAQABAoIBAB/MEfHLP3N2pZp0EWd7v/JVOZ7H6u3/CHE6JkItrvyuzaR3xq4dfY1ZlfjrWjveI3u3fffwCwK/598I2NORfSiU7L10GFDqQzDZK2KiGGmtpRokcYBxlr6f2gjq1WxNLTPlwhIrM1PpJzf6uW3wTdkoxM92tZi691JS9kKGTbN1+LWIITWk6sC3n4Atu8LI19/zSfrl16/1iYSF7n9ylz2tyqQAyBEQXgrMRrg3KkPU83P5CwdIdDFyb4pwZ75U8OXuOfhcv0ilGIH62t2d9eVaFw0RKSf4QOYAdcVPAA75m+RzTSM7jDX4OGiPsoa1iWS4fqcdPfchFQSnJhhrL2ECgYEA8VV9JMYKE4qRY/srxhKnsVXhAVX8WkOjBT+VQSEBtI9ay5wld1JYLjWnCfaScXUQhFTXrR1f4JDAQ1K2MYwJ8FF1whW6WR0FvUi6IZX9C+pNfN4YtbVOYg4P8PhLF4hnV8UyqFCYN4Apw3JadS0kKK370eIhz1g+307pwu47h00CgYEAp5qhAi0HdB/aleb/GHGBr//xDHwm87mKyi6BKhiNP5phM7gnoyItIoxT2ArUgYC9lrrt0hi4wZsCxixLciWjGw9rFBY0Z23ie59cRyY9TlV3WTNFLkIl7nBB5PJaJAu7scXx/R4Ozgc0brX4mXs1ZORzlDbRKNFYNnsGkRKhZSkCgYA55vT7mbhZL+nqPx0ljNxHI/+0PlkpnwjB/Ztl4PFzzOFP8MrcchlOHPlS3qIMLrYjyedlVaLnUlOO0417HcpUqnbCdkwbjWcPHx/pZv8rmK+2weLT1ghUZmNUwX3iy4tf96RL1epvhoR+rDUf4BDI4dWFaegKw3VyRpC3gEkwEQKBgCaCXtAzLG1ADGc45g/ltJiNxALMW97QGNWPjdnwPjQI8qCBhYn0Bk7T00fmZSFERUtms9H8ICdLyH1kHAmkIC/NgRriZzQEiW9CFF+8p4ViGcQDBbg1NqXsYReLn658i6mzA4DW8Svhd+igIviQ2JnP68Z4OeKZBx2tcrrOfwrRAoGAGyXTcOvhr+5ayXkQ36VAr2YcAUs2SeN0HwmYBP2ErCgd/KXri7RwWXqEQtvpvAOGJq/tXyc7P5BnBhlqQtUm9WX7kqTy/dIS+pJP0UMm02N9U+b02G0auPmBKM35LXO4YGhZep1Vig+MLycR8OSe0cd4gzk52u3Th9I3e0bV9Fw=-----END RSA PRIVATE KEY-----'
  23. ];
  24. var DATA = 'Ox2fUJq1gAbX';
  25. var envelopeService_;
  26. var envelopeGenerator_;
  27. var envelopeOpener_;
  28. var data_;
  29. beforeAll(function() {
  30. envelopeService_ = digitalEnvelope.newService();
  31. data_ = codec.utf8Encode(DATA);
  32. });
  33. beforeEach(function() {
  34. envelopeGenerator_ = envelopeService_.newGenerator().init(
  35. PUBLIC_KEY_PEMS[0], PUBLIC_KEY_PEMS[1]);
  36. envelopeOpener_ = envelopeService_.newOpener().init(PRIVATE_KEY_PEMS[0]);
  37. });
  38. describe('create a digital envelope service that should be able to ..', function() {
  39. describe('create a digital envelope generator/opener pair that should be able to', function() {
  40. it('generate a digital envelope with a single public key and open the envelope with the corresponding private key',
  41. function() {
  42. var envelope =
  43. envelopeGenerator_.init(PUBLIC_KEY_PEMS[0]).generate(data_);
  44. var retrievedData = envelopeOpener_.open(envelope);
  45. expect(retrievedData).toEqual(data_);
  46. });
  47. it('generate a digital envelope with multiple public keys and open the envelope with any corresponding private key',
  48. function() {
  49. var envelope = envelopeGenerator_.generate(data_);
  50. var retrievedData;
  51. for (var i = 0; i < PRIVATE_KEY_PEMS.length; i++) {
  52. retrievedData =
  53. envelopeOpener_.init(PRIVATE_KEY_PEMS[i]).open(envelope);
  54. expect(retrievedData).toEqual(data_);
  55. }
  56. });
  57. it('generate and open a digital envelope, using a provided cryptographic policy',
  58. function() {
  59. var policy = cryptoPolicy.newInstance();
  60. policy.digitalEnvelope.symmetric.mac.hashAlgorithm =
  61. cryptoPolicy.options.digitalEnvelope.symmetric.mac.hashAlgorithm
  62. .SHA512_224;
  63. var envelopeService = digitalEnvelope.newService({policy: policy});
  64. var envelopeGenerator =
  65. envelopeService.newGenerator().init(PUBLIC_KEY_PEMS[0]);
  66. var envelopeOpener =
  67. envelopeService.newOpener().init(PRIVATE_KEY_PEMS[0]);
  68. var envelope = envelopeGenerator.generate(data_);
  69. var mac = envelope.mac;
  70. expect(mac.length).toBe(28);
  71. var retrievedData = envelopeOpener.open(envelope);
  72. expect(retrievedData).toEqual(data_);
  73. });
  74. it('generate and open a digital envelope, using a provided symmetric cryptography service',
  75. function() {
  76. var envelopeService = digitalEnvelope.newService(
  77. {symmetricCryptographyService: symmetric.newService()});
  78. var envelopeGenerator =
  79. envelopeService.newGenerator().init(PUBLIC_KEY_PEMS[0]);
  80. var envelopeOpener =
  81. envelopeService.newOpener().init(PRIVATE_KEY_PEMS[0]);
  82. var envelope = envelopeGenerator.generate(data_);
  83. var retrievedData = envelopeOpener.open(envelope);
  84. expect(retrievedData).toEqual(data_);
  85. });
  86. it('generate and open a digital envelope, using a provided asymmetric cryptography service',
  87. function() {
  88. var envelopeService = digitalEnvelope.newService(
  89. {asymmetricCryptographyService: asymmetric.newService()});
  90. var envelopeGenerator =
  91. envelopeService.newGenerator().init(PUBLIC_KEY_PEMS[0]);
  92. var envelopeOpener =
  93. envelopeService.newOpener().init(PRIVATE_KEY_PEMS[0]);
  94. var envelope = envelopeGenerator.generate(data_);
  95. var retrievedData = envelopeOpener.open(envelope);
  96. expect(retrievedData).toEqual(data_);
  97. });
  98. it('open a digital envelope, generated with a single public key, that was recreated by the service from its components',
  99. function() {
  100. var envelope =
  101. envelopeGenerator_.init(PUBLIC_KEY_PEMS[0]).generate(data_);
  102. var newEnvelope = envelopeService_.newEnvelope(
  103. envelope.encryptedData, envelope.mac,
  104. envelope.encryptedSecretKeyPairs);
  105. var retrievedData = envelopeOpener_.open(newEnvelope);
  106. expect(retrievedData).toEqual(data_);
  107. });
  108. it('open a digital envelope, generated with multiple public keys, that was recreated by the service from its components',
  109. function() {
  110. var envelope = envelopeGenerator_.generate(data_);
  111. var newEnvelope = envelopeService_.newEnvelope(
  112. envelope.encryptedData, envelope.mac,
  113. envelope.encryptedSecretKeyPairs);
  114. var retrievedData = envelopeOpener_.open(newEnvelope);
  115. for (var i = 0; i < PRIVATE_KEY_PEMS.length; i++) {
  116. retrievedData =
  117. envelopeOpener_.init(PRIVATE_KEY_PEMS[i]).open(newEnvelope);
  118. expect(retrievedData).toEqual(data_);
  119. }
  120. });
  121. it('open a digital envelope, generated with a single public key, that was serialized and deserialized',
  122. function() {
  123. var envelope =
  124. envelopeGenerator_.init(PUBLIC_KEY_PEMS[0]).generate(data_);
  125. var envelopeJson = envelope.toJson();
  126. var envelopeFromJson = envelopeService_.newEnvelope(envelopeJson);
  127. var retrievedData = envelopeOpener_.open(envelopeFromJson);
  128. expect(retrievedData).toEqual(data_);
  129. });
  130. it('open a digital envelope, generated with a multiple public keys, that was serialized and deserialized',
  131. function() {
  132. var envelope = envelopeGenerator_.generate(data_);
  133. var envelopeJson = envelope.toJson();
  134. var envelopeFromJson = envelopeService_.newEnvelope(envelopeJson);
  135. var retrievedData;
  136. for (var i = 0; i < PRIVATE_KEY_PEMS.length; i++) {
  137. retrievedData = envelopeOpener_.init(PRIVATE_KEY_PEMS[i])
  138. .open(envelopeFromJson);
  139. expect(retrievedData).toEqual(data_);
  140. }
  141. });
  142. it('throw an error when generating a digital envelope before the generator has been initialized with a public key',
  143. function() {
  144. var envelopeGenerator = envelopeService_.newGenerator();
  145. expect(function() {
  146. envelopeGenerator.generate(data_);
  147. }).toThrow();
  148. });
  149. it('throw an error when opening a digital envelope before the opener has been initialized with a private key',
  150. function() {
  151. var envelope = envelopeGenerator_.generate(data_);
  152. var envelopeOpener = envelopeService_.newOpener();
  153. expect(function() {
  154. envelopeOpener.open(envelope);
  155. }).toThrow();
  156. });
  157. it('throw an error when opening a digital envelope with the wrong private key',
  158. function() {
  159. var envelope =
  160. envelopeGenerator_.init(PUBLIC_KEY_PEMS[0]).generate(data_);
  161. expect(function() {
  162. envelopeOpener_.init(PRIVATE_KEY_PEMS[1]).open(envelope);
  163. }).toThrow();
  164. });
  165. it('throw an error when opening a corrupted digital envelope',
  166. function() {
  167. var envelope = envelopeGenerator_.generate(data_);
  168. var envelopeJson = envelope.toJson();
  169. var corruptedEnvelopeJson = envelopeJson.replace(
  170. '\"encryptedDataBase64\":\"', '\"encryptedDataBase64\":\"0');
  171. var corruptedEnvelope =
  172. envelopeService_.newEnvelope(corruptedEnvelopeJson);
  173. expect(function() {
  174. envelopeOpener_.open(corruptedEnvelope);
  175. }).toThrow();
  176. });
  177. });
  178. });
  179. });