virgil-crypto 2.3.0 → 3.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (259) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -0
  3. data/.gitmodules +0 -0
  4. data/.travis.yml +13 -0
  5. data/Gemfile +0 -0
  6. data/README.md +113 -9
  7. data/Rakefile +0 -0
  8. data/ext/native/src/.clang-format +37 -0
  9. data/ext/native/src/.gitignore +3 -0
  10. data/ext/native/src/.travis.yml +2 -1
  11. data/ext/native/src/CMakeLists.txt +66 -63
  12. data/ext/native/src/ChangeLog +114 -2
  13. data/ext/native/src/Dockerfile_Golang +29 -8
  14. data/ext/native/src/Jenkinsfile +61 -50
  15. data/ext/native/src/LICENSE +0 -0
  16. data/ext/native/src/README.md +137 -167
  17. data/ext/native/src/VERSION +1 -1
  18. data/ext/native/src/benchmark.md +140 -0
  19. data/ext/native/src/benchmark/CMakeLists.txt +0 -0
  20. data/ext/native/src/benchmark/benchmark_cipher.cxx +0 -0
  21. data/ext/native/src/benchmark/benchmark_hash.cxx +0 -0
  22. data/ext/native/src/benchmark/benchmark_keys.cxx +0 -0
  23. data/ext/native/src/benchmark/benchmark_pythia.cxx +61 -0
  24. data/ext/native/src/benchmark/benchmark_random.cxx +0 -0
  25. data/ext/native/src/benchmark/benchmark_signer.cxx +0 -0
  26. data/ext/native/src/ci/install-dependencies.sh +8 -12
  27. data/ext/native/src/ci/publish-docs.sh +107 -22
  28. data/ext/native/src/ci/travis-deployment-key.enc +0 -0
  29. data/ext/native/src/cmake/TransitiveArgs.cmake +78 -0
  30. data/ext/native/src/cmake/TransitiveToolchainArgs.cmake +105 -0
  31. data/ext/native/src/cmake/add_mono_metadata.cmake +103 -0
  32. data/ext/native/src/cmake/apple.cmake +56 -11
  33. data/ext/native/src/cmake/aux_source_directory_to_file.cmake +0 -0
  34. data/ext/native/src/cmake/check_pointer_size.cmake +0 -0
  35. data/ext/native/src/cmake/copy_all_files.cmake +0 -0
  36. data/ext/native/src/cmake/file_regex_replace.cmake +0 -0
  37. data/ext/native/src/cmake/find_host_utils.cmake +0 -0
  38. data/ext/native/src/cmake/uppercase_first_char.cmake +0 -0
  39. data/ext/native/src/cmake/uppercase_namespaces.cmake +3 -0
  40. data/ext/native/src/cmake/virgil_depends.cmake +0 -0
  41. data/ext/native/src/cmake/virgil_depends_local.cmake +2 -0
  42. data/ext/native/src/docs/.gitignore +0 -0
  43. data/ext/native/src/lib/CMakeLists.txt +59 -1
  44. data/ext/native/src/lib/Doxyfile.in +1 -1
  45. data/ext/native/src/lib/Info.plist.in +0 -0
  46. data/ext/native/src/lib/cmake/config.cmake.in +0 -0
  47. data/ext/native/src/lib/include/virgil/crypto/VirgilByteArrayUtils.h +0 -0
  48. data/ext/native/src/lib/include/virgil/crypto/VirgilChunkCipher.h +0 -0
  49. data/ext/native/src/lib/include/virgil/crypto/VirgilCipherBase.h +0 -0
  50. data/ext/native/src/lib/include/virgil/crypto/VirgilContentInfo.h +0 -0
  51. data/ext/native/src/lib/include/virgil/crypto/VirgilCrypto.h +13 -0
  52. data/ext/native/src/lib/include/virgil/crypto/VirgilCryptoError.h +0 -0
  53. data/ext/native/src/lib/include/virgil/crypto/VirgilCustomParams.h +0 -0
  54. data/ext/native/src/lib/include/virgil/crypto/VirgilKeyPair.h +30 -0
  55. data/ext/native/src/lib/include/virgil/crypto/VirgilSignerBase.h +0 -0
  56. data/ext/native/src/lib/include/virgil/crypto/VirgilStreamCipher.h +0 -0
  57. data/ext/native/src/lib/include/virgil/crypto/VirgilStreamSigner.h +0 -0
  58. data/ext/native/src/lib/include/virgil/crypto/VirgilTinyCipher.h +0 -0
  59. data/ext/native/src/lib/include/virgil/crypto/VirgilVersion.h +0 -0
  60. data/ext/native/src/lib/include/virgil/crypto/foundation/VirgilAsymmetricCipher.h +17 -0
  61. data/ext/native/src/lib/include/virgil/crypto/foundation/VirgilHKDF.h +0 -0
  62. data/ext/native/src/lib/include/virgil/crypto/foundation/VirgilPBKDF.h +0 -0
  63. data/ext/native/src/lib/include/virgil/crypto/foundation/VirgilSystemCryptoError.h +0 -0
  64. data/ext/native/src/lib/include/virgil/crypto/foundation/asn1/VirgilAsn1Compatible.h +0 -0
  65. data/ext/native/src/lib/include/virgil/crypto/foundation/cms/VirgilCMSContent.h +0 -0
  66. data/ext/native/src/lib/include/virgil/crypto/foundation/cms/VirgilCMSContentInfo.h +0 -0
  67. data/ext/native/src/lib/include/virgil/crypto/foundation/cms/VirgilCMSEncryptedContent.h +0 -0
  68. data/ext/native/src/lib/include/virgil/crypto/foundation/cms/VirgilCMSEnvelopedData.h +0 -0
  69. data/ext/native/src/lib/include/virgil/crypto/foundation/cms/VirgilCMSKeyTransRecipient.h +0 -0
  70. data/ext/native/src/lib/include/virgil/crypto/foundation/cms/VirgilCMSPasswordRecipient.h +0 -0
  71. data/ext/native/src/lib/include/virgil/crypto/pfs/VirgilPFS.h +0 -0
  72. data/ext/native/src/lib/include/virgil/crypto/pfs/VirgilPFSEncryptedMessage.h +0 -0
  73. data/ext/native/src/lib/include/virgil/crypto/pfs/VirgilPFSInitiatorPrivateInfo.h +0 -0
  74. data/ext/native/src/lib/include/virgil/crypto/pfs/VirgilPFSInitiatorPublicInfo.h +0 -0
  75. data/ext/native/src/lib/include/virgil/crypto/pfs/VirgilPFSPrivateKey.h +0 -0
  76. data/ext/native/src/lib/include/virgil/crypto/pfs/VirgilPFSPublicKey.h +0 -0
  77. data/ext/native/src/lib/include/virgil/crypto/pfs/VirgilPFSResponderPrivateInfo.h +0 -0
  78. data/ext/native/src/lib/include/virgil/crypto/pfs/VirgilPFSResponderPublicInfo.h +0 -0
  79. data/ext/native/src/lib/include/virgil/crypto/pfs/VirgilPFSSession.h +0 -0
  80. data/ext/native/src/lib/include/virgil/crypto/primitive/VirgilOperationCipher.h +0 -0
  81. data/ext/native/src/lib/include/virgil/crypto/primitive/VirgilOperationDH.h +0 -0
  82. data/ext/native/src/lib/include/virgil/crypto/primitive/VirgilOperationHash.h +0 -0
  83. data/ext/native/src/lib/include/virgil/crypto/primitive/VirgilOperationKDF.h +0 -0
  84. data/ext/native/src/lib/include/virgil/crypto/primitive/VirgilOperationRandom.h +0 -0
  85. data/ext/native/src/lib/include/virgil/crypto/pythia/VirgilPythia.h +181 -0
  86. data/ext/native/src/lib/include/virgil/crypto/pythia/VirgilPythiaBlindResult.h +89 -0
  87. data/ext/native/src/lib/include/virgil/crypto/pythia/VirgilPythiaContext.h +72 -0
  88. data/ext/native/src/lib/include/virgil/crypto/pythia/VirgilPythiaError.h +161 -0
  89. data/ext/native/src/lib/include/virgil/crypto/pythia/VirgilPythiaProveResult.h +89 -0
  90. data/ext/native/src/lib/include/virgil/crypto/pythia/VirgilPythiaTransformResult.h +91 -0
  91. data/ext/native/src/lib/include/virgil/crypto/pythia/VirgilPythiaTransformationKeyPair.h +87 -0
  92. data/ext/native/src/lib/include/virgil/crypto/pythia/virgil_pythia_c.h +203 -0
  93. data/ext/native/src/lib/include/virgil/crypto/stream/VirgilBytesDataSink.h +0 -0
  94. data/ext/native/src/lib/include/virgil/crypto/stream/VirgilBytesDataSource.h +0 -0
  95. data/ext/native/src/lib/mainpage.dox +6 -0
  96. data/ext/native/src/lib/module.modulemap +7 -0
  97. data/ext/native/src/lib/src/VirgilAsn1Alg.cxx +0 -0
  98. data/ext/native/src/lib/src/VirgilAsn1Alg.h +0 -0
  99. data/ext/native/src/lib/src/VirgilAsn1Compatible.cxx +0 -0
  100. data/ext/native/src/lib/src/VirgilAsymmetricCipher.cxx +82 -0
  101. data/ext/native/src/lib/src/VirgilByteArrayUtils.cxx +0 -0
  102. data/ext/native/src/lib/src/VirgilCMSContent.cxx +0 -0
  103. data/ext/native/src/lib/src/VirgilCMSContentInfo.cxx +0 -0
  104. data/ext/native/src/lib/src/VirgilCMSEncryptedContent.cxx +0 -0
  105. data/ext/native/src/lib/src/VirgilCMSEnvelopedData.cxx +0 -0
  106. data/ext/native/src/lib/src/VirgilCMSKeyTransRecipient.cxx +0 -0
  107. data/ext/native/src/lib/src/VirgilCMSPasswordRecipient.cxx +0 -0
  108. data/ext/native/src/lib/src/VirgilChunkCipher.cxx +0 -0
  109. data/ext/native/src/lib/src/VirgilCipherBase.cxx +0 -0
  110. data/ext/native/src/lib/src/VirgilConfig.cxx +51 -0
  111. data/ext/native/src/lib/src/VirgilConfig.h.in +43 -1
  112. data/ext/native/src/lib/src/VirgilContentInfo.cxx +0 -0
  113. data/ext/native/src/lib/src/VirgilCryptoError.cxx +0 -0
  114. data/ext/native/src/lib/src/VirgilCustomParams.cxx +0 -0
  115. data/ext/native/src/lib/src/VirgilDataSink.cxx +0 -0
  116. data/ext/native/src/lib/src/VirgilHKDF.cxx +0 -0
  117. data/ext/native/src/lib/src/VirgilKeyPair.cxx +19 -0
  118. data/ext/native/src/lib/src/VirgilOID.h +0 -0
  119. data/ext/native/src/lib/src/VirgilPBKDF.cxx +0 -0
  120. data/ext/native/src/lib/src/VirgilSignerBase.cxx +0 -0
  121. data/ext/native/src/lib/src/VirgilStreamCipher.cxx +0 -0
  122. data/ext/native/src/lib/src/VirgilStreamSigner.cxx +0 -0
  123. data/ext/native/src/lib/src/VirgilSystemCryptoError.cxx +0 -0
  124. data/ext/native/src/lib/src/VirgilTagFilter.cxx +0 -0
  125. data/ext/native/src/lib/src/VirgilTagFilter.h +0 -0
  126. data/ext/native/src/lib/src/VirgilTinyCipher.cxx +0 -0
  127. data/ext/native/src/lib/src/VirgilVersion.cxx.in +0 -0
  128. data/ext/native/src/lib/src/mbedtls_context.h +0 -0
  129. data/ext/native/src/lib/src/mbedtls_context_policy_spec.h +0 -0
  130. data/ext/native/src/lib/src/mbedtls_type_utils.h +0 -0
  131. data/ext/native/src/lib/src/pfs/VirgilPFS.cxx +0 -0
  132. data/ext/native/src/lib/src/pfs/VirgilPFSEncryptedMessage.cxx +0 -0
  133. data/ext/native/src/lib/src/pfs/VirgilPFSInitiatorPrivateInfo.cxx +0 -0
  134. data/ext/native/src/lib/src/pfs/VirgilPFSInitiatorPublicInfo.cxx +0 -0
  135. data/ext/native/src/lib/src/pfs/VirgilPFSPrivateKey.cxx +0 -0
  136. data/ext/native/src/lib/src/pfs/VirgilPFSPublicKey.cxx +0 -0
  137. data/ext/native/src/lib/src/pfs/VirgilPFSResponderPrivateInfo.cxx +0 -0
  138. data/ext/native/src/lib/src/pfs/VirgilPFSResponderPublicInfo.cxx +0 -0
  139. data/ext/native/src/lib/src/pfs/VirgilPFSSession.cxx +0 -0
  140. data/ext/native/src/lib/src/primitive/VirgilOperationCipher.cxx +0 -0
  141. data/ext/native/src/lib/src/primitive/VirgilOperationDH.cxx +0 -0
  142. data/ext/native/src/lib/src/primitive/VirgilOperationHash.cxx +0 -0
  143. data/ext/native/src/lib/src/primitive/VirgilOperationKDF.cxx +0 -0
  144. data/ext/native/src/lib/src/primitive/VirgilOperationRandom.cxx +0 -0
  145. data/ext/native/src/lib/src/pythia/VirgilPythia.cxx +202 -0
  146. data/ext/native/src/lib/src/pythia/VirgilPythiaContext.cxx +116 -0
  147. data/ext/native/src/lib/src/pythia/VirgilPythiaError.cxx +58 -0
  148. data/ext/native/src/lib/src/pythia/virgil_pythia_c.cxx +129 -0
  149. data/ext/native/src/lib/src/stream/VirgilBytesDataSink.cxx +0 -0
  150. data/ext/native/src/lib/src/stream/VirgilBytesDataSource.cxx +0 -0
  151. data/ext/native/src/lib/src/utils.h +3 -2
  152. data/ext/native/src/libs_ext/mbedtls/configs/config.h +0 -0
  153. data/ext/native/src/libs_ext/mbedtls/configs/config_desktop.h +0 -0
  154. data/ext/native/src/libs_ext/mbedtls/mbedtls.cmake +0 -0
  155. data/ext/native/src/{cmake/cmake_args.cmake → libs_ext/pythia/pythia.cmake} +24 -28
  156. data/ext/native/src/libs_ext/rapidjson/rapidjson.cmake +0 -0
  157. data/ext/native/src/libs_ext/tinyformat/cmake/config.cmake.in +0 -0
  158. data/ext/native/src/libs_ext/tinyformat/tinyformat.cmake +0 -0
  159. data/ext/native/src/migration-2.0.md +0 -0
  160. data/ext/native/src/tests/CMakeLists.txt +0 -0
  161. data/ext/native/src/tests/catch.hpp +0 -0
  162. data/ext/native/src/tests/data/test_data_pfs_with_otc.json +0 -0
  163. data/ext/native/src/tests/data/test_data_pfs_without_otc.json +0 -0
  164. data/ext/native/src/tests/deterministic_keys.h +293 -0
  165. data/ext/native/src/tests/rsa_keys.h +229 -123
  166. data/ext/native/src/tests/test_asn1_writer.cxx +0 -0
  167. data/ext/native/src/tests/test_asymmetric_cipher.cxx +65 -0
  168. data/ext/native/src/tests/test_base64.cxx +0 -0
  169. data/ext/native/src/tests/test_byte_array_utils.cxx +0 -0
  170. data/ext/native/src/tests/test_chunk_cipher.cxx +0 -0
  171. data/ext/native/src/tests/test_cipher.cxx +8 -4
  172. data/ext/native/src/tests/test_cipher_base.cxx +0 -0
  173. data/ext/native/src/tests/test_contract_copy_move.cxx +4 -1
  174. data/ext/native/src/tests/test_data_pfs.h +0 -0
  175. data/ext/native/src/tests/test_hash.cxx +0 -0
  176. data/ext/native/src/tests/test_hkdf.cxx +0 -0
  177. data/ext/native/src/tests/test_key_pair.cxx +65 -3
  178. data/ext/native/src/tests/test_pbe.cxx +0 -0
  179. data/ext/native/src/tests/test_pbkdf.cxx +0 -0
  180. data/ext/native/src/tests/test_pfs.cxx +0 -0
  181. data/ext/native/src/tests/test_pythia.cxx +157 -0
  182. data/ext/native/src/tests/test_random.cxx +0 -0
  183. data/ext/native/src/tests/test_runner.cxx +0 -0
  184. data/ext/native/src/tests/test_signer.cxx +0 -0
  185. data/ext/native/src/tests/test_stream_cipher.cxx +0 -0
  186. data/ext/native/src/tests/test_stream_data_source.cxx +0 -0
  187. data/ext/native/src/tests/test_symmetric_cipher.cxx +0 -0
  188. data/ext/native/src/tests/test_tag_filter.cxx +0 -0
  189. data/ext/native/src/tests/test_tiny_cipher.cxx +0 -0
  190. data/ext/native/src/utils/build.bat +0 -0
  191. data/ext/native/src/utils/build.sh +238 -68
  192. data/ext/native/src/utils/zip.vbs +0 -0
  193. data/ext/native/src/virgil-crypto.sublime-project +15 -0
  194. data/ext/native/src/wrappers/asmjs/CMakeLists.txt +0 -8
  195. data/ext/native/src/wrappers/emsdk/CMakeLists.txt +2 -2
  196. data/ext/native/src/wrappers/emsdk/error.js +0 -0
  197. data/ext/native/src/wrappers/emsdk/example.html +152 -31
  198. data/ext/native/src/wrappers/emsdk/helpers.js +140 -135
  199. data/ext/native/src/wrappers/emsdk/patch_embind.pl +0 -0
  200. data/ext/native/src/wrappers/emsdk/wrapper.cxx +55 -0
  201. data/ext/native/src/wrappers/go/CMakeLists.txt +6 -5
  202. data/ext/native/src/wrappers/java/CMakeLists.txt +27 -4
  203. data/ext/native/src/wrappers/java/src/JniLoader.java +167 -0
  204. data/ext/native/src/wrappers/java/src/VirgilStreamDataSink.java +0 -0
  205. data/ext/native/src/wrappers/java/src/VirgilStreamDataSource.java +0 -0
  206. data/ext/native/src/wrappers/net/CMakeLists.txt +41 -8
  207. data/ext/native/src/wrappers/net/cmake/UseCSharp.cmake +5 -5
  208. data/ext/native/src/wrappers/net/src/VirgilStreamDataSink.cs +0 -0
  209. data/ext/native/src/wrappers/net/src/VirgilStreamDataSource.cs +0 -0
  210. data/ext/native/src/wrappers/nodejs/checksum.txt +66 -0
  211. data/ext/native/src/wrappers/php/CMakeLists.txt +2 -5
  212. data/ext/native/src/wrappers/php/tests/CMakeLists.txt +6 -0
  213. data/ext/native/src/wrappers/php/tests/VirgilChunkCipher_Test.php.in +0 -0
  214. data/ext/native/src/wrappers/php/tests/VirgilCustomParams_Test.php.in +0 -0
  215. data/ext/native/src/wrappers/php/tests/VirgilKDF_Test.php.in +0 -0
  216. data/ext/native/src/wrappers/php/tests/VirgilPBE_Test.php.in +0 -0
  217. data/ext/native/src/wrappers/php/tests/VirgilPBKDF_Test.php.in +0 -0
  218. data/ext/native/src/wrappers/php/tests/VirgilPythia_Test.php.in +87 -0
  219. data/ext/native/src/wrappers/php/tests/VirgilStreamCipher_Test.php.in +0 -0
  220. data/ext/native/src/wrappers/php/tests/VirgilStreamSigner_Test.php.in +0 -0
  221. data/ext/native/src/wrappers/php/tests/VirgilVersion_Test.php.in +0 -0
  222. data/ext/native/src/wrappers/python/CMakeLists.txt +4 -1
  223. data/ext/native/src/wrappers/ruby/CMakeLists.txt +4 -1
  224. data/ext/native/src/wrappers/swig/common.i +0 -0
  225. data/ext/native/src/wrappers/swig/csharp/FixedArray.i +0 -0
  226. data/ext/native/src/wrappers/swig/csharp/VirgilByteArray.i +0 -0
  227. data/ext/native/src/wrappers/swig/csharp/common.i +0 -0
  228. data/ext/native/src/wrappers/swig/csharp/csharphead.swg.in +0 -0
  229. data/ext/native/src/wrappers/swig/go/common.i.in +7 -0
  230. data/ext/native/src/wrappers/swig/java/VirgilByteArray.i +0 -0
  231. data/ext/native/src/wrappers/swig/java/common.i +6 -0
  232. data/ext/native/src/wrappers/swig/php/common.i +0 -0
  233. data/ext/native/src/wrappers/swig/php/php7/VirgilByteArray.i +0 -0
  234. data/ext/native/src/wrappers/swig/util.i +0 -0
  235. data/ext/native/src/wrappers/swig/wrapper.i.in +18 -7
  236. data/ext/native/src/wrappers/webasm/CMakeLists.txt +0 -8
  237. data/ext/rakefile.rb +77 -56
  238. data/lib/virgil/crypto.rb +53 -9
  239. data/lib/virgil/crypto/access_token_signer.rb +79 -0
  240. data/lib/virgil/crypto/bytes.rb +81 -17
  241. data/lib/virgil/crypto/card_crypto.rb +115 -0
  242. data/lib/virgil/crypto/crypto_exception.rb +40 -0
  243. data/lib/virgil/crypto/hash_algorithm.rb +82 -0
  244. data/lib/virgil/crypto/key_pair.rb +41 -0
  245. data/lib/virgil/crypto/key_pair_type.rb +98 -0
  246. data/lib/virgil/crypto/private_key.rb +40 -0
  247. data/lib/virgil/crypto/private_key_exporter.rb +67 -0
  248. data/lib/virgil/crypto/public_key.rb +40 -0
  249. data/lib/virgil/crypto/{virgil_stream_data_sink.rb → stream_data_sink.rb} +12 -12
  250. data/lib/virgil/crypto/{virgil_stream_data_source.rb → stream_data_source.rb} +12 -12
  251. data/lib/virgil/crypto/validation.rb +59 -0
  252. data/lib/virgil/crypto/version.rb +35 -1
  253. data/lib/virgil/crypto/virgil_crypto.rb +595 -0
  254. data/lib/virgil/native_crypto.rb +80 -60
  255. data/lib/virgil/os.rb +40 -6
  256. data/secrets.tar.enc +0 -0
  257. data/virgil-crypto.gemspec +6 -7
  258. metadata +62 -12
  259. data/ext/native/src/cmake/android.toolchain.cmake +0 -1697
