virgil-crypto 2.0.2b2 → 2.0.6r1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -1
  3. data/Gemfile +3 -0
  4. data/Rakefile +5 -4
  5. data/bin/console +1 -0
  6. data/ext/native/src/CMakeLists.txt +55 -3
  7. data/ext/native/src/ChangeLog +30 -0
  8. data/ext/native/src/VERSION +1 -1
  9. data/ext/native/src/lib/include/virgil/crypto/VirgilCryptoException.h +7 -0
  10. data/ext/native/src/lib/include/virgil/crypto/foundation/VirgilPBKDF.h +1 -1
  11. data/ext/native/src/lib/src/VirgilAsn1Writer.cxx +4 -4
  12. data/ext/native/src/lib/src/VirgilCryptoException.cxx +4 -0
  13. data/ext/native/src/lib/src/stream/VirgilStreamDataSource.cxx +1 -1
  14. data/ext/native/src/libs_ext/mbedtls/mbedtls.cmake +2 -2
  15. data/ext/native/src/tests/test_asn1_writer.cxx +6 -70
  16. data/ext/native/src/tests/test_cipher.cxx +20 -0
  17. data/ext/native/src/tests/test_stream_data_source.cxx +58 -0
  18. data/ext/native/src/utils/build.sh +8 -3
  19. data/ext/native/src/wrappers/go/CMakeLists.txt +92 -0
  20. data/ext/native/src/wrappers/net/CMakeLists.txt +1 -1
  21. data/ext/native/src/wrappers/net/src/VirgilStreamDataSink.cs +1 -3
  22. data/ext/native/src/wrappers/net/src/VirgilStreamDataSource.cs +1 -3
  23. data/ext/native/src/wrappers/ruby/CMakeLists.txt +4 -6
  24. data/ext/native/src/wrappers/swig/common.i +7 -0
  25. data/ext/native/src/wrappers/swig/go/common.i.in +66 -0
  26. data/ext/native/src/wrappers/swig/util.i +1 -0
  27. data/ext/rakefile.rb +65 -0
  28. data/lib/virgil/crypto.rb +2 -2
  29. data/lib/virgil/crypto/bytes.rb +4 -0
  30. data/lib/virgil/crypto/version.rb +1 -1
  31. data/lib/virgil/crypto/virgil_stream_data_sink.rb +4 -3
  32. data/lib/virgil/crypto/virgil_stream_data_source.rb +4 -3
  33. data/lib/virgil/native_crypto.rb +100 -0
  34. data/lib/virgil/os.rb +17 -0
  35. data/virgil-crypto.gemspec +12 -6
  36. metadata +20 -13
  37. data/ext/native/extconf.rb +0 -35
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2152748198fab435f7924aff74f028916595ab6c
4
- data.tar.gz: a2f5e81ff99213a9ee47c4262722f83843d2b326
3
+ metadata.gz: 061bfd4a2b1cf1a2eb066d41304ba70f2ddab57a
4
+ data.tar.gz: 11b8b78fb1270dfad90dd2fc450fe2916aa4362c
5
5
  SHA512:
6
- metadata.gz: 5dbf9d69423bc2ab64f4e0d4e51b079bc080d20ebc7caba2c759efc3d6f7662ae605962823e7b6a5d9ef89c5376d89fd722c60657eaa6a55f6eeb2823077a3dc
7
- data.tar.gz: d4f5139c15942b9fd0403e460e633d2d092d2c56410b9988190760c851dbb76d1e406e871881b2937b0de4cf90a6361b41b746838cc22474a32ca6f12399041c
6
+ metadata.gz: 1612f74573fe63d3b097a8181844beed801720e580f96c35a1fe1fcbf4f1bc1d60a3510eaa3b367cd44ce0883edb6a2fc3658d4a2ab8d5f4bf0e91b0f20f9f5c
7
+ data.tar.gz: 66c023d4b2007ba70e820791365569bba4ce3af5bc0ccf1fc7ed35c58048d47753c98eaf5916ce03b38fa7bae3fdd06d22ec45c02f32575b0adb7d53cb9198b8
data/.gitignore CHANGED
@@ -7,5 +7,9 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
- /lib/virgil/crypto/native.so
10
+ lib/virgil/crypto/virgil_crypto_ruby.so
11
+ lib/virgil/crypto/virgil_crypto_ruby.bundle
11
12
  *.gem
