3 This engine provides implementation of Russian cryptography standard.
4 This is also an example of adding new cryptoalgorithms into OpenSSL
5 without changing its core. If OpenSSL is compiled with dynamic engine
6 support, new algorithms can be added even without recompilation of
7 OpenSSL and applications which use it.
11 GOST R 34.10-94 and GOST R 34.10-2001 - digital signature algorithms.
12 Also support key exchange based on public keys. See RFC 4357 for
13 details of VKO key exchange algorithm. These algorithms use
14 256 bit private keys. Public keys are 1024 bit for 94 and 512 bit for
15 2001 (which is elliptic-curve based). Key exchange algorithms
16 (VKO R 34.10) are supported on these keys too.
18 GOST R 34.11-94 Message digest algorithm. 256-bit hash value
20 GOST 28147-89 - Symmetric cipher with 256-bit key. Various modes are
21 defined in the standard, but only CFB and CNT modes are implemented
22 in the engine. To make statistical analysis more difficult, key
23 meshing is supported (see RFC 4357).
25 GOST 28147-89 MAC mode. Message authentication code. While most MAC
26 algorithms out there are based on hash functions using HMAC
27 algorithm, this algoritm is based on symmetric cipher.
28 It has 256-bit symmetric key and only 32 bits of MAC value
29 (while HMAC has same key size and value size).
31 Really, this algorithm supports from 8 to 64 bits of the MAC value
33 It is implemented as combination of EVP_PKEY type and EVP_MD type.
35 USAGE OF THESE ALGORITHMS
37 This engine is designed to allow usage of this algorithms in the
38 high-level openssl functions, such as PKI, S/MIME and TLS.
40 See RFC 4490 for S/MIME with GOST algorithms and RFC 4491 for PKI.
41 TLS support is implemented according IETF
42 draft-chudov-cryptopro-cptls-03.txt and is compatible with
43 CryptoPro CSP 3.0 and 3.6 as well as with MagPro CSP.
44 GOST ciphersuites implemented in CryptoPro CSP 2.0 are not supported
45 because they use ciphersuite numbers used now by AES ciphersuites.
47 To use the engine you have to load it via openssl configuration
48 file. Applications should read openssl configuration file or provide
49 their own means to load engines. Also, applications which operate with
50 private keys, should use generic EVP_PKEY API instead of using RSA or
51 other algorithm-specific API.
55 Configuration file should include following statement in the global
56 section, i.e. before first bracketed section header (see config(5) for details)
58 openssl_conf = openssl_def
60 where openssl_def is name of the section in configuration file which
61 describes global defaults.
63 This section should contain following statement:
66 engines = engine_section
68 which points to the section which describes list of the engines to be
69 loaded. This section should contain:
74 And section which describes configuration of the engine should contain
78 dynamic_path = /usr/lib/ssl/engines/libgost.so
79 default_algorithms = ALL
80 CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet
82 Where engine_id parameter specifies name of engine (should be "gost").
83 dynamic_path is a location of the loadable shared library implementing the
84 engine. If the engine is compiled statically or is located in the OpenSSL
85 engines directory, this line can be omitted.
86 default_algorithms parameter specifies that all algorithms, provided by
87 engine, should be used.
89 The CRYPT_PARAMS parameter is engine-specific. It allows the user to choose
90 between different parameter sets of symmetric cipher algorithm. RFC 4357
91 specifies several parameters for the GOST 28147-89 algorithm, but OpenSSL
92 doesn't provide user interface to choose one when encrypting. So use engine
93 configuration parameter instead.
95 Value of this parameter can be either short name, defined in OpenSSL
96 obj_dat.h header file or numeric representation of OID, defined in RFC
99 USAGE WITH COMMAND LINE openssl UTILITY
101 1. Generation of private key
103 openssl genpkey -algorithm gost2001 -pkeyopt paramset:A -out seckey.pem
105 Use -algorithm option to specify algorithm.
106 Use -pkeyopt option to pass paramset to algorithm. The following paramsets
108 gost94: 0,A,B,C,D,XA,XB,XC
109 gost2001: 0,A,B,C,XA,XB
110 You can also use numeric representation of OID as to destinate
113 Paramsets starting with X are intended to use for key exchange keys.
114 Paramsets without X are for digital signature keys.
116 Paramset for both algorithms 0 is the test paramset which should be used
117 only for test purposes.
119 There are no algorithm-specific things with generation of certificate
120 request once you have a private key.
122 2. Generation of certificate request along with private/public keypar
124 openssl req -newkey gost2001 -pkeyopt paramset:A
126 Syntax of -pkeyopt parameter is identical with genpkey command.
128 You can also use oldstyle syntax -newkey gost2001:paramfile, but in
129 this case you should create parameter file first.
131 It can be created with
133 openssl genpkey -genparam -algorithm gost2001 -pkeyopt paramset:A\
138 If you want to send encrypted mail using GOST algorithms, don't forget
139 to specify -gost89 as encryption algorithm for OpenSSL smime command.
140 While OpenSSL is clever enough to find out that GOST R 34.11-94 digest
141 must be used for digital signing with GOST private key, it have no way
142 to derive symmetric encryption algorithm from key exchange keys.
146 OpenSSL supports all four ciphersuites defined in the IETF draft.
147 Once you've loaded GOST key and certificate into your TLS server,
148 ciphersuites which use GOST 28147-89 encryption are enabled.
150 Ciphersuites with NULL encryption should be enabled explicitely if
153 GOST2001-GOST89-GOST89 Uses GOST R 34.10-2001 for auth and key exchange
154 GOST 28147-89 for encryption and GOST 28147-89 MAC
155 GOST94-GOST89-GOST89 Uses GOST R 34.10-94 for auth and key exchange
156 GOST 28147-89 for encryption and GOST 28147-89 MAC
157 GOST2001-NULL-GOST94 Uses GOST R 34.10-2001 for auth and key exchange,
158 no encryption and HMAC, based on GOST R 34.11-94
159 GOST94-NULL-GOST94 Uses GOST R 34.10-94 for auth and key exchange,
160 no encryption and HMAC, based on GOST R 34.11-94
162 Gost 94 and gost 2001 keys can be used simultaneously in the TLS server.
163 RSA, DSA and EC keys can be used simultaneously with GOST keys, if
164 server implementation supports loading more than two private
165 key/certificate pairs. In this case ciphersuites which use any of loaded
166 keys would be supported and clients can negotiate ones they wish.
168 This allows creation of TLS servers which use GOST ciphersuites for
169 Russian clients and RSA/DSA ciphersuites for foreign clients.
171 5. Calculation of digests and symmetric encryption
172 OpenSSL provides specific commands (like sha1, aes etc) for calculation
173 of digests and symmetric encryption. Since such commands cannot be
174 added dynamically, no such commands are provided for GOST algorithms.
175 Use generic commands 'dgst' and 'enc'.
177 Calculation of GOST R 34.11-94 message digest
179 openssl dgst -md_gost94 datafile
181 Note that GOST R 34.11-94 specifies that digest value should be
182 interpreted as little-endian number, but OpenSSL outputs just hex dump
185 So, to obtain correct digest value, such as produced by gostsum utility
186 included in the engine distribution, bytes of output should be
189 Calculation of HMAC based on GOST R 34.11-94
191 openssl dgst -md_gost94 -mac hmac -macopt key:<32 bytes of key> datafile
193 (or use hexkey if key contain NUL bytes)
194 Calculation of GOST 28147 MAC
196 openssl dgst -mac gost-mac -macopt key:<32 bytes of key> datafile
198 Note absence of an option that specifies digest algorithm. gost-mac
199 algorithm supports only one digest (which is actually part of
200 implementation of this mac) and OpenSSL is clever enough to find out
203 Following mac options are supported:
205 key:(32 bytes of key)
207 hexkey:(64 hexadecimal digits of key)
209 Engine support calculation of mac with size different from default 32
210 bits. You can set mac size to any value from 1 to 8 bytes using
212 -sigopt size:(number from 1 to 8 - mac size in bytes)
214 (dgst command uses different EVP_PKEY_CTX for initialization and for
215 finalization of MAC. Option of first are set via -macopt, and for
216 second via -sigopt. Key should be set during initialization and size
217 during finalization. If you use API functions
218 EVP_DigestSignInit/EVP_DigestSignFinal, you can set both options at
221 Encryption with GOST 28147 CFB mode
222 openssl enc -gost89 -out encrypted-file -in plain-text-file -k <passphrase>
223 Encryption with GOST 28147 CNT mode
224 openssl enc -gost89-cnt -out encrypted-file -in plain-text-file -k <passphrase>
225 Encryption with GOST 28147 CBC mode
226 openssl enc -gost89-cbc -out encrypted-file -in plain-text-file -k <passphrase>
228 6. Encrypting private keys and PKCS12
230 To produce PKCS12 files compatible with MagPro CSP, you need to use
231 GOST algorithm for encryption of PKCS12 file and also GOST R 34.11-94
232 hash to derive key from password.
234 openssl pksc12 -export -inkey gost.pem -in gost_cert.pem -keypbe gost89\
235 -certpbe gost89 -macalg md_gost94
237 7. Testing speed of symmetric ciphers.
239 To test performance of GOST symmetric ciphers you should use -evp switch
240 of the openssl speed command. Engine-provided ciphers couldn't be
241 accessed by cipher-specific functions, only via generic evp interface
243 openssl speed -evp gost89
244 openssl speed -evp gost89-cnt
245 openssl speed -evp gost89-cbc
248 PROGRAMMING INTERFACES DETAILS
250 Applications never should access engine directly. They only use provided
251 EVP_PKEY API. But there are some details, which should be taken into
254 EVP provides two kinds of API for key exchange:
256 1. EVP_PKEY_encrypt/EVP_PKEY_decrypt functions, intended to use with
257 RSA-like public key encryption algorithms
259 2. EVP_PKEY_derive, intended to use with Diffie-Hellman-like shared key
260 computing algorithms.
262 Although VKO R 34.10 algorithms, described in the RFC 4357 are
263 definitely second case, engine provides BOTH API for GOST R 34.10 keys.
265 EVP_PKEY_derive just invokes appropriate VKO algorithm and computes
266 256 bit shared key. VKO R 34.10-2001 requires 64 bits of random user key
267 material (UKM). This UKM should be transmitted to other party, so it is
268 not generated inside derive function.
270 It should be set by EVP_PKEY_CTX_ctrl function using
271 EVP_PKEY_CTRL_SET_IV command after call of EVP_PKEY_derive_init, but
272 before EVP_PKEY_derive.
273 unsigned char ukm[8];
275 EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_DERIVE, 8, ukm)
277 EVP_PKEY_encrypt encrypts provided session key with VKO shared key and
278 packs it into GOST key transport structure, described in the RFC 4490.
280 It typically uses ephemeral key pair to compute shared key and packs its
281 public part along with encrypted key. So, for most cases use of
282 EVP_PKEY_encrypt/EVP_PKEY_decrypt with GOST keys is almost same as with
285 However, if peerkey field in the EVP_PKEY_CTX structure is set (using
286 EVP_PKEY_derive_set_peerkey function) to EVP_PKEY structure which has private
287 key and uses same parameters as the public key from which this EVP_PKEY_CTX is
288 created, EVP_PKEY_encrypt will use this private key to compute shared key and
289 set ephemeral key in the GOST_key_transport structure to NULL. In this case
290 pkey and peerkey fields in the EVP_PKEY_CTX are used upside-down.
292 If EVP_PKEY_decrypt encounters GOST_key_transport structure with NULL
293 public key field, it tries to use peerkey field from the context to
294 compute shared key. In this case peerkey field should really contain
297 Encrypt operation supports EVP_PKEY_CTRL_SET_IV operation as well.
298 It can be used when some specific restriction on UKM are imposed by
299 higher level protocol. For instance, description of GOST ciphersuites
300 requires UKM to be derived from shared secret.
302 If UKM is not set by this control command, encrypt operation would
306 This sources include implementation of GOST 28147-89 and GOST R 34.11-94
307 which are completely indepentent from OpenSSL and can be used separately
308 (files gost89.c, gost89.h, gosthash.c, gosthash.h) Utility gostsum (file
309 gostsum.c) is provided as example of such separate usage. This is
310 program, simular to md5sum and sha1sum utilities, but calculates GOST R
313 Makefile doesn't include rule for compiling gostsum.
316 $(CC) -o gostsum gostsum.c gost89.c gosthash.c
317 where $(CC) is name of your C compiler.
319 Implementations of GOST R 34.10-xx, including VKO algorithms heavily
320 depends on OpenSSL BIGNUM and Elliptic Curve libraries.