hkdf.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954
  1. /*
  2. * Copyright 2016-2025 The OpenSSL Project Authors. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License 2.0 (the "License"). You may not use
  5. * this file except in compliance with the License. You can obtain a copy
  6. * in the file LICENSE in the source distribution or at
  7. * https://www.openssl.org/source/license.html
  8. */
  9. /*
  10. * HMAC low level APIs are deprecated for public use, but still ok for internal
  11. * use.
  12. */
  13. #include "internal/deprecated.h"
  14. #include <stdlib.h>
  15. #include <stdarg.h>
  16. #include <string.h>
  17. #include <openssl/hmac.h>
  18. #include <openssl/evp.h>
  19. #include <openssl/kdf.h>
  20. #include <openssl/core_names.h>
  21. #include <openssl/proverr.h>
  22. #include "internal/cryptlib.h"
  23. #include "internal/numbers.h"
  24. #include "internal/packet.h"
  25. #include "crypto/evp.h"
  26. #include "prov/provider_ctx.h"
  27. #include "prov/providercommon.h"
  28. #include "prov/implementations.h"
  29. #include "prov/provider_util.h"
  30. #include "prov/securitycheck.h"
  31. #include "internal/e_os.h"
  32. #include "internal/params.h"
  33. #define HKDF_MAXBUF 2048
  34. #define HKDF_MAXINFO (32*1024)
  35. static OSSL_FUNC_kdf_newctx_fn kdf_hkdf_new;
  36. static OSSL_FUNC_kdf_dupctx_fn kdf_hkdf_dup;
  37. static OSSL_FUNC_kdf_freectx_fn kdf_hkdf_free;
  38. static OSSL_FUNC_kdf_reset_fn kdf_hkdf_reset;
  39. static OSSL_FUNC_kdf_derive_fn kdf_hkdf_derive;
  40. static OSSL_FUNC_kdf_settable_ctx_params_fn kdf_hkdf_settable_ctx_params;
  41. static OSSL_FUNC_kdf_set_ctx_params_fn kdf_hkdf_set_ctx_params;
  42. static OSSL_FUNC_kdf_gettable_ctx_params_fn kdf_hkdf_gettable_ctx_params;
  43. static OSSL_FUNC_kdf_get_ctx_params_fn kdf_hkdf_get_ctx_params;
  44. static OSSL_FUNC_kdf_derive_fn kdf_tls1_3_derive;
  45. static OSSL_FUNC_kdf_settable_ctx_params_fn kdf_tls1_3_settable_ctx_params;
  46. static OSSL_FUNC_kdf_set_ctx_params_fn kdf_tls1_3_set_ctx_params;
  47. static OSSL_FUNC_kdf_gettable_ctx_params_fn kdf_tls1_3_gettable_ctx_params;
  48. static OSSL_FUNC_kdf_get_ctx_params_fn kdf_tls1_3_get_ctx_params;
  49. static int HKDF(OSSL_LIB_CTX *libctx, const EVP_MD *evp_md,
  50. const unsigned char *salt, size_t salt_len,
  51. const unsigned char *key, size_t key_len,
  52. const unsigned char *info, size_t info_len,
  53. unsigned char *okm, size_t okm_len);
  54. static int HKDF_Extract(OSSL_LIB_CTX *libctx, const EVP_MD *evp_md,
  55. const unsigned char *salt, size_t salt_len,
  56. const unsigned char *ikm, size_t ikm_len,
  57. unsigned char *prk, size_t prk_len);
  58. static int HKDF_Expand(const EVP_MD *evp_md,
  59. const unsigned char *prk, size_t prk_len,
  60. const unsigned char *info, size_t info_len,
  61. unsigned char *okm, size_t okm_len);
  62. /* Settable context parameters that are common across HKDF and the TLS KDF */
  63. #define HKDF_COMMON_SETTABLES \
  64. OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_MODE, NULL, 0), \
  65. OSSL_PARAM_int(OSSL_KDF_PARAM_MODE, NULL), \
  66. OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_PROPERTIES, NULL, 0), \
  67. OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_DIGEST, NULL, 0), \
  68. OSSL_PARAM_octet_string(OSSL_KDF_PARAM_KEY, NULL, 0), \
  69. OSSL_PARAM_octet_string(OSSL_KDF_PARAM_SALT, NULL, 0)
  70. /* Gettable context parameters that are common across HKDF and the TLS KDF */
  71. #define HKDF_COMMON_GETTABLES \
  72. OSSL_PARAM_size_t(OSSL_KDF_PARAM_SIZE, NULL), \
  73. OSSL_PARAM_octet_string(OSSL_KDF_PARAM_INFO, NULL, 0)
  74. typedef struct {
  75. void *provctx;
  76. int mode;
  77. PROV_DIGEST digest;
  78. unsigned char *salt;
  79. size_t salt_len;
  80. unsigned char *key;
  81. size_t key_len;
  82. unsigned char *prefix;
  83. size_t prefix_len;
  84. unsigned char *label;
  85. size_t label_len;
  86. unsigned char *data;
  87. size_t data_len;
  88. unsigned char *info;
  89. size_t info_len;
  90. OSSL_FIPS_IND_DECLARE
  91. } KDF_HKDF;
  92. static void *kdf_hkdf_new(void *provctx)
  93. {
  94. KDF_HKDF *ctx;
  95. if (!ossl_prov_is_running())
  96. return NULL;
  97. if ((ctx = OPENSSL_zalloc(sizeof(*ctx))) != NULL) {
  98. ctx->provctx = provctx;
  99. OSSL_FIPS_IND_INIT(ctx)
  100. }
  101. return ctx;
  102. }
  103. static void kdf_hkdf_free(void *vctx)
  104. {
  105. KDF_HKDF *ctx = (KDF_HKDF *)vctx;
  106. if (ctx != NULL) {
  107. kdf_hkdf_reset(ctx);
  108. OPENSSL_free(ctx);
  109. }
  110. }
  111. static void kdf_hkdf_reset(void *vctx)
  112. {
  113. KDF_HKDF *ctx = (KDF_HKDF *)vctx;
  114. void *provctx = ctx->provctx;
  115. ossl_prov_digest_reset(&ctx->digest);
  116. #ifdef OPENSSL_PEDANTIC_ZEROIZATION
  117. OPENSSL_clear_free(ctx->salt, ctx->salt_len);
  118. #else
  119. OPENSSL_free(ctx->salt);
  120. #endif
  121. OPENSSL_free(ctx->prefix);
  122. OPENSSL_free(ctx->label);
  123. OPENSSL_clear_free(ctx->data, ctx->data_len);
  124. OPENSSL_clear_free(ctx->key, ctx->key_len);
  125. OPENSSL_clear_free(ctx->info, ctx->info_len);
  126. memset(ctx, 0, sizeof(*ctx));
  127. ctx->provctx = provctx;
  128. }
  129. static void *kdf_hkdf_dup(void *vctx)
  130. {
  131. const KDF_HKDF *src = (const KDF_HKDF *)vctx;
  132. KDF_HKDF *dest;
  133. dest = kdf_hkdf_new(src->provctx);
  134. if (dest != NULL) {
  135. if (!ossl_prov_memdup(src->salt, src->salt_len, &dest->salt,
  136. &dest->salt_len)
  137. || !ossl_prov_memdup(src->key, src->key_len,
  138. &dest->key , &dest->key_len)
  139. || !ossl_prov_memdup(src->prefix, src->prefix_len,
  140. &dest->prefix, &dest->prefix_len)
  141. || !ossl_prov_memdup(src->label, src->label_len,
  142. &dest->label, &dest->label_len)
  143. || !ossl_prov_memdup(src->data, src->data_len,
  144. &dest->data, &dest->data_len)
  145. || !ossl_prov_memdup(src->info, src->info_len,
  146. &dest->info, &dest->info_len)
  147. || !ossl_prov_digest_copy(&dest->digest, &src->digest))
  148. goto err;
  149. dest->mode = src->mode;
  150. OSSL_FIPS_IND_COPY(dest, src)
  151. }
  152. return dest;
  153. err:
  154. kdf_hkdf_free(dest);
  155. return NULL;
  156. }
  157. static size_t kdf_hkdf_size(KDF_HKDF *ctx)
  158. {
  159. int sz;
  160. const EVP_MD *md = ossl_prov_digest_md(&ctx->digest);
  161. if (ctx->mode != EVP_KDF_HKDF_MODE_EXTRACT_ONLY)
  162. return SIZE_MAX;
  163. if (md == NULL) {
  164. ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST);
  165. return 0;
  166. }
  167. sz = EVP_MD_get_size(md);
  168. if (sz <= 0)
  169. return 0;
  170. return sz;
  171. }
  172. #ifdef FIPS_MODULE
  173. static int fips_hkdf_key_check_passed(KDF_HKDF *ctx)
  174. {
  175. OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);
  176. int key_approved = ossl_kdf_check_key_size(ctx->key_len);
  177. if (!key_approved) {
  178. if (!OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE0,
  179. libctx, "HKDF", "Key size",
  180. ossl_fips_config_hkdf_key_check)) {
  181. ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
  182. return 0;
  183. }
  184. }
  185. return 1;
  186. }
  187. #endif
  188. static int kdf_hkdf_derive(void *vctx, unsigned char *key, size_t keylen,
  189. const OSSL_PARAM params[])
  190. {
  191. KDF_HKDF *ctx = (KDF_HKDF *)vctx;
  192. OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);
  193. const EVP_MD *md;
  194. if (!ossl_prov_is_running() || !kdf_hkdf_set_ctx_params(ctx, params))
  195. return 0;
  196. md = ossl_prov_digest_md(&ctx->digest);
  197. if (md == NULL) {
  198. ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST);
  199. return 0;
  200. }
  201. if (ctx->key == NULL) {
  202. ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_KEY);
  203. return 0;
  204. }
  205. if (keylen == 0) {
  206. ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
  207. return 0;
  208. }
  209. switch (ctx->mode) {
  210. case EVP_KDF_HKDF_MODE_EXTRACT_AND_EXPAND:
  211. default:
  212. return HKDF(libctx, md, ctx->salt, ctx->salt_len,
  213. ctx->key, ctx->key_len, ctx->info, ctx->info_len, key, keylen);
  214. case EVP_KDF_HKDF_MODE_EXTRACT_ONLY:
  215. return HKDF_Extract(libctx, md, ctx->salt, ctx->salt_len,
  216. ctx->key, ctx->key_len, key, keylen);
  217. case EVP_KDF_HKDF_MODE_EXPAND_ONLY:
  218. return HKDF_Expand(md, ctx->key, ctx->key_len, ctx->info,
  219. ctx->info_len, key, keylen);
  220. }
  221. }
  222. static int hkdf_common_set_ctx_params(KDF_HKDF *ctx, const OSSL_PARAM params[])
  223. {
  224. OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);
  225. const OSSL_PARAM *p;
  226. int n;
  227. if (ossl_param_is_empty(params))
  228. return 1;
  229. if (OSSL_PARAM_locate_const(params, OSSL_ALG_PARAM_DIGEST) != NULL) {
  230. const EVP_MD *md = NULL;
  231. if (!ossl_prov_digest_load_from_params(&ctx->digest, params, libctx))
  232. return 0;
  233. md = ossl_prov_digest_md(&ctx->digest);
  234. if (EVP_MD_xof(md)) {
  235. ERR_raise(ERR_LIB_PROV, PROV_R_XOF_DIGESTS_NOT_ALLOWED);
  236. return 0;
  237. }
  238. }
  239. if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_MODE)) != NULL) {
  240. if (p->data_type == OSSL_PARAM_UTF8_STRING) {
  241. if (OPENSSL_strcasecmp(p->data, "EXTRACT_AND_EXPAND") == 0) {
  242. ctx->mode = EVP_KDF_HKDF_MODE_EXTRACT_AND_EXPAND;
  243. } else if (OPENSSL_strcasecmp(p->data, "EXTRACT_ONLY") == 0) {
  244. ctx->mode = EVP_KDF_HKDF_MODE_EXTRACT_ONLY;
  245. } else if (OPENSSL_strcasecmp(p->data, "EXPAND_ONLY") == 0) {
  246. ctx->mode = EVP_KDF_HKDF_MODE_EXPAND_ONLY;
  247. } else {
  248. ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_MODE);
  249. return 0;
  250. }
  251. } else if (OSSL_PARAM_get_int(p, &n)) {
  252. if (n != EVP_KDF_HKDF_MODE_EXTRACT_AND_EXPAND
  253. && n != EVP_KDF_HKDF_MODE_EXTRACT_ONLY
  254. && n != EVP_KDF_HKDF_MODE_EXPAND_ONLY) {
  255. ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_MODE);
  256. return 0;
  257. }
  258. ctx->mode = n;
  259. } else {
  260. ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_MODE);
  261. return 0;
  262. }
  263. }
  264. if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_KEY)) != NULL) {
  265. OPENSSL_clear_free(ctx->key, ctx->key_len);
  266. ctx->key = NULL;
  267. if (!OSSL_PARAM_get_octet_string(p, (void **)&ctx->key, 0,
  268. &ctx->key_len))
  269. return 0;
  270. }
  271. if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_SALT)) != NULL) {
  272. OPENSSL_free(ctx->salt);
  273. ctx->salt = NULL;
  274. if (!OSSL_PARAM_get_octet_string(p, (void **)&ctx->salt, 0,
  275. &ctx->salt_len))
  276. return 0;
  277. }
  278. return 1;
  279. }
  280. static int kdf_hkdf_set_ctx_params(void *vctx, const OSSL_PARAM params[])
  281. {
  282. KDF_HKDF *ctx = vctx;
  283. if (ossl_param_is_empty(params))
  284. return 1;
  285. if (!OSSL_FIPS_IND_SET_CTX_PARAM(ctx, OSSL_FIPS_IND_SETTABLE0, params,
  286. OSSL_KDF_PARAM_FIPS_KEY_CHECK))
  287. return 0;
  288. if (!hkdf_common_set_ctx_params(ctx, params))
  289. return 0;
  290. if (ossl_param_get1_concat_octet_string(params, OSSL_KDF_PARAM_INFO,
  291. &ctx->info, &ctx->info_len,
  292. HKDF_MAXINFO) == 0)
  293. return 0;
  294. #ifdef FIPS_MODULE
  295. if (OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_KEY) != NULL)
  296. if (!fips_hkdf_key_check_passed(ctx))
  297. return 0;
  298. #endif
  299. return 1;
  300. }
  301. static const OSSL_PARAM *kdf_hkdf_settable_ctx_params(ossl_unused void *ctx,
  302. ossl_unused void *provctx)
  303. {
  304. static const OSSL_PARAM known_settable_ctx_params[] = {
  305. HKDF_COMMON_SETTABLES,
  306. OSSL_PARAM_octet_string(OSSL_KDF_PARAM_INFO, NULL, 0),
  307. OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_KDF_PARAM_FIPS_KEY_CHECK)
  308. OSSL_PARAM_END
  309. };
  310. return known_settable_ctx_params;
  311. }
  312. static int hkdf_common_get_ctx_params(KDF_HKDF *ctx, OSSL_PARAM params[])
  313. {
  314. OSSL_PARAM *p;
  315. if (ossl_param_is_empty(params))
  316. return 1;
  317. if ((p = OSSL_PARAM_locate(params, OSSL_KDF_PARAM_SIZE)) != NULL) {
  318. size_t sz = kdf_hkdf_size(ctx);
  319. if (sz == 0)
  320. return 0;
  321. if (!OSSL_PARAM_set_size_t(p, sz))
  322. return 0;
  323. }
  324. if ((p = OSSL_PARAM_locate(params, OSSL_KDF_PARAM_INFO)) != NULL) {
  325. if (ctx->info == NULL || ctx->info_len == 0)
  326. p->return_size = 0;
  327. else if (!OSSL_PARAM_set_octet_string(p, ctx->info, ctx->info_len))
  328. return 0;
  329. }
  330. return 1;
  331. }
  332. static int kdf_hkdf_get_ctx_params(void *vctx, OSSL_PARAM params[])
  333. {
  334. KDF_HKDF *ctx = (KDF_HKDF *)vctx;
  335. if (ossl_param_is_empty(params))
  336. return 1;
  337. if (!hkdf_common_get_ctx_params(ctx, params))
  338. return 0;
  339. if (!OSSL_FIPS_IND_GET_CTX_PARAM(ctx, params))
  340. return 0;
  341. return 1;
  342. }
  343. static const OSSL_PARAM *kdf_hkdf_gettable_ctx_params(ossl_unused void *ctx,
  344. ossl_unused void *provctx)
  345. {
  346. static const OSSL_PARAM known_gettable_ctx_params[] = {
  347. HKDF_COMMON_GETTABLES,
  348. OSSL_FIPS_IND_GETTABLE_CTX_PARAM()
  349. OSSL_PARAM_END
  350. };
  351. return known_gettable_ctx_params;
  352. }
  353. const OSSL_DISPATCH ossl_kdf_hkdf_functions[] = {
  354. { OSSL_FUNC_KDF_NEWCTX, (void(*)(void))kdf_hkdf_new },
  355. { OSSL_FUNC_KDF_DUPCTX, (void(*)(void))kdf_hkdf_dup },
  356. { OSSL_FUNC_KDF_FREECTX, (void(*)(void))kdf_hkdf_free },
  357. { OSSL_FUNC_KDF_RESET, (void(*)(void))kdf_hkdf_reset },
  358. { OSSL_FUNC_KDF_DERIVE, (void(*)(void))kdf_hkdf_derive },
  359. { OSSL_FUNC_KDF_SETTABLE_CTX_PARAMS,
  360. (void(*)(void))kdf_hkdf_settable_ctx_params },
  361. { OSSL_FUNC_KDF_SET_CTX_PARAMS, (void(*)(void))kdf_hkdf_set_ctx_params },
  362. { OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS,
  363. (void(*)(void))kdf_hkdf_gettable_ctx_params },
  364. { OSSL_FUNC_KDF_GET_CTX_PARAMS, (void(*)(void))kdf_hkdf_get_ctx_params },
  365. OSSL_DISPATCH_END
  366. };
  367. /*
  368. * Refer to "HMAC-based Extract-and-Expand Key Derivation Function (HKDF)"
  369. * Section 2 (https://tools.ietf.org/html/rfc5869#section-2) and
  370. * "Cryptographic Extraction and Key Derivation: The HKDF Scheme"
  371. * Section 4.2 (https://eprint.iacr.org/2010/264.pdf).
  372. *
  373. * From the paper:
  374. * The scheme HKDF is specified as:
  375. * HKDF(XTS, SKM, CTXinfo, L) = K(1) | K(2) | ... | K(t)
  376. *
  377. * where:
  378. * SKM is source key material
  379. * XTS is extractor salt (which may be null or constant)
  380. * CTXinfo is context information (may be null)
  381. * L is the number of key bits to be produced by KDF
  382. * k is the output length in bits of the hash function used with HMAC
  383. * t = ceil(L/k)
  384. * the value K(t) is truncated to its first d = L mod k bits.
  385. *
  386. * From RFC 5869:
  387. * 2.2. Step 1: Extract
  388. * HKDF-Extract(salt, IKM) -> PRK
  389. * 2.3. Step 2: Expand
  390. * HKDF-Expand(PRK, info, L) -> OKM
  391. */
  392. static int HKDF(OSSL_LIB_CTX *libctx, const EVP_MD *evp_md,
  393. const unsigned char *salt, size_t salt_len,
  394. const unsigned char *ikm, size_t ikm_len,
  395. const unsigned char *info, size_t info_len,
  396. unsigned char *okm, size_t okm_len)
  397. {
  398. unsigned char prk[EVP_MAX_MD_SIZE];
  399. int ret, sz;
  400. size_t prk_len;
  401. sz = EVP_MD_get_size(evp_md);
  402. if (sz <= 0)
  403. return 0;
  404. prk_len = (size_t)sz;
  405. /* Step 1: HKDF-Extract(salt, IKM) -> PRK */
  406. if (!HKDF_Extract(libctx, evp_md,
  407. salt, salt_len, ikm, ikm_len, prk, prk_len))
  408. return 0;
  409. /* Step 2: HKDF-Expand(PRK, info, L) -> OKM */
  410. ret = HKDF_Expand(evp_md, prk, prk_len, info, info_len, okm, okm_len);
  411. OPENSSL_cleanse(prk, sizeof(prk));
  412. return ret;
  413. }
  414. /*
  415. * Refer to "HMAC-based Extract-and-Expand Key Derivation Function (HKDF)"
  416. * Section 2.2 (https://tools.ietf.org/html/rfc5869#section-2.2).
  417. *
  418. * 2.2. Step 1: Extract
  419. *
  420. * HKDF-Extract(salt, IKM) -> PRK
  421. *
  422. * Options:
  423. * Hash a hash function; HashLen denotes the length of the
  424. * hash function output in octets
  425. *
  426. * Inputs:
  427. * salt optional salt value (a non-secret random value);
  428. * if not provided, it is set to a string of HashLen zeros.
  429. * IKM input keying material
  430. *
  431. * Output:
  432. * PRK a pseudorandom key (of HashLen octets)
  433. *
  434. * The output PRK is calculated as follows:
  435. *
  436. * PRK = HMAC-Hash(salt, IKM)
  437. */
  438. static int HKDF_Extract(OSSL_LIB_CTX *libctx, const EVP_MD *evp_md,
  439. const unsigned char *salt, size_t salt_len,
  440. const unsigned char *ikm, size_t ikm_len,
  441. unsigned char *prk, size_t prk_len)
  442. {
  443. int sz = EVP_MD_get_size(evp_md);
  444. if (sz <= 0)
  445. return 0;
  446. if (prk_len != (size_t)sz) {
  447. ERR_raise(ERR_LIB_PROV, PROV_R_WRONG_OUTPUT_BUFFER_SIZE);
  448. return 0;
  449. }
  450. /* calc: PRK = HMAC-Hash(salt, IKM) */
  451. return
  452. EVP_Q_mac(libctx, "HMAC", NULL, EVP_MD_get0_name(evp_md), NULL, salt,
  453. salt_len, ikm, ikm_len, prk, EVP_MD_get_size(evp_md), NULL)
  454. != NULL;
  455. }
  456. /*
  457. * Refer to "HMAC-based Extract-and-Expand Key Derivation Function (HKDF)"
  458. * Section 2.3 (https://tools.ietf.org/html/rfc5869#section-2.3).
  459. *
  460. * 2.3. Step 2: Expand
  461. *
  462. * HKDF-Expand(PRK, info, L) -> OKM
  463. *
  464. * Options:
  465. * Hash a hash function; HashLen denotes the length of the
  466. * hash function output in octets
  467. *
  468. * Inputs:
  469. * PRK a pseudorandom key of at least HashLen octets
  470. * (usually, the output from the extract step)
  471. * info optional context and application specific information
  472. * (can be a zero-length string)
  473. * L length of output keying material in octets
  474. * (<= 255*HashLen)
  475. *
  476. * Output:
  477. * OKM output keying material (of L octets)
  478. *
  479. * The output OKM is calculated as follows:
  480. *
  481. * N = ceil(L/HashLen)
  482. * T = T(1) | T(2) | T(3) | ... | T(N)
  483. * OKM = first L octets of T
  484. *
  485. * where:
  486. * T(0) = empty string (zero length)
  487. * T(1) = HMAC-Hash(PRK, T(0) | info | 0x01)
  488. * T(2) = HMAC-Hash(PRK, T(1) | info | 0x02)
  489. * T(3) = HMAC-Hash(PRK, T(2) | info | 0x03)
  490. * ...
  491. *
  492. * (where the constant concatenated to the end of each T(n) is a
  493. * single octet.)
  494. */
  495. static int HKDF_Expand(const EVP_MD *evp_md,
  496. const unsigned char *prk, size_t prk_len,
  497. const unsigned char *info, size_t info_len,
  498. unsigned char *okm, size_t okm_len)
  499. {
  500. HMAC_CTX *hmac;
  501. int ret = 0, sz;
  502. unsigned int i;
  503. unsigned char prev[EVP_MAX_MD_SIZE];
  504. size_t done_len = 0, dig_len, n;
  505. sz = EVP_MD_get_size(evp_md);
  506. if (sz <= 0)
  507. return 0;
  508. dig_len = (size_t)sz;
  509. /* calc: N = ceil(L/HashLen) */
  510. n = okm_len / dig_len;
  511. if (okm_len % dig_len)
  512. n++;
  513. if (n > 255 || okm == NULL)
  514. return 0;
  515. if ((hmac = HMAC_CTX_new()) == NULL)
  516. return 0;
  517. if (!HMAC_Init_ex(hmac, prk, prk_len, evp_md, NULL))
  518. goto err;
  519. for (i = 1; i <= n; i++) {
  520. size_t copy_len;
  521. const unsigned char ctr = i;
  522. /* calc: T(i) = HMAC-Hash(PRK, T(i - 1) | info | i) */
  523. if (i > 1) {
  524. if (!HMAC_Init_ex(hmac, NULL, 0, NULL, NULL))
  525. goto err;
  526. if (!HMAC_Update(hmac, prev, dig_len))
  527. goto err;
  528. }
  529. if (!HMAC_Update(hmac, info, info_len))
  530. goto err;
  531. if (!HMAC_Update(hmac, &ctr, 1))
  532. goto err;
  533. if (!HMAC_Final(hmac, prev, NULL))
  534. goto err;
  535. copy_len = (dig_len > okm_len - done_len) ?
  536. okm_len - done_len :
  537. dig_len;
  538. memcpy(okm + done_len, prev, copy_len);
  539. done_len += copy_len;
  540. }
  541. ret = 1;
  542. err:
  543. OPENSSL_cleanse(prev, sizeof(prev));
  544. HMAC_CTX_free(hmac);
  545. return ret;
  546. }
  547. /*
  548. * TLS uses slight variations of the above and for FIPS validation purposes,
  549. * they need to be present here.
  550. * Refer to RFC 8446 section 7 for specific details.
  551. */
  552. /*
  553. * Given a |secret|; a |label| of length |labellen|; and |data| of length
  554. * |datalen| (e.g. typically a hash of the handshake messages), derive a new
  555. * secret |outlen| bytes long and store it in the location pointed to be |out|.
  556. * The |data| value may be zero length. Returns 1 on success and 0 on failure.
  557. */
  558. static int prov_tls13_hkdf_expand(const EVP_MD *md,
  559. const unsigned char *key, size_t keylen,
  560. const unsigned char *prefix, size_t prefixlen,
  561. const unsigned char *label, size_t labellen,
  562. const unsigned char *data, size_t datalen,
  563. unsigned char *out, size_t outlen)
  564. {
  565. size_t hkdflabellen;
  566. unsigned char hkdflabel[HKDF_MAXBUF];
  567. WPACKET pkt;
  568. /*
  569. * 2 bytes for length of derived secret + 1 byte for length of combined
  570. * prefix and label + bytes for the label itself + 1 byte length of hash
  571. * + bytes for the hash itself. We've got the maximum the KDF can handle
  572. * which should always be sufficient.
  573. */
  574. if (!WPACKET_init_static_len(&pkt, hkdflabel, sizeof(hkdflabel), 0)
  575. || !WPACKET_put_bytes_u16(&pkt, outlen)
  576. || !WPACKET_start_sub_packet_u8(&pkt)
  577. || !WPACKET_memcpy(&pkt, prefix, prefixlen)
  578. || !WPACKET_memcpy(&pkt, label, labellen)
  579. || !WPACKET_close(&pkt)
  580. || !WPACKET_sub_memcpy_u8(&pkt, data, (data == NULL) ? 0 : datalen)
  581. || !WPACKET_get_total_written(&pkt, &hkdflabellen)
  582. || !WPACKET_finish(&pkt)) {
  583. WPACKET_cleanup(&pkt);
  584. return 0;
  585. }
  586. return HKDF_Expand(md, key, keylen, hkdflabel, hkdflabellen,
  587. out, outlen);
  588. }
  589. static int prov_tls13_hkdf_generate_secret(OSSL_LIB_CTX *libctx,
  590. const EVP_MD *md,
  591. const unsigned char *prevsecret,
  592. size_t prevsecretlen,
  593. const unsigned char *insecret,
  594. size_t insecretlen,
  595. const unsigned char *prefix,
  596. size_t prefixlen,
  597. const unsigned char *label,
  598. size_t labellen,
  599. unsigned char *out, size_t outlen)
  600. {
  601. size_t mdlen;
  602. int ret;
  603. unsigned char preextractsec[EVP_MAX_MD_SIZE];
  604. /* Always filled with zeros */
  605. static const unsigned char default_zeros[EVP_MAX_MD_SIZE];
  606. ret = EVP_MD_get_size(md);
  607. /* Ensure cast to size_t is safe */
  608. if (ret <= 0)
  609. return 0;
  610. mdlen = (size_t)ret;
  611. if (insecret == NULL) {
  612. insecret = default_zeros;
  613. insecretlen = mdlen;
  614. }
  615. if (prevsecret == NULL) {
  616. prevsecret = default_zeros;
  617. prevsecretlen = mdlen;
  618. } else {
  619. EVP_MD_CTX *mctx = EVP_MD_CTX_new();
  620. unsigned char hash[EVP_MAX_MD_SIZE];
  621. /* The pre-extract derive step uses a hash of no messages */
  622. if (mctx == NULL
  623. || EVP_DigestInit_ex(mctx, md, NULL) <= 0
  624. || EVP_DigestFinal_ex(mctx, hash, NULL) <= 0) {
  625. EVP_MD_CTX_free(mctx);
  626. return 0;
  627. }
  628. EVP_MD_CTX_free(mctx);
  629. /* Generate the pre-extract secret */
  630. if (!prov_tls13_hkdf_expand(md, prevsecret, prevsecretlen,
  631. prefix, prefixlen, label, labellen,
  632. hash, mdlen, preextractsec, mdlen))
  633. return 0;
  634. prevsecret = preextractsec;
  635. prevsecretlen = mdlen;
  636. }
  637. ret = HKDF_Extract(libctx, md, prevsecret, prevsecretlen,
  638. insecret, insecretlen, out, outlen);
  639. if (prevsecret == preextractsec)
  640. OPENSSL_cleanse(preextractsec, mdlen);
  641. return ret;
  642. }
  643. #ifdef FIPS_MODULE
  644. static int fips_tls1_3_digest_check_passed(KDF_HKDF *ctx, const EVP_MD *md)
  645. {
  646. OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);
  647. /*
  648. * Perform digest check
  649. *
  650. * According to RFC 8446 appendix B.4, the valid hash functions are
  651. * specified in FIPS 180-4. However, it only lists SHA2-256 and SHA2-384 in
  652. * the table. ACVP also only lists the same set of hash functions.
  653. */
  654. int digest_unapproved = !EVP_MD_is_a(md, SN_sha256)
  655. && !EVP_MD_is_a(md, SN_sha384);
  656. if (digest_unapproved) {
  657. if (!OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE0,
  658. libctx, "TLS13 KDF", "Digest",
  659. ossl_fips_config_tls13_kdf_digest_check)) {
  660. ERR_raise(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED);
  661. return 0;
  662. }
  663. }
  664. return 1;
  665. }
  666. /*
  667. * Calculate the correct length of the secret key.
  668. *
  669. * RFC 8446:
  670. * If a given secret is not available, then the 0-value consisting of a
  671. * string of Hash.length bytes set to zeros is used.
  672. */
  673. static size_t fips_tls1_3_key_size(KDF_HKDF *ctx)
  674. {
  675. const EVP_MD *md = ossl_prov_digest_md(&ctx->digest);
  676. size_t key_size = 0;
  677. if (ctx->key != NULL)
  678. key_size = ctx->key_len;
  679. else if (md != NULL)
  680. key_size = EVP_MD_size(md);
  681. return key_size;
  682. }
  683. static int fips_tls1_3_key_check_passed(KDF_HKDF *ctx)
  684. {
  685. OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);
  686. int key_approved = ossl_kdf_check_key_size(fips_tls1_3_key_size(ctx));
  687. if (!key_approved) {
  688. if (!OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE1,
  689. libctx, "TLS13 KDF", "Key size",
  690. ossl_fips_config_tls13_kdf_key_check)) {
  691. ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
  692. return 0;
  693. }
  694. }
  695. return 1;
  696. }
  697. #endif
  698. static int kdf_tls1_3_derive(void *vctx, unsigned char *key, size_t keylen,
  699. const OSSL_PARAM params[])
  700. {
  701. KDF_HKDF *ctx = (KDF_HKDF *)vctx;
  702. const EVP_MD *md;
  703. if (!ossl_prov_is_running() || !kdf_tls1_3_set_ctx_params(ctx, params))
  704. return 0;
  705. md = ossl_prov_digest_md(&ctx->digest);
  706. if (md == NULL) {
  707. ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST);
  708. return 0;
  709. }
  710. switch (ctx->mode) {
  711. default:
  712. return 0;
  713. case EVP_KDF_HKDF_MODE_EXTRACT_ONLY:
  714. return prov_tls13_hkdf_generate_secret(PROV_LIBCTX_OF(ctx->provctx),
  715. md,
  716. ctx->salt, ctx->salt_len,
  717. ctx->key, ctx->key_len,
  718. ctx->prefix, ctx->prefix_len,
  719. ctx->label, ctx->label_len,
  720. key, keylen);
  721. case EVP_KDF_HKDF_MODE_EXPAND_ONLY:
  722. return prov_tls13_hkdf_expand(md, ctx->key, ctx->key_len,
  723. ctx->prefix, ctx->prefix_len,
  724. ctx->label, ctx->label_len,
  725. ctx->data, ctx->data_len,
  726. key, keylen);
  727. }
  728. }
  729. static int kdf_tls1_3_set_ctx_params(void *vctx, const OSSL_PARAM params[])
  730. {
  731. const OSSL_PARAM *p;
  732. KDF_HKDF *ctx = vctx;
  733. if (ossl_param_is_empty(params))
  734. return 1;
  735. if (!OSSL_FIPS_IND_SET_CTX_PARAM(ctx, OSSL_FIPS_IND_SETTABLE0, params,
  736. OSSL_KDF_PARAM_FIPS_DIGEST_CHECK))
  737. return 0;
  738. if (!OSSL_FIPS_IND_SET_CTX_PARAM(ctx, OSSL_FIPS_IND_SETTABLE1, params,
  739. OSSL_KDF_PARAM_FIPS_KEY_CHECK))
  740. return 0;
  741. if (!hkdf_common_set_ctx_params(ctx, params))
  742. return 0;
  743. if (ctx->mode == EVP_KDF_HKDF_MODE_EXTRACT_AND_EXPAND) {
  744. ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_MODE);
  745. return 0;
  746. }
  747. if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_PREFIX)) != NULL) {
  748. OPENSSL_free(ctx->prefix);
  749. ctx->prefix = NULL;
  750. if (!OSSL_PARAM_get_octet_string(p, (void **)&ctx->prefix, 0,
  751. &ctx->prefix_len))
  752. return 0;
  753. }
  754. if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_LABEL)) != NULL) {
  755. OPENSSL_free(ctx->label);
  756. ctx->label = NULL;
  757. if (!OSSL_PARAM_get_octet_string(p, (void **)&ctx->label, 0,
  758. &ctx->label_len))
  759. return 0;
  760. }
  761. OPENSSL_clear_free(ctx->data, ctx->data_len);
  762. ctx->data = NULL;
  763. if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_DATA)) != NULL
  764. && !OSSL_PARAM_get_octet_string(p, (void **)&ctx->data, 0,
  765. &ctx->data_len))
  766. return 0;
  767. #ifdef FIPS_MODULE
  768. if (OSSL_PARAM_locate_const(params, OSSL_ALG_PARAM_DIGEST) != NULL) {
  769. const EVP_MD *md = ossl_prov_digest_md(&ctx->digest);
  770. if (!fips_tls1_3_digest_check_passed(ctx, md))
  771. return 0;
  772. }
  773. if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_KEY)) != NULL)
  774. if (!fips_tls1_3_key_check_passed(ctx))
  775. return 0;
  776. #endif
  777. return 1;
  778. }
  779. static const OSSL_PARAM *kdf_tls1_3_settable_ctx_params(ossl_unused void *ctx,
  780. ossl_unused void *provctx)
  781. {
  782. static const OSSL_PARAM known_settable_ctx_params[] = {
  783. HKDF_COMMON_SETTABLES,
  784. OSSL_PARAM_octet_string(OSSL_KDF_PARAM_PREFIX, NULL, 0),
  785. OSSL_PARAM_octet_string(OSSL_KDF_PARAM_LABEL, NULL, 0),
  786. OSSL_PARAM_octet_string(OSSL_KDF_PARAM_DATA, NULL, 0),
  787. OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_KDF_PARAM_FIPS_DIGEST_CHECK)
  788. OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_KDF_PARAM_FIPS_KEY_CHECK)
  789. OSSL_PARAM_END
  790. };
  791. return known_settable_ctx_params;
  792. }
  793. static int kdf_tls1_3_get_ctx_params(void *vctx, OSSL_PARAM params[])
  794. {
  795. KDF_HKDF *ctx = (KDF_HKDF *)vctx;
  796. if (ossl_param_is_empty(params))
  797. return 1;
  798. if (!hkdf_common_get_ctx_params(ctx, params))
  799. return 0;
  800. if (!OSSL_FIPS_IND_GET_CTX_PARAM(ctx, params))
  801. return 0;
  802. return 1;
  803. }
  804. static const OSSL_PARAM *kdf_tls1_3_gettable_ctx_params(ossl_unused void *ctx,
  805. ossl_unused void *provctx)
  806. {
  807. static const OSSL_PARAM known_gettable_ctx_params[] = {
  808. HKDF_COMMON_GETTABLES,
  809. OSSL_FIPS_IND_GETTABLE_CTX_PARAM()
  810. OSSL_PARAM_END
  811. };
  812. return known_gettable_ctx_params;
  813. }
  814. const OSSL_DISPATCH ossl_kdf_tls1_3_kdf_functions[] = {
  815. { OSSL_FUNC_KDF_NEWCTX, (void(*)(void))kdf_hkdf_new },
  816. { OSSL_FUNC_KDF_DUPCTX, (void(*)(void))kdf_hkdf_dup },
  817. { OSSL_FUNC_KDF_FREECTX, (void(*)(void))kdf_hkdf_free },
  818. { OSSL_FUNC_KDF_RESET, (void(*)(void))kdf_hkdf_reset },
  819. { OSSL_FUNC_KDF_DERIVE, (void(*)(void))kdf_tls1_3_derive },
  820. { OSSL_FUNC_KDF_SETTABLE_CTX_PARAMS,
  821. (void(*)(void))kdf_tls1_3_settable_ctx_params },
  822. { OSSL_FUNC_KDF_SET_CTX_PARAMS, (void(*)(void))kdf_tls1_3_set_ctx_params },
  823. { OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS,
  824. (void(*)(void))kdf_tls1_3_gettable_ctx_params },
  825. { OSSL_FUNC_KDF_GET_CTX_PARAMS, (void(*)(void))kdf_tls1_3_get_ctx_params },
  826. OSSL_DISPATCH_END
  827. };