@@ -42,6 +42,138 @@
42
42
  #ifndef VIRGIL_CRYPTO_TEST_RAS_KEYS_H
43
43
  #define VIRGIL_CRYPTO_TEST_RAS_KEYS_H
44
44
 
45
+
46
+ //---------------------------------------------------------------------------
47
+ // RSA 4096
48
+ //---------------------------------------------------------------------------
49
+ constexpr char kRSA_4096_Password[] = "password";
50
+
51
+ constexpr char kRSA_4096_Public[] = "-----BEGIN PUBLIC KEY-----\n"
52
+ "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6gd3rC3nA16FQDPP+tWm\n"
53
+ "6PBJ5cEguD0fmKo0QOdmXrUiWP8U4bXfTd+gzxykLaUgz/2NwWqUNW/gpFedaeY3\n"
54
+ "+SDUw+R+/YZ1qHmaxP93PMczGsbrla2GVqZpoj+SpoPHtOnkBRA81jsTdUl35I5p\n"
55
+ "y255gESkm8QakeMY1IKNvKJEOnnHQzOvo1gZzURRfSiDUtfW9WHXmRQH6t5hMM+0\n"
56
+ "yEy7dUKVdQRbfkputoXYhRj+qeMSiVmu6m7euW5rtA3gPk8tSvLHbmTnQQSE6Zb/\n"
57
+ "NruuxssKYu0eZBcHqxW71CabtVTbrEibzW5FhUx/mtVLTcB9WZa4JNvrVK/YOMmF\n"
58
+ "UMVwiVFgCIxeT9/+qpiSNd7SacbfldbHIZu81MVv1tmX/wS819FChbAJyFKFfDVG\n"
59
+ "fSk4kzLG/O424nTtDLlGOC1pct0Y+H73OTLYZ4jbWMFJFAWAREm3/yCp2cFFyult\n"
60
+ "OVoyyVGtBAB+uvSmviMntJOSg8fyX0Y6L4RMYqYVfc1J6aozXU8IUMydeHbZ51ZE\n"
61
+ "3a/fKEnLKl1zjtZfprN9xewxn2HDiz50qzMWK124H+tFuF9eMdr2nohof0uIrI1S\n"
62
+ "AIIcNgiFeuGifsjHY9hXCO+tU9+itOIflhZc/BJKrJ31z2qu70GeXlee1TENLQw+\n"
63
+ "QhNXNSC91MIiFWJAkQibX6sCAwEAAQ==\n"
64
+ "-----END PUBLIC KEY-----\n";
65
+
66
+ constexpr char kRSA_4096_Private[] = "-----BEGIN ENCRYPTED PRIVATE KEY-----\n"
67
+ "MIIJszBdBgkqhkiG9w0BBQ0wUDAvBgkqhkiG9w0BBQwwIgQQqO4VolScOYHQ/XvZ\n"
68
+ "CmXw4QICEo8wCgYIKoZIhvcNAgowHQYJYIZIAWUDBAEqBBD1dI3XzHxfp3zZqVzb\n"
69
+ "XfnYBIIJUAoXr5Z7AStPwl4QWSuyDCZDRNBeIdURocEPPfSWzlhZ5oqZysKiRwLs\n"
70
+ "ZJywdmWnr7Rt5TYfc2Nv9mZ4qG1EomsDTmr+sB97fgcg+Y9O4ysD/D68e+UnmBnq\n"
71
+ "R6deNqSqrqUpptameZbQQRuI71MbPTd2SF1qEPYh96+923tJJbazbhezjeOR29nc\n"
72
+ "V+oLwBzEnPOn+EBvNBwBfJ3B910MzpfgsvQKq7gXDFINudp/zWueeEEszFn+fR69\n"
73
+ "1md0X6voJLZBAXjHBJEYUfyiKo3CPa4GT4vVldKev1DTr4d4zi/LwRQ04uwVUzcn\n"
74
+ "2T/h3FjTXvxAx1sy4BU80S5Ar9kbtttVUjm/KyEkUTsKiDEWfVEH7P2mSQB4SWTm\n"
75
+ "woUez8Rbt0k+NDJ6TKfXTMrr4jdfamSCQIeuOXicfTZOZWApxMPQ0b5BmzLps/r4\n"
76
+ "jmVdCYE4PNRtCaf4c1DCWDqKzb6TkrwJM0JVLD5bKcGBNZUKOKi0/Q+QEWv6tHui\n"
77
+ "Zn8/Q+j5ZZvLSSO7Yh20vrDbb991fhUVI4IlFOCuFLZhm3TOaB5aVvQNaYwgWbzl\n"
78
+ "CsMHoloY65voisizmNa8/iqygxBnbVG6hITON7c96OhXJ0QWTQrpEZrLz+sxEDlN\n"
79
+ "mZ8MFGoHvv6lqFnJ4udF08bwpZsimbKJXRe+39pRc7kZyB0GafbLw+cVotAqF+HC\n"
80
+ "y8gTu+GVuZOa1/litqvsFn6ozlVyn3Pmo3fA3+xsem/QwxtBxTf31JnzzSuL8M/Z\n"
81
+ "XVguIEFjwxWK57WH9bnLadAYm0WN32Qo20lBdLokIf7XwU17z2oBds+tbdE/fQxl\n"
82
+ "OGjqv3cvS3uNmJK7kHciIXAc+kX7DB05anQl6fNH0YkyW6lx3pzoGVsMsin8Idcx\n"
83
+ "wy15o8VUdzce5Y6Vn5JIXT52+iJZ8nTiRiSnciBj64XfLjlMFUwyyriAuDErmynw\n"
84
+ "gCrKw1kzTT1dNbMsPfOBCOQGCLDsymb85xruqcrBgiCF6MAbA67CbdcBY4vmQRHT\n"
85
+ "GxaIm92IjoqJ8aNQSO+Phz3mLPUcwu2If2A6K4pJkOlj7QHN22pIjEkrUr9B6lgH\n"
86
+ "M+oSd6ap6K1f5qIqO5I84vsFuC3pLTNIZkZNtc2t1KC4NqYa+BGiDgaycQP3YW9k\n"
87
+ "DmTB2lGHhHtfzupL4kxK6siMpU337tZYT6OatKERXKNM1JTz/FWRKiZ4HB0Yn85p\n"
88
+ "P8QikXRfQY+SxK4jMwKiXFDszmfIBS9yaIa24WyZBRs0avedYR5tWs6IGPr36yTU\n"
89
+ "kLdwo52ZxqT5ZrasfBmZ1nmg2pWCYy3yswMjQ0fJFs+amczniCAIXqAfdPy3A8kB\n"
90
+ "HdessZ5519QMYGaWN95D4i5ZbFnImIKeAaMFPI095LGiI0D2X0oRBOqAjXkoAfIX\n"
91
+ "wgzijpfkiXorWBC+A1Hh70NkPXbB/NUtQrQW1zo/twNaaLrZOX5oG/LlyzngNwan\n"
92
+ "y8N9VeO9SYFfrVmg0DjpzEbbGT8scyUN40pHSdU8mXasgU2sGVL8wbFzYNdGHL0J\n"
93
+ "EtbLOPilRFytDyG7N6DdisCs2EZpqpavvFvm2Asl/0zewU1Zn0TXksbBpLg1mHE1\n"
94
+ "+46fhRM67xILqME+dBTsFIbX3RinIPJGGrj/iNDtaM+OClvvgGV1se7Ia1sgxqPx\n"
95
+ "NFvbGyyMdTiaQKYdGOJchgkr0ejKdkM/8JFscFamAHbNyJvwsEbv7zdqx4Lwl/8R\n"
96
+ "gutc0gI3xSmXMklqYf4G+BLiJCrNhVemljNBbyaGfMiX7stTBuGKIhmPZzL6Lc2f\n"
97
+ "F6WWNtBvE7nJPXi5tlHYmqk53Ma+SuSAAQzv1TerLIkXglVlRHES4wUSh6fGDjJ3\n"
98
+ "zWwBAstjZQ+vRUgubPvFejPxM97YJIaH+ziZWDHJaBDaxGbbCASiWJKx1VRLslzL\n"
99
+ "ZsXc9/9Am2GbTeHvtFEqbxdi7lnmfqKYIH3zoLk9eT0TPiA3NLZG2byHYdAcZsPd\n"
100
+ "iPtOuDOLu6MgY7LOBXiepLsdbGs9OZQOF6c+yPkJnPcIv+Xg2JppG2e2fFUlw8Y4\n"
101
+ "uz4iezouYjPEAtSaO5BwdS7FaeCbtxkhYwqpQpO31eCVwdXk+c69X3gHYiK+uNOO\n"
102
+ "EQNSKXrtLjS916L4WWgunvFY92D/8nPjKVgWjcXMYYis4tVpKXQhdz0uz7ZT3FHq\n"
103
+ "zd/8/59qYjGFbRFzCajMmrg26PV+1LQ4OTYcuP0P7JuEye9P4I0efnuWN5f8Kohn\n"
104
+ "5qM/4sG/qDydl2imzaClt0lbiMS4XnVmP+ymPNvfB/SJHkDy8JfGP59elc/Mf1D0\n"
105
+ "LgDsUpTr31jdHXkK8OGLNXyWjL3hFJnmNaRvn2A+GHns01mVM9Mas9FbRkS3G7As\n"
106
+ "uaHVBXg1n0FfjY2sQkYjmwtWO/TZkuN1Bz9ABQq1YUWoeRVtsSBeFJRY1jQw36fp\n"
107
+ "r5zoLKQsaydRxYWMjD+f1Y7OYvhYf9KRYMJwVJMI+GWMLOL2PBJqsBjwm8MV8xO2\n"
108
+ "tsgFfACOqGi7TSKEsOlvUVgWNntocnKPRNjcXczCdxOC2J5zMS+k0l0t7vkVJdz3\n"
109
+ "2EzHqd/6Txl1pKRByuQ/tIBdDuhEQ/M+sbZjwkHZt2zrgss4ji8JdKJX2EZj4KMx\n"
110
+ "HW4ZwTFsosaed3KZ8vGaYJ+nhsDl63OEXClDmjS3wqmW3l3bXQNdx6UCtk3C5vdF\n"
111
+ "n0z4/MDgM58foHeca4kz4JkTzmqWUkCCCvq880y7ATR0azxG0n7xHEEGUVXjGmz7\n"
112
+ "0IBKGe9VV9SNGLVo55kacdmqMJ6C92lfEgdUV5bJrhH0lg2Y14L1fR1aDCaTcfSy\n"
113
+ "W2W7pa+qc1ZqBlzEqvKL60XFBkPL/qw63nd9p2O5XkOl3LFYT+V0A50Kg3GaImAW\n"
114
+ "MVVAr3CpizYNW8cXOa0ctH6ZTm2fkFING09F8KjRlJBc1jGihIGXR/hilpKMbNEm\n"
115
+ "l/IVZtLOgaNYyZ++g9JQuZoAU3jUps0tM2AoLr2fk/g5MAdd+ItHbnY6dQgj+QBz\n"
116
+ "UlMNjZgcmQHujBMqsVu+7CDLZlwHsanE1n4O4wtVM1Dj/VX4ahTUIWivG5FCIvRO\n"
117
+ "YkSPLq4s8RfA5UTFlRyqrKlwn6Nt8jssNwkSVGtO+hnZOYnN+1Z/+veZjnJkUCZ2\n"
118
+ "NYO8SftfX9X6D4GMbhSzqDM9kQBG+gYjK+yffeYLV2E8j/SQ0qwt\n"
119
+ "-----END ENCRYPTED PRIVATE KEY-----\n";
120
+
121
+ constexpr char kRSA_4096_Private_Plain[] = "-----BEGIN RSA PRIVATE KEY-----\n"
122
+ "MIIJKQIBAAKCAgEA6gd3rC3nA16FQDPP+tWm6PBJ5cEguD0fmKo0QOdmXrUiWP8U\n"
123
+ "4bXfTd+gzxykLaUgz/2NwWqUNW/gpFedaeY3+SDUw+R+/YZ1qHmaxP93PMczGsbr\n"
124
+ "la2GVqZpoj+SpoPHtOnkBRA81jsTdUl35I5py255gESkm8QakeMY1IKNvKJEOnnH\n"
125
+ "QzOvo1gZzURRfSiDUtfW9WHXmRQH6t5hMM+0yEy7dUKVdQRbfkputoXYhRj+qeMS\n"
126
+ "iVmu6m7euW5rtA3gPk8tSvLHbmTnQQSE6Zb/NruuxssKYu0eZBcHqxW71CabtVTb\n"
127
+ "rEibzW5FhUx/mtVLTcB9WZa4JNvrVK/YOMmFUMVwiVFgCIxeT9/+qpiSNd7Sacbf\n"
128
+ "ldbHIZu81MVv1tmX/wS819FChbAJyFKFfDVGfSk4kzLG/O424nTtDLlGOC1pct0Y\n"
129
+ "+H73OTLYZ4jbWMFJFAWAREm3/yCp2cFFyultOVoyyVGtBAB+uvSmviMntJOSg8fy\n"
130
+ "X0Y6L4RMYqYVfc1J6aozXU8IUMydeHbZ51ZE3a/fKEnLKl1zjtZfprN9xewxn2HD\n"
131
+ "iz50qzMWK124H+tFuF9eMdr2nohof0uIrI1SAIIcNgiFeuGifsjHY9hXCO+tU9+i\n"
132
+ "tOIflhZc/BJKrJ31z2qu70GeXlee1TENLQw+QhNXNSC91MIiFWJAkQibX6sCAwEA\n"
133
+ "AQKCAgEA0YLT6SnC6apB4qM/61BAN8N+dJh8IVRfJ/4f/4bph5njYQcje5mliwLL\n"
134
+ "5P7AIDj3chyNPn2ap2g8FQR24SqAK6DvuVujMHaieKw9GWWXKqsunic9GueZH5Ol\n"
135
+ "d+Iv+LB7JgRJ5RqPTD7hAZw/IDc6kSuazHEnaGecXcSQIxepqhkeubbx48Cu2a3y\n"
136
+ "k2g5B7IwNwcR4uWv7NQY7nQdUGRydOr021o7kOHQwvQBv5d9qlIhEpg9rQbD6A5P\n"
137
+ "iHRJKY1Olpmtc657SeI9gWB5WOGcIzTMmB2Hc97R2Usgy1IOsDPMK/8HFmp+SOAS\n"
138
+ "ju5YQpX272mHDqA2xJC5UjyGdvg6RsmfEw3DlELX5S+zuXWdRCf18wV7FJnRXZWj\n"
139
+ "UHgtdFtR8eNyiHoDCkRSh3H96obbJTf/3IoSY/urChB6+JhXsryusLgNpCasbKTI\n"
140
+ "gK7dHq9ejl7VSM8EbI5IeyfRPxwhi3EvQVg2MVfqbkpcohb1jS886AIc+/b+fhQE\n"
141
+ "AsYnsDzAIrK8VDwVpbipdMiQiz/Bt+QR/h3jo3g++3U5L9vo0A0VQPH0nUJKJneI\n"
142
+ "d7zS35lFQYzQL+cAJTBBvSQEUtFCXQcU0ehoMRgGsUb6/oQZtQuADXtjGLoJKLtc\n"
143
+ "HPpGlg9Jc3QcIu10/yJ9/zEtJXfO5XHkUXCdruakRGopOStHt+kCggEBAP3XuDnJ\n"
144
+ "ATgpUA6WVSovVbvBSMmRUZcHxFOBo28SXClbINdlG08pDB7NnKrqFIOWFR2qKG4x\n"
145
+ "ZUGP2pfqyXmIrf8ng7hpsifhftAqJ+XDEtCT71Rvcn6iz9hDudaWcBZxQ+Gsfn32\n"
146
+ "+lDUjg/MDgYE9RecgEoXQlvSZkhTG8UUGHbasfcpQ2HcUnhlUn+GVpC2TpXhg2Gk\n"
147
+ "KmaeIldN5CSJIYDlLOHINC1yULA+Cqgx/H7ud9AaL741LtskbURHek9SCmnt3wdX\n"
148
+ "y+Yu+Q9M87W254jM6g6J5QObumiJH6cpZg21hQ8OIJD0Vyq7Jth8aKW3snKIkdIu\n"
149
+ "PN2ywsFiA295nPUCggEBAOwEo9mCpKM9MqTFb/njDr/Qa8ZZbpUTnkPVXHmtg2B0\n"
150
+ "CEgJH3Pj6xhFkxE9xlk09Y9T+zCFG44qd85lXKjY09zA21o4kMgDfyuHGVEeI7Qc\n"
151
+ "+m5njPgsFu/RsibjYzsJpOLMfKrGyCT12PC6JzHeDkKqeZEy0dB7INoNRl0DYAVt\n"
152
+ "ikRVVWsekqDBZPfJmkqIiyP7uTbXZxiSvrRlHct+Yi86QIsecArfYfXuahXtwaq5\n"
153
+ "SJZ71W9/NqEMhy80AbX7QaORV+/2+V8Vh+hZCf+WTbyRO3w14l57m6z3+8EMxnu6\n"
154
+ "bfJwbUJSFlO2rMHH7gSaQGeFswYZTBmi0X+k8EAhJh8CggEBAJP7dHzLf5h8DR3T\n"
155
+ "6iZDnhls3sATpZsEfiGoi9yuuWeqpoSrfrYxWc2DVHgXKopjrj+y+Qr0ZPFJqcey\n"
156
+ "qm3djoIXSSTzCVdSkBlO2h+KD6fk9jslFXxZ8g1Dvk0pOoL62PXxF3TbzKXepEr1\n"
157
+ "TJ+ZuEBhjjCjSp45FEPJn4DO7Ewtxl4uggfE55ckimmpqUGH5lxeMbd0evuD6MU4\n"
158
+ "tW3PO+bms7mUe0abRArawF+5dFeTMenxui+K1ZwPqluJx/YB/+wtLj4botS4QZ33\n"
159
+ "4IPo8yW/QBvlq8rkuFFEz10mN0Z6se1K8RVQPJi+rjC6pk8lvjQjBc+gAP/FvN/8\n"
160
+ "AcC1BxkCggEATESrlgxLm5yZEvniV4PyLjXxveUEgRQX3p/CBGf3vmGAk5avHUoX\n"
161
+ "nH5PKhEmWYltmOVwlJtO7j/2+zFyIfX/cKS5vYvt7VSD8dL0cWwl6Xw7yRWZTlEh\n"
162
+ "EFpZEYwFcvyI1elyl9UotBjmA9SD+e9h+FUSd8NOXeqMESqdBE2k59wgBDj3I2h7\n"
163
+ "xYr5T8FMJK2/GN+tWHV/EUfKbI0Idcvfepd+Z/ZsCndpNonWqkNsg/jf5hEaRa98\n"
164
+ "PcrInI5XxzDsYykCm77ZkspoYsLzIi617CuaZ2caQaH8CocQSbARK8Zw5RlDlVzl\n"
165
+ "biPn667p0X7vNQTVdzERkG829+Ka6H5NzQKCAQBTrzGD+WO64tt8AbdNB3BwXrq1\n"
166
+ "Os4CYVGKtKCxFxYPRXmuFQjNeUFNZFwX5EisWj68pRdBr2tEYirceCtcSf3c0znw\n"
167
+ "yjvXWvHXRqN5cyz8Dl5ueFju8Tgs5d3dMUYROBE1/KrcNJXjITU3JMxmoXLHKxGi\n"
168
+ "+BU+2GwQQWPtl5JE8m7O8i013ZhwHydZWwLrRkCxUB+BQjCnef0Q+3mShSl1ac3W\n"
169
+ "IyUTUxzO5e11aFYj7TQiIY9hcte6DIbE8Zgmds05PkImgDvwwYfXWSeKY9WMUHRr\n"
170
+ "Swy0Bwhwqnuv4S5egCq6MexGU669C1W7fr6oy5wRDhwpT/H12zN+n9h+AZe+\n"
171
+ "-----END RSA PRIVATE KEY-----\n";
172
+
173
+
174
+ //---------------------------------------------------------------------------
175
+ // RSA 8192
176
+ //---------------------------------------------------------------------------
45
177
  constexpr char kRSA_8192_Password[] = "password";