13
+ build*/
14
+ .idea
15
+ *.iml
data/Gemfile CHANGED
@@ -2,3 +2,6 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in virgil-crypto.gemspec
4
4
  gemspec
5
+
6
+
7
+
data/Rakefile CHANGED
@@ -1,12 +1,13 @@
1
1
  require "bundler/gem_tasks"
2
2
  require 'rake/extensiontask'
3
3
  require 'rake/testtask'
4
-
5
- Rake::ExtensionTask.new('native')
4
+ require 'mkmf'
6
5
 
7
6
  Rake::TestTask.new do |t|
8
- t.libs << 'test'
9
- t.test_files = FileList['test/**/*_test.rb']
7
+ t.libs << 'test'
8
+ t.test_files = FileList['test/**/*_test.rb']
10
9
  end
11
10
 
12
11
  task :default => :test
12
+
13
+
data/bin/console CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "bundler/setup"
4
4
  require "virgil/crypto"
5
+ require "virgil/native_crypto"
5
6
 
6
7
  # You can add fixtures and/or initialization code here to make experimenting
7
8
  # with your gem easier. You can also use a different console, if you like.
@@ -41,10 +41,12 @@
41
41
  # - PLATFORM - name of target platform (optional).
42
42
  # - PLATFORM_VERSION - minimum supported version of the target platform (optional).
43
43
  # - PLATFORM_ARCH - target platform processor architecture (optional).
44
+ # - ADD_COMPILER_INFO - define whether to add compiler info to the library full name (optional).
44
45
  #
45
46
  # - LIB_LOW_LEVEL_API - boolean value that defines whether to include low-level API or not.
46
47
  # - LIB_FILE_IO - boolean value that defines whether to include module depends on file IO or not.
47
48
  # or separate utilities.
49
+ # - LIB_STATIC_RUNTIME - сauses library to use the static version of the run-time library.
48
50
  # - INSTALL_CORE_LIBS - boolean value that defines whether install core library and it's dependencies or not,
49
51
  # if this value is NO or undefined - only wrapped library will be installed.
50
52
  # - INSTALL_EXT_HEADERS - boolean value that defines whether install third-party library headers or not.
@@ -95,9 +97,9 @@ project (VirgilSecurity)
95
97
 
96
98
  # Set library version
97
99
  set (VIRGIL_VERSION_MAJOR 2)
98
- set (VIRGIL_VERSION_MINOR 0)
99
- set (VIRGIL_VERSION_PATCH 2)
100
- set (VIRGIL_VERSION_FEATURE)
100
+ set (VIRGIL_VERSION_MINOR 1)
101
+ set (VIRGIL_VERSION_PATCH 0)
102
+ set (VIRGIL_VERSION_FEATURE dev)
101
103
  set (VIRGIL_VERSION ${VIRGIL_VERSION_MAJOR}.${VIRGIL_VERSION_MINOR}.${VIRGIL_VERSION_PATCH})
102
104
  set (VIRGIL_SOVERSION 2)
103
105
 
@@ -116,6 +118,34 @@ set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
116
118
  # Build shared library if defined
117
119
  set (BUILD_SHARED_LIBS OFF CACHE BOOL "Force to create shared libraries")
118
120
 
121
+ # Configure redefine compiler options if requested
122
+ if (NOT CMAKE_CROSSCOMPILING AND WIN32 AND NOT CYGWIN)
123
+ set (LIB_STATIC_RUNTIME ON CACHE BOOL "Causes library to use the static version of the run-time library.")
124
+ else ()
125
+ set (LIB_STATIC_RUNTIME OFF CACHE BOOL "Causes library to use the static version of the run-time library.")
126
+ endif ()
127
+
128
+ # Configure additional parameters for library full name
129
+ set (ADD_COMPILER_INFO OFF CACHE BOOL "Define whether to add compiler info to the library full name")
130
+
131
+ # Define COMPILER
132
+ string (TOLOWER "${CMAKE_CXX_COMPILER_ID}" COMPILER_ID)
133
+ if (COMPILER_ID STREQUAL "gnu")
134
+ set (COMPILER "gcc")
135
+ else ()
136
+ set (COMPILER "${COMPILER_ID}")
137
+ endif ()
138
+ set (COMPILER_ID)
139
+
140
+ # Define COMPILER_VERSION
141
+ if (CMAKE_CXX_COMPILER_VERSION)
142
+ string (
143
+ REGEX REPLACE
144
+ "([0-9]+)([.][0-9]+)?([.][0-9]+)?([.][0-9]+)?" "\\1\\2"
145
+ COMPILER_VERSION "${CMAKE_CXX_COMPILER_VERSION}"
146
+ )
147
+ endif ()
148
+
119
149
  # Add find_host_* utilities
