hkdf.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /**
  2. * \file hkdf.h
  3. *
  4. * \brief This file contains the HKDF interface.
  5. *
  6. * The HMAC-based Extract-and-Expand Key Derivation Function (HKDF) is
  7. * specified by RFC 5869.
  8. */
  9. /*
  10. * Copyright (C) 2016-2018, ARM Limited, All Rights Reserved
  11. * SPDX-License-Identifier: Apache-2.0
  12. *
  13. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  14. * not use this file except in compliance with the License.
  15. * You may obtain a copy of the License at
  16. *
  17. * http://www.apache.org/licenses/LICENSE-2.0
  18. *
  19. * Unless required by applicable law or agreed to in writing, software
  20. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  21. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  22. * See the License for the specific language governing permissions and
  23. * limitations under the License.
  24. *
  25. * This file is part of mbed TLS (https://tls.mbed.org)
  26. */
  27. #ifndef MBEDTLS_HKDF_H
  28. #define MBEDTLS_HKDF_H
  29. #include "md.h"
  30. /**
  31. * \name HKDF Error codes
  32. * \{
  33. */
  34. #define MBEDTLS_ERR_HKDF_BAD_INPUT_DATA -0x5F80 /**< Bad input parameters to function. */
  35. /* \} name */
  36. #ifdef __cplusplus
  37. extern "C" {
  38. #endif
  39. /**
  40. * \brief This is the HMAC-based Extract-and-Expand Key Derivation Function
  41. * (HKDF).
  42. *
  43. * \param md A hash function; md.size denotes the length of the hash
  44. * function output in bytes.
  45. * \param salt An optional salt value (a non-secret random value);
  46. * if the salt is not provided, a string of all zeros of
  47. * md.size length is used as the salt.
  48. * \param salt_len The length in bytes of the optional \p salt.
  49. * \param ikm The input keying material.
  50. * \param ikm_len The length in bytes of \p ikm.
  51. * \param info An optional context and application specific information
  52. * string. This can be a zero-length string.
  53. * \param info_len The length of \p info in bytes.
  54. * \param okm The output keying material of \p okm_len bytes.
  55. * \param okm_len The length of the output keying material in bytes. This
  56. * must be less than or equal to 255 * md.size bytes.
  57. *
  58. * \return 0 on success.
  59. * \return #MBEDTLS_ERR_HKDF_BAD_INPUT_DATA when the parameters are invalid.
  60. * \return An MBEDTLS_ERR_MD_* error for errors returned from the underlying
  61. * MD layer.
  62. */
  63. int mbedtls_hkdf( const mbedtls_md_info_t *md, const unsigned char *salt,
  64. size_t salt_len, const unsigned char *ikm, size_t ikm_len,
  65. const unsigned char *info, size_t info_len,
  66. unsigned char *okm, size_t okm_len );
  67. /**
  68. * \brief Take the input keying material \p ikm and extract from it a
  69. * fixed-length pseudorandom key \p prk.
  70. *
  71. * \param md A hash function; md.size denotes the length of the
  72. * hash function output in bytes.
  73. * \param salt An optional salt value (a non-secret random value);
  74. * if the salt is not provided, a string of all zeros
  75. * of md.size length is used as the salt.
  76. * \param salt_len The length in bytes of the optional \p salt.
  77. * \param ikm The input keying material.
  78. * \param ikm_len The length in bytes of \p ikm.
  79. * \param[out] prk A pseudorandom key of at least md.size bytes.
  80. *
  81. * \return 0 on success.
  82. * \return #MBEDTLS_ERR_HKDF_BAD_INPUT_DATA when the parameters are invalid.
  83. * \return An MBEDTLS_ERR_MD_* error for errors returned from the underlying
  84. * MD layer.
  85. */
  86. int mbedtls_hkdf_extract( const mbedtls_md_info_t *md,
  87. const unsigned char *salt, size_t salt_len,
  88. const unsigned char *ikm, size_t ikm_len,
  89. unsigned char *prk );
  90. /**
  91. * \brief Expand the supplied \p prk into several additional pseudorandom
  92. * keys, which is the output of the HKDF.
  93. *
  94. * \param md A hash function; md.size denotes the length of the hash
  95. * function output in bytes.
  96. * \param prk A pseudorandom key of at least md.size bytes. \p prk is usually,
  97. * the output from the HKDF extract step.
  98. * \param prk_len The length in bytes of \p prk.
  99. * \param info An optional context and application specific information
  100. * string. This can be a zero-length string.
  101. * \param info_len The length of \p info in bytes.
  102. * \param okm The output keying material of \p okm_len bytes.
  103. * \param okm_len The length of the output keying material in bytes. This
  104. * must be less than or equal to 255 * md.size bytes.
  105. *
  106. * \return 0 on success.
  107. * \return #MBEDTLS_ERR_HKDF_BAD_INPUT_DATA when the parameters are invalid.
  108. * \return An MBEDTLS_ERR_MD_* error for errors returned from the underlying
  109. * MD layer.
  110. */
  111. int mbedtls_hkdf_expand( const mbedtls_md_info_t *md, const unsigned char *prk,
  112. size_t prk_len, const unsigned char *info,
  113. size_t info_len, unsigned char *okm, size_t okm_len );
  114. #ifdef __cplusplus
  115. }
  116. #endif
  117. #endif /* hkdf.h */