hpke.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /*
  2. * Copyright 2022-2024 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. /* APIs and data structures for HPKE (RFC9180) */
  10. #ifndef OSSL_HPKE_H
  11. # define OSSL_HPKE_H
  12. # pragma once
  13. # include <openssl/types.h>
  14. /* HPKE modes */
  15. # define OSSL_HPKE_MODE_BASE 0 /* Base mode */
  16. # define OSSL_HPKE_MODE_PSK 1 /* Pre-shared key mode */
  17. # define OSSL_HPKE_MODE_AUTH 2 /* Authenticated mode */
  18. # define OSSL_HPKE_MODE_PSKAUTH 3 /* PSK+authenticated mode */
  19. /*
  20. * Max for ikm, psk, pskid, info and exporter contexts.
  21. * RFC9180, section 7.2.1 RECOMMENDS 64 octets but we have test vectors from
  22. * Appendix A.6.1 with a 66 octet IKM so we'll allow that.
  23. */
  24. # define OSSL_HPKE_MAX_PARMLEN 66
  25. # define OSSL_HPKE_MIN_PSKLEN 32
  26. # define OSSL_HPKE_MAX_INFOLEN 1024
  27. /*
  28. * The (16bit) HPKE algorithm ID IANA codepoints
  29. * If/when new IANA codepoints are added there are tables in
  30. * crypto/hpke/hpke_util.c that must also be updated.
  31. */
  32. # define OSSL_HPKE_KEM_ID_RESERVED 0x0000 /* not used */
  33. # define OSSL_HPKE_KEM_ID_P256 0x0010 /* NIST P-256 */
  34. # define OSSL_HPKE_KEM_ID_P384 0x0011 /* NIST P-384 */
  35. # define OSSL_HPKE_KEM_ID_P521 0x0012 /* NIST P-521 */
  36. # define OSSL_HPKE_KEM_ID_X25519 0x0020 /* Curve25519 */
  37. # define OSSL_HPKE_KEM_ID_X448 0x0021 /* Curve448 */
  38. # define OSSL_HPKE_KDF_ID_RESERVED 0x0000 /* not used */
  39. # define OSSL_HPKE_KDF_ID_HKDF_SHA256 0x0001 /* HKDF-SHA256 */
  40. # define OSSL_HPKE_KDF_ID_HKDF_SHA384 0x0002 /* HKDF-SHA384 */
  41. # define OSSL_HPKE_KDF_ID_HKDF_SHA512 0x0003 /* HKDF-SHA512 */
  42. # define OSSL_HPKE_AEAD_ID_RESERVED 0x0000 /* not used */
  43. # define OSSL_HPKE_AEAD_ID_AES_GCM_128 0x0001 /* AES-GCM-128 */
  44. # define OSSL_HPKE_AEAD_ID_AES_GCM_256 0x0002 /* AES-GCM-256 */
  45. # define OSSL_HPKE_AEAD_ID_CHACHA_POLY1305 0x0003 /* Chacha20-Poly1305 */
  46. # define OSSL_HPKE_AEAD_ID_EXPORTONLY 0xFFFF /* export-only fake ID */
  47. /* strings for suite components */
  48. # define OSSL_HPKE_KEMSTR_P256 "P-256" /* KEM id 0x10 */
  49. # define OSSL_HPKE_KEMSTR_P384 "P-384" /* KEM id 0x11 */
  50. # define OSSL_HPKE_KEMSTR_P521 "P-521" /* KEM id 0x12 */
  51. # define OSSL_HPKE_KEMSTR_X25519 "X25519" /* KEM id 0x20 */
  52. # define OSSL_HPKE_KEMSTR_X448 "X448" /* KEM id 0x21 */
  53. # define OSSL_HPKE_KDFSTR_256 "hkdf-sha256" /* KDF id 1 */
  54. # define OSSL_HPKE_KDFSTR_384 "hkdf-sha384" /* KDF id 2 */
  55. # define OSSL_HPKE_KDFSTR_512 "hkdf-sha512" /* KDF id 3 */
  56. # define OSSL_HPKE_AEADSTR_AES128GCM "aes-128-gcm" /* AEAD id 1 */
  57. # define OSSL_HPKE_AEADSTR_AES256GCM "aes-256-gcm" /* AEAD id 2 */
  58. # define OSSL_HPKE_AEADSTR_CP "chacha20-poly1305" /* AEAD id 3 */
  59. # define OSSL_HPKE_AEADSTR_EXP "exporter" /* AEAD id 0xff */
  60. /*
  61. * Roles for use in creating an OSSL_HPKE_CTX, most
  62. * important use of this is to control nonce re-use.
  63. */
  64. # define OSSL_HPKE_ROLE_SENDER 0
  65. # define OSSL_HPKE_ROLE_RECEIVER 1
  66. # ifdef __cplusplus
  67. extern "C" {
  68. # endif
  69. typedef struct {
  70. uint16_t kem_id; /* Key Encapsulation Method id */
  71. uint16_t kdf_id; /* Key Derivation Function id */
  72. uint16_t aead_id; /* AEAD alg id */
  73. } OSSL_HPKE_SUITE;
  74. /**
  75. * Suite constants, use this like:
  76. * OSSL_HPKE_SUITE myvar = OSSL_HPKE_SUITE_DEFAULT;
  77. */
  78. # ifndef OPENSSL_NO_ECX
  79. # define OSSL_HPKE_SUITE_DEFAULT \
  80. {\
  81. OSSL_HPKE_KEM_ID_X25519, \
  82. OSSL_HPKE_KDF_ID_HKDF_SHA256, \
  83. OSSL_HPKE_AEAD_ID_AES_GCM_128 \
  84. }
  85. # else
  86. # define OSSL_HPKE_SUITE_DEFAULT \
  87. {\
  88. OSSL_HPKE_KEM_ID_P256, \
  89. OSSL_HPKE_KDF_ID_HKDF_SHA256, \
  90. OSSL_HPKE_AEAD_ID_AES_GCM_128 \
  91. }
  92. #endif
  93. typedef struct ossl_hpke_ctx_st OSSL_HPKE_CTX;
  94. OSSL_HPKE_CTX *OSSL_HPKE_CTX_new(int mode, OSSL_HPKE_SUITE suite, int role,
  95. OSSL_LIB_CTX *libctx, const char *propq);
  96. void OSSL_HPKE_CTX_free(OSSL_HPKE_CTX *ctx);
  97. int OSSL_HPKE_encap(OSSL_HPKE_CTX *ctx,
  98. unsigned char *enc, size_t *enclen,
  99. const unsigned char *pub, size_t publen,
  100. const unsigned char *info, size_t infolen);
  101. int OSSL_HPKE_seal(OSSL_HPKE_CTX *ctx,
  102. unsigned char *ct, size_t *ctlen,
  103. const unsigned char *aad, size_t aadlen,
  104. const unsigned char *pt, size_t ptlen);
  105. int OSSL_HPKE_keygen(OSSL_HPKE_SUITE suite,
  106. unsigned char *pub, size_t *publen, EVP_PKEY **priv,
  107. const unsigned char *ikm, size_t ikmlen,
  108. OSSL_LIB_CTX *libctx, const char *propq);
  109. int OSSL_HPKE_decap(OSSL_HPKE_CTX *ctx,
  110. const unsigned char *enc, size_t enclen,
  111. EVP_PKEY *recippriv,
  112. const unsigned char *info, size_t infolen);
  113. int OSSL_HPKE_open(OSSL_HPKE_CTX *ctx,
  114. unsigned char *pt, size_t *ptlen,
  115. const unsigned char *aad, size_t aadlen,
  116. const unsigned char *ct, size_t ctlen);
  117. int OSSL_HPKE_export(OSSL_HPKE_CTX *ctx,
  118. unsigned char *secret,
  119. size_t secretlen,
  120. const unsigned char *label,
  121. size_t labellen);
  122. int OSSL_HPKE_CTX_set1_authpriv(OSSL_HPKE_CTX *ctx, EVP_PKEY *priv);
  123. int OSSL_HPKE_CTX_set1_authpub(OSSL_HPKE_CTX *ctx,
  124. const unsigned char *pub,
  125. size_t publen);
  126. int OSSL_HPKE_CTX_set1_psk(OSSL_HPKE_CTX *ctx,
  127. const char *pskid,
  128. const unsigned char *psk, size_t psklen);
  129. int OSSL_HPKE_CTX_set1_ikme(OSSL_HPKE_CTX *ctx,
  130. const unsigned char *ikme, size_t ikmelen);
  131. int OSSL_HPKE_CTX_set_seq(OSSL_HPKE_CTX *ctx, uint64_t seq);
  132. int OSSL_HPKE_CTX_get_seq(OSSL_HPKE_CTX *ctx, uint64_t *seq);
  133. int OSSL_HPKE_suite_check(OSSL_HPKE_SUITE suite);
  134. int OSSL_HPKE_get_grease_value(const OSSL_HPKE_SUITE *suite_in,
  135. OSSL_HPKE_SUITE *suite,
  136. unsigned char *enc, size_t *enclen,
  137. unsigned char *ct, size_t ctlen,
  138. OSSL_LIB_CTX *libctx, const char *propq);
  139. int OSSL_HPKE_str2suite(const char *str, OSSL_HPKE_SUITE *suite);
  140. size_t OSSL_HPKE_get_ciphertext_size(OSSL_HPKE_SUITE suite, size_t clearlen);
  141. size_t OSSL_HPKE_get_public_encap_size(OSSL_HPKE_SUITE suite);
  142. size_t OSSL_HPKE_get_recommended_ikmelen(OSSL_HPKE_SUITE suite);
  143. # ifdef __cplusplus
  144. }
  145. # endif
  146. #endif