120
150
  include (find_host_utils)
121
151
 
@@ -152,6 +182,20 @@ if (NOT CMAKE_CROSSCOMPILING)
152
182
  endif ()
153
183
  endif (NOT CMAKE_CROSSCOMPILING)
154
184
 
185
+ if (LIB_STATIC_RUNTIME)
186
+ foreach (compile_flags
187
+ CMAKE_C_FLAGS
188
+ CMAKE_C_FLAGS_DEBUG
189
+ CMAKE_C_FLAGS_RELEASE
190
+ CMAKE_CXX_FLAGS
191
+ CMAKE_CXX_FLAGS_DEBUG
192
+ CMAKE_CXX_FLAGS_RELEASE
193
+ )
194
+ string (REPLACE "/MD" "/MT" ${compile_flags} "${${compile_flags}}")
195
+ string (REPLACE "/MDd" "/MTd" ${compile_flags} "${${compile_flags}}")
196
+ endforeach ()
197
+ endif (LIB_STATIC_RUNTIME)
198
+
155
199
  # Define optimization features
156
200
  set (ED25519_AMD64_OPTIMIZATION ON CACHE BOOL "Defines whether to enable AMD64 optimization for Ed25519 algorithms")
157
201
 
@@ -318,6 +362,14 @@ if (PLATFORM_ARCH)
318
362
  set (LIB_NAME_FULL "${LIB_NAME_FULL}-${PLATFORM_ARCH}")
319
363
  endif (PLATFORM_ARCH)
320
364
 
365
+ if (ADD_COMPILER_INFO)
366
+ if (COMPILER AND COMPILER_VERSION)
367
+ set (LIB_NAME_FULL "${LIB_NAME_FULL}-${COMPILER}-${COMPILER_VERSION}")
368
+ else ()
369
+ message (FATAL_ERROR "ADD_COMPILER_INFO defined, but can not deduce compiler version.")
370
+ endif ()
371
+ endif ()
372
+
321
373
  message (STATUS "Library full name: ${LIB_NAME_FULL}")
322
374
 
323
375
  file (WRITE "${CMAKE_CURRENT_BINARY_DIR}/lib_name_full.txt" "${LIB_NAME_FULL}")
@@ -1,5 +1,35 @@
1
1
  virgil ChangeLog (Sorted per date)
2
2
 
3
+ = Version 2.0.4 released 2017-01-10
4
+
5
+ ## Bugfix
6
+
7
+ * [GO] Fix: VirgilByteArray is missed in Golang wrapper
8
+ * [Lib] Fix: Got exception when encrypt data in 32 bit architecture
9
+ * [PHP] Fix: Some constants are missed in the PHP wrapper
10
+
11
+ ## Changes
12
+
13
+ * [Lib] Add getter VirgilCryptoException::condition()
14
+ * [Build] Add compiler version to the built archive name (optional)
15
+
16
+ = Version 2.0.3 released 2016-12-08
17
+
18
+ ## Bugfix
19
+
20
+ * [.NET] Fix namespaces in the .NET wrapper's addons
21
+ * [Lib] Fix VirgilStreamDataSource::hasData() infinite if closed file stream is given
22
+
23
+ ## Changes
24
+
25
+ * [Build] Use static linkage to windows runtime libraries for wrappers
26
+ * [Lib] Remove restriction for ASN.1 length
27
+ * [Lib] Update mbed TLS dependency to version 2.4.0
28
+
29
+ ## Features
30
+
31
+ * [GO] Add Go to the wrappers
32
+
3
33
  = Version 2.0.2 released 2016-11-02