46
178
 
47
179
  constexpr char kRSA_8192_Public[] = "-----BEGIN PUBLIC KEY-----\n"
@@ -173,130 +305,104 @@ constexpr char kRSA_8192_Private[] = "-----BEGIN ENCRYPTED PRIVATE KEY-----\n"
173
305
  "gts=\n"
174
306
  "-----END ENCRYPTED PRIVATE KEY-----\n";
175
307
 
176
- constexpr char kRSA_8192_Public_Plain[] = "-----BEGIN PUBLIC KEY-----\n"
177
- "MIIEIjANBgkqhkiG9w0BAQEFAAOCBA8AMIIECgKCBAEAjQG6LZvY4H5JVg3HuKzk\n"
178
- "sPZX2CuA4+J3Ucu4tGyd/6IaDMvFxjod+PC8tjEmOgp2YtKw9sLHpPqPw0pIkeSS\n"
179
- "umn0OALdaMXmQxmZ8ErECoGQePXpkYEsKdR7jzuaQH6kLOvDCC5HgghaMoXNzxOH\n"
180
- "xGuAqnN4AAp+t4F4CsrJ0NvvsxDdegr/PVs/gXgQVrG4oFdlNNGa1JYNwB/+K/VB\n"
181
- "4vg5ro4hlgmAjm7lCdK529sLsxVCTs+R/q+SAEXiZw43r6Nyu8qyFwq82uJ83JBw\n"
182
- "f/AfF3MbFMf0mvGjryvenMWDEuReXnSFqr4dXkSNaq2+R5JE8D3VZxrRPJvJ/B5F\n"
183
- "8LgGHRNNx5LTdQx28knz139w4KEWxsHnlMETeAkgUo7DD7iYtYmLNHSnNORWO58+\n"
184
- "m2jCkm3ZMvTLtcl5obc8tNVR3hIZB/uqQMNQ19r2643kiY8y31sXODJmX7lNHg9w\n"
185
- "yX0Iv4KaGJeztYQK3FER/+m+xKJP+OpalTIAR4gCAPz3WK040w8vvze+yZVA4Zc8\n"
186
- "8eoP9oO79GilfjjYwP11qXUI5aI79HTSwc+xLfPPSR5evPrpp1M9xZ5iPYKZAiUV\n"
187
- "XHNYyu2fIoRrY7z6cDCPb+gp3GIbmWbv4dBDiuml3v+r3oq/0b1Zn19RF4sL/HyT\n"
188
- "W0a7vehzlgWDDvlMUZj3/4X/X7tCAZ0rfQ4Ymc5Zb7QRKwQXq3mPNt4mhexa8n1G\n"
189
- "605WxPM7DNggfBtORccO5SSpC+GlBEnVKBu6Z67rLD417TFboS+EoYMWexY8lfJH\n"
190
- "eni5qShftt79UYPALs6iarM/j9ZrRlf9RrpPZ8tAMSberpwquE3y4NvYbRa5JmoI\n"
191
- "qoy7sA5DDYvWSLI7N8FS9wFxuyYhhp2es1Z3v6H8PYRNgCPs8smngG/PZpv4Hyr5\n"
192
- "Ozrw6xF2zzhp+t7ilC3uGkn9fLovSD5Y9K9Qf5X6CTl8l0HKjyJG8/HerYByE+BM\n"
193
- "XpJdrGSaHJLkpkruJc/IAVUVLtoHojOpfNyoUbblJxwrEz/RLWk6pbmwK9Ae09CV\n"
194
- "R+dEcnLeiCUtxPGSpuurIsGyy9Gdr5NG4VDX/p01/K9wrMK2cUdlt6n5Ut0I/Eti\n"
195
- "zrB06AuI7Nlippg63lhkKR8By4R1oMDltE0QhL+tN0/YWJV8mD0KcK+v4gBHP9r1\n"
196
- "sYnUN3Qadh6OfsPMznukXo260dI7HNTNdBeaT6LP4Br42HLJdOePPRrhRSaItRr9\n"
197
- "mLm3w1MGcEeRpuU3Yj9vnhMZbzS+BsUAOAZgvhZgkSRhyNyETPqTAHNHagGQ/Lbw\n"
198
- "evj7lNFbzaOKLlLQw6e7DTe2cGj1H+T3XxEhT/hgvnMlWa3KawIFYLOly+3u74Yw\n"
199
- "EQIDAQAB\n"
200
- "-----END PUBLIC KEY-----\n";
201
-
202
308
  constexpr char kRSA_8192_Private_Plain[] = "-----BEGIN RSA PRIVATE KEY-----\n"
