Skip to content

Commit d5e9022

Browse files
authored
Merge pull request gost-engine#482 from VladGud/tls13
Implement provider interface to support GOST TLS 1.3
2 parents 806d9ee + a3b8c79 commit d5e9022

72 files changed

Lines changed: 5439 additions & 634 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/before_script.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ if [ "${APT_INSTALL-}" ]; then
1212
fi
1313

1414
git clone --depth 1 -b $OPENSSL_BRANCH https://github.com/openssl/openssl.git
15+
if [ "${PATCH_OPENSSL}" == "1" ]; then
16+
git apply patches/openssl-tls1.3.patch
17+
fi
1518
cd openssl
1619
git describe --always --long
1720

.github/script.sh

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ PATH=$PREFIX/bin:$PATH
55

66
mkdir build
77
cd build
8-
cmake -DOPENSSL_ROOT_DIR=$PREFIX -DOPENSSL_ENGINES_DIR=$PREFIX/engines ${ASAN-} ..
8+
cmake -DTLS13_PATCHED_OPENSSL=$PATCH_OPENSSL -DOPENSSL_ROOT_DIR=$PREFIX -DOPENSSL_ENGINES_DIR=$PREFIX/engines ${ASAN-} ..
99
make
1010
make test CTEST_OUTPUT_ON_FAILURE=1
1111
if [ -z "${ASAN-}" ]; then
12-
make tcl_tests
12+
make tcl_tests_engine
13+
make tcl_tests_provider
1314
fi

.github/workflows/ci.yml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@ name: CI
22
on: [push, pull_request]
33

44
env:
5-
OPENSSL_BRANCH: openssl-3.0
5+
OPENSSL_BRANCH: openssl-3.4.2
66
USE_RPATH: yes
7+
PATCH_OPENSSL: 0
8+
GOST_PROVIDER_ENABLE_ONLINE_TESTS: 1
79

810
jobs:
911
gcc-openssl-stable:
1012
runs-on: ubuntu-latest
13+
env:
14+
PATCH_OPENSSL: 1
1115
steps:
1216
- uses: actions/checkout@v2
1317
with:
@@ -19,6 +23,7 @@ jobs:
1923
runs-on: ubuntu-latest
2024
env:
2125
CC: clang
26+
PATCH_OPENSSL: 1
2227
steps:
2328
- uses: actions/checkout@v2
2429
with:
@@ -30,6 +35,8 @@ jobs:
3035
runs-on: macos-latest
3136
env:
3237
USE_RPATH:
38+
PATCH_OPENSSL: 1
39+
GOST_PROVIDER_ENABLE_ONLINE_TESTS: 0 # macOS runner has no network access to infotecs TLS1.3 server
3340
steps:
3441
- uses: actions/checkout@v2
3542
with:
@@ -92,6 +99,7 @@ jobs:
9299
LDFLAGS: -m32
93100
SETARCH: "setarch i386"
94101
APT_INSTALL: gcc-multilib
102+
PATCH_OPENSSL: 1
95103
steps:
96104
- uses: actions/checkout@v2
97105
with:

.github/workflows/codeql-analysis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: "CodeQL"
22

33
env:
4-
OPENSSL_BRANCH: openssl-3.0
4+
OPENSSL_BRANCH: openssl-3.4.2
55
#RPATH: "-Wl,-rpath=${PREFIX}/lib"
66
#PREFIX: ${HOME}/opt
77
#PATH: ${PREFIX}/bin:${PATH}

.github/workflows/coverity.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ jobs:
1010
runs-on: ubuntu-latest
1111
if: ${{ github.repository_owner == 'gost-engine' || github.event_name == 'workflow_dispatch' }}
1212
env:
13-
OPENSSL_BRANCH: openssl-3.0
13+
OPENSSL_BRANCH: openssl-3.4.2
1414
USE_RPATH: yes
15+
PATCH_OPENSSL: 1
16+
GOST_PROVIDER_ENABLE_ONLINE_TESTS: 0
1517

1618
steps:
1719
- uses: actions/checkout@v2

