virgil-crypto 2.0.2b2 → 2.0.6r1

Sign up to get free protection for your applications and to get access to all the features.
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