Skip to content

Commit d1a8d5a

Browse files
danvangeestpaulidale
authored andcommitted
Add HKDF algorithms with fixed digests.
Add HKDF-SHA256, HKDF-SHA384 and HKDF-SHA512 which are versions of HKDF that have the digest pre-set. The digest cannot be changed for contexts of these types. RFC 8619 defines algorithm identifiers for these combinations. These algorithm identifiers will be used in future features, e.g. KEMRecipientInfo. Reviewed-by: Shane Lontis <shane.lontis@oracle.com> Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Paul Dale <ppzgs1@gmail.com> (Merged from openssl#27247)
1 parent 162089a commit d1a8d5a

File tree

17 files changed

+267
-9
lines changed

17 files changed

+267
-9
lines changed

CHANGES.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,11 @@ OpenSSL 3.6
112112

113113
*Dimitri John Ledkov*
114114

115+
* HKDF with (SHA-256,SHA-384,SHA-512) has assigned OIDs. Added ability to load
116+
HKDF configured with these explicit digests by name or OID.
117+
118+
*Daniel Van Geest (CryptoNext Security)*
119+
115120
OpenSSL 3.5
116121
-----------
117122

crypto/objects/obj_dat.h

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*/
1111

1212
/* Serialized OID's */
13-
static const unsigned char so[9517] = {
13+
static const unsigned char so[9550] = {
1414
0x2A,0x86,0x48,0x86,0xF7,0x0D, /* [ 0] OBJ_rsadsi */
1515
0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01, /* [ 6] OBJ_pkcs */
1616
0x2A,0x86,0x48,0x86,0xF7,0x0D,0x02,0x02, /* [ 13] OBJ_md2 */
@@ -1348,9 +1348,12 @@ static const unsigned char so[9517] = {
13481348
0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x03,0x2C, /* [ 9489] OBJ_SLH_DSA_SHAKE_192f_WITH_SHAKE256 */
13491349
0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x03,0x2D, /* [ 9498] OBJ_SLH_DSA_SHAKE_256s_WITH_SHAKE256 */
13501350
0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x03,0x2E, /* [ 9507] OBJ_SLH_DSA_SHAKE_256f_WITH_SHAKE256 */
1351+
0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x10,0x03,0x1C, /* [ 9516] OBJ_HKDF_SHA256 */
1352+
0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x10,0x03,0x1D, /* [ 9527] OBJ_HKDF_SHA384 */
1353+
0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x10,0x03,0x1E, /* [ 9538] OBJ_HKDF_SHA512 */
13511354
};
13521355

1353-
#define NUM_NID 1496
1356+
#define NUM_NID 1499
13541357
static const ASN1_OBJECT nid_objs[NUM_NID] = {
13551358
{"UNDEF", "undefined", NID_undef},
13561359
{"rsadsi", "RSA Data Security, Inc.", NID_rsadsi, 6, &so[0]},
@@ -2848,9 +2851,12 @@ static const ASN1_OBJECT nid_objs[NUM_NID] = {
28482851
{"AES-128-CBC-HMAC-SHA512-ETM", "aes-128-cbc-hmac-sha512-etm", NID_aes_128_cbc_hmac_sha512_etm},
28492852
{"AES-192-CBC-HMAC-SHA512-ETM", "aes-192-cbc-hmac-sha512-etm", NID_aes_192_cbc_hmac_sha512_etm},
28502853
{"AES-256-CBC-HMAC-SHA512-ETM", "aes-256-cbc-hmac-sha512-etm", NID_aes_256_cbc_hmac_sha512_etm},
2854+
{"id-alg-hkdf-with-sha256", "HKDF-SHA256", NID_HKDF_SHA256, 11, &so[9516]},
2855+
{"id-alg-hkdf-with-sha384", "HKDF-SHA384", NID_HKDF_SHA384, 11, &so[9527]},
2856+
{"id-alg-hkdf-with-sha512", "HKDF-SHA512", NID_HKDF_SHA512, 11, &so[9538]},
28512857
};
28522858

2853-
#define NUM_SN 1487
2859+
#define NUM_SN 1490
28542860
static const unsigned int sn_objs[NUM_SN] = {
28552861
364, /* "AD_DVCS" */
28562862
419, /* "AES-128-CBC" */
@@ -3480,6 +3486,9 @@ static const unsigned int sn_objs[NUM_SN] = {
34803486
323, /* "id-alg-des40" */
34813487
326, /* "id-alg-dh-pop" */
34823488
325, /* "id-alg-dh-sig-hmac-sha1" */
3489+
1496, /* "id-alg-hkdf-with-sha256" */
3490+
1497, /* "id-alg-hkdf-with-sha384" */
3491+
1498, /* "id-alg-hkdf-with-sha512" */
34833492
1456, /* "id-alg-ml-kem-1024" */
34843493
1454, /* "id-alg-ml-kem-512" */
34853494
1455, /* "id-alg-ml-kem-768" */
@@ -4341,7 +4350,7 @@ static const unsigned int sn_objs[NUM_SN] = {
43414350
1289, /* "zstd" */
43424351
};
43434352

4344-
#define NUM_LN 1487
4353+
#define NUM_LN 1490
43454354
static const unsigned int ln_objs[NUM_LN] = {
43464355
363, /* "AD Time Stamping" */
43474356
405, /* "ANSI X9.62" */
@@ -4468,6 +4477,9 @@ static const unsigned int ln_objs[NUM_LN] = {
44684477
1472, /* "HASH-ML-DSA-44-WITH-SHA512" */
44694478
1473, /* "HASH-ML-DSA-65-WITH-SHA512" */
44704479
1474, /* "HASH-ML-DSA-87-WITH-SHA512" */
4480+
1496, /* "HKDF-SHA256" */
4481+
1497, /* "HKDF-SHA384" */
4482+
1498, /* "HKDF-SHA512" */
44714483
1156, /* "HMAC DSTU Gost 34311-95" */
44724484
988, /* "HMAC GOST 34.11-2012 256 bit" */
44734485
989, /* "HMAC GOST 34.11-2012 512 bit" */
@@ -5832,7 +5844,7 @@ static const unsigned int ln_objs[NUM_LN] = {
58325844
125, /* "zlib compression" */
58335845
};
58345846

5835-
#define NUM_OBJ 1344
5847+
#define NUM_OBJ 1347
58365848
static const unsigned int obj_objs[NUM_OBJ] = {
58375849
0, /* OBJ_undef 0 */
58385850
181, /* OBJ_iso 1 */
@@ -7145,6 +7157,9 @@ static const unsigned int obj_objs[NUM_OBJ] = {
71457157
247, /* OBJ_id_smime_alg_CMSRC2wrap 1 2 840 113549 1 9 16 3 7 */
71467158
125, /* OBJ_zlib_compression 1 2 840 113549 1 9 16 3 8 */
71477159
893, /* OBJ_id_alg_PWRI_KEK 1 2 840 113549 1 9 16 3 9 */
7160+
1496, /* OBJ_HKDF_SHA256 1 2 840 113549 1 9 16 3 28 */
7161+
1497, /* OBJ_HKDF_SHA384 1 2 840 113549 1 9 16 3 29 */
7162+
1498, /* OBJ_HKDF_SHA512 1 2 840 113549 1 9 16 3 30 */
71487163
248, /* OBJ_id_smime_cd_ldap 1 2 840 113549 1 9 16 4 1 */
71497164
249, /* OBJ_id_smime_spq_ets_sqt_uri 1 2 840 113549 1 9 16 5 1 */
71507165
250, /* OBJ_id_smime_spq_ets_sqt_unotice 1 2 840 113549 1 9 16 5 2 */

crypto/objects/obj_mac.num

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1493,3 +1493,6 @@ aes_256_cbc_hmac_sha256_etm 1492
14931493
aes_128_cbc_hmac_sha512_etm 1493
14941494
aes_192_cbc_hmac_sha512_etm 1494
14951495
aes_256_cbc_hmac_sha512_etm 1495
1496+
HKDF_SHA256 1496
1497+
HKDF_SHA384 1497
1498+
HKDF_SHA512 1498

crypto/objects/objects.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,9 @@ id-smime-alg 5 : id-smime-alg-ESDH
336336
id-smime-alg 6 : id-smime-alg-CMS3DESwrap
337337
id-smime-alg 7 : id-smime-alg-CMSRC2wrap
338338
id-smime-alg 9 : id-alg-PWRI-KEK
339+
id-smime-alg 28 : id-alg-hkdf-with-sha256 : HKDF-SHA256
340+
id-smime-alg 29 : id-alg-hkdf-with-sha384 : HKDF-SHA384
341+
id-smime-alg 30 : id-alg-hkdf-with-sha512 : HKDF-SHA512
339342

340343
# S/MIME Certificate Distribution
341344
id-smime-cd 1 : id-smime-cd-ldap

fuzz/oids.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1344,3 +1344,6 @@ OBJ_SLH_DSA_SHAKE_192s_WITH_SHAKE256="\x60\x86\x48\x01\x65\x03\x04\x03\x2B"
13441344
OBJ_SLH_DSA_SHAKE_192f_WITH_SHAKE256="\x60\x86\x48\x01\x65\x03\x04\x03\x2C"
13451345
OBJ_SLH_DSA_SHAKE_256s_WITH_SHAKE256="\x60\x86\x48\x01\x65\x03\x04\x03\x2D"
13461346
OBJ_SLH_DSA_SHAKE_256f_WITH_SHAKE256="\x60\x86\x48\x01\x65\x03\x04\x03\x2E"
1347+
OBJ_HKDF_SHA256="\x2A\x86\x48\x86\xF7\x0D\x01\x09\x10\x03\x1C"
1348+
OBJ_HKDF_SHA384="\x2A\x86\x48\x86\xF7\x0D\x01\x09\x10\x03\x1D"
1349+
OBJ_HKDF_SHA512="\x2A\x86\x48\x86\xF7\x0D\x01\x09\x10\x03\x1E"

include/openssl/core_names.h.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ extern "C" {
6666

6767
/* Known KDF names */
6868
# define OSSL_KDF_NAME_HKDF "HKDF"
69+
# define OSSL_KDF_NAME_HKDF_SHA256 "HKDF-SHA256"
70+
# define OSSL_KDF_NAME_HKDF_SHA384 "HKDF-SHA384"
71+
# define OSSL_KDF_NAME_HKDF_SHA512 "HKDF-SHA512"
6972
# define OSSL_KDF_NAME_TLS1_3_KDF "TLS13-KDF"
7073
# define OSSL_KDF_NAME_PBKDF1 "PBKDF1"
7174
# define OSSL_KDF_NAME_PBKDF2 "PBKDF2"

include/openssl/obj_mac.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,6 +1062,21 @@
10621062
#define NID_id_alg_PWRI_KEK 893
10631063
#define OBJ_id_alg_PWRI_KEK OBJ_id_smime_alg,9L
10641064

1065+
#define SN_HKDF_SHA256 "id-alg-hkdf-with-sha256"
1066+
#define LN_HKDF_SHA256 "HKDF-SHA256"
1067+
#define NID_HKDF_SHA256 1496
1068+
#define OBJ_HKDF_SHA256 OBJ_id_smime_alg,28L
1069+
1070+
#define SN_HKDF_SHA384 "id-alg-hkdf-with-sha384"
1071+
#define LN_HKDF_SHA384 "HKDF-SHA384"
1072+
#define NID_HKDF_SHA384 1497
1073+
#define OBJ_HKDF_SHA384 OBJ_id_smime_alg,29L
1074+
1075+
#define SN_HKDF_SHA512 "id-alg-hkdf-with-sha512"
1076+
#define LN_HKDF_SHA512 "HKDF-SHA512"
1077+
#define NID_HKDF_SHA512 1498
1078+
#define OBJ_HKDF_SHA512 OBJ_id_smime_alg,30L
1079+
10651080
#define SN_id_smime_cd_ldap "id-smime-cd-ldap"
10661081
#define NID_id_smime_cd_ldap 248
10671082
#define OBJ_id_smime_cd_ldap OBJ_id_smime_cd,1L

providers/defltprov.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,9 @@ static const OSSL_ALGORITHM deflt_macs[] = {
358358

359359
static const OSSL_ALGORITHM deflt_kdfs[] = {
360360
{ PROV_NAMES_HKDF, "provider=default", ossl_kdf_hkdf_functions },
361+
{ PROV_NAMES_HKDF_SHA256, "provider=default", ossl_kdf_hkdf_sha256_functions },
362+
{ PROV_NAMES_HKDF_SHA384, "provider=default", ossl_kdf_hkdf_sha384_functions },
363+
{ PROV_NAMES_HKDF_SHA512, "provider=default", ossl_kdf_hkdf_sha512_functions },
361364
{ PROV_NAMES_TLS1_3_KDF, "provider=default",
362365
ossl_kdf_tls1_3_kdf_functions },
363366
{ PROV_NAMES_SSKDF, "provider=default", ossl_kdf_sskdf_functions },
@@ -395,6 +398,9 @@ static const OSSL_ALGORITHM deflt_keyexch[] = {
395398
#endif
396399
{ PROV_NAMES_TLS1_PRF, "provider=default", ossl_kdf_tls1_prf_keyexch_functions },
397400
{ PROV_NAMES_HKDF, "provider=default", ossl_kdf_hkdf_keyexch_functions },
401+
{ PROV_NAMES_HKDF_SHA256, "provider=default", ossl_kdf_hkdf_sha256_keyexch_functions },
402+
{ PROV_NAMES_HKDF_SHA384, "provider=default", ossl_kdf_hkdf_sha384_keyexch_functions },
403+
{ PROV_NAMES_HKDF_SHA512, "provider=default", ossl_kdf_hkdf_sha512_keyexch_functions },
398404
{ PROV_NAMES_SCRYPT, "provider=default",
399405
ossl_kdf_scrypt_keyexch_functions },
400406
{ NULL, NULL, NULL }
@@ -583,6 +589,12 @@ static const OSSL_ALGORITHM deflt_keymgmt[] = {
583589
PROV_DESCS_TLS1_PRF_SIGN },
584590
{ PROV_NAMES_HKDF, "provider=default", ossl_kdf_keymgmt_functions,
585591
PROV_DESCS_HKDF_SIGN },
592+
{ PROV_NAMES_HKDF_SHA256, "provider=default", ossl_kdf_keymgmt_functions,
593+
PROV_DESCS_HKDF_SHA256_SIGN },
594+
{ PROV_NAMES_HKDF_SHA384, "provider=default", ossl_kdf_keymgmt_functions,
595+
PROV_DESCS_HKDF_SHA384_SIGN },
596+
{ PROV_NAMES_HKDF_SHA512, "provider=default", ossl_kdf_keymgmt_functions,
597+
PROV_DESCS_HKDF_SHA512_SIGN },
586598
{ PROV_NAMES_SCRYPT, "provider=default", ossl_kdf_keymgmt_functions,
587599
PROV_DESCS_SCRYPT_SIGN },
588600
{ PROV_NAMES_HMAC, "provider=default", ossl_mac_legacy_keymgmt_functions,

providers/fips/fipsprov.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,9 @@ static const OSSL_ALGORITHM fips_macs_internal[] = {
404404

405405
static const OSSL_ALGORITHM fips_kdfs[] = {
406406
{ PROV_NAMES_HKDF, FIPS_DEFAULT_PROPERTIES, ossl_kdf_hkdf_functions },
407+
{ PROV_NAMES_HKDF_SHA256, FIPS_DEFAULT_PROPERTIES, ossl_kdf_hkdf_sha256_functions },
408+
{ PROV_NAMES_HKDF_SHA384, FIPS_DEFAULT_PROPERTIES, ossl_kdf_hkdf_sha384_functions },
409+
{ PROV_NAMES_HKDF_SHA512, FIPS_DEFAULT_PROPERTIES, ossl_kdf_hkdf_sha512_functions },
407410
{ PROV_NAMES_TLS1_3_KDF, FIPS_DEFAULT_PROPERTIES,
408411
ossl_kdf_tls1_3_kdf_functions },
409412
{ PROV_NAMES_SSKDF, FIPS_DEFAULT_PROPERTIES, ossl_kdf_sskdf_functions },
@@ -445,6 +448,9 @@ static const OSSL_ALGORITHM fips_keyexch[] = {
445448
{ PROV_NAMES_TLS1_PRF, FIPS_DEFAULT_PROPERTIES,
446449
ossl_kdf_tls1_prf_keyexch_functions },
447450
{ PROV_NAMES_HKDF, FIPS_DEFAULT_PROPERTIES, ossl_kdf_hkdf_keyexch_functions },
451+
{ PROV_NAMES_HKDF_SHA256, FIPS_DEFAULT_PROPERTIES, ossl_kdf_hkdf_sha256_keyexch_functions },
452+
{ PROV_NAMES_HKDF_SHA384, FIPS_DEFAULT_PROPERTIES, ossl_kdf_hkdf_sha384_keyexch_functions },
453+
{ PROV_NAMES_HKDF_SHA512, FIPS_DEFAULT_PROPERTIES, ossl_kdf_hkdf_sha512_keyexch_functions },
448454
{ NULL, NULL, NULL }
449455
};
450456

@@ -612,6 +618,12 @@ static const OSSL_ALGORITHM fips_keymgmt[] = {
612618
PROV_DESCS_TLS1_PRF_SIGN },
613619
{ PROV_NAMES_HKDF, FIPS_DEFAULT_PROPERTIES, ossl_kdf_keymgmt_functions,
614620
PROV_DESCS_HKDF_SIGN },
621+
{ PROV_NAMES_HKDF_SHA256, FIPS_DEFAULT_PROPERTIES, ossl_kdf_keymgmt_functions,
622+
PROV_DESCS_HKDF_SHA256_SIGN },
623+
{ PROV_NAMES_HKDF_SHA384, FIPS_DEFAULT_PROPERTIES, ossl_kdf_keymgmt_functions,
624+
PROV_DESCS_HKDF_SHA384_SIGN },
625+
{ PROV_NAMES_HKDF_SHA512, FIPS_DEFAULT_PROPERTIES, ossl_kdf_keymgmt_functions,
626+
PROV_DESCS_HKDF_SHA512_SIGN },
615627
{ PROV_NAMES_HMAC, FIPS_DEFAULT_PROPERTIES, ossl_mac_legacy_keymgmt_functions,
616628
PROV_DESCS_HMAC_SIGN },
617629
#ifndef OPENSSL_NO_CMAC

providers/implementations/exchange/kdf_exch.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ static void *kdf_newctx(const char *kdfname, void *provctx)
7979

8080
KDF_NEWCTX(tls1_prf, "TLS1-PRF")
8181
KDF_NEWCTX(hkdf, "HKDF")
82+
KDF_NEWCTX(hkdf_sha256, "HKDF-SHA256")
83+
KDF_NEWCTX(hkdf_sha384, "HKDF-SHA384")
84+
KDF_NEWCTX(hkdf_sha512, "HKDF-SHA512")
8285
KDF_NEWCTX(scrypt, "SCRYPT")
8386

8487
static int kdf_init(void *vpkdfctx, void *vkdf, const OSSL_PARAM params[])
@@ -206,6 +209,9 @@ static const OSSL_PARAM *kdf_settable_ctx_params(ossl_unused void *vpkdfctx,
206209

207210
KDF_SETTABLE_CTX_PARAMS(tls1_prf, "TLS1-PRF")
208211
KDF_SETTABLE_CTX_PARAMS(hkdf, "HKDF")
212+
KDF_SETTABLE_CTX_PARAMS(hkdf_sha256, "HKDF-SHA256")
213+
KDF_SETTABLE_CTX_PARAMS(hkdf_sha384, "HKDF-SHA384")
214+
KDF_SETTABLE_CTX_PARAMS(hkdf_sha512, "HKDF-SHA512")
209215
KDF_SETTABLE_CTX_PARAMS(scrypt, "SCRYPT")
210216

211217
static const OSSL_PARAM *kdf_gettable_ctx_params(ossl_unused void *vpkdfctx,
@@ -234,6 +240,9 @@ static const OSSL_PARAM *kdf_gettable_ctx_params(ossl_unused void *vpkdfctx,
234240

235241
KDF_GETTABLE_CTX_PARAMS(tls1_prf, "TLS1-PRF")
236242
KDF_GETTABLE_CTX_PARAMS(hkdf, "HKDF")
243+
KDF_GETTABLE_CTX_PARAMS(hkdf_sha256, "HKDF-SHA256")
244+
KDF_GETTABLE_CTX_PARAMS(hkdf_sha384, "HKDF-SHA384")
245+
KDF_GETTABLE_CTX_PARAMS(hkdf_sha512, "HKDF-SHA512")
237246
KDF_GETTABLE_CTX_PARAMS(scrypt, "SCRYPT")
238247

239248
#define KDF_KEYEXCH_FUNCTIONS(funcname) \
@@ -254,4 +263,7 @@ KDF_GETTABLE_CTX_PARAMS(scrypt, "SCRYPT")
254263

255264
KDF_KEYEXCH_FUNCTIONS(tls1_prf)
256265
KDF_KEYEXCH_FUNCTIONS(hkdf)
266+
KDF_KEYEXCH_FUNCTIONS(hkdf_sha256)
267+
KDF_KEYEXCH_FUNCTIONS(hkdf_sha384)
268+
KDF_KEYEXCH_FUNCTIONS(hkdf_sha512)
257269
KDF_KEYEXCH_FUNCTIONS(scrypt)

0 commit comments

Comments
 (0)