4
34
 
5
35
  ## Bugfix
@@ -1 +1 @@
1
- 2.0.2
1
+ 2.1.0-dev
@@ -76,6 +76,13 @@ public:
76
76
  */
77
77
  VirgilCryptoException(int ev, const std::error_category& ecat, const char* what);
78
78
 
79
+ /**
80
+ * Get underlying error condition.
81
+ *
82
+ * @return Error condition.
83
+ */
84
+ const std::error_condition& condition() const;
85
+
79
86
  /**
80
87
  * Get string identifying exception.
81
88
  *
@@ -55,7 +55,7 @@ public:
55
55
  * @property kIterationCount_Default
56
56
  * @brief Default iteration count.
57
57
  */
58
- static const unsigned int kIterationCount_Default = 2048;
58
+ static constexpr unsigned int kIterationCount_Default = 2048;
59
59
  public:
60
60
  /**
61
61
  * @brief Defines specific password based key derivation function algorithm
@@ -57,7 +57,7 @@ static const size_t kAsn1LengthValueSize = 3;
57
57
  static const size_t kAsn1IntegerValueSize = kAsn1TagValueSize + kAsn1LengthValueSize + 8;
58
58
  static const size_t kAsn1BoolValueSize = 3;
59
59
  static const size_t kAsn1NullValueSize = kAsn1TagValueSize + 1;
60
- static const size_t kAsn1SizeMax = 65535 + kAsn1TagValueSize + 3; // According to MbedTLS restriction on TAG: LENGTH
60
+ static const size_t kAsn1SizeMax = 0xFFFFFFFF; // According to MbedTLS restriction on TAG: LENGTH
61
61
  static const size_t kAsn1ContextTagMax = 0x1E;
62
62
 
63
63
  #define RETURN_POINTER_DIFF_AFTER_INVOCATION(pointer, invocation) \
@@ -307,9 +307,9 @@ void VirgilAsn1Writer::ensureBufferEnough(size_t len) {
307
307
  if (len > unusedSpace) {
308
308
  const size_t usedSpace = bufLen_ - unusedSpace;
309
309
  const size_t requiredLenMin = len + usedSpace;
310
- if (requiredLenMin > kAsn1SizeMax) {
311
- throw make_error(VirgilCryptoError::ExceededMaxSize, "ASN.1 structure size limit was exceeded.");
312
- }
310
+ if (requiredLenMin > kAsn1SizeMax) {
311
+ throw make_error(VirgilCryptoError::ExceededMaxSize, "ASN.1 structure size limit was exceeded.");
312
+ }
313
313
  const size_t requiredLenMax =
314
314
  (size_t) 1 << (size_t) (std::ceil(std::log((double) requiredLenMin) / std::log(2.0)));
315
315
  const size_t adjustedLen = requiredLenMax > kAsn1SizeMax ? kAsn1SizeMax : requiredLenMax;
@@ -72,6 +72,10 @@ const char* VirgilCryptoException::what() const noexcept {
72
72
  return what_.c_str();
73
73
  }
74
74
 
75
+ const std::error_condition& VirgilCryptoException::condition() const {
76
+ return condition_;
77
+ }
78
+
75
79
  std::string virgil::crypto::backtrace_exception(const std::exception& exception, size_t level) {
76
80
  std::ostringstream sstr;
77
81
  sstr << std::string(4 * level, ' ') << exception.what();
@@ -54,7 +54,7 @@ VirgilStreamDataSource::~VirgilStreamDataSource() noexcept {
54
54
  }
55
55
 
56
56
  bool VirgilStreamDataSource::hasData() {
57
- return !in_.eof();
57
+ return in_.good();
58
58
  }
59
59
 
60
60
  VirgilByteArray VirgilStreamDataSource::read() {
@@ -89,8 +89,8 @@ endif ()
89
89
 
90
90
  ExternalProject_Add (${PROJECT_NAME}
91
91
  DOWNLOAD_DIR "@VIRGIL_DEPENDS_PACKAGE_DOWNLOAD_DIR@"
92
- URL "https://github.com/VirgilSecurity/mbedtls/archive/mbedtls-2.3.0-virgil-2.0.0.tar.gz"
93
- URL_HASH SHA1=99b30c425dbc409e6dfa05948d132b40f517028a
92
+ URL "https://github.com/VirgilSecurity/mbedtls/archive/mbedtls-2.4.0-virgil-2.0.1.tar.gz"
93
+ URL_HASH SHA1=8fe17bd30e644cefffdb2811c51c0e603e00e09b
94
94
  PREFIX "@VIRGIL_DEPENDS_PACKAGE_BUILD_DIR@"
95
95
  CMAKE_ARGS "@VIRGIL_DEPENDS_CMAKE_ARGS@" "${MBEDTLS_CMAKE_ARGS}"
96
96
  UPDATE_COMMAND ${CMAKE_COMMAND} -E copy_directory
@@ -51,8 +51,8 @@ using virgil::crypto::VirgilByteArrayUtils;
51
51
  using virgil::crypto::VirgilCryptoException;
52
52
  using virgil::crypto::foundation::asn1::VirgilAsn1Writer;
53
53
 
54
- const size_t kAsn1LengthMax = 65535; // According to MbedTLS restriction on TAG: LENGTH
55
- const size_t kAsn1SizeMax = kAsn1LengthMax + 1 + 3;
54
+ constexpr size_t kAsn1SizeMax = 10 * 1024 * 1024; // 10MB, really not maximum but good enough
55
+ constexpr size_t kAsn1LengthMax = kAsn1SizeMax - 2 /* minus 2 tags size */;
56
56
 
