This is a hotfix for Apple platforms: ObjCThemis and SwiftThemis , running on iOS and macOS, when installed via Carthage or CocoaPods.
themis pod is now restored to use dynamic linkage again@rpath when using CocoaPodsarm64e architecture slice from Carthage builds for iOS which prevented CocoaPods from functioning correctlyCode:
Objective-C / Swift
This is a hotfix for Apple platforms: ObjCThemis and SwiftThemis , running on macOS, when installed via Carthage.
iOS platform is not affected. Installations via CocoaPods are not affected too. You can continue using Themis 0.13.4 there.
Code:
Objective-C / Swift
This is a hotfix for Apple platforms: ObjCThemis and SwiftThemis , running on iOS and macOS, installed via Carthage or CocoaPods.
Note that this hotfix is not compatible with Xcode 11. (Future releases of Themis will also require Xcode 12+) If you are using Xcode 11, please use older versions of Themis:
pod 'themis', '0.13.0'github "cossacklabs/themis" "0.13.0"π See #715, #725 for details.
Code:
Objective-C / Swift
π Hotfix for Themis CocoaPods and Xcode12:
Code:
Objective-C / Swift
π Hotfix for Carthage, removing dysfunctional ObjCThemis.xcodeproj.
π₯ Breaking changes and deprecations:
themis.framework once again.Code:
Objective-C
π₯ Breaking changes
-
ObjCThemis framework built by Carthage is now called themis.framework once again (#704).
ObjCThemis 0.13.0 has initiated renaming of the framework produced by Carthage into objcthemis.framework from its historical name themis.framework. This decision has been a mistake. More information is available in the pull request linked above.
π objcthemis.framework is removed and should not be used.
Please continue linking your applications to themis.framework. Note as well that starting with ObjCThemis 0.13.1, you do not have to embed openssl.framework anymore when ObjCThemis is installed via Carthage.
TL;DR:
Code:
Core
Android
Go
Node.js
WebAssembly
Swift
Objective-C
Infrastructure:
TL;DR:
π₯ Breaking changes and deprecations:
objcthemis instead of just themis (read more).Code:
Core
WITH_ASAN=1 flags
(#548,
#556).-O2 optimizations enabled by default
(#543).soter_pbkdf2_sha256() can be used to derive encryption keys from passphrases with PBKDF2 algorithm (#574).themis_gen_sym_key() can be used to securely generate symmetric keys for Secure Cell (#560).themis_secure_cell_encrypt_seal_with_passphrase()themis_secure_cell_decrypt_seal_with_passphrase()provide Seal mode API that is safe to use with passphrases (#577, #582, #640).
secure_session_save() and secure_session_load() methods
(#658).Old versions of Themis have been calculating encrypted data length incorrectly, which made Secure Cells encrypted on 64-bit machines impossible to decrypt on 32-bit machines (see #279 for details).
Themis 0.10 and later versions include a fix for that issue and a compatiblity workaround that allows to decrypt data encrypted by Themis 0.9.6 on 64-bit platforms. This workaround was enabled by default and could be disabled by setting the NO_SCELL_COMPAT varible.
Since Themis 0.13 the workaround for Themis 0.9.6 compatibility is disabled by default (as it has performance implications). It can be enabled if needed by compling with WITH_SCELL_COMPAT.
We are planning to remove the workaround completely after Themis 0.9.6 reaches end-of-life in December 2020. Please use this time to migrate existing data if you have been using Themis 0.9.6. To migrate the data, decrypt it and encrypt it back with the latest Themis version.
Themis has never committed to supporting machines with big-endian architectures. However, it was expected to accidentally work to some degree on such machines, with certain compatibility restrictions on interaction with little-endian machines.
Recent changes in Themis Core are known to introduce compatibility issues on big-endian architectures. If you believe you are affected by this change, please reach out to us via dev@cossacklabs.com.
Android
See also: Java API updates.
Fixed broken SecureSession#save and SecureSession#restore methods
(#658).
Breaking changes
It is no longer possible to build AndroidThemis with Java 7. Please upgrade to Java 8 or later version.
Deprecations
To build Themis for Android, run
./gradlew :android:assembleRelease
instead of
./gradlew assembleRelease
The unqualified form still works for now, but may break in future releases.
Secure Cell API updates (#588)
#include <themispp/secure_cell.hpp>
auto cell = themispp::secure_cell_seal_with_passphrase("string");
uint8_t[] plaintext = "message";
std::vector<uint8_t> encrypted = cell.encrypt(plaintext);
std::vector<uint8_t> decrypted = cell.decrypt(encrypted);
You can safely and securely use short, human-readable passphrases as strings with this new API.
Existing master key API (themispp::secure_cell_seal and other modes) should not be used with passphrases or passwords.
Use master key API with symmetric encryption keys, such as generated by themispp::gen_sym_key() (#561).
Use passphrase API with human-readable passphrases.
themispp::secure_cell_seal_with_key(master_key)themispp::secure_cell_token_protect_with_key(master_key)themispp::secure_cell_context_imprint_with_key(master_key)New API has additional benefits:
std::vector, std::array, std::span, C arrays, etc.The following classes are deprecated:
themispp::secure_cell_seal_tthemispp::secure_cell_token_protect_tthemispp::secure_cell_context_imprint_tThey should be replaced with their _with_key counterparts. In most cases migration should be a trivial renaming but there are caveats with Token Protect mode and iterator usage. Please see #588 for details.
New function themispp::gen_sym_key() can be used to generate symmetric keys for Secure Cell
(#561,
#576).
Updated test suite to test C++14 and C++17 (in addition to C++11 and C++03) (#572).
Breaking changes
get_pub_key_by_id() method of secure_session_callback_interface_t
now has to return non-const vector
(#540).Change your implementation like this:
-const std::vector<uint8_t> get_pub_key_by_id(const std::vector<uint8_t>& id) override
+std::vector<uint8_t> get_pub_key_by_id(const std::vector<uint8_t>& id) override
{
// ...
}
New function keys.NewSymmetricKey() can be used to generate symmetric keys for Secure Cell (#561).
Improved ThemisError introspection: added error constants, numeric error codes (#622).
Secure Cell API updates:
func SealWithKey(key *keys.SymmetricKey) (*SecureCellSeal, error)
func (sc *SecureCellSeal) Encrypt(plaintext, context []byte) ([]byte, error)
func (sc *SecureCellSeal) Decrypt(encrypted, context []byte) ([]byte, error)
func TokenProtectWithKey(key *keys.SymmetricKey) (*SecureCellTokenProtect, error)
func (sc *SecureCellTokenProtect) Encrypt(plaintext, context []byte) (encrypted, token []byte, error)
func (sc *SecureCellTokenProtect) Decrypt(encrypted, token, context []byte) ([]byte, error)
func ContextImprintWithKey(key *keys.SymmetricKey) (*SecureCellContextImprint, error)
func (sc *SecureCellContextImprint) Encrypt(plaintext, context []byte) ([]byte, error)
func (sc *SecureCellContextImprint) Decrypt(encrypted, context []byte) ([]byte, error)
This API is less ambiguous and more convenient to use.
scell, err := cell.SealWithPassphrase("secret")
if err != nil {
return err
}
encrypted, err := scell.Encrypt([]byte("message"), nil)
if err != nil {
return err
}
decrypted, err := scell.Decrypt(encrypted, nil)
if err != nil {
return err
}
You can safely and securely use short, human-readable passphrases as strings with this new API.
Existing master key API (cell.SealWithKey() or cell.New()) should not be used with passphrases or passwords.
Use master key API with symmetric encryption keys, such as generated by keys.NewSymmetricKey() (#561).
Use passphrase API with human-readable passphrases.
Deprecated API
Please use new constructors cell.SealWithKey() instead of cell.New() and cell.ModeSeal... constants.
Encryption is now performed with Encrypt() method instead of Protect().
For decryption use Decrypt() instead of Unprotect().
Old API is retained for compatibility.
New function TSGenerateSymmetricKey() (available in Objective-C and Swift) can be used to generate symmetric keys for Secure Cell (#561).
Mac Catalyst is explicitly disabled (#598).
Improved test coverage of platforms (#599, #607, #610, #642).
SwiftThemis is now tested with Swift 5 (#605).
iPadOS is now officially supported target for ObjCThemis (#641).
Secure Cell API updates:
encrypt and decrypt (#606).NSData now which bridges with Swift Data directly.TSCellTokenEncryptedData object.In Swift:
let cell = TSCellSeal(passphrase: "secret")
let encrypted = try cell.encrypt("message".data(using: .utf8)!)
let decrypted = try cell.decrypt(encrypted)
In Objective-C:
TSCellSeal *cell = [[TSCellSeal alloc] initWithPassphrase:@"secret"];
NSData *encrypted = [cell encrypt:[@"message" dataUsingEncoding:NSUTF8StringEncoding]];
NSData *decrypted = [cell decrypt:encrypted];
You can safely and securely use short, human-readable passphrases as strings with this new API.
Existing master key API (TSCellSeal(key: ...) or initWithKey:...) should not be used with passphrases or passwords.
Use master key API with symmetric encryption keys, such as generated by TSGenerateSymmetricKey() (#561).
Use passphrase API with human-readable passphrases.
Deprecated API
As a result, the following methods are deprecated. There are no plans for their removal.
Swift ModeDeprecationReplacement TSCellSeal wrap(:, context:)wrap encrypt(:, context:)encrypt unwrapData(:, context:)unwrapData decrypt(:, context:)decrypt TSCellToken wrap(:, context:)wrap encrypt(:, context:)encrypt unwrapData(:, context:)unwrapData decrypt(:, token:, context:)decrypt(:, token:) TSCellContextImprint wrap(:, context:)wrap encrypt(:, context:)encrypt unwrapData(:, context:)unwrapData decrypt(_:, context:)decrypt
Objective-C ModeDeprecationReplacement TSCellSeal wrapData:context:error:wrapData:error: encrypt:context:error:encrypt:error: unwrapData:context:error:unwrapData:error: decrypt:context:error:decrypt:error: TSCellToken wrapData:context:error:wrapData:error: encrypt:context:error:encrypt:error: unwrapData:context:error:unwrapData:error: decrypt:token:context:error:decrypt:token:error: TSCellContextImprint wrapData:context:error:wrapData:error: encrypt:context:error:encrypt:error: unwrapData:context:error:unwrapData:error: decrypt:context:error:decrypt:error:
Breaking changes
objcthemis.framework (#604).We have renamed the Carthage framework from themis.framework to objcthemis.framework in order to improve compatibility with CocoaPods and avoid possible import conflicts with Themis Core.
β οΈ Please migrate to
objcthemis.frameworkin a timely manner.themis.frameworkis deprecated since Themis 0.13 and will be removed in the next release due to maintainability issues.iοΈ Installations via CocoaPods are not affected. If you get Themis via CocoaPods then no action is necessary.
Migration instructions (click to reveal)
After upgrading to Themis 0.13 and running carthage update you will notice that two Themis projects have been built:
*** Building scheme "OpenSSL (iOS)" in OpenSSL.xcodeproj
*** Building scheme "ObjCThemis (iOS)" in ObjCThemis.xcodeproj
*** Building scheme "Themis (iOS)" in Themis.xcodeproj
Your project is currently using "Themis". In order to migrate to "ObjCThemis" you need to do the following:
- update `#import` statements in code (for Objective-C only)
- link against `objcthemis.framework` in Xcode project
- remove link to `themis.framework` in Xcode project
Use the new syntax to import ObjCThemis in Objective-C projects:
// NEW:
#import <objcthemis/objcthemis.h>
// old and deprecated:
#import <themis/themis.h>
The new syntax is now the same as used by CocoaPods.
If you are using Swift, the import syntax is unchanged:
import themis
After updating imports you also need to link against the new framework (regardless of the language).
1. Add `objcthemis.framework` to your project (can be found in `Carthage/Build/iOS` or `Mac`).
2. For each Xcode target:
1. Open **General** tab, **Frameworks and Libraries** section
2. Drag `objcthemis.framework` there. Select _Embed & Sign_ if necessary.
3. Remove `themis.framework` from dependencies.
3. Finally, remove `themis.framework` reference from the project.
Migration is complete, your project should build successfully now.
We are sorry for the inconvenience.
</details>
Java
libthemis-jni packages for supported Linux systems (#552, #553).SecureSocket initialisation (#557).Exception to unchecked RuntimeException, relaxing requirements for throws specifiers (#563).IKey interface with accessors to raw key data (#564).SymmetricKey can be used to generate symmetric keys for Secure Cell (#565)../gradlew :desktop:tasks to learn more
(#633).SecureSession#save and SecureSession#restore methods
(#658).encrypt and decrypt
(#634).Improved Token Protect API (#634).
SecureCellData object.SecureCellData can now be destructured in Kotlin
(#638).// You can now write like this:
val (encrypted, authToken) = cellTP.encrypt(message, context)
// Instead of having to spell it out like this:
val result = cellTP.protect(context, message)
val encrypted = result.protectedData
val authToken = result.additionalData
Secure Cell mode can now be selected by instantiating an appropriate interface:
| New API | Old API |
| ------- | ------- |
| SecureCell.SealWithKey(key) | new SecureCell(key, SecureCell.MODE_SEAL) |
| SecureCell.SealWithPassphrase(passphrase) | not available |
| SecureCell.TokenProtectWithKey(key) | new SecureCell(key, SecureCell.MODE_TOKEN_PROTECT) |
| SecureCell.ContextImprintWithKey(key) | new SecureCell(key, SecureCell.MODE_CONTEXT_IMPRINT) |
In Kotlin:
import com.cossacklabs.themis.SecureCell
val cell = SecureCell.SealWithPassphrase("secret")
val message = "message".toByteArray()
val encrypted = cell.encrypt(message)
val decrypted = cell.decrypt(encrypted)
assertArrayEquals(decrypted, message)
In Java:
import com.cossacklabs.themis.SecureCell;
SecureCell.Seal cell = SecureCell.SealWithPassphrase("secret");
byte[] message = "message".getBytes(StandardCharsets.UTF_8);
byte[] encrypted = cell.encrypt(message);
byte[] decrypted = cell.decrypt(encrypted);
assertArrayEquals(decrypted, message);
You can safely and securely use short, human-readable passphrases as strings with this new API.
Existing symmetric key API (SecureCell.SealWithKey(...) or new SecureCell(...))
should not be used with passphrases or passwords.
Use symmetric key API with symmetric encryption keys,
such as generated by SymmetricKey (#565).
Use passphrase API with human-readable passphrases.
The following items are deprecated:
- Constructors:
- `new SecureCell(int mode)`
- `new SecureCell(byte[] key)`
- `new SecureCell(byte[] key, int mode)`
- `new SecureCell(String password)` β οΈ **not recommended, insecure**
- `new SecureCell(String password, int mode)` β οΈ **not recommended, insecure**
- Methods:
- `protect(byte[] key, byte[] context, byte[] data)`
- `protect(byte[] constext, byte[] data)`
- `protect(String password, String context, byte[] data)` β οΈ **not recommended, insecure**
- `protect(String context, byte[] data)`
- `unprotect(byte[] key, byte[] context, SecureCellData protected)`
- `unprotect(byte[] context, SecureCellData protected)`
- `unprotect(String password, String context, SecureCellData protected)` β οΈ **not recommended, insecure**
- `unprotect(String context, SecureCellData protected)`
- Constants:
- `SecureCell.MODE_SEAL`
- `SecureCell.MODE_TOKEN_PROTECT`
- `SecureCell.MODE_CONTEXT_IMPRINT`
Some methods are not secure when used with short passphrases, consider using new passphrase API instead. Other methods have easier to use replacements in the new API, consider using them instead.
Deprecated API is still supported, there are no plans for its removal.
SecureSession methods save and restore are now deprecated
(#659).An improved API for serialisation might appear in some next version of JavaThemis.
For now, please refrain from using SecureSession#save and SecureSession#restore
which may be removed in the future.
Node.js
SymmetricKey can be used to generate symmetric keys for Secure Cell (#562).make jsthemis can be used to build JsThemis from source (#618).SecureCell now allows null to explicitly specify omitted encryption context (#620).SecureMessage now allows null for omitted keys in sign/verify mode (#620).SecureSession callback (#620).JsThemis now supports passphrase API of Secure Cell in Seal mode:
const themis = require('jsthemis')
let cell = themis.SecureCellSeal.withPassphrase('secret')
let encrypted = cell.encrypt(Buffer.from('message data'))
let decrypted = cell.decrypt(encrypted)
You can safely and securely use short, human-readable passphrases as strings with this new API.
Existing master key API (available as themis.SecureCellSeal.withKey(...)) should not be used with passphrases or passwords.
Use master key API with symmetric encryption keys, such as generated by SymmetricKey (#562).
Use passphrase API with human-readable passphrases.
new is deprecated (#621).Passphrase API makes it ambiguous whether a Secure Cell is initialised with a master key or a passphrase.
All Secure Cell classes β SecureCellSeal, SecureCellTokenProtect, SecureCellContextImprint β
get a static factory method withKey to reduce the ambiguity.
Please use it instead:
// NEW, write like this:
let cell = themis.SecureCellSeal.withKey(secret)
// old, avoid this:
let cell = new themis.SecureCellSeal(secret)
new constructors are not recommended for use but they are still supported and will always work with master keys, as they did before.
PHP
phpthemis_gen_sym_key() can be used to generate symmetric keys for Secure Cell (#561).$encrypted = phpthemis_scell_seal_encrypt_with_passphrase('passphrase', 'message');
$decrypted = phpthemis_scell_seal_decrypt_with_passphrase('passphrase', $encrypted);
You can safely and securely use short, human-readable passphrases as strings with this new API.
Existing master key API (phpthemis_scell_seal_{encrypt,decrypt} and other modes) should not be used with passphrases or passwords.
Use master key API with symmetric encryption keys, such as generated by phpthemis_gen_sym_key() (#561).
Use passphrase API with human-readable passphrases.
Python
skeygen.GenerateSymmetricKey() can be used to generate symmetric keys for Secure Cell (#561).from pythemis.scell import SCellSeal
cell = SCellSeal(passphrase='my passphrase')
encrypted = cell.encrypt(b'message data')
decrypted = cell.decrypt(encrypted)
You can safely and securely use short, human-readable passphrases as strings with this new API.
Existing master key API (SCellSeal(key=...)) should not be used with passphrases or passwords.
Use master key API with symmetric encryption keys, such as generated by GenerateSymmetricKey() (#561).
Use passphrase API with human-readable passphrases.
Python 2 had reached EOL on 2020εΉ΄01ζ01ζ₯.
In fact, we are not making any changes in this release that break compatibility, but we no longer officially support it. This means that we do not run any CI tests for Python 2, and in the future we will develop code compatible only with Python 3+.
π Ruby
Themis::gen_sym_key() can be used to generate symmetric keys for Secure Cell (#561). require 'rbthemis'
cell = Themis::ScellSealPassphrase.new('secret string')
encrypted = cell.encrypt('message data')
decrypted = cell.decrypt(encrypted)
You can safely and securely use short, human-readable passphrases as strings with this new API.
Existing master key API (Themis::Scell...) should not be used with passphrases or passwords.
Use master key API with symmetric encryption keys, such as generated by Themis::gen_sym_key (#561).
Use passphrase API with human-readable passphrases.
| New API | Old API |
| ------- | ------- |
| Themis::ScellSeal.new(key) | Themis::Scell.new(key, Themis::Scell::SEAL_MODE) |
| Themis::ScellSealPassphrase.new(passphrase) | not available |
| Themis::ScellTokenProtect.new(key) | Themis::Scell.new(key, Themis::Scell::TOKEN_PROTECT_MODE) |
| Themis::ScellContextImprint.new(key | Themis::Scell.new(key, Themis::Scell::CONTEXT_IMPRINT_MODE) |
Themis::Scell class is deprecated and should be replaced with new API.
decrypted = cell.decrypt([encrypted, token], context) # old
decrypted = cell.decrypt(encrypted, token, context) # new
(Arrays are still accepted for compatibility but this API is deprecated.)
Rust
themis::keys::SymmetricKey can be used to generate symmetric keys for Secure Cell
(#561,
#631).bindgen crate from dependencies (#626).RustThemis now supports passphrase API of Secure Cell in Seal mode:
use themis::secure_cell::SecureCell;
let cell = SecureCell::with_passphase("secret")?.seal();
let encrypted = cell.encrypt(b"message data")?;
let decrypted = cell.decrypt(&encrypted)?;
You can safely and securely use short, human-readable passphrases as strings with this new API.
Existing master key API (available as SecureCell::with_key(...)) should not be used with passphrases or passwords.
Use master key API with symmetric encryption keys, such as generated by themis::keys::SymmetricKey (#561).
Use passphrase API with human-readable passphrases.
WebAssembly
SymmetricKey can be used to generate symmetric keys for Secure Cell (#561).WasmThemis now supports passphrase API of Secure Cell in Seal mode:
const themis = require('wasm-themis')
let cell = themis.SecureCellSeal.withPassphrase('secret')
let encrypted = cell.encrypt(Buffer.from('message data'))
let decrypted = cell.decrypt(encrypted)
You can safely and securely use short, human-readable passphrases as strings with this new API.
Existing master key API (available as themis.SecureCellSeal.withKey(...)) should not be used with passphrases or passwords.
Use master key API with symmetric encryption keys, such as generated by SymmetricKey (#561).
Use passphrase API with human-readable passphrases.
new is deprecated (#616).Passphrase API makes it ambiguous whether a Secure Cell is initialised with a master key or a passphrase. All Secure Cell classes β
SecureCellSeal, SecureCellTokenProtect, SecureCellContextImprint β get a static factory method withKey to reduce the ambiguity. Please use it instead:
// NEW, write like this:
let cell = themis.SecureCellSeal.withKey(secret)
// old, avoid this:
let cell = new themis.SecureCellSeal(secret)
new constructors are not recommended for use but they are still supported and will always work with master keys, as they did before.
π Docs:
Infrastructure:
make dist to themis_X.Y.Z.tar.gz
(#544).benches
(#580,
#582).make jsthemis builds JsThemis from source (#618).make install
(#645../configure script to significantly improve rebuild performance
(#611,
#628).β‘οΈ Miscellaneous minor improvements and updates in the build system (#542, #573, #615, #617, #629, #627, #632, #644, #646, #649, #656).
π New supported platforms
π₯ Breaking changes
Updates in Gradle build infrastructure require Java 8.
This version is no longer maintained by the Debian team and it lacks Java 8. We no longer provide binary packages for this distribution.
Python 2 had finally reached EOL on 2020εΉ΄01ζ01ζ₯. PyThemis 0.13 is the last version guaranteed to be compatible with Python 2.
Fixed an issue in WasmThemis which caused an error when packaging with webpack (#568).
TL;DR:
π₯ Breaking changes:
/usr to /usr/local. If youβre affected, read the instructions on how to make a clean upgrade below.rubythemis gem has been completely removed in favour of rbthemis.Code:
Core
Improved security and code quality, implemented better handling of secrets and memory management. These changes decrease the chance of potential memory leaks.
soter_wipe().
It can be used to securely wipe sensitive data from memory after it's no longer needed.
All Themis cryptosystems now use this new API (#488)./usr/local by default when building from source on Linux (#448).This may be a breaking change if your system has non-standard precedence rules. If you install Themis from source code directly, please do a clean upgrade the following way:
make uninstall PREFIX=/usr
make install PREFIX=/usr/local
Please consider using binary repositories to install Themis. If your system or package manager is not supported yet, please let us know via dev@cossacklabs.com.
Multiarch enables parallel installation of 32-bit and 64-bit versions of the library. This is particularly important on CentOS where some tools like pkg-config would fail to locate Themis due to non-standard installation path.
libdir (#453, #455).make nsis_installer command in MSYS2 environment.
You can read more about MSYS2 target here (#474).Android
C++
Use
libthemispp-dev for Debian and Ubuntu,libthemispp-devel for CentOS.Go
The old names are now deprecated and scheduled for removal in the next release. Please migrate to using the new names when you upgrade.
| Old API | New API |
| -------------------------------------- | -------------------------- |
| cell.CELL_MODE_SEAL | cell.ModeSeal |
| compare.COMPARE_MATCH | compare.Match |
| keys.KEYTYPE_EC | keys.TypeEC |
| session.STATE_ESTABLISHED | session.StateEstablished |
| (*session.SecureSession) GetRemoteId | GetRemoteID |
π iOS, macOS
Java
Node.js
PHP
π Ruby
rubythemis gem has been completely removed after being deprecated in Themis 0.11.
Please use require 'rbthemis' in your projects (#508).Rust
WebAssembly
WasmThemis supports the full functionality of other Themis wrappers:
Secure Cell, Secure Message, Secure Session, and Secure Comparator.
WasmThemis package is available via npm as wasm-themis,
sample code can be found in docs/examples/js,
and the How-To guide is available on the documentation server (#457, #461, #462, #473, #482, #489, #490, #491, #492,#494, #495, #498, #507, #513).
π Windows
π Docs:
π Themis GitHub Wiki is being deprecated. Please find the latest documentation for Themis on Cossack Labs Documentation Server. If you're used to using the Themis Wiki or have bookmarked a few pages for further use, don't worry - its pages and table of contents stay where they were, but each will now link to its corresponding Cossack Labs Documentation Server counterpart.
Code of Conduct has been introduced to make sure that Themis project has a welcoming environment (#518).
π Improved and updated installation guides for numerous languages and platforms.
Infrastructure:
π New Makefile targets and use cases:
emmake make all builds WasmThemis in Emscripten environment (#475);make all can be run in MSYS2 environment on Windows now (#469);make nsis_installer builds NSIS installer for Windows binaries (#474);make deb and make rpm now build ThemisPP packages, too (#506);NO_NIST_STS environment variable can be used to disable the long-running NIST statistical test suite when doing make test (#456).β Removed Makefile targets:
rubythemis targets have been completely removed.
Use make rbthemis_install to install RubyThemis instead (#508).β‘οΈ Multiple updates in the way Themis is installed and packaged.
The most significant are switch to /usr/local for installation from source code and added support for multiarch installation packages (Read more).
β JsThemis and WasmThemis are now tested on all current LTS versions of Node.js (#502, #510).
β Integration tests are getting stronger with WebAssembly platform being added to the suite (#511).
β CI servers are now using the latest RVM for testing RubyThemis (#503, #504).