s2n_security_policies.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. /*
  2. * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License").
  5. * You may not use this file except in compliance with the License.
  6. * A copy of the License is located at
  7. *
  8. * http://aws.amazon.com/apache2.0
  9. *
  10. * or in the "license" file accompanying this file. This file is distributed
  11. * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
  12. * express or implied. See the License for the specific language governing
  13. * permissions and limitations under the License.
  14. */
  15. #pragma once
  16. #include <stdint.h>
  17. #include "tls/s2n_cipher_preferences.h"
  18. #include "tls/s2n_ecc_preferences.h"
  19. #include "tls/s2n_kem_preferences.h"
  20. #include "tls/s2n_signature_scheme.h"
  21. /* Kept up-to-date by s2n_security_policies_test */
  22. #define NUM_RSA_PSS_SCHEMES 6
  23. /* The s2n_security_policy struct is used to define acceptable and available
  24. * algorithms for use in the TLS protocol. Note that the behavior of each field
  25. * likely differs between different TLS versions, as the mechanics of cipher
  26. * negotiation often have significant differences between TLS versions.
  27. *
  28. * In s2n-tls, the signature_algorithms extension only applies to signatures in
  29. * CertificateVerify messages. To specify acceptable signature algorithms for
  30. * certificates the certificate_signature_preferences field should be set in the
  31. * security policy.
  32. */
  33. struct s2n_security_policy {
  34. uint8_t minimum_protocol_version;
  35. /* TLS 1.0 - 1.2 - cipher preference includes multiple elements such
  36. * as signature algorithms, record algorithms, and key exchange algorithms
  37. * TLS 1.3 - cipher preference only determines record encryption
  38. */
  39. const struct s2n_cipher_preferences *cipher_preferences;
  40. /* kem_preferences is only used for Post-Quantum cryptography */
  41. const struct s2n_kem_preferences *kem_preferences;
  42. /* This field roughly corresponds to the "signature_algorithms" extension.
  43. * The client serializes this field of the security_policy to populate the
  44. * extension, and it is also used by the server to choose an appropriate
  45. * entry from the options supplied by the client.
  46. * TLS 1.2 - optional extension to specify signature algorithms other than
  47. * default: https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.4.1
  48. * TLS 1.3 - required extension specifying signature algorithms
  49. */
  50. const struct s2n_signature_preferences *signature_preferences;
  51. /* When this field is set, the endpoint will ensure that the signatures on
  52. * the certificates in the peer's certificate chain are in the specified
  53. * list. Note that s2n-tls does not support the signature_algorithms_cert
  54. * extension. Unlike the signature_preferences field, this information is
  55. * never transmitted to a peer.
  56. */
  57. const struct s2n_signature_preferences *certificate_signature_preferences;
  58. /* This field roughly corresponds to the information in the
  59. * "supported_groups" extension.
  60. * TLS 1.0 - 1.2 - "elliptic_curves" extension indicates supported groups
  61. * for both key exchange and signature algorithms.
  62. * TLS 1.3 - the "supported_groups" extension indicates the named groups
  63. * which the client supports for key exchange
  64. * https://www.rfc-editor.org/rfc/rfc8446#section-4.2.7
  65. */
  66. const struct s2n_ecc_preferences *ecc_preferences;
  67. };
  68. struct s2n_security_policy_selection {
  69. const char *version;
  70. const struct s2n_security_policy *security_policy;
  71. unsigned ecc_extension_required : 1;
  72. unsigned pq_kem_extension_required : 1;
  73. unsigned supports_tls13 : 1;
  74. };
  75. extern struct s2n_security_policy_selection security_policy_selection[];
  76. extern const struct s2n_security_policy security_policy_20140601;
  77. extern const struct s2n_security_policy security_policy_20141001;
  78. extern const struct s2n_security_policy security_policy_20150202;
  79. extern const struct s2n_security_policy security_policy_20150214;
  80. extern const struct s2n_security_policy security_policy_20150306;
  81. extern const struct s2n_security_policy security_policy_20160411;
  82. extern const struct s2n_security_policy security_policy_20160804;
  83. extern const struct s2n_security_policy security_policy_20160824;
  84. extern const struct s2n_security_policy security_policy_20170210;
  85. extern const struct s2n_security_policy security_policy_20170328;
  86. extern const struct s2n_security_policy security_policy_20170328_gcm;
  87. extern const struct s2n_security_policy security_policy_20170405;
  88. extern const struct s2n_security_policy security_policy_20170405_gcm;
  89. extern const struct s2n_security_policy security_policy_20170718;
  90. extern const struct s2n_security_policy security_policy_20170718_gcm;
  91. extern const struct s2n_security_policy security_policy_20190214;
  92. extern const struct s2n_security_policy security_policy_20190214_gcm;
  93. extern const struct s2n_security_policy security_policy_20190801;
  94. extern const struct s2n_security_policy security_policy_20190802;
  95. extern const struct s2n_security_policy security_policy_20230317;
  96. extern const struct s2n_security_policy security_policy_default_tls13;
  97. extern const struct s2n_security_policy security_policy_default_fips;
  98. extern const struct s2n_security_policy security_policy_test_all;
  99. extern const struct s2n_security_policy security_policy_test_all_tls12;
  100. extern const struct s2n_security_policy security_policy_test_all_fips;
  101. extern const struct s2n_security_policy security_policy_test_all_ecdsa;
  102. extern const struct s2n_security_policy security_policy_test_ecdsa_priority;
  103. extern const struct s2n_security_policy security_policy_test_all_rsa_kex;
  104. extern const struct s2n_security_policy security_policy_test_all_tls13;
  105. /* See https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html */
  106. extern const struct s2n_security_policy security_policy_elb_2015_04;
  107. extern const struct s2n_security_policy security_policy_elb_2016_08;
  108. extern const struct s2n_security_policy security_policy_elb_tls_1_2_2017_01;
  109. extern const struct s2n_security_policy security_policy_elb_tls_1_1_2017_01;
  110. extern const struct s2n_security_policy security_policy_elb_tls_1_2_ext_2018_06;
  111. extern const struct s2n_security_policy security_policy_elb_fs_2018_06;
  112. extern const struct s2n_security_policy security_policy_elb_fs_1_2_2019_08;
  113. extern const struct s2n_security_policy security_policy_elb_fs_1_1_2019_08;
  114. extern const struct s2n_security_policy security_policy_elb_fs_1_2_res_2019_08;
  115. extern const struct s2n_security_policy security_policy_aws_crt_sdk_ssl_v3;
  116. extern const struct s2n_security_policy security_policy_aws_crt_sdk_tls_10;
  117. extern const struct s2n_security_policy security_policy_aws_crt_sdk_tls_11;
  118. extern const struct s2n_security_policy security_policy_aws_crt_sdk_tls_12;
  119. extern const struct s2n_security_policy security_policy_aws_crt_sdk_tls_13;
  120. extern const struct s2n_security_policy security_policy_kms_pq_tls_1_0_2019_06;
  121. extern const struct s2n_security_policy security_policy_kms_pq_tls_1_0_2020_02;
  122. extern const struct s2n_security_policy security_policy_kms_pq_tls_1_0_2020_07;
  123. extern const struct s2n_security_policy security_policy_pq_sike_test_tls_1_0_2019_11;
  124. extern const struct s2n_security_policy security_policy_pq_sike_test_tls_1_0_2020_02;
  125. extern const struct s2n_security_policy security_policy_pq_tls_1_0_2020_12;
  126. extern const struct s2n_security_policy security_policy_pq_tls_1_1_2021_05_17;
  127. extern const struct s2n_security_policy security_policy_pq_tls_1_0_2021_05_18;
  128. extern const struct s2n_security_policy security_policy_pq_tls_1_0_2021_05_19;
  129. extern const struct s2n_security_policy security_policy_pq_tls_1_0_2021_05_20;
  130. extern const struct s2n_security_policy security_policy_pq_tls_1_1_2021_05_21;
  131. extern const struct s2n_security_policy security_policy_pq_tls_1_0_2021_05_22;
  132. extern const struct s2n_security_policy security_policy_pq_tls_1_0_2021_05_23;
  133. extern const struct s2n_security_policy security_policy_pq_tls_1_0_2021_05_24;
  134. extern const struct s2n_security_policy security_policy_pq_tls_1_0_2021_05_25;
  135. extern const struct s2n_security_policy security_policy_pq_tls_1_0_2021_05_26;
  136. extern const struct s2n_security_policy security_policy_pq_tls_1_0_2023_01_24;
  137. extern const struct s2n_security_policy security_policy_pq_tls_1_2_2023_04_07;
  138. extern const struct s2n_security_policy security_policy_pq_tls_1_2_2023_04_08;
  139. extern const struct s2n_security_policy security_policy_pq_tls_1_2_2023_04_09;
  140. extern const struct s2n_security_policy security_policy_pq_tls_1_2_2023_04_10;
  141. extern const struct s2n_security_policy security_policy_pq_tls_1_3_2023_06_01;
  142. extern const struct s2n_security_policy security_policy_pq_tls_1_2_2023_10_07;
  143. extern const struct s2n_security_policy security_policy_pq_tls_1_2_2023_10_08;
  144. extern const struct s2n_security_policy security_policy_pq_tls_1_2_2023_10_09;
  145. extern const struct s2n_security_policy security_policy_pq_tls_1_2_2023_10_10;
  146. extern const struct s2n_security_policy security_policy_cloudfront_upstream;
  147. extern const struct s2n_security_policy security_policy_cloudfront_upstream_tls10;
  148. extern const struct s2n_security_policy security_policy_cloudfront_upstream_tls12;
  149. extern const struct s2n_security_policy security_policy_cloudfront_ssl_v_3;
  150. extern const struct s2n_security_policy security_policy_cloudfront_tls_1_0_2014;
  151. extern const struct s2n_security_policy security_policy_cloudfront_tls_1_0_2016;
  152. extern const struct s2n_security_policy security_policy_cloudfront_tls_1_1_2016;
  153. extern const struct s2n_security_policy security_policy_cloudfront_tls_1_2_2017;
  154. extern const struct s2n_security_policy security_policy_cloudfront_tls_1_2_2018;
  155. extern const struct s2n_security_policy security_policy_cloudfront_tls_1_2_2019;
  156. extern const struct s2n_security_policy security_policy_cloudfront_tls_1_2_2021;
  157. extern const struct s2n_security_policy security_policy_cloudfront_tls_1_2_2021_chacha20_boosted;
  158. extern const struct s2n_security_policy security_policy_kms_tls_1_0_2018_10;
  159. extern const struct s2n_security_policy security_policy_kms_tls_1_2_2023_06;
  160. extern const struct s2n_security_policy security_policy_kms_fips_tls_1_2_2018_10;
  161. extern const struct s2n_security_policy security_policy_20190120;
  162. extern const struct s2n_security_policy security_policy_20190121;
  163. extern const struct s2n_security_policy security_policy_20190122;
  164. extern const struct s2n_security_policy security_policy_null;
  165. int s2n_security_policies_init();
  166. int s2n_config_set_cipher_preferences(struct s2n_config *config, const char *version);
  167. int s2n_connection_set_cipher_preferences(struct s2n_connection *conn, const char *version);
  168. bool s2n_ecc_is_extension_required(const struct s2n_security_policy *security_policy);
  169. bool s2n_pq_kem_is_extension_required(const struct s2n_security_policy *security_policy);
  170. bool s2n_security_policy_supports_tls13(const struct s2n_security_policy *security_policy);
  171. int s2n_find_security_policy_from_version(const char *version, const struct s2n_security_policy **security_policy);
  172. int s2n_validate_kem_preferences(const struct s2n_kem_preferences *kem_preferences, bool pq_kem_extension_required);
  173. S2N_RESULT s2n_validate_certificate_signature_preferences(const struct s2n_signature_preferences *s2n_certificate_signature_preferences);