s2n_record.h 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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 "crypto/s2n_hmac.h"
  18. #include "stuffer/s2n_stuffer.h"
  19. #define S2N_TLS_CONTENT_TYPE_LENGTH 1
  20. /* All versions of TLS define the record header the same:
  21. * ContentType + ProtocolVersion + length
  22. */
  23. #define S2N_TLS_RECORD_HEADER_LENGTH (S2N_TLS_CONTENT_TYPE_LENGTH + S2N_TLS_PROTOCOL_VERSION_LEN + 2)
  24. /*
  25. * All versions of TLS limit the data fragment to 2^14 bytes.
  26. *
  27. *= https://tools.ietf.org/rfc/rfc5246#section-6.2.1
  28. *# The record layer fragments information blocks into TLSPlaintext
  29. *# records carrying data in chunks of 2^14 bytes or less.
  30. *
  31. *= https://tools.ietf.org/rfc/rfc8446#section-5.1
  32. *# The record layer fragments information blocks into TLSPlaintext
  33. *# records carrying data in chunks of 2^14 bytes or less.
  34. */
  35. #define S2N_TLS_MAXIMUM_FRAGMENT_LENGTH (1 << 14)
  36. /* The TLS1.2 record length allows for 1024 bytes of compression expansion and
  37. * 1024 bytes of encryption expansion and padding.
  38. * Since S2N does not support compression, we can ignore the compression overhead.
  39. */
  40. #define S2N_TLS12_ENCRYPTION_OVERHEAD_SIZE 1024
  41. #define S2N_TLS12_MAX_RECORD_LEN_FOR(frag) \
  42. ((frag) + S2N_TLS12_ENCRYPTION_OVERHEAD_SIZE + S2N_TLS_RECORD_HEADER_LENGTH)
  43. #define S2N_TLS12_MAXIMUM_RECORD_LENGTH S2N_TLS12_MAX_RECORD_LEN_FOR(S2N_TLS_MAXIMUM_FRAGMENT_LENGTH)
  44. /*
  45. *= https://tools.ietf.org/rfc/rfc8446#section-5.2
  46. *# An AEAD algorithm used in TLS 1.3 MUST NOT produce an expansion
  47. *# greater than 255 octets.
  48. */
  49. #define S2N_TLS13_ENCRYPTION_OVERHEAD_SIZE 255
  50. #define S2N_TLS13_MAX_RECORD_LEN_FOR(frag) ((frag) + S2N_TLS_CONTENT_TYPE_LENGTH \
  51. + S2N_TLS13_ENCRYPTION_OVERHEAD_SIZE \
  52. + S2N_TLS_RECORD_HEADER_LENGTH)
  53. #define S2N_TLS13_MAXIMUM_RECORD_LENGTH S2N_TLS13_MAX_RECORD_LEN_FOR(S2N_TLS_MAXIMUM_FRAGMENT_LENGTH)
  54. /* Currently, TLS1.2 records may be larger than TLS1.3 records.
  55. * If the protocol is unknown, assume TLS1.2.
  56. */
  57. #define S2N_TLS_MAX_RECORD_LEN_FOR(frag) S2N_TLS12_MAX_RECORD_LEN_FOR(frag)
  58. #define S2N_TLS_MAXIMUM_RECORD_LENGTH S2N_TLS_MAX_RECORD_LEN_FOR(S2N_TLS_MAXIMUM_FRAGMENT_LENGTH)
  59. S2N_RESULT s2n_record_max_write_size(struct s2n_connection *conn, uint16_t max_fragment_size, uint16_t *max_record_size);
  60. S2N_RESULT s2n_record_max_write_payload_size(struct s2n_connection *conn, uint16_t *max_fragment_size);
  61. S2N_RESULT s2n_record_min_write_payload_size(struct s2n_connection *conn, uint16_t *payload_size);
  62. S2N_RESULT s2n_record_write(struct s2n_connection *conn, uint8_t content_type, struct s2n_blob *in);
  63. int s2n_record_writev(struct s2n_connection *conn, uint8_t content_type, const struct iovec *in, int in_count, size_t offs, size_t to_write);
  64. int s2n_record_parse(struct s2n_connection *conn);
  65. int s2n_record_header_parse(struct s2n_connection *conn, uint8_t *content_type, uint16_t *fragment_length);
  66. int s2n_tls13_parse_record_type(struct s2n_stuffer *stuffer, uint8_t *record_type);
  67. int s2n_sslv2_record_header_parse(struct s2n_connection *conn, uint8_t *record_type, uint8_t *client_protocol_version, uint16_t *fragment_length);
  68. int s2n_verify_cbc(struct s2n_connection *conn, struct s2n_hmac_state *hmac, struct s2n_blob *decrypted);
  69. S2N_RESULT s2n_aead_aad_init(const struct s2n_connection *conn, uint8_t *sequence_number, uint8_t content_type, uint16_t record_length, struct s2n_blob *ad);
  70. S2N_RESULT s2n_tls13_aead_aad_init(uint16_t record_length, uint8_t tag_length, struct s2n_blob *ad);