203
- "MIISKAIBAAKCBAEAjQG6LZvY4H5JVg3HuKzksPZX2CuA4+J3Ucu4tGyd/6IaDMvF\n"
204
- "xjod+PC8tjEmOgp2YtKw9sLHpPqPw0pIkeSSumn0OALdaMXmQxmZ8ErECoGQePXp\n"
205
- "kYEsKdR7jzuaQH6kLOvDCC5HgghaMoXNzxOHxGuAqnN4AAp+t4F4CsrJ0NvvsxDd\n"
206
- "egr/PVs/gXgQVrG4oFdlNNGa1JYNwB/+K/VB4vg5ro4hlgmAjm7lCdK529sLsxVC\n"
207
- "Ts+R/q+SAEXiZw43r6Nyu8qyFwq82uJ83JBwf/AfF3MbFMf0mvGjryvenMWDEuRe\n"
208
- "XnSFqr4dXkSNaq2+R5JE8D3VZxrRPJvJ/B5F8LgGHRNNx5LTdQx28knz139w4KEW\n"
209
- "xsHnlMETeAkgUo7DD7iYtYmLNHSnNORWO58+m2jCkm3ZMvTLtcl5obc8tNVR3hIZ\n"
210
- "B/uqQMNQ19r2643kiY8y31sXODJmX7lNHg9wyX0Iv4KaGJeztYQK3FER/+m+xKJP\n"
211
- "+OpalTIAR4gCAPz3WK040w8vvze+yZVA4Zc88eoP9oO79GilfjjYwP11qXUI5aI7\n"
212
- "9HTSwc+xLfPPSR5evPrpp1M9xZ5iPYKZAiUVXHNYyu2fIoRrY7z6cDCPb+gp3GIb\n"
213
- "mWbv4dBDiuml3v+r3oq/0b1Zn19RF4sL/HyTW0a7vehzlgWDDvlMUZj3/4X/X7tC\n"
214
- "AZ0rfQ4Ymc5Zb7QRKwQXq3mPNt4mhexa8n1G605WxPM7DNggfBtORccO5SSpC+Gl\n"
215
- "BEnVKBu6Z67rLD417TFboS+EoYMWexY8lfJHeni5qShftt79UYPALs6iarM/j9Zr\n"
216
- "Rlf9RrpPZ8tAMSberpwquE3y4NvYbRa5JmoIqoy7sA5DDYvWSLI7N8FS9wFxuyYh\n"
217
- "hp2es1Z3v6H8PYRNgCPs8smngG/PZpv4Hyr5Ozrw6xF2zzhp+t7ilC3uGkn9fLov\n"
218
- "SD5Y9K9Qf5X6CTl8l0HKjyJG8/HerYByE+BMXpJdrGSaHJLkpkruJc/IAVUVLtoH\n"
219
- "ojOpfNyoUbblJxwrEz/RLWk6pbmwK9Ae09CVR+dEcnLeiCUtxPGSpuurIsGyy9Gd\n"
220
- "r5NG4VDX/p01/K9wrMK2cUdlt6n5Ut0I/EtizrB06AuI7Nlippg63lhkKR8By4R1\n"
221
- "oMDltE0QhL+tN0/YWJV8mD0KcK+v4gBHP9r1sYnUN3Qadh6OfsPMznukXo260dI7\n"
222
- "HNTNdBeaT6LP4Br42HLJdOePPRrhRSaItRr9mLm3w1MGcEeRpuU3Yj9vnhMZbzS+\n"
223
- "BsUAOAZgvhZgkSRhyNyETPqTAHNHagGQ/Lbwevj7lNFbzaOKLlLQw6e7DTe2cGj1\n"
224
- "H+T3XxEhT/hgvnMlWa3KawIFYLOly+3u74YwEQIDAQABAoIEAGvQjEhfR36vUOep\n"
225
- "dbJxEBN26EfzS4PzHwS93iamflB946kxDbG5sj0r5T7xaacrZMW/D2w+FmTA6LeL\n"
226
- "zt0uhjpe1UsWdbCs0JkxtBCVOjxGQO8cKFEHEXuSaj9kdVcm/eUTB3bz291DAaRr\n"
227
- "xqe06TR4dlLeIzz0yVsKdXza/WDjKe4i0RWF3w9M+8vEv8lp7h87c7jlI5u0eCMU\n"
228
- "00VNK+mdno0nQ+ryrQc7J4lRRKckX1e4w5B7CchQ+jOXO7tMlauIMCwCmhUgMrKy\n"
229
- "RoJnNn28XimR630CPrdSV7OSuY3pP4Vsc/OI6MNaxh3UEMUmv7z9zBRdUxSY3q+W\n"
230
- "9uP9ScD7FEGbBve3/lMbCr/LZ9S4LtiykzW6AZYt4vL/F2XInsEghjMYTgX3w/mf\n"
231
- "NYg1BKvTeCJ6N37Myg3fVU8fSh2ClixUbis6dD08mk3RsMb/IWVExsMdZS2k6735\n"
232
- "c0uuxrBpGA1GkQiIxfHeWmeG3VptoV28NaW/my9Eog4PomibA40cNby7eeideRWt\n"
233
- "N4TGHOVj8Hyu0UHZ2eAfGyzFH/hH8luSpoEN6jAi2/ik2TOxMwMQXyN/dFXr+nXJ\n"
234
- "q7CGJkUgNR5Efk7oLSx/zIWHu8T3ITrPEQdEO9rPYTWP3TIbD5EDShPW0fYX7Wsw\n"
235
- "+CNAJXO/K8HTQL3OzRzf5Ujmy4jmB9ENtFS6T95nB+JPU3GgZsZnVyeq/Fxs/QxX\n"
236
- "kNAvqYOGDmKe3xXppmb/fMUKNwptMoCw/Rn4ne9uXo0+SUUE2U8/nox3H6xLuS2R\n"
237
- "xaboVjYm+8/pae3o0Nizlf7feAdGl2VXJB9ayKFcLERPanLVEIobbTeX0FNws1By\n"
238
- "FbxsNNYwijEJ21Nr7LM7sZDqfdchN/jUW46f+dg3WDnbzXLsXsutrMlyvvdIkD9T\n"
239
- "Mv2RPzvce14GDJSjFh9Xr/2IFe3EvvHuiSmLNtN0I+Eho6dZxDz4VGqLq6yC4ubQ\n"
240
- "nE84R1EHiPJq2geQe7UC8PzcOflLhvQEZ8o/5Hygnp6Wpv8u8jGlxaO2HNCqtmLh\n"
241
- "b/csyRcJIvFN2AyGpQPgdeSA3/UjGFL8a6Qzgr7lPJ/mXnr3+E6p+XuDtQeFXEYg\n"
242
- "RgbTCXs1yPCi1XBpoeaJgf8UJvkniPY9KczTRscwmApVHM/5fdrZvviw8y6byfQd\n"
243
- "ZAOxG6EuVjbmvEfy1dyOAFbd9Jz/rZm3K6U3QqSEFzaxDjuUssPo2BMCTNb22SZ9\n"
244
- "cpI7tPHGY+9b469ksn9+n99pcDNK6Sv4Kh22SCgEyYSFEFrtjxiFNKbqBAjrrZr9\n"
245
- "siPNdsdvA+wZsqXWJMBQoz3kFfDVLlt3h9xZ0Fc+cs/imye9d+W1U30L3DOCXRCM\n"
246
- "3pASTYECggIBAN7leF9Szouc+p7Kpgpw3Iwpv71JbHPltE9uh1tNiglIVO0XOHbE\n"
247
- "eUDnKM/SNdMYpTHZxQw17OFOGcZkeambhghFsk2AmSOd9e/8UQxJcJTLybmfA+6w\n"
248
- "Zailso8O0T/ZiUupmnYz4iseAzdGTb0GLK4DNX1WBGqmkJ5C/v6OhhxyWhD6vlw4\n"
249
- "xX+rLYMqeib5RT3tpjt+n8FDRqO45j3450P31g0z+aVkO1y0RuMNvKAi252y0qSi\n"
250
- "3xEBINaXhZlp1cl8ptei1LZGVArSFu9nzHNDa0E8bhpMP5rpBDNt1oQ0tB4QAkv7\n"
251
- "cc9Zdv+GcGCtq0nO85wiTCkOsHGyioXVPTyb9o83RdJA9nLvOGoonrLbgmn62prm\n"
252
- "jj9fSDsDKb7HCEu5GO7M4+LK85U9fvx0EFJ2xO2YBwkohxLj2T+tgClj3obSGWJ3\n"
253
- "eDQbOvKEDv1B9mF1lZ5464dSsTv6vgqcZ8sXxz8PCg/lwlTKiyzYVBsn4yX7pbzi\n"
254
- "G4DmkIvc0heTZaspt9Wi4iLoXCvbw4y8gZGptaZAMaR0KfBHf0GZOd8zwLlgs+jb\n"
255
- "J0wzkvks8pLdrpMPQnFXzQ7ghObgjNcSwl8504MEdpynB6yaYAS4D+LXD67ohGXS\n"
256
- "90WVPWgF8/QCpBZBZEZtZroJ+jbbOXjZrEh4HEujaQjcx7ELuXUt8BaZAoICAQCh\n"
257
- "8s9ejDJ09UM7JgVIv2mL21bHCowxLOJkSm2LdlChZPn+5FC7FTpnyc2USJj8/6fk\n"
258
- "P3f2iWgPOV2/Wni64al73nD/NZNs5lpPiEnD1h3D0IxvONxeMAj2/Tpoit4n2nYR\n"
259
- "4L6hxr5oAiutlxsVRvSS3TjN1vyLJL1ndosS1ElQoqMT+0Vv5IYXBpfp4S3MQUHh\n"
260
- "/aST1iHuMYjktJL6lqvYBz6I/ix8I0xZZgp7iSNonCYxUL1h4RFpjnBdzXj+7JSh\n"
261
- "QLbZB7vidzUnbWd51UCNK64mUi6pNKolEL2+VntJHLldBGOhlYESAJ9NOkObkkn7\n"
262
- "xGHo7TPnkDjYmA4xIJJS3tnj7AtvTo/49x1GayXJGvWLN8MMWj9O4OXPkWnDnvh3\n"
263
- "yeB8xozm6RHzKg6hgBZuhHNDzxQy2urt+g/vKHkDNkkI72qyN7YeVAy8NMcGsCe6\n"
264
- "ANSh3wxu1ECkjYknj2ZkbWL/iKXVoQht7EqwhmDBiLDZoZ5t2ed/Vs8Lv0SagCiM\n"
265
- "bQgcPDWCi52zKVV8BudXLcfGJ9rlJgt5xrNW2HPYtqzihfmd9YlhJjGUsGoobdG3\n"
266
- "mSsBoE3p5EcoI5NM8ddeSo5JXgUbX3CebLVlEOxbEwSIUTafHLlQD0h1SRKbcD7Y\n"
267
- "SOZcONWyshXaWf0vwHCrbro0uJ8+TIeWHyWC79toOQKCAgEA1lbZquipH85DnmEG\n"
268
- "zDF9k/ctn2s0tDpmap/B38WvgH+i0x8qN+N1KjlfoIDnK2ieqlJcTwKoGHyPAp1p\n"
269
- "9PROLjQ/YpHQMVTbw/vhQCx660sQX8QO9v9/sm4sR68a/whEI5Mjqpj32ziQJR4g\n"
270
- "8S0319nUHQOTWa90kAuiw8zwH/jCrWNBnNMm8D7+lAxLzKCVuhiGat236BO2oQfT\n"
271
- "uDJayZxQpP+fCDFbeCkPpZV3FpKOl5X3Q0Qvt11bY5/vY/hHEeshUWkOnX0Boiom\n"
272
- "ze8Fxq1FPUVMJ1O9MkzysjXkO9umfOYuHzzbU2YXrV5tQDqg5WfyEOlWTYEHoT3s\n"
273
- "QQguS9M6hLvFE4tOsnVhzYvkF+BIB3unrZ8ZmM0aW00OXptsWczTsgcq+NLq609o\n"
274
- "hoFhlLsLYeJ4mZD0WvDp33cLMEIOIZ11tZ9m4sxwofblpxpAP7Xfu7VR4B5fumrD\n"
275
- "RtbiZIUoH3Zp2aG6fukKboRUVIzFvKfB1+GiSxDsXOJq0Sr3cGG8mt54ENNalv5M\n"
276
- "jFBVVGpa+FTwp9Dg52MJd15OLVnJ8TmRp9DeeEN8CMr1NM+h6V6aKP4ifTTf+Fhk\n"
277
- "dwleCk5EG9A18ywXkB4fSUpqVFs0hKCpeHUnPS1nEFnxHmtPuOsG70aSq0Ge8BNd\n"
278
- "r9258zI1G3M3NMOB77lzjMAxCLkCggIAbJKdpfR162V2wlPWHRR+zU2qmtyeamV+\n"
279
- "DeC8GlCi8+D/nXwyB4rO0kA//BbDwnIfe+11Hqq2QeaizCP6ZsfdWXci6GZhxROW\n"
280
- "HlXvpkSJRfst+27yho7Lo9LXcrkPAUb7+zZid5EHnDFAWSvB83zTgRag+5cTTrG9\n"
281
- "7XxS9retw0qV7FJ8FezuXMeF1z2o95QUeE8VJCveKZO6BCJvm2KiKL2KlktZRYxg\n"
282
- "plq70mB5hauSC2Pm45UBmHPvL2QOp1Gyv3zkWRJPSx/CWgGF6u8mTL6pDXXxZG0z\n"
283
- "WJAltVLDapvARfUoWm8hzhDuu9bA9q6XvRvGzGMidi+BfOxML3F3x+kxyRU6AVB5\n"
284
- "Q19gmBJDjdTuI3yp3kEuylIKoCML9iNAzwZf4yc11aUR7KUYk/uMjmFr6V0OXJ3Z\n"
285
- "/Nu2DQ9kOdwOENh5/qtNBH4y34a+m+RDbfcalr8z1aWlBO0Cs6v26INRaKGTFGrW\n"
286
- "fON6m2gru/RJJE6vKVR6WCu5uVVsx+v9w09hrZRMB45UloWykukJ9a9yjI2xugjM\n"
287
- "jsLA/ws0d2jY9TD+zYCMrr3tZZL0SNB/VghxBbEUKydo8ScQnPhR/Bwd0mAfKl/M\n"
288
- "39lfrzcuTkyssDtKVFfsgRkN6duoht80ssoE7nUIB7pO3kmQbZAluTkNy0SvNhQW\n"
289
- "nnWZL3Rg8zkCggIAYay9SVhV1aT9sAjuPyoeMMdUhWota+V3Y3buNIlBKByY24JA\n"
290
- "48gjYcD6TEkHHhP6h2riACaX2NmSagreBZ5l5CO/kCbrqpE7c4l3Ac5VTB3wBxU5\n"
291
- "IK2zCwFag/2HOKUojmNmqCcHctnuOI6r1vo9s6cn765J2TpBMr2gt3P9ouqqr2Kw\n"
292
- "FKNfd+T7vfII7Jke7pKCvz+sk+bGgP2WPZbbOrjFVxIFD9xU5Cl7Yu2V9PtzvshB\n"
293
- "pG9VBQyaXaUVgx20Tf+MArG3yaxeYobrHIKuIXH8wh1Moy10vCymBDEUa7TXB5dZ\n"
294
- "cq+ypQJzKprMTY0VyyYlzLPnC/y9i/kpLfHnIpR+va16Gk9Yd1WGFZX2bap0smOu\n"
295
- "5AX30Pgdplycvm3rozMuCZ6+ONY80cQoTbtqVE5OaJhqyJsBbTe2x7IXtcu9CPfB\n"
296
- "YM4iujKcT4toV92DQIkERC+FaJb0wX3NHd63svC7AD2l67/MeCE0ijp45uBa+ZcJ\n"
297
- "pqyxLEB5KHV8gbCHjOJlAGAl2yCKmvpWFHkLz+2VVqocvf8L6IcBl/tY59rkZLbJ\n"
298
- "Huc1DDswnHnaJLmTYpye5B+TLIpn+Z5BBh/88ERwik91Eh8c/iqOK513YkahHMNA\n"
299
- "9izz9yRZmhfd7QvSbXVq1fhmNqZu8xBdEv886TdYhVNJ6x98cdWnAHmV6vs=\n"
309
+ "MIISKAIBAAKCBAEAtWIfF94niOYRV8JKvX9CRzlxWCeGyv6RNTma1zRZq2lKHBFc\n"
310
+ "+5j5I4eqPPVQ4Xfb4fVkB/Vua1zLSRT49G8Xf/9KvfavHUZG/8ft2VzyAIuxmVbS\n"
311
+ "t1UToOGut/kCsstFQkC0X7Jny66ETh6inV4k/BiVYm1hJCap/k6o7briD8vayKrz\n"
312
+ "PpzK2LRVnFDiVjreFNI2aoUDQhWbdSSOQdI4FJWuYypgOWnZWcCIOtCG7s5D9HON\n"
313
+ "lFR/C011AQekrB3e0rxMMlp6s2IH+9PSmHmlFkgDX8Jn5CfkpQbT0CTEvVnfcb7/\n"
314
+ "RbX+gxsvDO3HRL6Fzhzo/uliwNa0rbAzWYidBamWCXsox8z1Cfd4VMf70FnRPgLL\n"
315
+ "oeQk0LulFwbzZZSfi16lMaAtTcnj9GI0dlZY0e83kZDHP/Udrq/FqCvOeIYeRZAv\n"
316
+ "q5mRtPuGvqr0wR0owgZaPg4lf+IoBlj/JAJRUjUSty1LLfR/1p0I0rntzzHyQfWJ\n"
317
+ "a6MQi9e4n1zvK5TITnK7iRm5zAOm7SYWNs8HPMuCNtTOidt1pyaU9wpZZ+3BPM8C\n"
318
+ "YTy89QNi9tUfv2+QqaA1OHjf519Tb4zgJZTl1SnDYzG8HNyVu+R083NnpPMedmGs\n"
319
+ "LI09GvjWtkW3imrGk//Ll9e92Wxb2/8qB8DbPnPh5JI5SWrvY5fcEVsv7jTEsM2F\n"
320
+ "lCg/hFXkIwMmwt9PLKMESpCxP39ldX7lCayovNlpJzK82alLPttgarP0YX3rwEUV\n"
321
+ "EURUPhwYF7j5IiVxRl5HumuRXP0bHexn1aJ0obuAM1mhC/9v6w0dFJiptbIp2Drd\n"
322
+ "KC80BnWQZpXzxfxcCMvOlP1SuSZCQ7e2c82X34UWUXIiGRszdFCL/Y6Zvaz5OF42\n"
323
+ "5Tuh86+mK3zZ8hX1+1UYFmhRsCRkEwYOAs4W3tn+rSU01XNByWxWb1pxCSjntVNZ\n"
324
+ "QgeqOgDVMXihzwxMtBa/C9LiPNKzSlmQIOg2g599d4LyAAPExevRVDb7eRmZEGZz\n"
325
+ "Ql/ve4VjzjpqynDUfvQG6ABXy4OMcWEo5byGAsRByR288yQzEPxW6+GtwVubAy/0\n"
326
+ "EP6PqM3Vu4BiKZcHJkcFYyRvNY2i0MI5Nibxrm94mgmJYw9kPU/RvOSRYGmdhhZa\n"
327
+ "Y3hQJPf0wTUphKLPJ3BxxzT8dIsRLeL+xPVD+9okwQ5OiuPG6iCT758fc5DVQYmy\n"
328
+ "vwZMwmPzqp7RlaoFT0VYcv+0WDBUnC+6R+SURQ9b0oS/9eRLq4uhJgkYFmyU5FhF\n"
329
+ "AwXoQjtm5b2i+xJ1ctVmNUwh5f6hoJcmx/KPSOLk5teZy4WK9p5APVI8ApwwvJH2\n"
330
+ "gs0qohIjFT4H6vppaK/K5XVMvZYech/237gz8wIDAQABAoIEAHC5NyulI5q/qH2K\n"
331
+ "wNo9sVoER/2KKwoS5PlYAHPIFAYkHCuPWuL9sa+0C0dxCb/ltmAaGf2cOPA+LhQQ\n"
332
+ "FZwLQmaIqNGf8jpWR5+Eh7uzOK7AIjJys+e91sIAH440Eco965/+CFsEy97YaV8H\n"
333
+ "SPZV4NRPDt+prFpEMRdbmT6NCxrYDPLy0tLRrHq6sA3Ccrc2RHhaH/lZCqpSNVe6\n"
334
+ "zTH4zGN2lncIid6EetB9h+xNVd4pkC/mdFF/pajHjXSDZIKW2bjLzuroMiMzRFTr\n"
335
+ "0pBx4PgU7wvfDKPNaxpoQNC1WRN4PBY7pfeT4EVoang1ecauRQfQDbkGIBpKFOVw\n"
336
+ "gKke7r7rItRnlvN827hC9KRz2Homp5RLNnQ5DewvAa1q4274y6JYwn8x1ZXnZ2Sk\n"
337
+ "d4gnp3Foonczq7CCy9yZXlRiTSG38C45KncRrGz2eEocgplVXtQeEI1KS2HLkiZH\n"
338
+ "vuCJFDLryuLOIk/ACIa+9xHG/RTsLGtzheC/6XOPMCzSG81Q3J9sTEIrG72/c0kk\n"
339
+ "h1+ukAfnTdh3rpgcLGUh5CgXZXLiXlpFKGx3y9LVNPbDgsR9OEFC0HB1JmlrY7YK\n"
340
+ "re6NN7yfBM+rxAWHzQKFO21lBj+L3B2kG9VgPV560S1b7HH4Y8rsiIGoUVNDNV9m\n"
341
+ "l59T6q1IZVWgzjtjWrzhTqH2srXtR13y9HxJz50Ep6D3LYeTEd83RKAW54N45UOw\n"
342
+ "VgmL64XTWgacFKWNR2heo7cuzBsfT6WWjWuXUq4SJkHWQZ4s2FKP7t8AU40BF/X0\n"
343
+ "Aqx0m1heo4ISSY+YtyqYOOcNv95nLMXo/yXtK/r0Vop7tNqF/wWZUDDib3IqbTrb\n"
344
+ "BDtc0PGBpdhqrbj1Rhz7/CYIZL7dbljy4NU0bTCtu1XZekjO3CqS/MHkOoAOrqP7\n"
345
+ "+RGxo7CO+u/cLrC6AWJ+H3dEb/B1nPwF6mkx0D8SizdH5UyRku/drXakh6riOr0P\n"
346
+ "A48gOXUEryNtbIzjYHWagosJ/aDaOSp7G2uQcq7R/ey9qCs9jraBJnQaBoPpksD5\n"
347
+ "XKIgbtxs/gXo+d7/fabVmPRk7JlE2t7qAnlSqz7PlhwRtqZtSDAEBG9iiKwnMiS+\n"
348
+ "otJgbpvjdrOon0l3rBFa1k4sGN6wz0okCF/7jpsbCotDHLi9WbWGhLH0WwQ266l5\n"
349
+ "CDtnaD7HX9zTuBhTqzXUcqs30XinCHnN5u+K7a5mxNpmPYzgBN5ZCDeM453xXl66\n"
350
+ "V72FgaZAfmbgy2sgGw/Be6eTtNC7NM9C7STOQwGTE5HxkszR6qsyMK7L+xebFdE1\n"
351
+ "4SbkuaWEsjlPm9k1k9+ycdWtB2mp/KOYyfbiojLqVXoPNkEzP17I3YnNn24RlmLb\n"
352
+ "2HteWtECggIBAN+iIw6iiuT+orAfl9Bch+/9WVEXSi7sUrCC9crUcryaTlYe4sU3\n"
353
+ "b0InkDrJatAigKxxfCWRXdDgL7qRD0juU7D2Dw0RP6p1Hv7j7Cv2PcXZIHgK8ra6\n"
354
+ "xExMyKVhFNulYJoFjdWOtg/qwNIAcEoaAw59l9pfGu8Q7h7avGNrCPnIsL/y0qr2\n"
355
+ "k8Ewrufpksm/SyJnUnHI44tniYH1B7GVh+1RA23H/dLOT3wQuNTSHFDbzmphLiIm\n"
356
+ "2L2EXIslsEDVRWi7BRbsvfn+N8SIb8Nn8LoSvCHHpUqaGIj3mrTsNyOBHe2he2NN\n"
357
+ "+muY/KMTvXOLSzfP0bXLps0byPleqpZ5kHStdHX0lHTiRU6gh6d+Jz2VL5Fd8vBJ\n"
358
+ "C3OymZNvZy6UeUplj1esHQDQfQkqMvI9+N4kAXiwYo3N3o7WwUaOr/9Wrt1/yttX\n"
359
+ "Y0Ev1asjUMk7SHvZXnHPpXgcRTiDV90RWFYEgrj67jcqHgtz5OU6ySTHyWU5mbAZ\n"
360
+ "wfvjNKPnPwAgXQUUbFQYFN4irH2wmF5XwfqEd7TfpNSpaOixDkvefXyQ0liK1VXL\n"
361
+ "qLu3/s/417hxys6e8ViIRozmJMPBoYqXTZEP/CIkd7CyjFV1zrWg0mu0KqA1Ld8H\n"
362
+ "D/fMig2D8nxLBoUqRKLlNfzIYBbapQbf4jd5ojBoJQN0RvDg1OWXyL9bAoICAQDP\n"
363
+ "opKwuXIvjlc/0d9QP3Sr+OSLAkbrjbIkaoiWtFsiX6hPE91Gb8lU1tEvAk+Z6P7T\n"
364
+ "jpS45z9Uw5w/u6vMHqJsykVNPBe0D4fxepv1S/QrD0RGTC4Y39VhFOi8EPmx/fIq\n"
365
+ "nTg4dor/o6boB1X7sgcVXfIT1m35dFPSv0XpyDQgMIu4KhxptIVtou/hoAODd3uY\n"
366
+ "dmoo74iT7DDtXLy5EdHnfoiasatqYi3qmcbvOaP0pg916FioSfGtINq1HDi8EsrU\n"
367
+ "QTTIDixB1i62JqRvrObxCPJkq44Nmsh19361mvuAu7sniN2nB979D/o5KPHn2iVu\n"
368
+ "5/eRGmdCK5ziHmGx2nxI/T1WMv7nyGA/clQOKgXmPNgpHMZsGFDly76m4zPMUL72\n"
369
+ "9IyyOKl8/CmfVVjCUMBHr6+Wq7YoY3eZzoQdhVVDVcWhaY8SMoXklNdVrYfyMJIp\n"
370
+ "sfovcIGQJKU/uzegfNteaVfRn1w977Ihs1nMzeNDX/2S0ciZacxiDpK7PkuW+mX+\n"
371
+ "0lGtyhX8pDoNT3Gfp3EZE6PBZxX9kJcPMegS2jsxpuMbokBBNAWoOgTiqyal7jWR\n"
372
+ "Lme+ncLb6sFHrNLYpYKox9AO92NzC5IK7BzY1S04zixElLAqNAkuifYeck4pYjtn\n"
373
+ "Kc3Fwujm5y/fqaAy7agXK4/JH5JJzb/2Eg4ydElZSQKCAgB8qLDKE6lBBQBDFRlX\n"
374
+ "OH0+Ngd3wHfFuE5PvnCs48ghghJwxz65mLEYO12Wp3g3FUSM26XMez/Ek3OHmBzh\n"
375
+ "FpjoaADz082dgzQH+Z1I1DaS9vm2cMPjQDD0J0khhwBNf95dfQMXLDoonT9m0H/H\n"
376
+ "jsBtb20aeTFWWiWiZWPmN2AFfO2p0f3E9zZd1nlpJTaB53RGdTnr24ObzddE7gWf\n"
377
+ "5C6lByfWJklDHWYJTnj5iTXnjN9/RTSmLOlcm0/K8PNS8I+EVdv8b3Nmy2Li1vsV\n"
378
+ "/faegpsEaXmmIEfU8dD3UUVbMToxoHZbYLhbCiip7vMIWXlQXzQTFragVwCsoSyO\n"
379
+ "PK1dnOLybafjj836ilmT8CqHlYWyjqBBeTY9BC2/lbX6rSD/a6V/xZ1VOuK4HSHR\n"
380
+ "DuKPUZrQX+JQEZYiIWwTnK5Ws0c+iWHW6tuVFskQYNtDkRxSjVSsNIeUcI3VdsGf\n"
381
+ "pW+MY29LFfV8Iqok0DGj5iUBr6yAFJ+rHnCXrItHYjwoIeI4Vq4cImBfgwyL88i7\n"
382
+ "rkefEgB4fsIvGVA1hZzmhduFeGUInjtVW/Vuzp3n6Fq3ohbfHpKCO1S4bgHIbUNT\n"
383
+ "Mgw29KYjkhh2EtFPQiA79q3VA9VPANXVIOaxxv6dkhO1XU0BJhKkiwiRJFEL7E1Z\n"
384
+ "i6taKR9TxHn9du+kjm+enAF3SQKCAgEAo9myEp21Gwwjk+xFYmlA47jceUoJtzax\n"
385
+ "HoWnVe3rgPulsQmG81+hrD59ArC7KkSwWzhH6oYp9vUKJ00s7D48hMc12xYRynj7\n"
386
+ "GTddPTx76UL56NOTCPQRybObWVW4BZrVcIVy6TO6yrNVMgMf+ihp6JWjQ75SOKlw\n"
387
+ "wH1KaYsgf0pv55vrogrfxD3xOMZyH1u5f/3qFnW3/KtFjPpCv3TthNXYbOLJ14C0\n"
388
+ "pU5Gq198H8Kvrqb015DKk4m6rXMg3mGiB8+RHFH64NVpNTrXRn1WHV2nEoRC7D95\n"
389
+ "84WkSyGLWPJMZY1fBMF0WZUzK8pA42rFYXjSZ4JDe/c4rUO2aoh0zZBxx8UkXLpG\n"
390
+ "IatR43+L+j2HgyH+/yxNIpoe0Em5BYGuwOkI4ldOgJ/pJKBQE79vjOJ6GNdWPxcH\n"
391
+ "Oau7nCQsvZ9A/vhy+7Q87r36E9WF0zw7C4Y0XR1WUO5qLRnLcu00m5NbxsMQIpw1\n"
392
+ "oNyMf871iaSFUUgVGeNgcvz3E6W8Nt9Qf79uz0sLALyERx6rFocm+9gAwM1dkCR6\n"
393
+ "4HXMopvuXGdLDvKB7DJmSHPIiSrwq76ILRJGsiiCrdLaRXp/RJGPwysy56yXoSC/\n"
394
+ "VbkvpnjLX+lrC4+eWR+JI12hiDNBtOyc3fMiO+5splJH+CM+lRHwNKCereMpKO6h\n"
395
+ "jkh/RZd4jmkCggIAdY3VwTI+4iI151RlQNufK06EjPoR+8eWeakfzZCOL2xyzPjR\n"
396
+ "Xzgqt31uVqRxyFikiCMkOgjpFK7JJYwMKGqPzCrhqh2NBLIG/aR7OW2OHKxBtfRl\n"
397
+ "BdiiOLMtSo4PrZu6EBU+a77H8iL4rCizxoCFu09BlFoRFv0aNHyLwxmVg0nORxXg\n"
398
+ "a21490oz2CYO1dVvWnUI5PZtUAex/9YvzXzcM6hB7ghignT0O3v2GxqPQQjKelOb\n"
399
+ "JonV8jnTK6Y1d5fXHf+NSTyfRcZTcX7fXRvrX/TfDgfeSJTBlOnHpJTY5Hayj9Hv\n"
400
+ "44yLMEYF88H087ZBbwQQCB8Tpq4pHNCuW5vSZFpyA9joEJemG6ugzzc+Pp4gDutK\n"
401
+ "lSeLVL0U+JZKNNYDBtJPX6QQJH+KQ617cglvrNSld/hPtKGWhrN9JNBQBkSKaJld\n"
402
+ "vckL2BJfNiVcDAohTiWizkd0G6qGkaCYDvOjfQyQL4b5Nw/0WGOuQAbt/3LGSYW2\n"
403
+ "5R4jWbE5Sh/ttASb02UpMMxG1QpEyXReeIi7B2OkX1kIv5XSwV1N5ja+Zz4dD0HG\n"
404
+ "2TkSiXXIJjTsxpqwNlEjbswRawNEJ2olh6YmmUwogGDV7aGEQAcIK2aaqdHrGtwB\n"
405
+ "F+eUskJJpN+iCO9cNSrBFvNPoDcociuzSwrpMUis8vn8STb4gDjVpr7pYeU=\n"
300
406
  "-----END RSA PRIVATE KEY-----\n";