.github/workflows/windows.yml

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,27 @@ jobs:
77
outputs:
88
openssl-head: ${{ steps.openssl.outputs.head }}
99
steps:
10+
- uses: actions/checkout@v2
1011
- uses: actions/checkout@v2
1112
with:
1213
repository: openssl/openssl
14+
path: openssl
15+
ref: openssl-3.4.2
1316
fetch-depth: 0
14-
- run: echo "::set-output name=head::$(git describe --always --long)"
17+
- run: echo "::set-output name=head::$(git -C openssl describe --always --long)"
1518
id: openssl
1619
- uses: actions/cache@v4
1720
id: cache
1821
with:
19-
path: _dest
22+
path: openssl/_dest
2023
key: ${{ runner.os }}-openssl-${{ steps.openssl.outputs.head }}
24+
- name: Apply patches
25+
run: |
26+
git apply patches/openssl-tls1.3.patch
2127
- uses: ilammy/msvc-dev-cmd@v1
2228
- name: Build OpenSSL
2329
if: steps.cache.outputs.cache-hit != 'true'
30+
working-directory: openssl
2431
run: |
2532
perl Configure no-makedepend no-tests no-asm VC-WIN64A
2633
perl configdata.pm --dump
@@ -36,13 +43,13 @@ jobs:
3643
submodules: true
3744
- uses: actions/cache@v4
3845
with:
39-
path: _dest
46+
path: openssl/_dest
4047
key: ${{ runner.os }}-openssl-${{ needs.msvc-openssl.outputs.openssl-head }}
41-
- run: cmake -DOPENSSL_ROOT_DIR="_dest\Program Files\OpenSSL" -DOPENSSL_ENGINES_DIR=bin .
48+
- run: cmake -DOPENSSL_ROOT_DIR="openssl\_dest\Program Files\OpenSSL" -DOPENSSL_ENGINES_DIR=bin .
4249
- run: cmake --build .
4350
- name: Run tests
4451
run: |
45-
$env:PATH = "$env:PATH;$pwd\_dest\Program Files\OpenSSL\bin"
52+
$env:PATH = "$pwd\openssl\_dest\Program Files\OpenSSL\bin;$env:PATH"
4653
$env:OPENSSL_ENGINES = "$pwd\bin\Debug"
4754
$env:OPENSSL_MODULES = "$pwd\bin\Debug"
4855
ctest -C Debug --output-on-failure

CMakeLists.txt

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ include(CheckCSourceRuns)
88

99
enable_testing()
1010

11-
find_package(OpenSSL 3.0 REQUIRED)
11+
find_package(OpenSSL 3.4 REQUIRED)
1212

