Building and Installation
=========================

How to Build
------------

To build and install OpenSSL GOST Engine, you will need

* OpenSSL 3.0 development version
* an ANSI C compiler
* CMake (3.0 or newer, 3.18 recommended)

Here is a quick build guide:

    $ git clone https://github.com/gost-engine/engine
    $ cd engine
    $ git submodule update --init
    $ mkdir build
    $ cd build
    $ cmake -DCMAKE_BUILD_TYPE=Release ..
    $ cmake --build . --config Release

Instead of `Release` you can use `Debug`, `RelWithDebInfo` or `MinSizeRel` configuration.
See [cmake docs](https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html) for details.
You will find built binaries in `../bin` directory.

If you want to build against a specific OpenSSL instance (you will need it if
you have more than one OpenSSL instance for example), you can use the `cmake`
variable `OPENSSL_ROOT_DIR` to specify absolute path of the desirable OpenSSL
instance:

    $ cmake -DOPENSSL_ROOT_DIR=/PATH/TO/OPENSSL/ ..

Building against OpenSSL 3.0 requires openssl detection module
(FindOpenSSL.cmake) from CMake 3.18 or higher. More earlier versions may have
problems with it.

If you use Visual Studio, you can also set `CMAKE_INSTALL_PREFIX` variable
to set install path, like this:

    > cmake -G "Visual Studio 15 Win64" -DCMAKE_PREFIX_PATH=c:\OpenSSL\vc-win64a\ -DCMAKE_INSTALL_PREFIX=c:\OpenSSL\vc-win64a\ ..

Also instead of `cmake --build` tool you can just open `gost-engine.sln`
in Visual Studio, select configuration and call `Build Solution` manually.

Instructions how to build OpenSSL 1.1.0 with Microsoft Visual Studio
you can find [there](https://gist.github.com/terrillmoore/995421ea6171a9aa50552f6aa4be0998).

How to Install
--------------

To install GOST Engine you can call:

    # cmake --build . --target install --config Release

or old plain and Unix only:

    # make install

The engine library `gost.so` should be installed into OpenSSL engine directory.

To ensure that it is installed propery call:

    $ openssl version -e
    ENGINESDIR: "/usr/lib/i386-linux-gnu/engines-1.1"

Then check that `gost.so` there

    # ls /usr/lib/i386-linux-gnu/engines-1.1

Finally, to start using GOST Engine through OpenSSL, you should edit
`openssl.cnf` configuration file as specified below.


How to Configure
----------------

The very minimal example of the configuration file is provided in this
distribution and named `example.conf`.

Configuration file should include following statement in the global
section, i.e. before first bracketed section header (see config(5) for details)

    openssl_conf = openssl_def

where `openssl_def` is name of the section in configuration file which
describes global defaults.

This section should contain following statement:

    [openssl_def]
    engines = engine_section

which points to the section which describes list of the engines to be
loaded. This section should contain:

    [engine_section]
    gost = gost_section

And section which describes configuration of the engine should contain

    [gost_section]
    engine_id = gost
    dynamic_path = /usr/lib/ssl/engines/libgost.so
    default_algorithms = ALL

Various cryptoproviders (e.g. BouncyCastle) has some problems with private key
parsing from PrivateKeyInfo, so if you want to use old private key
representation format, which supported by BC, you will have to add:

    GOST_PK_FORMAT = LEGACY_PK_WRAP

to `[gost_section]`.

Where `engine_id` parameter specifies name of engine (should be `gost`).

`dynamic_path is` a location of the loadable shared library implementing the
engine. If the engine is compiled statically or is located in the OpenSSL
engines directory, this line can be omitted.

`default_algorithms` parameter specifies that all algorithms, provided by
engine, should be used.

The `CRYPT_PARAMS` parameter is engine-specific. It allows the user to choose
between different parameter sets of symmetric cipher algorithm. [RFC 4357][1]
specifies several parameters for the GOST 28147-89 algorithm, but OpenSSL
doesn't provide user interface to choose one when encrypting. So use engine
configuration parameter instead. It SHOULD NOT be used nowadays because all
the parameters except the default one are deprecated now.

Value of this parameter can be either short name, defined in OpenSSL
`obj_dat.h` header file or numeric representation of OID, defined in
[RFC 4357][1].

[1]:https://tools.ietf.org/html/rfc4357 "RFC 4357"


Docker Image Building
========================

Overview
--------

This article describes how to build Docker images with a pre-built OpenSSL GOST engine for various Linux distributions.

Available Images

- alpine - Minimal image based on Alpine Linux
- debian - Image based on Debian Trixie

Prerequisites

- Docker
- GNU Make (optional)

Building with Make

To build a specific image:

    $ cd docker
    $ make alpine
    $ make debian

This will create images tagged as `gost-engine:<version>-<distro>`.

Building without Make
---------------------
To build images manually using Docker:

    $ cd docker
    $ docker build -f docker/Dockerfile.alpine -t gost-engine:latest-alpine .
    $ docker build -f docker/Dockerfile.debian -t gost-engine:latest-debian .

Verification
------------
After building, verify that the images work correctly:

    $ cd docker
    $ docker run --rm gost-engine:latest-alpine openssl version
    $ docker run --rm gost-engine:latest-alpine openssl engine -t gost

The images include:

- OpenSSL with GOST engine support
- gostsum and gost12sum utilities
- Pre-configured openssl.cnf with GOST enabled

Image Contents
--------------
Each image contains:
- OpenSSL with GOST engine
- GOST cipher support
- Command-line utilities
- Proper CA certificates configuration

The images are optimized for size and include only runtime dependencies.