301
407
 
302
408
  #endif /* VIRGIL_CRYPTO_TEST_RAS_KEYS_H */
File without changes
@@ -40,6 +40,7 @@
40
40
  */
41
41
 
42
42
  #include "catch.hpp"
43
+ #include "deterministic_keys.h"
43
44
 
44
45
  #include <virgil/crypto/VirgilByteArray.h>
45
46
  #include <virgil/crypto/foundation/VirgilAsymmetricCipher.h>
@@ -49,6 +50,7 @@ using virgil::crypto::hex2bytes;
49
50
  using virgil::crypto::bytes2str;
50
51
  using virgil::crypto::bytes2hex;
51
52
  using virgil::crypto::VirgilByteArray;
53
+ using virgil::crypto::VirgilKeyPair;
52
54
  using virgil::crypto::foundation::VirgilAsymmetricCipher;
53
55
 
54
56
  static const char* const kPublicKey1 =
@@ -179,3 +181,66 @@ TEST_CASE("Asymmetric Cipher - Keys Validation", "[asymmetric-cipher]") {
179
181
  REQUIRE_THROWS(VirgilAsymmetricCipher::isPrivateKeyEncrypted(str2bytes(kMalformedPrivateKey2)));
180
182
  }
181
183
  }
184
+
185
+ TEST_CASE("Asymmetric Cipher - Deterministic Key Pair generation", "[asymmetric-cipher]") {
186
+ VirgilAsymmetricCipher cipher;
187
+ VirgilByteArray strongKeyMaterial = hex2bytes(kDeterministic_KeyMaterial);
188
+ VirgilByteArray weakKeyMaterial = VirgilByteArray(31, 0xAB);
189
+ VirgilByteArray strongEnaughKeyMaterial = VirgilByteArray(32, 0xAB);
190
+
191
+ SECTION("key material with length 31 fail") {
192
+ REQUIRE_THROWS(cipher.genKeyPairFromKeyMaterial(VirgilKeyPair::Algorithm::RSA_256, weakKeyMaterial));
193
+ }
194
+
195
+ SECTION("key material with length 32 pass") {
196
+ REQUIRE_NOTHROW(cipher.genKeyPairFromKeyMaterial(VirgilKeyPair::Algorithm::RSA_256, strongEnaughKeyMaterial));
197
+ }
198
+
199
+ SECTION("check RSA_256") {
200
+ REQUIRE_NOTHROW(cipher.genKeyPairFromKeyMaterial(VirgilKeyPair::Algorithm::RSA_256, strongKeyMaterial));
201
+ REQUIRE(kDeterministic_RSA_256_Public == bytes2str(cipher.exportPublicKeyToPEM()));
202
+ REQUIRE(kDeterministic_RSA_256_Private == bytes2str(cipher.exportPrivateKeyToPEM()));
203
+ }
204
+
205
+ SECTION("check RSA_8192") {
206
+ REQUIRE_NOTHROW(cipher.genKeyPairFromKeyMaterial(VirgilKeyPair::Algorithm::RSA_8192, strongKeyMaterial));
207
+ REQUIRE(kDeterministic_RSA_8192_Public == bytes2str(cipher.exportPublicKeyToPEM()));
208
+ REQUIRE(kDeterministic_RSA_8192_Private == bytes2str(cipher.exportPrivateKeyToPEM()));
209
+ }
210
+
211
+ SECTION("check EC_SECP192R1") {
212
+ REQUIRE_NOTHROW(cipher.genKeyPairFromKeyMaterial(VirgilKeyPair::Algorithm::EC_SECP192R1, strongKeyMaterial));
213
+ REQUIRE(kDeterministic_EC_SECP192R1_Public == bytes2str(cipher.exportPublicKeyToPEM()));
214
+ REQUIRE(kDeterministic_EC_SECP192R1_Private == bytes2str(cipher.exportPrivateKeyToPEM()));
215
+ }
216
+
217
+ SECTION("check EC_SECP521R1") {
218
+ REQUIRE_NOTHROW(cipher.genKeyPairFromKeyMaterial(VirgilKeyPair::Algorithm::EC_SECP521R1, strongKeyMaterial));
219
+ REQUIRE(kDeterministic_EC_SECP521R1_Public == bytes2str(cipher.exportPublicKeyToPEM()));
220
+ REQUIRE(kDeterministic_EC_SECP521R1_Private == bytes2str(cipher.exportPrivateKeyToPEM()));
221
+ }
222
+
223
+ SECTION("check EC_BP512R1") {
224
+ REQUIRE_NOTHROW(cipher.genKeyPairFromKeyMaterial(VirgilKeyPair::Algorithm::RSA_256, strongKeyMaterial));
225
+ REQUIRE(kDeterministic_RSA_256_Public == bytes2str(cipher.exportPublicKeyToPEM()));
226
+ REQUIRE(kDeterministic_RSA_256_Private == bytes2str(cipher.exportPrivateKeyToPEM()));
227
+ }
228
+
229
+ SECTION("check EC_SECP256K1") {
230
+ REQUIRE_NOTHROW(cipher.genKeyPairFromKeyMaterial(VirgilKeyPair::Algorithm::EC_SECP256K1, strongKeyMaterial));
231
+ REQUIRE(kDeterministic_EC_SECP256K1_Public == bytes2str(cipher.exportPublicKeyToPEM()));
232
+ REQUIRE(kDeterministic_EC_SECP256K1_Private == bytes2str(cipher.exportPrivateKeyToPEM()));
233
+ }
234
+
235
+ SECTION("check FAST_EC_X25519") {
236
+ REQUIRE_NOTHROW(cipher.genKeyPairFromKeyMaterial(VirgilKeyPair::Algorithm::FAST_EC_X25519, strongKeyMaterial));
237
+ REQUIRE(kDeterministic_FAST_EC_X25519_Public == bytes2str(cipher.exportPublicKeyToPEM()));
238
+ REQUIRE(kDeterministic_FAST_EC_X25519_Private == bytes2str(cipher.exportPrivateKeyToPEM()));
239
+ }
240
+
241
+ SECTION("check FAST_EC_ED25519") {
242
+ REQUIRE_NOTHROW(cipher.genKeyPairFromKeyMaterial(VirgilKeyPair::Algorithm::FAST_EC_ED25519, strongKeyMaterial));
243
+ REQUIRE(kDeterministic_FAST_EC_ED25519_Public == bytes2str(cipher.exportPublicKeyToPEM()));
244
+ REQUIRE(kDeterministic_FAST_EC_ED25519_Private == bytes2str(cipher.exportPrivateKeyToPEM()));
245
+ }
246
+ }
File without changes