1313
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
1414
message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.")
@@ -29,12 +29,12 @@ if (CMAKE_C_COMPILER_ID MATCHES "Clang")
2929
set(CMAKE_C_FLAGS_RELEASE -O2)
3030
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
3131
set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -ggdb")
32-
add_compile_options(-Werror -Wall -Wno-unused-parameter -Wno-unused-function -Wno-missing-braces -Qunused-arguments -Wno-deprecated-declarations)
32+
add_compile_options(-Werror -Wall -Wno-unused-parameter -Wno-unused-function -Wno-missing-braces -Qunused-arguments -Wno-deprecated-declarations -Wno-error=\#warnings)
3333
elseif(CMAKE_C_COMPILER_ID MATCHES "GNU")
3434
set(CMAKE_C_FLAGS_RELEASE -O2)
3535
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
3636
set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -ggdb")
37-
add_compile_options(-Werror -Wall -Wno-unused-parameter -Wno-unused-function -Wno-missing-braces -Wno-error=unknown-pragmas -Wno-error=pragmas -Wno-deprecated-declarations)
37+
add_compile_options(-Werror -Wall -Wno-unused-parameter -Wno-unused-function -Wno-missing-braces -Wno-error=unknown-pragmas -Wno-error=pragmas -Wno-deprecated-declarations -Wno-error=cpp)
3838
elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC")
3939
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
4040
add_definitions(-D_CRT_DEPRECATED_NO_WARNINGS)
@@ -204,15 +204,25 @@ set(GOST_ENGINE_SOURCE_FILES
204204

205205
set(GOST_PROV_SOURCE_FILES
206206
gost_prov.c
207+
gost_prov.h
207208
gost_prov_cipher.c
208209
gost_prov_digest.c
209210
gost_prov_mac.c
211+
gost_prov_keymgmt.c
212+
gost_prov_encoder.c
213+
gost_prov_signature.c
214+
gost_prov_decoder.c
215+
gost_prov_keyexch.c
216+
gost_prov_tls.c
217+
gost_prov_tls.h
210218
)
211219

212220
set(TEST_ENVIRONMENT_COMMON
221+
TLS13_PATCHED_OPENSSL=${TLS13_PATCHED_OPENSSL}
213222
CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}
214223
PERL5LIB=${CMAKE_CURRENT_SOURCE_DIR}/test
215224
OPENSSL_PROGRAM=${OPENSSL_PROGRAM}
225+
OPENSSL_MODULES=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
216226
OPENSSL_CRYPTO_LIBRARY=${OPENSSL_CRYPTO_LIBRARY}
217227
)
218228

@@ -247,6 +257,13 @@ set_tests_properties(ciphers-with-provider
247257
PROPERTIES ENVIRONMENT "${TEST_ENVIRONMENT_PROVIDER}")
248258

249259
# test_curves is an internals testing program, it doesn't need a test env
260+
261+
add_executable(test_ecdhe test_ecdhe.c)
262+
target_link_libraries(test_ecdhe gost_core gost_err)
263+
add_test(NAME ecdhe COMMAND test_ecdhe)
264+
set_tests_properties(ecdhe
265+
PROPERTIES ENVIRONMENT "${TEST_ENVIRONMENT_ENGINE}")
266+
250267
add_executable(test_curves test_curves.c)
251268
target_link_libraries(test_curves gost_core gost_err)
252269
add_test(NAME curves COMMAND test_curves)
@@ -295,14 +312,17 @@ add_executable(test_gost89 test_gost89.c)
295312
target_link_libraries(test_gost89 gost_core gost_err)
296313
add_test(NAME gost89 COMMAND test_gost89)
297314

298-
add_executable(test_mgm test_mgm.c)
299-
target_link_libraries(test_mgm OpenSSL::Crypto)
300-
add_test(NAME mgm-with-engine COMMAND test_mgm)
301-
set_tests_properties(mgm-with-engine
302-
PROPERTIES ENVIRONMENT "${TEST_ENVIRONMENT_ENGINE}")
303-
add_test(NAME mgm-with-provider COMMAND test_mgm)
304-
set_tests_properties(mgm-with-provider
305-
PROPERTIES ENVIRONMENT "${TEST_ENVIRONMENT_PROVIDER}")
315+
if(TLS13_PATCHED_OPENSSL)
316+
add_executable(test_mgm test_mgm.c)
317+
target_link_libraries(test_mgm OpenSSL::Crypto)
318+
add_test(NAME mgm-with-engine COMMAND test_mgm)
319+
set_tests_properties(mgm-with-engine
320+
PROPERTIES ENVIRONMENT "${TEST_ENVIRONMENT_ENGINE}")
321+
add_test(NAME mgm-with-provider COMMAND test_mgm)
322+
set_tests_properties(mgm-with-provider
323+
PROPERTIES ENVIRONMENT "${TEST_ENVIRONMENT_PROVIDER}")
324+
set_property(TARGET test_mgm APPEND PROPERTY COMPILE_DEFINITIONS ENGINE_DIR="${OUTPUT_DIRECTORY}")
325+
endif()
306326

307327
if(NOT SKIP_PERL_TESTS)
308328
execute_process(COMMAND perl -MTest2::V0 -e ""
@@ -330,14 +350,14 @@ set(BINARY_TESTS_TARGETS
330350
test_digest
331351
test_ciphers
332352
test_curves
353+
test_ecdhe
333354
test_params
334355
test_derive
335356
test_sign
336357
test_context
337358
test_keyexpimp
338359
test_gost89
339360
test_tls
340-
test_mgm
341361
)
342362
set_property(TARGET ${BINARY_TESTS_TARGETS} APPEND PROPERTY COMPILE_DEFINITIONS ENGINE_DIR="${OUTPUT_DIRECTORY}")
343363

@@ -410,12 +430,23 @@ add_custom_target(tags
410430
COMMAND ctags -R . ${OPENSSL_ROOT_DIR}
411431
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
412432

413-
add_custom_target(tcl_tests
433+
add_custom_target(tcl_tests_provider
434+
COMMAND OPENSSL_LIBCRYPTO=${OPENSSL_CRYPTO_LIBRARY}
435+
OPENSSL_APP=${OPENSSL_PROGRAM}
436+
TESTSRC=${CMAKE_SOURCE_DIR}/tcl_tests
437+
TESTDIR=${CMAKE_BINARY_DIR}/tcl_tests_provider
438+
OPENSSL_MODULES_DIR=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
439+
OPENSSL_CONF=${CMAKE_SOURCE_DIR}/tcl_tests/openssl-gost-provider.cnf
440+
sh ./runtest.sh
441+
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tcl_tests)
442+
443+
add_custom_target(tcl_tests_engine
414444
COMMAND OPENSSL_LIBCRYPTO=${OPENSSL_CRYPTO_LIBRARY}
415445
OPENSSL_APP=${OPENSSL_PROGRAM}
416446
TESTSRC=${CMAKE_SOURCE_DIR}/tcl_tests
417447
TESTDIR=${CMAKE_BINARY_DIR}/tcl_tests
418448
ENGINE_DIR=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
449+
OPENSSL_CONF=${CMAKE_SOURCE_DIR}/tcl_tests/openssl-gost-engine.cnf
419450
sh ./runtest.sh
420451
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tcl_tests)
421452

README.prov.md

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,49 @@ MACs:
3737
- kuznyechik-mac
3838
- kuznyechik-ctr-acpkm-omac
3939

40-
## TODO, not requiring additional OpenSSL support
40+
Keymgmt:
4141

42-
- Basic support for GOST keys, i.e. implementations of KEYMGMT
43-
(including key generation), DECODER and DECODER.
42+
- id-GostR3410-2001 ("GOST R 34.10-2001", "1.2.643.2.2.19")
43+
- id-GostR3410-2001DH ("GOST R 34.10-2001 DH", "1.2.643.2.2.98")
44+
- gost2012_256 ("GOST R 34.10-2012 with 256 bit modulus", "1.2.643.7.1.1.1.1")
45+
- gost2012_512 ("GOST R 34.10-2012 with 512 bit modulus", "1.2.643.7.1.1.1.2")
4446

45-
- Support for these operations using GOST keys:
47+
Encoder:
48+
- id-GostR3410-2001 ("GOST R 34.10-2001", "1.2.643.2.2.19") with structure format = pem/der/text
49+
- id-GostR3410-2001DH ("GOST R 34.10-2001 DH", "1.2.643.2.2.98") with structure format = pem/der/text
50+
- gost2012_256 ("GOST R 34.10-2012 with 256 bit modulus", "1.2.643.7.1.1.1.1") with structure format = pem/der/text
51+
- gost2012_512 ("GOST R 34.10-2012 with 512 bit modulus", "1.2.643.7.1.1.1.2") with structure format = pem/der/text
52+
53+
PrivateKeyInfo can only be saved in pkcs8 format without encryption.
54+
55+
Decoder:
56+
- id-GostR3410-2001 ("GOST R 34.10-2001", "1.2.643.2.2.19") with structure format = der
57+
- id-GostR3410-2001DH ("GOST R 34.10-2001 DH", "1.2.643.2.2.98") with structure format = der
58+
- gost2012_256 ("GOST R 34.10-2012 with 256 bit modulus", "1.2.643.7.1.1.1.1") with structure format = der
59+
- gost2012_512 ("GOST R 34.10-2012 with 512 bit modulus", "1.2.643.7.1.1.1.2") with structure format = der
60+
61+
pem2der decoder already implemented by OpenSSL default provider.
62+
63+
PrivateKeyInfo can only be loaded in pkcs8 format without decryption.
64+
65+
Signature:
66+
- SN_id_GostR3410_2001, "id-GostR3411-94-with-GostR3410-2001", "GOST R 34.11-94 with GOST R 34.10-2001", "1.2.643.2.2.3"
67+
- SN_id_GostR3410_2012_256, "id-tc26-signwithdigest-gost3410-2012-256", "GOST R 34.10-2012 with GOST R 34.11-2012 (256 bit)", "1.2.643.7.1.1.3.2"
68+
- gost2012_256, "id-tc26-signwithdigest-gost3410-2012-512", "GOST R 34.10-2012 with GOST R 34.11-2012 (512 bit)", "1.2.643.7.1.1.3.3"
4669

70+
Keyexchange:
71+
- ECDHE
72+
73+
TLS1.3:
74+
- OpenSSL patch has been implemented that allows to connect TLS1.3 using a provider.
75+
76+
## TODO, not requiring additional OpenSSL support
77+
78+
- Support for these operations using GOST keys:
4779
- ASYM_CIPHER (encryption and decryption using GOST keys)
48-
- SIGNATURE (signing and verifying using GOST keys)
4980

5081
## TODO, which requires additional OpenSSL support
5182

52-
- TLSTREE support. This may require additional changes in libssl.
53-
Needs investigation.
54-
5583
- PKCS7 and CMS support. This requires OpenSSL PKCS7 and CMS code
5684
to change for better interfacing with providers.
5785

0 commit comments

Comments
 (0)