ml_dsa.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /*
  2. * Copyright 2024-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. /* Internal ML_DSA functions for other submodules, not for application use */
  10. #ifndef OSSL_CRYPTO_ML_DSA_H
  11. # define OSSL_CRYPTO_ML_DSA_H
  12. # pragma once
  13. # include <openssl/e_os2.h>
  14. # include <openssl/types.h>
  15. # include "crypto/types.h"
  16. # define ML_DSA_MAX_CONTEXT_STRING_LEN 255
  17. # define ML_DSA_SEED_BYTES 32
  18. # define ML_DSA_ENTROPY_LEN 32
  19. /* See FIPS 204 Section 4 Table 1 & Table 2 */
  20. # define ML_DSA_44_PRIV_LEN 2560
  21. # define ML_DSA_44_PUB_LEN 1312
  22. # define ML_DSA_44_SIG_LEN 2420
  23. /* See FIPS 204 Section 4 Table 1 & Table 2 */
  24. # define ML_DSA_65_PRIV_LEN 4032
  25. # define ML_DSA_65_PUB_LEN 1952
  26. # define ML_DSA_65_SIG_LEN 3309
  27. /* See FIPS 204 Section 4 Table 1 & Table 2 */
  28. # define ML_DSA_87_PRIV_LEN 4896
  29. # define ML_DSA_87_PUB_LEN 2592
  30. # define ML_DSA_87_SIG_LEN 4627
  31. /* Key and signature size maxima taken from values above */
  32. # define MAX_ML_DSA_PRIV_LEN ML_DSA_87_PRIV_LEN
  33. # define MAX_ML_DSA_PUB_LEN ML_DSA_87_PUB_LEN
  34. # define MAX_ML_DSA_SIG_LEN ML_DSA_87_SIG_LEN
  35. # define ML_DSA_KEY_PREFER_SEED (1 << 0)
  36. # define ML_DSA_KEY_RETAIN_SEED (1 << 1)
  37. /* Default provider flags */
  38. # define ML_DSA_KEY_PROV_FLAGS_DEFAULT \
  39. (ML_DSA_KEY_PREFER_SEED | ML_DSA_KEY_RETAIN_SEED)
  40. /*
  41. * Refer to FIPS 204 Section 4 Parameter sets.
  42. * Fields that are shared between all algorithms (such as q & d) have been omitted.
  43. */
  44. typedef struct ml_dsa_params_st {
  45. const char *alg;
  46. int evp_type;
  47. int tau; /* Number of +/-1's in polynomial c */
  48. int bit_strength; /* The collision strength (lambda) */
  49. int gamma1; /* coefficient range of y */
  50. int gamma2; /* low-order rounding range */
  51. size_t k, l; /* matrix dimensions of 'A' */
  52. int eta; /* Private key range */
  53. int beta; /* tau * eta */
  54. int omega; /* Number of 1's in the hint 'h' */
  55. int security_category; /* Category is related to Security strength */
  56. size_t sk_len; /* private key size */
  57. size_t pk_len; /* public key size */
  58. size_t sig_len; /* signature size */
  59. } ML_DSA_PARAMS;
  60. /* NOTE - any changes to this struct may require updates to ossl_ml_dsa_dup() */
  61. typedef struct ml_dsa_key_st ML_DSA_KEY;
  62. const ML_DSA_PARAMS *ossl_ml_dsa_params_get(int evp_type);
  63. const ML_DSA_PARAMS *ossl_ml_dsa_key_params(const ML_DSA_KEY *key);
  64. __owur ML_DSA_KEY *ossl_ml_dsa_key_new(OSSL_LIB_CTX *libctx, const char *propq,
  65. int evp_type);
  66. /* Factory reset for keys that fail initialisation */
  67. void ossl_ml_dsa_key_reset(ML_DSA_KEY *key);
  68. __owur int ossl_ml_dsa_key_pub_alloc(ML_DSA_KEY *key);
  69. __owur int ossl_ml_dsa_key_priv_alloc(ML_DSA_KEY *key);
  70. void ossl_ml_dsa_key_free(ML_DSA_KEY *key);
  71. __owur ML_DSA_KEY *ossl_ml_dsa_key_dup(const ML_DSA_KEY *src, int selection);
  72. __owur int ossl_ml_dsa_key_equal(const ML_DSA_KEY *key1, const ML_DSA_KEY *key2,
  73. int selection);
  74. __owur int ossl_ml_dsa_key_has(const ML_DSA_KEY *key, int selection);
  75. __owur int ossl_ml_dsa_key_pairwise_check(const ML_DSA_KEY *key);
  76. __owur int ossl_ml_dsa_generate_key(ML_DSA_KEY *out);
  77. __owur const uint8_t *ossl_ml_dsa_key_get_pub(const ML_DSA_KEY *key);
  78. __owur size_t ossl_ml_dsa_key_get_pub_len(const ML_DSA_KEY *key);
  79. __owur const uint8_t *ossl_ml_dsa_key_get_priv(const ML_DSA_KEY *key);
  80. __owur size_t ossl_ml_dsa_key_get_priv_len(const ML_DSA_KEY *key);
  81. __owur const uint8_t *ossl_ml_dsa_key_get_seed(const ML_DSA_KEY *key);
  82. __owur int ossl_ml_dsa_key_get_prov_flags(const ML_DSA_KEY *key);
  83. int ossl_ml_dsa_set_prekey(ML_DSA_KEY *key, int flags_set, int flags_clr,
  84. const uint8_t *seed, size_t seed_len,
  85. const uint8_t *sk, size_t sk_len);
  86. __owur size_t ossl_ml_dsa_key_get_collision_strength_bits(const ML_DSA_KEY *key);
  87. __owur size_t ossl_ml_dsa_key_get_sig_len(const ML_DSA_KEY *key);
  88. __owur int ossl_ml_dsa_key_matches(const ML_DSA_KEY *key, int evp_type);
  89. __owur const char *ossl_ml_dsa_key_get_name(const ML_DSA_KEY *key);
  90. OSSL_LIB_CTX *ossl_ml_dsa_key_get0_libctx(const ML_DSA_KEY *key);
  91. __owur int ossl_ml_dsa_key_public_from_private(ML_DSA_KEY *key);
  92. __owur int ossl_ml_dsa_pk_decode(ML_DSA_KEY *key, const uint8_t *in, size_t in_len);
  93. __owur int ossl_ml_dsa_sk_decode(ML_DSA_KEY *key, const uint8_t *in, size_t in_len);
  94. __owur int ossl_ml_dsa_sign(const ML_DSA_KEY *priv, int msg_is_mu,
  95. const uint8_t *msg, size_t msg_len,
  96. const uint8_t *context, size_t context_len,
  97. const uint8_t *rand, size_t rand_len, int encode,
  98. unsigned char *sig, size_t *siglen, size_t sigsize);
  99. __owur int ossl_ml_dsa_verify(const ML_DSA_KEY *pub, int msg_is_mu,
  100. const uint8_t *msg, size_t msg_len,
  101. const uint8_t *context, size_t context_len,
  102. int encode, const uint8_t *sig, size_t sig_len);
  103. #endif /* OSSL_CRYPTO_SLH_DSA_H */