57
57
  TEST_CASE("ASN.1 write: use small buffer", "[asn1-writer]") {
58
58
  VirgilAsn1Writer asn1Writer(1);
@@ -97,7 +97,7 @@ TEST_CASE("ASN.1 write: use small buffer", "[asn1-writer]") {
97
97
 
98
98
  SECTION ("with max octet string") {
99
99
  VirgilByteArray octetString = VirgilByteArray(kAsn1LengthMax, 0xAB);
100
- VirgilByteArray asn1Expected = VirgilByteArrayUtils::hexToBytes("0482ffff");
100
+ VirgilByteArray asn1Expected = VirgilByteArrayUtils::hexToBytes("04839ffffe");
101
101
  asn1Expected.insert(asn1Expected.end(), octetString.begin(), octetString.end());
102
102
  asn1Writer.writeOctetString(octetString);
103
103
  VirgilByteArray asn1 = asn1Writer.finish();
@@ -112,18 +112,13 @@ TEST_CASE("ASN.1 write: use small buffer", "[asn1-writer]") {
112
112
 
113
113
  SECTION ("with max UTF8 string") {
114
114
  VirgilByteArray utf8String = VirgilByteArray(kAsn1LengthMax, 0x41);
115
- VirgilByteArray asn1Expected = VirgilByteArrayUtils::hexToBytes("0c82ffff");
115
+ VirgilByteArray asn1Expected = VirgilByteArrayUtils::hexToBytes("0c839ffffe");
116
116
  asn1Expected.insert(asn1Expected.end(), utf8String.begin(), utf8String.end());
117
117
  asn1Writer.writeUTF8String(utf8String);
118
118
  VirgilByteArray asn1 = asn1Writer.finish();
119
119
  REQUIRE(VirgilByteArrayUtils::bytesToHex(asn1) == VirgilByteArrayUtils::bytesToHex(asn1Expected));
120
120
  }
121
121
 
122
- SECTION ("with oversized UTF8 string") {
123
- VirgilByteArray utf8String = VirgilByteArray(kAsn1SizeMax + 1, 0x41);
124
- REQUIRE_THROWS(asn1Writer.writeUTF8String(utf8String));
125
- }
126
-
127
122
  SECTION ("with context tag over UTF8 string") {
128
123
  size_t len = asn1Writer.writeUTF8String(VirgilByteArrayUtils::hexToBytes("4142434445464748494a4b4c4d4e4f"));
129
124
  asn1Writer.writeContextTag(1, len);
@@ -142,11 +137,6 @@ TEST_CASE("ASN.1 write: use small buffer", "[asn1-writer]") {
142
137
  REQUIRE(VirgilByteArrayUtils::bytesToHex(asn1) == VirgilByteArrayUtils::bytesToHex(data));
143
138
  }
144
139
 
145
- SECTION ("with oversized RAW buffer") {
146
- VirgilByteArray data = VirgilByteArray(kAsn1SizeMax + 1, 0x41);
147
- REQUIRE_THROWS(asn1Writer.writeData(data));
148
- }
149
-
150
140
  SECTION ("with OID") {
151
141
  std::string oid =
152
142
  VirgilByteArrayUtils::bytesToString(VirgilByteArrayUtils::hexToBytes("4142434445464748494a4b4c4d4e4f"));
@@ -157,18 +147,13 @@ TEST_CASE("ASN.1 write: use small buffer", "[asn1-writer]") {
157
147
 
158
148
  SECTION ("with max OID") {
159
149
  std::string oid = VirgilByteArrayUtils::bytesToString(VirgilByteArray(kAsn1LengthMax, 0x41));
160
- VirgilByteArray asn1Expected = VirgilByteArrayUtils::hexToBytes("0682ffff");
150
+ VirgilByteArray asn1Expected = VirgilByteArrayUtils::hexToBytes("06839ffffe");
161
151
  asn1Expected.insert(asn1Expected.end(), oid.begin(), oid.end());
162
152
  asn1Writer.writeOID(oid);
163
153
  VirgilByteArray asn1 = asn1Writer.finish();
164
154
  REQUIRE(VirgilByteArrayUtils::bytesToHex(asn1) == VirgilByteArrayUtils::bytesToHex(asn1Expected));
165
155
  }
166
156
 
167
- SECTION ("with oversized OID") {
168
- std::string oid = VirgilByteArrayUtils::bytesToString(VirgilByteArray(kAsn1SizeMax + 1, 0x41));
169
- REQUIRE_THROWS(asn1Writer.writeOID(oid));
170
- }
171
-
172
157
  SECTION ("with sequence over UTF8 string") {
173
158
  size_t len = asn1Writer.writeUTF8String(VirgilByteArrayUtils::hexToBytes("4142434445464748494a4b4c4d4e4f"));
174
159
  asn1Writer.writeSequence(len);
@@ -200,7 +185,7 @@ TEST_CASE("ASN.1 write: use small buffer", "[asn1-writer]") {
200
185
  utf8String.insert(utf8String.end(), utf8StringHead.begin(), utf8StringHead.end());
201
186
  utf8String.insert(utf8String.end(), utf8StringBody.begin(), utf8StringBody.end());
202
187
 
203
- VirgilByteArray asn1Expected = VirgilByteArrayUtils::hexToBytes("3182ffff");
188
+ VirgilByteArray asn1Expected = VirgilByteArrayUtils::hexToBytes("31839ffffe");
204
189
  asn1Expected.insert(asn1Expected.end(), utf8String.begin(), utf8String.end());
205
190
 
206
191
  std::vector<VirgilByteArray> set;
@@ -212,55 +197,6 @@ TEST_CASE("ASN.1 write: use small buffer", "[asn1-writer]") {
212
197
  }
213
198
  }
214
199
 
215
- TEST_CASE("ASN.1 write: check overflows ", "[asn1-writer]") {
216
- VirgilAsn1Writer asn1Writer;
217
-
218
- VirgilByteArray data(kAsn1SizeMax);
219
- asn1Writer.writeData(data);
220
-
221
- SECTION("with integer") {
222
- REQUIRE_THROWS(asn1Writer.writeInteger(1));
223
- }
224
-
225
- SECTION("with bool") {
226
- REQUIRE_THROWS(asn1Writer.writeBool(true));
227
- }
228
-
229
- SECTION("with NULL") {
230
- REQUIRE_THROWS(asn1Writer.writeNull());
231
- }
232
-
233
- SECTION("with octet string") {
234
- REQUIRE_THROWS(asn1Writer.writeOctetString(VirgilByteArray(1, 0xff)));
235
- }
236
-
237
- SECTION("with UTF8 string") {
238
- REQUIRE_THROWS(asn1Writer.writeUTF8String(VirgilByteArray(1, 0x41)));
239
- }
240
-
241
- SECTION("with context tag") {
242
- REQUIRE_THROWS(asn1Writer.writeContextTag(1, data.size()));
243
- }
244
-
245
- SECTION("with RAW buffer") {
246
- REQUIRE_THROWS(asn1Writer.writeData(VirgilByteArray(1, 0xff)));
247
- }
248
-
249
- SECTION("with OID") {
250
- REQUIRE_THROWS(asn1Writer.writeOID(std::string("\x2A")));
251
- }
252
-
253
- SECTION("with sequence") {
254
- REQUIRE_THROWS(asn1Writer.writeSequence(data.size()));
255
- }
256
-
257
- SECTION("with set") {
258
- std::vector<VirgilByteArray> set;
259
- set.push_back(VirgilByteArrayUtils::hexToBytes("0500"));
260
- REQUIRE_THROWS(asn1Writer.writeSet(set));
261
- }
262
- }
263
-
264
200
  TEST_CASE("ASN.1 write: check step by step ASN.1 buffer grows", "[asn1-writer]") {
265
201
  VirgilAsn1Writer asn1Writer(1);
266
202
  size_t len = 0;
@@ -400,3 +400,23 @@ TEST_CASE("VirgilCipher: check recipient existence", "[cipher]") {
400
400
  REQUIRE_FALSE(restoredCipher.keyRecipientExists(aliceId));
401
401
  }
402
402
  }
403
+
404
+ TEST_CASE("VirgilCipher: add 512 recipients", "[cipher]") {
405
+ VirgilCipher cipher;
406
+ VirgilKeyPair commonKeyPair = VirgilKeyPair::generateRecommended();
407
+ VirgilByteArray testData =
408
+ VirgilByteArrayUtils::stringToBytes("this string will be encrypted for a lot of recipients");
409
+
410
+ for (auto i = 0; i < 512; ++i) {
411
+ std::string recipientId = "recipient-" + std::to_string(i);
412
+ cipher.addKeyRecipient(VirgilByteArrayUtils::stringToBytes(recipientId), commonKeyPair.publicKey());
413
+ }
414
+ VirgilByteArray lastRecipientId = VirgilByteArrayUtils::stringToBytes("recipient-511");
415
+
416
+ VirgilByteArray encryptedData;
417
+ VirgilByteArray decryptedData;
418
+ REQUIRE_NOTHROW(encryptedData = cipher.encrypt(testData));
419
+ cipher = VirgilCipher(); // Make new cipher
420
+ REQUIRE_NOTHROW(decryptedData = cipher.decryptWithKey(encryptedData, lastRecipientId, commonKeyPair.privateKey()));
421
+ REQUIRE(testData == decryptedData);
422
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Copyright (C) 2015-2016 Virgil Security Inc.
3
+ *
4
+ * Lead Maintainer: Virgil Security Inc. <support@virgilsecurity.com>
5
+ *
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are
10
+ * met:
11
+ *
12
+ * (1) Redistributions of source code must retain the above copyright
13
+ * notice, this list of conditions and the following disclaimer.
14
+ *
15
+ * (2) Redistributions in binary form must reproduce the above copyright
16
+ * notice, this list of conditions and the following disclaimer in
17
+ * the documentation and/or other materials provided with the
18
+ * distribution.
19
+ *
20
+ * (3) Neither the name of the copyright holder nor the names of its
21
+ * contributors may be used to endorse or promote products derived from
22
+ * this software without specific prior written permission.
23
+ *
24
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR
25
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
28
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
32
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
33
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
+ * POSSIBILITY OF SUCH DAMAGE.
35
+ */
36
+
37
+ /**
38
+ * @file test_stream_data_source.cxx
39
+ * @brief Covers class VirgilDataSreamSource
40
+ */
41
+
42
+ #if LIB_FILE_IO
43
+
44
+ #include "catch.hpp"
45
+
46
+ #include <virgil/crypto/stream/VirgilStreamDataSource.h>
47
+
48
+ #include <fstream>
49
+
50
+ using virgil::crypto::stream::VirgilStreamDataSource;
51
+
52
+ TEST_CASE("VirgilStreamDataSource: check data existence in the bad stream", "[stream-data-source]") {
53
+ std::fstream nonExistingFile("invalid_path_to_file");
54
+ VirgilStreamDataSource dataSource(nonExistingFile);
55
+ REQUIRE_FALSE(dataSource.hasData());
56
+ }
57
+
58
+ #endif // LIB_FILE_IO