From 2ed69ca1219dd8287476bed0d20d50750c010d11 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Wed, 1 Apr 2020 17:10:52 +0300 Subject: [PATCH 77/87] ssl: add defines for GOST CTR-OMAC ciphersuites Add definitions for cipher, mac and KX used by GOST CTR-OMAC ciphersuites (see draft-smyshlyaev-tls12-gost-suites-07). Signed-off-by: Dmitry Baryshkov --- src/lib/libssl/s3_lib.c | 32 ++++++++++++++++++++++++++++++++ src/lib/libssl/ssl.h | 3 +++ src/lib/libssl/ssl_ciph.c | 38 ++++++++++++++++++++++++++++++++++++++ src/lib/libssl/ssl_locl.h | 5 +++++ 4 files changed, 78 insertions(+) diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c index 425420c4a..18b9ad62f 100644 --- a/src/lib/libssl/s3_lib.c +++ b/src/lib/libssl/s3_lib.c @@ -1305,6 +1305,38 @@ SSL_CIPHER ssl3_ciphers[] = { .alg_bits = 256, }, + /* Cipher C100 */ + { + .valid = 1, + .name = "GOST2012256-KUZNYECHIK-CTR-OMAC", + .id = 0x300c100, + .algorithm_mkey = SSL_kGOST_KDF, + .algorithm_auth = SSL_aGOST01, + .algorithm_enc = SSL_KUZNYECHIK_CTR_ACPKM, + .algorithm_mac = SSL_KUZNYECHIK_OMAC, + .algorithm_ssl = SSL_TLSV1_2, + .algo_strength = SSL_HIGH, + .algorithm2 = SSL_HANDSHAKE_MAC_STREEBOG256|TLS1_PRF_STREEBOG256, + .strength_bits = 256, + .alg_bits = 256 + }, + + /* Cipher C101 */ + { + .valid = 1, + .name = "GOST2012256-MAGMA-CTR-OMAC", + .id = 0x300c101, + .algorithm_mkey = SSL_kGOST_KDF, + .algorithm_auth = SSL_aGOST01, + .algorithm_enc = SSL_MAGMA_CTR_ACPKM, + .algorithm_mac = SSL_MAGMA_OMAC, + .algorithm_ssl = SSL_TLSV1_2, + .algo_strength = SSL_HIGH, + .algorithm2 = SSL_HANDSHAKE_MAC_STREEBOG256|TLS1_PRF_STREEBOG256, + .strength_bits = 256, + .alg_bits = 256 + }, + /* Cipher C102 */ { .valid = 1, diff --git a/src/lib/libssl/ssl.h b/src/lib/libssl/ssl.h index 4370c84cd..b11216b1e 100644 --- a/src/lib/libssl/ssl.h +++ b/src/lib/libssl/ssl.h @@ -246,6 +246,7 @@ extern "C" { #define SSL_TXT_kEECDH "kEECDH" #define SSL_TXT_kPSK "kPSK" #define SSL_TXT_kGOST "kGOST" +#define SSL_TXT_kGOST_KDF "kGOSTKDF" #define SSL_TXT_kSRP "kSRP" #define SSL_TXT_aRSA "aRSA" @@ -299,6 +300,8 @@ extern "C" { #define SSL_TXT_SHA384 "SHA384" #define SSL_TXT_STREEBOG256 "STREEBOG256" #define SSL_TXT_STREEBOG512 "STREEBOG512" +#define SSL_TXT_KUZNYECHIK_OMAC "KUZNYECHIK-OMAC" +#define SSL_TXT_MAGMA_OMAC "MAGMA-OMAC" #define SSL_TXT_DTLS1 "DTLSv1" #define SSL_TXT_SSLV2 "SSLv2" diff --git a/src/lib/libssl/ssl_ciph.c b/src/lib/libssl/ssl_ciph.c index 37417efc0..9ef17e052 100644 --- a/src/lib/libssl/ssl_ciph.c +++ b/src/lib/libssl/ssl_ciph.c @@ -219,6 +219,11 @@ static const SSL_CIPHER cipher_aliases[] = { .algorithm_mkey = SSL_kGOST, }, + { + .name = SSL_TXT_kGOST_KDF, + .algorithm_mkey = SSL_kGOST_KDF, + }, + /* server authentication aliases */ { .name = SSL_TXT_aRSA, @@ -365,6 +370,14 @@ static const SSL_CIPHER cipher_aliases[] = { .name = SSL_TXT_GOST89MAC, .algorithm_mac = SSL_GOST89MAC, }, + { + .name = SSL_TXT_KUZNYECHIK_OMAC, + .algorithm_mac = SSL_KUZNYECHIK_OMAC, + }, + { + .name = SSL_TXT_MAGMA_OMAC, + .algorithm_mac = SSL_MAGMA_OMAC, + }, { .name = SSL_TXT_SHA256, .algorithm_mac = SSL_SHA256, @@ -1424,6 +1437,9 @@ SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len) case SSL_kGOST: kx = "GOST"; break; + case SSL_kGOST_KDF: + kx = "GOSTKDF"; + break; case SSL_kTLS1_3: kx = "TLSv1.3"; break; @@ -1489,6 +1505,12 @@ SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len) case SSL_eGOST2814789CNT: enc = "GOST-28178-89-CNT"; break; + case SSL_KUZNYECHIK_CTR_ACPKM: + enc = "KUZNYECHIK-CTR-ACPKM"; + break; + case SSL_MAGMA_CTR_ACPKM: + enc = "MAGMA-CTR-ACPKM"; + break; default: enc = "unknown"; break; @@ -1519,6 +1541,12 @@ SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len) case SSL_STREEBOG256: mac = "STREEBOG256"; break; + case SSL_KUZNYECHIK_OMAC: + mac = "KUZNYECHIK-OMAC"; + break; + case SSL_MAGMA_OMAC: + mac = "MAGMA-OMAC"; + break; default: mac = "unknown"; break; @@ -1613,6 +1641,10 @@ SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *c) return NID_rc4; case SSL_eGOST2814789CNT: return NID_gost89_cnt; + case SSL_KUZNYECHIK_CTR_ACPKM: + return NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm; + case SSL_MAGMA_CTR_ACPKM: + return NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm; default: return NID_undef; } @@ -1638,6 +1670,10 @@ SSL_CIPHER_get_digest_nid(const SSL_CIPHER *c) return NID_sha384; case SSL_STREEBOG256: return NID_id_tc26_gost3411_2012_256; + case SSL_KUZNYECHIK_OMAC: + return NID_kuznyechik_mac; + case SSL_MAGMA_OMAC: + return NID_magma_mac; default: return NID_undef; } @@ -1653,6 +1689,8 @@ SSL_CIPHER_get_kx_nid(const SSL_CIPHER *c) return NID_kx_ecdhe; case SSL_kGOST: return NID_kx_gost; + case SSL_kGOST_KDF: + return NID_kx_gost_kdf; case SSL_kRSA: return NID_kx_rsa; default: diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index bfc3c1ad9..72646fa8c 100644 --- a/src/lib/libssl/ssl_locl.h +++ b/src/lib/libssl/ssl_locl.h @@ -206,6 +206,7 @@ __BEGIN_HIDDEN_DECLS #define SSL_kECDHE 0x00000080L /* ephemeral ECDH */ #define SSL_kGOST 0x00000200L /* GOST key exchange */ #define SSL_kTLS1_3 0x00000400L /* TLSv1.3 key exchange */ +#define SSL_kGOST_KDF 0x00000800L /* GOST KDF key exchange */ /* Bits for algorithm_auth (server authentication) */ #define SSL_aRSA 0x00000001L /* RSA auth */ @@ -229,6 +230,8 @@ __BEGIN_HIDDEN_DECLS #define SSL_AES128GCM 0x00000400L #define SSL_AES256GCM 0x00000800L #define SSL_CHACHA20POLY1305 0x00001000L +#define SSL_KUZNYECHIK_CTR_ACPKM 0x00002000L +#define SSL_MAGMA_CTR_ACPKM 0x00004000L #define SSL_AES (SSL_AES128|SSL_AES256|SSL_AES128GCM|SSL_AES256GCM) #define SSL_CAMELLIA (SSL_CAMELLIA128|SSL_CAMELLIA256) @@ -245,6 +248,8 @@ __BEGIN_HIDDEN_DECLS /* Not a real MAC, just an indication it is part of cipher */ #define SSL_AEAD 0x00000040L #define SSL_STREEBOG256 0x00000080L +#define SSL_KUZNYECHIK_OMAC 0x00000100L +#define SSL_MAGMA_OMAC 0x00000200L /* Bits for algorithm_ssl (protocol version) */ #define SSL_SSLV3 0x00000002L -- 2.17.1