aws-crt 0.1.9 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (581) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/VERSION +1 -1
  4. data/aws-crt-ffi/crt/aws-c-auth/include/aws/auth/auth.h +1 -0
  5. data/aws-crt-ffi/crt/aws-c-auth/include/aws/auth/aws_imds_client.h +5 -0
  6. data/aws-crt-ffi/crt/aws-c-auth/include/aws/auth/credentials.h +5 -0
  7. data/aws-crt-ffi/crt/aws-c-auth/include/aws/auth/private/aws_signing.h +1 -0
  8. data/aws-crt-ffi/crt/aws-c-auth/include/aws/auth/private/credentials_utils.h +2 -0
  9. data/aws-crt-ffi/crt/aws-c-auth/include/aws/auth/signing_config.h +1 -0
  10. data/aws-crt-ffi/crt/aws-c-auth/source/auth.c +3 -1
  11. data/aws-crt-ffi/crt/aws-c-auth/source/aws_imds_client.c +146 -63
  12. data/aws-crt-ffi/crt/aws-c-auth/source/aws_signing.c +41 -19
  13. data/aws-crt-ffi/crt/aws-c-auth/source/credentials_provider_imds.c +1 -0
  14. data/aws-crt-ffi/crt/aws-c-auth/source/credentials_utils.c +1 -0
  15. data/aws-crt-ffi/crt/aws-c-auth/source/signable_http_request.c +2 -1
  16. data/aws-crt-ffi/crt/aws-c-auth/source/signing_config.c +25 -0
  17. data/aws-crt-ffi/crt/aws-c-auth/tests/CMakeLists.txt +3 -0
  18. data/aws-crt-ffi/crt/aws-c-auth/tests/aws_imds_client_test.c +197 -31
  19. data/aws-crt-ffi/crt/aws-c-auth/tests/credentials_provider_imds_tests.c +16 -18
  20. data/aws-crt-ffi/crt/aws-c-auth/tests/sigv4_signing_tests.c +3 -1
  21. data/aws-crt-ffi/crt/aws-c-cal/include/aws/cal/private/opensslcrypto_common.h +22 -0
  22. data/aws-crt-ffi/crt/aws-c-cal/source/darwin/commoncrypto_aes.c +46 -17
  23. data/aws-crt-ffi/crt/aws-c-cal/source/unix/openssl_aes.c +1 -0
  24. data/aws-crt-ffi/crt/aws-c-cal/source/unix/openssl_platform_init.c +7 -0
  25. data/aws-crt-ffi/crt/aws-c-cal/source/unix/openssl_rsa.c +59 -2
  26. data/aws-crt-ffi/crt/aws-c-cal/source/unix/opensslcrypto_ecc.c +1 -0
  27. data/aws-crt-ffi/crt/aws-c-common/CMakeLists.txt +13 -1
  28. data/aws-crt-ffi/crt/aws-c-common/THIRD-PARTY-LICENSES.txt +28 -7
  29. data/aws-crt-ffi/crt/aws-c-common/bin/system_info/CMakeLists.txt +18 -0
  30. data/aws-crt-ffi/crt/aws-c-common/bin/system_info/print_system_info.c +48 -0
  31. data/aws-crt-ffi/crt/aws-c-common/include/aws/common/allocator.h +23 -0
  32. data/aws-crt-ffi/crt/aws-c-common/include/aws/common/byte_buf.h +12 -0
  33. data/aws-crt-ffi/crt/aws-c-common/include/aws/common/cross_process_lock.h +35 -0
  34. data/aws-crt-ffi/crt/aws-c-common/include/aws/common/hash_table.h +1 -0
  35. data/aws-crt-ffi/crt/aws-c-common/include/aws/common/priority_queue.h +24 -0
  36. data/aws-crt-ffi/crt/aws-c-common/include/aws/common/private/system_info_priv.h +37 -0
  37. data/aws-crt-ffi/crt/aws-c-common/include/aws/common/system_info.h +47 -0
  38. data/aws-crt-ffi/crt/aws-c-common/include/aws/common/system_resource_util.h +30 -0
  39. data/aws-crt-ffi/crt/aws-c-common/include/aws/testing/aws_test_harness.h +3 -2
  40. data/aws-crt-ffi/crt/aws-c-common/source/allocator.c +64 -13
  41. data/aws-crt-ffi/crt/aws-c-common/source/android/logging.c +14 -0
  42. data/aws-crt-ffi/crt/aws-c-common/source/common.c +3 -3
  43. data/aws-crt-ffi/crt/aws-c-common/source/file.c +96 -35
  44. data/aws-crt-ffi/crt/aws-c-common/source/linux/system_info.c +24 -0
  45. data/aws-crt-ffi/crt/aws-c-common/source/memtrace.c +10 -3
  46. data/aws-crt-ffi/crt/aws-c-common/source/platform_fallback_stubs/system_info.c +21 -0
  47. data/aws-crt-ffi/crt/aws-c-common/source/posix/cross_process_lock.c +141 -0
  48. data/aws-crt-ffi/crt/aws-c-common/source/posix/system_info.c +1 -1
  49. data/aws-crt-ffi/crt/aws-c-common/source/posix/system_resource_utils.c +32 -0
  50. data/aws-crt-ffi/crt/aws-c-common/source/priority_queue.c +24 -0
  51. data/aws-crt-ffi/crt/aws-c-common/source/system_info.c +80 -0
  52. data/aws-crt-ffi/crt/aws-c-common/source/task_scheduler.c +2 -2
  53. data/aws-crt-ffi/crt/aws-c-common/source/windows/cross_process_lock.c +93 -0
  54. data/aws-crt-ffi/crt/aws-c-common/source/windows/system_resource_utils.c +31 -0
  55. data/aws-crt-ffi/crt/aws-c-common/tests/CMakeLists.txt +16 -0
  56. data/aws-crt-ffi/crt/aws-c-common/tests/alloc_test.c +83 -22
  57. data/aws-crt-ffi/crt/aws-c-common/tests/cross_process_lock_tests.c +116 -0
  58. data/aws-crt-ffi/crt/aws-c-common/tests/file_test.c +103 -0
  59. data/aws-crt-ffi/crt/aws-c-common/tests/priority_queue_test.c +36 -0
  60. data/aws-crt-ffi/crt/aws-c-common/tests/system_info_tests.c +19 -0
  61. data/aws-crt-ffi/crt/aws-c-common/tests/system_resource_util_test.c +37 -0
  62. data/aws-crt-ffi/crt/aws-c-http/include/aws/http/connection.h +9 -0
  63. data/aws-crt-ffi/crt/aws-c-http/include/aws/http/http.h +1 -0
  64. data/aws-crt-ffi/crt/aws-c-http/include/aws/http/private/connection_impl.h +5 -4
  65. data/aws-crt-ffi/crt/aws-c-http/include/aws/http/private/connection_manager_system_vtable.h +10 -18
  66. data/aws-crt-ffi/crt/aws-c-http/include/aws/http/private/proxy_impl.h +5 -1
  67. data/aws-crt-ffi/crt/aws-c-http/include/aws/http/private/request_response_impl.h +5 -0
  68. data/aws-crt-ffi/crt/aws-c-http/include/aws/http/request_response.h +10 -0
  69. data/aws-crt-ffi/crt/aws-c-http/source/connection.c +5 -2
  70. data/aws-crt-ffi/crt/aws-c-http/source/connection_manager.c +22 -21
  71. data/aws-crt-ffi/crt/aws-c-http/source/h1_connection.c +102 -17
  72. data/aws-crt-ffi/crt/aws-c-http/source/h1_stream.c +1 -0
  73. data/aws-crt-ffi/crt/aws-c-http/source/http.c +3 -0
  74. data/aws-crt-ffi/crt/aws-c-http/source/proxy_connection.c +2 -2
  75. data/aws-crt-ffi/crt/aws-c-http/tests/CMakeLists.txt +2 -0
  76. data/aws-crt-ffi/crt/aws-c-http/tests/test_connection_manager.c +18 -18
  77. data/aws-crt-ffi/crt/aws-c-http/tests/test_h1_client.c +111 -1
  78. data/aws-crt-ffi/crt/aws-c-http/tests/test_proxy.c +2 -2
  79. data/aws-crt-ffi/crt/aws-c-http/tests/test_stream_manager.c +2 -2
  80. data/aws-crt-ffi/crt/aws-c-io/include/aws/io/retry_strategy.h +1 -1
  81. data/aws-crt-ffi/crt/aws-c-io/source/exponential_backoff_retry_strategy.c +1 -1
  82. data/aws-crt-ffi/crt/aws-c-io/source/pkcs11_tls_op_handler.c +2 -4
  83. data/aws-crt-ffi/crt/aws-lc/CMakeLists.txt +16 -8
  84. data/aws-crt-ffi/crt/aws-lc/cmake/go.cmake +6 -0
  85. data/aws-crt-ffi/crt/aws-lc/crypto/CMakeLists.txt +6 -9
  86. data/aws-crt-ffi/crt/aws-lc/crypto/asn1/a_time.c +34 -1
  87. data/aws-crt-ffi/crt/aws-lc/crypto/asn1/a_utctm.c +4 -1
  88. data/aws-crt-ffi/crt/aws-lc/crypto/asn1/asn1_test.cc +41 -0
  89. data/aws-crt-ffi/crt/aws-lc/crypto/bio/bio_mem.c +6 -7
  90. data/aws-crt-ffi/crt/aws-lc/crypto/bio/bio_test.cc +152 -16
  91. data/aws-crt-ffi/crt/aws-lc/crypto/bio/connect.c +6 -12
  92. data/aws-crt-ffi/crt/aws-lc/crypto/bio/fd.c +2 -2
  93. data/aws-crt-ffi/crt/aws-lc/crypto/bio/file.c +20 -8
  94. data/aws-crt-ffi/crt/aws-lc/crypto/bio/socket.c +2 -2
  95. data/aws-crt-ffi/crt/aws-lc/crypto/bio/socket_helper.c +2 -2
  96. data/aws-crt-ffi/crt/aws-lc/crypto/blake2/blake2.c +11 -1
  97. data/aws-crt-ffi/crt/aws-lc/crypto/bytestring/cbb.c +13 -3
  98. data/aws-crt-ffi/crt/aws-lc/crypto/bytestring/cbs.c +9 -0
  99. data/aws-crt-ffi/crt/aws-lc/crypto/chacha/asm/chacha-armv8.pl +1 -1
  100. data/aws-crt-ffi/crt/aws-lc/crypto/chacha/chacha.c +49 -8
  101. data/aws-crt-ffi/crt/aws-lc/crypto/chacha/chacha_test.cc +110 -0
  102. data/aws-crt-ffi/crt/aws-lc/crypto/chacha/internal.h +8 -1
  103. data/aws-crt-ffi/crt/aws-lc/crypto/compiler_test.cc +4 -1
  104. data/aws-crt-ffi/crt/aws-lc/crypto/conf/conf_test.cc +1 -0
  105. data/aws-crt-ffi/crt/aws-lc/crypto/crypto_test.cc +9 -0
  106. data/aws-crt-ffi/crt/aws-lc/crypto/curve25519/curve25519.c +189 -108
  107. data/aws-crt-ffi/crt/aws-lc/crypto/curve25519/curve25519_nohw.c +78 -6
  108. data/aws-crt-ffi/crt/aws-lc/crypto/curve25519/ed25519_test.cc +9 -0
  109. data/aws-crt-ffi/crt/aws-lc/crypto/curve25519/internal.h +24 -10
  110. data/aws-crt-ffi/crt/aws-lc/crypto/curve25519/spake25519.c +4 -4
  111. data/aws-crt-ffi/crt/aws-lc/crypto/curve25519/x25519_test.cc +80 -11
  112. data/aws-crt-ffi/crt/aws-lc/crypto/decrepit/evp/evp_do_all.c +2 -0
  113. data/aws-crt-ffi/crt/aws-lc/crypto/digest_extra/digest_extra.c +8 -0
  114. data/aws-crt-ffi/crt/aws-lc/crypto/digest_extra/digest_test.cc +110 -45
  115. data/aws-crt-ffi/crt/aws-lc/crypto/dsa/dsa_test.cc +8 -2
  116. data/aws-crt-ffi/crt/aws-lc/crypto/dsa/internal.h +18 -0
  117. data/aws-crt-ffi/crt/aws-lc/crypto/dynamic_loading_test.c +8 -5
  118. data/aws-crt-ffi/crt/aws-lc/crypto/ec_extra/ec_derive.c +4 -3
  119. data/aws-crt-ffi/crt/aws-lc/crypto/ec_extra/hash_to_curve.c +6 -18
  120. data/aws-crt-ffi/crt/aws-lc/crypto/endian_test.cc +308 -0
  121. data/aws-crt-ffi/crt/aws-lc/crypto/err/ssl.errordata +2 -0
  122. data/aws-crt-ffi/crt/aws-lc/crypto/evp_extra/evp_extra_test.cc +2 -0
  123. data/aws-crt-ffi/crt/aws-lc/crypto/evp_extra/evp_test.cc +11 -1
  124. data/aws-crt-ffi/crt/aws-lc/crypto/evp_extra/evp_tests.txt +25 -0
  125. data/aws-crt-ffi/crt/aws-lc/crypto/evp_extra/p_ec_asn1.c +1 -1
  126. data/aws-crt-ffi/crt/aws-lc/crypto/evp_extra/p_kem.c +2 -2
  127. data/aws-crt-ffi/crt/aws-lc/crypto/evp_extra/p_rsa_asn1.c +1 -0
  128. data/aws-crt-ffi/crt/aws-lc/crypto/evp_extra/print.c +7 -6
  129. data/aws-crt-ffi/crt/aws-lc/crypto/evp_extra/scrypt.c +13 -1
  130. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/CMakeLists.txt +13 -4
  131. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/aes/aes_nohw.c +18 -6
  132. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/bcm.c +12 -4
  133. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/bn/bn_assert_test.cc +77 -0
  134. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/bn/bn_test.cc +30 -0
  135. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/bn/bytes.c +112 -22
  136. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/bn/div.c +12 -5
  137. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/bn/exponentiation.c +54 -1
  138. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/bn/gcd.c +5 -6
  139. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/bn/internal.h +37 -15
  140. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/bn/montgomery.c +4 -11
  141. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/bn/montgomery_inv.c +51 -15
  142. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/cipher/aead.c +2 -2
  143. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/digest/digest.c +29 -6
  144. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/digest/digests.c +89 -0
  145. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/digest/internal.h +4 -0
  146. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/ec/ec.c +19 -36
  147. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/ec/ec_key.c +3 -3
  148. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/ec/ec_montgomery.c +9 -7
  149. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/ec/ec_test.cc +33 -9
  150. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/ec/internal.h +17 -12
  151. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/ec/p224-64.c +5 -8
  152. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/ec/p256-nistz.c +8 -8
  153. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/ec/p256.c +9 -8
  154. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/ec/p384.c +33 -16
  155. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/ec/p521.c +14 -6
  156. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/ec/scalar.c +26 -24
  157. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/ec/simple_mul.c +8 -5
  158. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/ec/wnaf.c +3 -3
  159. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/ecdsa/ecdsa.c +9 -3
  160. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/evp/evp.c +43 -12
  161. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/evp/p_ec.c +4 -3
  162. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/hmac/hmac.c +3 -1
  163. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/modes/xts.c +26 -3
  164. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/rand/cpu_jitter_test.cc +1 -1
  165. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/rand/internal.h +20 -11
  166. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/rand/rand.c +10 -10
  167. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/rand/urandom.c +2 -2
  168. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/rsa/internal.h +59 -0
  169. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/rsa/padding.c +9 -3
  170. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/rsa/rsa.c +7 -0
  171. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/rsa/rsa_impl.c +51 -60
  172. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/service_indicator/service_indicator.c +5 -2
  173. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/service_indicator/service_indicator_test.cc +205 -5
  174. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/sha/asm/sha1-armv8.pl +1 -1
  175. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/sha/asm/sha512-armv8.pl +1 -1
  176. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/sha/internal.h +8 -0
  177. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/sha/sha3.c +37 -15
  178. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/sha/sha3_test.cc +115 -110
  179. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/sha/sha512.c +55 -1
  180. data/aws-crt-ffi/crt/aws-lc/crypto/fipsmodule/sshkdf/sshkdf.c +2 -2
  181. data/aws-crt-ffi/crt/aws-lc/crypto/hmac_extra/hmac_test.cc +12 -0
  182. data/aws-crt-ffi/crt/aws-lc/crypto/hmac_extra/hmac_tests.txt +10 -0
  183. data/aws-crt-ffi/crt/aws-lc/crypto/hrss/asm/poly_rq_mul.S +2 -6
  184. data/aws-crt-ffi/crt/aws-lc/crypto/impl_dispatch_test.cc +9 -1
  185. data/aws-crt-ffi/crt/aws-lc/crypto/internal.h +90 -8
  186. data/aws-crt-ffi/crt/aws-lc/crypto/kem/kem.c +28 -27
  187. data/aws-crt-ffi/crt/aws-lc/crypto/kyber/kem_kyber.h +14 -0
  188. data/aws-crt-ffi/crt/aws-lc/crypto/obj/obj_dat.h +52 -2
  189. data/aws-crt-ffi/crt/aws-lc/crypto/obj/obj_mac.num +5 -0
  190. data/aws-crt-ffi/crt/aws-lc/crypto/obj/objects.txt +7 -0
  191. data/aws-crt-ffi/crt/aws-lc/crypto/perlasm/arm-xlate.pl +3 -14
  192. data/aws-crt-ffi/crt/aws-lc/crypto/perlasm/ppc-xlate.pl +1 -5
  193. data/aws-crt-ffi/crt/aws-lc/crypto/perlasm/x86_64-xlate.pl +4 -15
  194. data/aws-crt-ffi/crt/aws-lc/crypto/perlasm/x86asm.pl +4 -13
  195. data/aws-crt-ffi/crt/aws-lc/crypto/poly1305/poly1305_arm_asm.S +3 -13
  196. data/aws-crt-ffi/crt/aws-lc/crypto/rand_extra/deterministic.c +4 -3
  197. data/aws-crt-ffi/crt/aws-lc/crypto/rand_extra/fuchsia.c +4 -4
  198. data/aws-crt-ffi/crt/aws-lc/crypto/rand_extra/rand_test.cc +0 -63
  199. data/aws-crt-ffi/crt/aws-lc/crypto/rand_extra/windows.c +41 -19
  200. data/aws-crt-ffi/crt/aws-lc/crypto/rsa_extra/rsa_test.cc +3 -3
  201. data/aws-crt-ffi/crt/aws-lc/crypto/siphash/siphash.c +12 -5
  202. data/aws-crt-ffi/crt/aws-lc/crypto/siphash/siphash_test.cc +5 -5
  203. data/aws-crt-ffi/crt/aws-lc/crypto/stack/stack.c +68 -46
  204. data/aws-crt-ffi/crt/aws-lc/crypto/trust_token/pmbtoken.c +4 -4
  205. data/aws-crt-ffi/crt/aws-lc/crypto/trust_token/voprf.c +2 -2
  206. data/aws-crt-ffi/crt/aws-lc/crypto/x509/by_dir.c +0 -6
  207. data/aws-crt-ffi/crt/aws-lc/crypto/x509/internal.h +4 -1
  208. data/aws-crt-ffi/crt/aws-lc/crypto/x509/x509_lu.c +33 -9
  209. data/aws-crt-ffi/crt/aws-lc/crypto/x509/x509_test.cc +87 -0
  210. data/aws-crt-ffi/crt/aws-lc/crypto/x509/x509_trs.c +1 -1
  211. data/aws-crt-ffi/crt/aws-lc/crypto/x509/x509_vfy.c +35 -13
  212. data/aws-crt-ffi/crt/aws-lc/crypto/x509v3/v3_lib.c +2 -0
  213. data/aws-crt-ffi/crt/aws-lc/crypto/x509v3/v3_purp.c +4 -6
  214. data/aws-crt-ffi/crt/aws-lc/generated-src/crypto_test_data.cc +179 -151
  215. data/aws-crt-ffi/crt/aws-lc/generated-src/err_data.c +353 -349
  216. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/chacha/chacha-armv8.S +4 -14
  217. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S +4 -14
  218. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/fipsmodule/aesv8-armx.S +3 -13
  219. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-unroll8.S +3 -13
  220. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/fipsmodule/aesv8-gcm-armv8.S +3 -13
  221. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/fipsmodule/armv8-mont.S +4 -14
  222. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/fipsmodule/bn-armv8.S +4 -14
  223. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/fipsmodule/ghash-neon-armv8.S +4 -14
  224. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/fipsmodule/ghashv8-armx.S +3 -13
  225. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/fipsmodule/keccak1600-armv8.S +3 -13
  226. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/fipsmodule/md5-armv8.S +3 -13
  227. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/fipsmodule/p256-armv8-asm.S +4 -14
  228. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S +4 -14
  229. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/fipsmodule/sha1-armv8.S +4 -14
  230. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/fipsmodule/sha256-armv8.S +4 -14
  231. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/fipsmodule/sha512-armv8.S +4 -14
  232. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/fipsmodule/vpaes-armv8.S +3 -13
  233. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-aarch64/crypto/test/trampoline-armv8.S +4 -14
  234. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-arm/crypto/chacha/chacha-armv4.S +3 -13
  235. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-arm/crypto/fipsmodule/aesv8-armx.S +3 -13
  236. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-arm/crypto/fipsmodule/armv4-mont.S +3 -13
  237. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-arm/crypto/fipsmodule/bsaes-armv7.S +3 -13
  238. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-arm/crypto/fipsmodule/ghash-armv4.S +3 -13
  239. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-arm/crypto/fipsmodule/ghashv8-armx.S +3 -13
  240. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-arm/crypto/fipsmodule/sha1-armv4-large.S +3 -13
  241. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-arm/crypto/fipsmodule/sha256-armv4.S +3 -13
  242. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-arm/crypto/fipsmodule/sha512-armv4.S +3 -13
  243. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-arm/crypto/fipsmodule/vpaes-armv7.S +3 -13
  244. data/aws-crt-ffi/crt/aws-lc/generated-src/ios-arm/crypto/test/trampoline-armv4.S +3 -13
  245. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/chacha/chacha-armv8.S +4 -14
  246. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S +4 -14
  247. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/fipsmodule/aesv8-armx.S +3 -13
  248. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-unroll8.S +3 -13
  249. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/fipsmodule/aesv8-gcm-armv8.S +3 -13
  250. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/fipsmodule/armv8-mont.S +4 -14
  251. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/fipsmodule/bn-armv8.S +3 -13
  252. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/fipsmodule/ghash-neon-armv8.S +3 -13
  253. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/fipsmodule/ghashv8-armx.S +3 -13
  254. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/fipsmodule/keccak1600-armv8.S +3 -13
  255. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/fipsmodule/md5-armv8.S +3 -13
  256. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/fipsmodule/p256-armv8-asm.S +4 -14
  257. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S +4 -14
  258. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/fipsmodule/sha1-armv8.S +4 -14
  259. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/fipsmodule/sha256-armv8.S +4 -14
  260. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/fipsmodule/sha512-armv8.S +4 -14
  261. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/fipsmodule/vpaes-armv8.S +3 -13
  262. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-aarch64/crypto/test/trampoline-armv8.S +3 -13
  263. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-arm/crypto/chacha/chacha-armv4.S +3 -13
  264. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-arm/crypto/fipsmodule/aesv8-armx.S +3 -13
  265. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-arm/crypto/fipsmodule/armv4-mont.S +3 -13
  266. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-arm/crypto/fipsmodule/bsaes-armv7.S +3 -13
  267. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-arm/crypto/fipsmodule/ghash-armv4.S +3 -13
  268. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-arm/crypto/fipsmodule/ghashv8-armx.S +3 -13
  269. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-arm/crypto/fipsmodule/sha1-armv4-large.S +3 -13
  270. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-arm/crypto/fipsmodule/sha256-armv4.S +3 -13
  271. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-arm/crypto/fipsmodule/sha512-armv4.S +3 -13
  272. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-arm/crypto/fipsmodule/vpaes-armv7.S +3 -13
  273. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-arm/crypto/test/trampoline-armv4.S +3 -13
  274. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-ppc64le/crypto/fipsmodule/aesp8-ppc.S +1 -5
  275. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-ppc64le/crypto/fipsmodule/ghashp8-ppc.S +1 -5
  276. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-ppc64le/crypto/test/trampoline-ppc.S +1 -5
  277. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86/crypto/chacha/chacha-x86.S +3 -12
  278. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86/crypto/fipsmodule/aesni-x86.S +3 -12
  279. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86/crypto/fipsmodule/bn-586.S +4 -13
  280. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86/crypto/fipsmodule/co-586.S +4 -13
  281. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86/crypto/fipsmodule/ghash-ssse3-x86.S +3 -12
  282. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86/crypto/fipsmodule/ghash-x86.S +3 -12
  283. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86/crypto/fipsmodule/md5-586.S +4 -13
  284. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86/crypto/fipsmodule/sha1-586.S +4 -13
  285. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86/crypto/fipsmodule/sha256-586.S +3 -12
  286. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86/crypto/fipsmodule/sha512-586.S +3 -12
  287. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86/crypto/fipsmodule/vpaes-x86.S +3 -12
  288. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86/crypto/fipsmodule/x86-mont.S +3 -12
  289. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86/crypto/test/trampoline-x86.S +3 -12
  290. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/chacha/chacha-x86_64.S +2 -11
  291. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S +2 -11
  292. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/cipher_extra/aesni-sha1-x86_64.S +2 -11
  293. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/cipher_extra/aesni-sha256-x86_64.S +2 -11
  294. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S +2 -11
  295. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/aesni-gcm-avx512.S +2 -11
  296. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S +2 -11
  297. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/aesni-x86_64.S +2 -11
  298. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/aesni-xts-avx512.S +2 -11
  299. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S +2 -11
  300. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/ghash-x86_64.S +2 -11
  301. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/md5-x86_64.S +2 -11
  302. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/p256-x86_64-asm.S +2 -11
  303. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S +2 -11
  304. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/rdrand-x86_64.S +2 -11
  305. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/rsaz-avx2.S +2 -11
  306. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/sha1-x86_64.S +2 -11
  307. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/sha256-x86_64.S +2 -11
  308. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/sha512-x86_64.S +2 -11
  309. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/vpaes-x86_64.S +2 -11
  310. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/x86_64-mont.S +2 -11
  311. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/fipsmodule/x86_64-mont5.S +2 -11
  312. data/aws-crt-ffi/crt/aws-lc/generated-src/linux-x86_64/crypto/test/trampoline-x86_64.S +2 -11
  313. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86/crypto/chacha/chacha-x86.S +3 -12
  314. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86/crypto/fipsmodule/aesni-x86.S +3 -12
  315. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86/crypto/fipsmodule/bn-586.S +3 -12
  316. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86/crypto/fipsmodule/co-586.S +3 -12
  317. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86/crypto/fipsmodule/ghash-ssse3-x86.S +3 -12
  318. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86/crypto/fipsmodule/ghash-x86.S +3 -12
  319. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86/crypto/fipsmodule/md5-586.S +3 -12
  320. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86/crypto/fipsmodule/sha1-586.S +3 -12
  321. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86/crypto/fipsmodule/sha256-586.S +3 -12
  322. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86/crypto/fipsmodule/sha512-586.S +3 -12
  323. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86/crypto/fipsmodule/vpaes-x86.S +3 -12
  324. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86/crypto/fipsmodule/x86-mont.S +3 -12
  325. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86/crypto/test/trampoline-x86.S +3 -12
  326. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/chacha/chacha-x86_64.S +2 -11
  327. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S +2 -11
  328. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/cipher_extra/aesni-sha1-x86_64.S +2 -11
  329. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/cipher_extra/aesni-sha256-x86_64.S +2 -11
  330. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S +2 -11
  331. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/aesni-gcm-avx512.S +2 -11
  332. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S +2 -11
  333. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/aesni-x86_64.S +2 -11
  334. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/aesni-xts-avx512.S +2 -11
  335. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S +2 -11
  336. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/ghash-x86_64.S +2 -11
  337. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/md5-x86_64.S +2 -11
  338. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/p256-x86_64-asm.S +2 -11
  339. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S +2 -11
  340. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/rdrand-x86_64.S +2 -11
  341. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/rsaz-avx2.S +2 -11
  342. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/sha1-x86_64.S +2 -11
  343. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/sha256-x86_64.S +2 -11
  344. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/sha512-x86_64.S +2 -11
  345. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/vpaes-x86_64.S +2 -11
  346. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/x86_64-mont.S +2 -11
  347. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/fipsmodule/x86_64-mont5.S +2 -11
  348. data/aws-crt-ffi/crt/aws-lc/generated-src/mac-x86_64/crypto/test/trampoline-x86_64.S +2 -11
  349. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/chacha/chacha-armv8.S +4 -14
  350. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S +4 -14
  351. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/fipsmodule/aesv8-armx.S +3 -13
  352. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-unroll8.S +3 -13
  353. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/fipsmodule/aesv8-gcm-armv8.S +3 -13
  354. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/fipsmodule/armv8-mont.S +4 -14
  355. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/fipsmodule/bn-armv8.S +4 -14
  356. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/fipsmodule/ghash-neon-armv8.S +4 -14
  357. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/fipsmodule/ghashv8-armx.S +3 -13
  358. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/fipsmodule/keccak1600-armv8.S +3 -13
  359. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/fipsmodule/md5-armv8.S +3 -13
  360. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/fipsmodule/p256-armv8-asm.S +4 -14
  361. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S +4 -14
  362. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/fipsmodule/sha1-armv8.S +4 -14
  363. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/fipsmodule/sha256-armv8.S +4 -14
  364. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/fipsmodule/sha512-armv8.S +4 -14
  365. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/fipsmodule/vpaes-armv8.S +3 -13
  366. data/aws-crt-ffi/crt/aws-lc/generated-src/win-aarch64/crypto/test/trampoline-armv8.S +4 -14
  367. data/aws-crt-ffi/crt/aws-lc/go.mod +4 -4
  368. data/aws-crt-ffi/crt/aws-lc/go.sum +8 -10
  369. data/aws-crt-ffi/crt/aws-lc/include/openssl/aead.h +2 -2
  370. data/aws-crt-ffi/crt/aws-lc/include/openssl/arm_arch.h +4 -119
  371. data/aws-crt-ffi/crt/aws-lc/include/openssl/asm_base.h +185 -0
  372. data/aws-crt-ffi/crt/aws-lc/include/openssl/asn1.h +5 -0
  373. data/aws-crt-ffi/crt/aws-lc/include/openssl/base.h +31 -134
  374. data/aws-crt-ffi/crt/aws-lc/include/openssl/bio.h +30 -18
  375. data/aws-crt-ffi/crt/aws-lc/include/openssl/bn.h +0 -2
  376. data/aws-crt-ffi/crt/aws-lc/include/openssl/chacha.h +6 -0
  377. data/aws-crt-ffi/crt/aws-lc/include/openssl/cipher.h +2 -2
  378. data/aws-crt-ffi/crt/aws-lc/include/openssl/digest.h +9 -6
  379. data/aws-crt-ffi/crt/aws-lc/include/openssl/dsa.h +0 -21
  380. data/aws-crt-ffi/crt/aws-lc/include/openssl/ec.h +1 -1
  381. data/aws-crt-ffi/crt/aws-lc/include/openssl/err.h +1 -1
  382. data/aws-crt-ffi/crt/aws-lc/include/openssl/evp.h +8 -5
  383. data/aws-crt-ffi/crt/aws-lc/include/openssl/nid.h +21 -0
  384. data/aws-crt-ffi/crt/aws-lc/include/openssl/rsa.h +1 -65
  385. data/aws-crt-ffi/crt/aws-lc/include/openssl/sha.h +22 -1
  386. data/aws-crt-ffi/crt/aws-lc/include/openssl/ssl.h +121 -13
  387. data/aws-crt-ffi/crt/aws-lc/include/openssl/stack.h +229 -208
  388. data/aws-crt-ffi/crt/aws-lc/include/openssl/target.h +166 -0
  389. data/aws-crt-ffi/crt/aws-lc/include/openssl/x509.h +30 -10
  390. data/aws-crt-ffi/crt/aws-lc/include/openssl/x509v3.h +6 -4
  391. data/aws-crt-ffi/crt/aws-lc/sources.cmake +2 -0
  392. data/aws-crt-ffi/crt/aws-lc/ssl/extensions.cc +12 -7
  393. data/aws-crt-ffi/crt/aws-lc/ssl/handshake_server.cc +28 -18
  394. data/aws-crt-ffi/crt/aws-lc/ssl/internal.h +41 -6
  395. data/aws-crt-ffi/crt/aws-lc/ssl/s3_both.cc +9 -17
  396. data/aws-crt-ffi/crt/aws-lc/ssl/ssl_cipher.cc +13 -5
  397. data/aws-crt-ffi/crt/aws-lc/ssl/ssl_key_share.cc +542 -2
  398. data/aws-crt-ffi/crt/aws-lc/ssl/ssl_lib.cc +35 -0
  399. data/aws-crt-ffi/crt/aws-lc/ssl/ssl_test.cc +1847 -14
  400. data/aws-crt-ffi/crt/aws-lc/ssl/ssl_x509.cc +128 -0
  401. data/aws-crt-ffi/crt/aws-lc/ssl/test/PORTING.md +10 -7
  402. data/aws-crt-ffi/crt/aws-lc/ssl/test/bssl_shim.cc +133 -77
  403. data/aws-crt-ffi/crt/aws-lc/ssl/test/handshake_util.cc +3 -3
  404. data/aws-crt-ffi/crt/aws-lc/ssl/test/handshaker.cc +4 -0
  405. data/aws-crt-ffi/crt/aws-lc/ssl/test/runner/handshake_client.go +6 -2
  406. data/aws-crt-ffi/crt/aws-lc/ssl/test/runner/handshake_messages.go +894 -1042
  407. data/aws-crt-ffi/crt/aws-lc/ssl/test/runner/handshake_server.go +24 -23
  408. data/aws-crt-ffi/crt/aws-lc/ssl/test/runner/prf.go +6 -5
  409. data/aws-crt-ffi/crt/aws-lc/ssl/test/runner/runner.go +56 -55
  410. data/aws-crt-ffi/crt/aws-lc/ssl/test/runner/shim_dispatcher.go +188 -0
  411. data/aws-crt-ffi/crt/aws-lc/ssl/test/runner/ticket.go +37 -39
  412. data/aws-crt-ffi/crt/aws-lc/ssl/test/test_config.cc +59 -24
  413. data/aws-crt-ffi/crt/aws-lc/ssl/test/test_config.h +3 -2
  414. data/aws-crt-ffi/crt/aws-lc/ssl/tls13_server.cc +10 -11
  415. data/aws-crt-ffi/crt/aws-lc/tests/ci/cdk/app.py +4 -4
  416. data/aws-crt-ffi/crt/aws-lc/tests/ci/cdk/cdk/{aws_lc_mac_arm_ci_stack.py → aws_lc_ec2_test_framework_ci_stack.py} +13 -29
  417. data/aws-crt-ffi/crt/aws-lc/tests/ci/cdk/cdk/ssm/general_test_run_ssm_document.yaml +43 -0
  418. data/aws-crt-ffi/crt/aws-lc/tests/ci/common_posix_setup.sh +10 -0
  419. data/aws-crt-ffi/crt/aws-lc/tests/ci/docker_images/linux-aarch/amazonlinux-2023_base/Dockerfile +5 -1
  420. data/aws-crt-ffi/crt/aws-lc/tests/ci/docker_images/linux-aarch/ubuntu-22.04_base/Dockerfile +19 -3
  421. data/aws-crt-ffi/crt/aws-lc/tests/ci/docker_images/linux-x86/amazonlinux-2_gcc-7x-intel-sde/Dockerfile +5 -4
  422. data/aws-crt-ffi/crt/aws-lc/tests/ci/docker_images/linux-x86/build_images.sh +1 -0
  423. data/aws-crt-ffi/crt/aws-lc/tests/ci/docker_images/linux-x86/push_images.sh +2 -1
  424. data/aws-crt-ffi/crt/aws-lc/tests/ci/docker_images/linux-x86/ubuntu-20.04_clang-10x_formal-verification/create_image.sh +1 -1
  425. data/aws-crt-ffi/crt/aws-lc/tests/ci/docker_images/linux-x86/ubuntu-22.04_base/Dockerfile +1 -0
  426. data/aws-crt-ffi/crt/aws-lc/tests/ci/docker_images/linux-x86/ubuntu-22.04_clang-14x-sde/Dockerfile +42 -0
  427. data/aws-crt-ffi/crt/aws-lc/tests/ci/docker_images/windows/vs2017/Dockerfile +14 -0
  428. data/aws-crt-ffi/crt/aws-lc/tests/ci/docker_images/windows/windows_base/Dockerfile +3 -0
  429. data/aws-crt-ffi/crt/aws-lc/tests/ci/integration/README.md +12 -0
  430. data/aws-crt-ffi/crt/aws-lc/tests/ci/integration/nginx_patch/aws-lc-nginx.patch +68 -23
  431. data/aws-crt-ffi/crt/aws-lc/tests/ci/integration/run_crt_integration.sh +27 -0
  432. data/aws-crt-ffi/crt/aws-lc/tests/ci/integration/run_monit_integration.sh +56 -0
  433. data/aws-crt-ffi/crt/aws-lc/tests/ci/integration/sslproxy_patch/aws-lc-sslproxy.patch +2 -2
  434. data/aws-crt-ffi/crt/aws-lc/tests/ci/run_ec2_test_framework.sh +135 -0
  435. data/aws-crt-ffi/crt/aws-lc/tests/ci/run_fips_tests.sh +14 -2
  436. data/aws-crt-ffi/crt/aws-lc/tests/ci/run_tests_with_sde.sh +4 -1
  437. data/aws-crt-ffi/crt/aws-lc/tests/ci/run_tests_with_sde_asan.sh +14 -0
  438. data/aws-crt-ffi/crt/aws-lc/tests/ci/run_windows_tests.bat +39 -3
  439. data/aws-crt-ffi/crt/aws-lc/third_party/fiat/README.md +21 -6
  440. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/bignum_madd_n25519.S +284 -0
  441. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/bignum_madd_n25519_alt.S +210 -0
  442. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/bignum_mod_n25519.S +186 -0
  443. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/bignum_neg_p25519.S +65 -0
  444. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/curve25519_x25519.S +1043 -352
  445. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/curve25519_x25519_alt.S +1043 -352
  446. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/curve25519_x25519_byte.S +1043 -352
  447. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/curve25519_x25519_byte_alt.S +1043 -352
  448. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/curve25519_x25519base.S +1042 -352
  449. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/curve25519_x25519base_alt.S +1042 -352
  450. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/curve25519_x25519base_byte.S +1042 -352
  451. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/curve25519_x25519base_byte_alt.S +1043 -354
  452. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/edwards25519_decode.S +700 -0
  453. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/edwards25519_decode_alt.S +563 -0
  454. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/edwards25519_encode.S +131 -0
  455. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/edwards25519_scalarmulbase.S +9626 -0
  456. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/edwards25519_scalarmulbase_alt.S +9468 -0
  457. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/edwards25519_scalarmuldouble.S +3157 -0
  458. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/curve25519/edwards25519_scalarmuldouble_alt.S +2941 -0
  459. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/p384/Makefile +1 -1
  460. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/arm/p521/Makefile +1 -1
  461. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/include/s2n-bignum_aws-lc.h +34 -0
  462. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/x86_att/curve25519/bignum_madd_n25519.S +219 -0
  463. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/x86_att/curve25519/bignum_madd_n25519_alt.S +245 -0
  464. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/x86_att/curve25519/bignum_mod_n25519.S +228 -0
  465. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/x86_att/curve25519/bignum_neg_p25519.S +86 -0
  466. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/x86_att/curve25519/curve25519_x25519.S +1350 -407
  467. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/x86_att/curve25519/curve25519_x25519_alt.S +1350 -407
  468. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/x86_att/curve25519/curve25519_x25519base.S +1344 -400
  469. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/x86_att/curve25519/curve25519_x25519base_alt.S +1348 -402
  470. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/x86_att/curve25519/edwards25519_decode.S +670 -0
  471. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/x86_att/curve25519/edwards25519_decode_alt.S +751 -0
  472. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/x86_att/curve25519/edwards25519_encode.S +81 -0
  473. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/x86_att/curve25519/edwards25519_scalarmulbase.S +9910 -0
  474. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/x86_att/curve25519/edwards25519_scalarmulbase_alt.S +9986 -0
  475. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/x86_att/curve25519/edwards25519_scalarmuldouble.S +3619 -0
  476. data/aws-crt-ffi/crt/aws-lc/third_party/s2n-bignum/x86_att/curve25519/edwards25519_scalarmuldouble_alt.S +3736 -0
  477. data/aws-crt-ffi/crt/aws-lc/third_party/wycheproof_testvectors/hmac_sha512_224_test.json +1978 -0
  478. data/aws-crt-ffi/crt/aws-lc/third_party/wycheproof_testvectors/hmac_sha512_224_test.txt +1403 -0
  479. data/aws-crt-ffi/crt/aws-lc/third_party/wycheproof_testvectors/hmac_sha512_256_test.json +1993 -0
  480. data/aws-crt-ffi/crt/aws-lc/third_party/wycheproof_testvectors/hmac_sha512_256_test.txt +1416 -0
  481. data/aws-crt-ffi/crt/aws-lc/tool/digest.cc +4 -0
  482. data/aws-crt-ffi/crt/aws-lc/tool/internal.h +1 -0
  483. data/aws-crt-ffi/crt/aws-lc/tool/speed.cc +53 -6
  484. data/aws-crt-ffi/crt/aws-lc/util/all_tests.go +43 -12
  485. data/aws-crt-ffi/crt/aws-lc/util/all_tests.json +13 -5
  486. data/aws-crt-ffi/crt/aws-lc/util/bot/DEPS +4 -4
  487. data/aws-crt-ffi/crt/aws-lc/util/bot/update_clang.py +8 -2
  488. data/aws-crt-ffi/crt/aws-lc/util/codecov-ci.sh +82 -0
  489. data/aws-crt-ffi/crt/aws-lc/util/convert_wycheproof/convert_wycheproof.go +7 -5
  490. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/ACVP.md +7 -0
  491. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/acvptool/subprocess/hash.go +24 -9
  492. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/acvptool/subprocess/rsa.go +3 -4
  493. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/acvptool/subprocess/subprocess.go +15 -10
  494. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-512-224.bz2 +0 -0
  495. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/acvptool/test/expected/SHA2-512-224.bz2 +0 -0
  496. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/acvptool/test/expected/SHAKE-128.bz2 +0 -0
  497. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/acvptool/test/expected/SHAKE-256.bz2 +0 -0
  498. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/acvptool/test/sha-tests/sha512-224-tests.json +1 -0
  499. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/acvptool/test/sha-tests/shake-128-tests.json +1 -0
  500. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/acvptool/test/sha-tests/shake-256-tests.json +1 -0
  501. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/acvptool/test/tests.json +1 -0
  502. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/acvptool/test/vectors/HMAC-SHA2-512-224.bz2 +0 -0
  503. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/acvptool/test/vectors/SHA2-512-224.bz2 +0 -0
  504. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/acvptool/test/vectors/SHAKE-128.bz2 +0 -0
  505. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/acvptool/test/vectors/SHAKE-256.bz2 +0 -0
  506. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/modulewrapper/main.cc +4 -0
  507. data/aws-crt-ffi/crt/aws-lc/util/fipstools/acvp/modulewrapper/modulewrapper.cc +144 -1
  508. data/aws-crt-ffi/crt/aws-lc/util/fipstools/delocate/delocate.go +9 -3
  509. data/aws-crt-ffi/crt/aws-lc/util/fipstools/delocate/testdata/aarch64-Basic/in.s +4 -0
  510. data/aws-crt-ffi/crt/aws-lc/util/fipstools/delocate/testdata/aarch64-Basic/out.s +11 -0
  511. data/aws-crt-ffi/crt/aws-lc/util/fipstools/inject_hash/inject_hash.go +13 -4
  512. data/aws-crt-ffi/crt/aws-lc/util/fipstools/test-break-kat.sh +2 -0
  513. data/aws-crt-ffi/crt/aws-lc/util/testconfig/testconfig.go +2 -1
  514. data/aws-crt-ffi/crt/s2n/api/s2n.h +9 -5
  515. data/aws-crt-ffi/crt/s2n/bindings/rust/bench/benches/handshake.rs +9 -6
  516. data/aws-crt-ffi/crt/s2n/bindings/rust/bench/benches/resumption.rs +14 -14
  517. data/aws-crt-ffi/crt/s2n/bindings/rust/bench/benches/throughput.rs +9 -6
  518. data/aws-crt-ffi/crt/s2n/bindings/rust/bench/src/harness.rs +106 -102
  519. data/aws-crt-ffi/crt/s2n/bindings/rust/bench/src/openssl.rs +24 -20
  520. data/aws-crt-ffi/crt/s2n/bindings/rust/bench/src/rustls.rs +28 -24
  521. data/aws-crt-ffi/crt/s2n/bindings/rust/bench/src/s2n_tls.rs +52 -50
  522. data/aws-crt-ffi/crt/s2n/bindings/rust/generate/Cargo.toml +1 -0
  523. data/aws-crt-ffi/crt/s2n/bindings/rust/integration/Cargo.toml +3 -0
  524. data/aws-crt-ffi/crt/s2n/bindings/rust/s2n-tls/Cargo.toml +2 -2
  525. data/aws-crt-ffi/crt/s2n/bindings/rust/s2n-tls/src/connection.rs +9 -0
  526. data/aws-crt-ffi/crt/s2n/bindings/rust/s2n-tls-sys/templates/Cargo.template +2 -1
  527. data/aws-crt-ffi/crt/s2n/bindings/rust/s2n-tls-tokio/Cargo.toml +2 -2
  528. data/aws-crt-ffi/crt/s2n/tests/cbmc/sources/make_common_datastructures.c +9 -2
  529. data/aws-crt-ffi/crt/s2n/tests/fuzz/s2n_client_cert_verify_recv_test.c +1 -1
  530. data/aws-crt-ffi/crt/s2n/tests/fuzz/s2n_hybrid_ecdhe_kyber_r3_fuzz_test.c +1 -1
  531. data/aws-crt-ffi/crt/s2n/tests/fuzz/s2n_tls13_cert_verify_recv_test.c +1 -1
  532. data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_version_negotiation.py +4 -4
  533. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_auth_selection_test.c +19 -9
  534. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_client_auth_handshake_test.c +3 -3
  535. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_client_cert_verify_test.c +1 -1
  536. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_client_hello_recv_test.c +1 -1
  537. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_client_hello_test.c +4 -4
  538. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_client_signature_algorithms_extension_test.c +4 -5
  539. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_connection_protocol_versions_test.c +390 -0
  540. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_connection_test.c +8 -4
  541. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_handshake_test.c +2 -1
  542. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_quic_support_io_test.c +106 -0
  543. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_security_policies_test.c +6 -2
  544. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_self_talk_offload_signing_test.c +3 -3
  545. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_self_talk_session_resumption_test.c +135 -0
  546. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_server_new_session_ticket_test.c +32 -0
  547. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_server_signature_algorithms_extension_test.c +1 -1
  548. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_signature_algorithms_test.c +307 -283
  549. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_tls13_cert_request_test.c +1 -1
  550. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_tls13_cert_verify_test.c +18 -17
  551. data/aws-crt-ffi/crt/s2n/tests/unit/s2n_x509_validator_test.c +125 -0
  552. data/aws-crt-ffi/crt/s2n/tls/extensions/s2n_client_signature_algorithms.c +8 -1
  553. data/aws-crt-ffi/crt/s2n/tls/extensions/s2n_client_supported_versions.c +43 -11
  554. data/aws-crt-ffi/crt/s2n/tls/extensions/s2n_client_supported_versions.h +3 -0
  555. data/aws-crt-ffi/crt/s2n/tls/extensions/s2n_server_signature_algorithms.c +8 -1
  556. data/aws-crt-ffi/crt/s2n/tls/s2n_auth_selection.c +4 -2
  557. data/aws-crt-ffi/crt/s2n/tls/s2n_client_cert_verify.c +7 -10
  558. data/aws-crt-ffi/crt/s2n/tls/s2n_client_hello.c +2 -2
  559. data/aws-crt-ffi/crt/s2n/tls/s2n_connection.c +75 -14
  560. data/aws-crt-ffi/crt/s2n/tls/s2n_handshake.h +2 -2
  561. data/aws-crt-ffi/crt/s2n/tls/s2n_post_handshake.c +1 -1
  562. data/aws-crt-ffi/crt/s2n/tls/s2n_post_handshake.h +1 -0
  563. data/aws-crt-ffi/crt/s2n/tls/s2n_quic_support.c +29 -0
  564. data/aws-crt-ffi/crt/s2n/tls/s2n_quic_support.h +5 -0
  565. data/aws-crt-ffi/crt/s2n/tls/s2n_security_policies.c +40 -0
  566. data/aws-crt-ffi/crt/s2n/tls/s2n_security_policies.h +4 -0
  567. data/aws-crt-ffi/crt/s2n/tls/s2n_server_cert_request.c +1 -1
  568. data/aws-crt-ffi/crt/s2n/tls/s2n_server_hello.c +0 -3
  569. data/aws-crt-ffi/crt/s2n/tls/s2n_server_key_exchange.c +8 -9
  570. data/aws-crt-ffi/crt/s2n/tls/s2n_server_new_session_ticket.c +8 -0
  571. data/aws-crt-ffi/crt/s2n/tls/s2n_signature_algorithms.c +111 -72
  572. data/aws-crt-ffi/crt/s2n/tls/s2n_signature_algorithms.h +11 -9
  573. data/aws-crt-ffi/crt/s2n/tls/s2n_signature_scheme.c +9 -0
  574. data/aws-crt-ffi/crt/s2n/tls/s2n_signature_scheme.h +2 -0
  575. data/aws-crt-ffi/crt/s2n/tls/s2n_tls13_certificate_verify.c +12 -18
  576. data/aws-crt-ffi/crt/s2n/tls/s2n_x509_validator.c +7 -7
  577. data/aws-crt-ffi/src/api.h +1 -0
  578. data/lib/aws-crt/native.rb +1 -1
  579. metadata +68 -5
  580. data/aws-crt-ffi/crt/aws-lc/tests/ci/cdk/cdk/ssm/m1_tests_ssm_document.yaml +0 -34
  581. data/aws-crt-ffi/crt/aws-lc/tests/ci/run_m1_ec2_instance.sh +0 -96
@@ -5,239 +5,49 @@
5
5
  package runner
6
6
 
7
7
  import (
8
- "encoding/binary"
9
8
  "errors"
10
9
  "fmt"
11
- )
12
-
13
- func writeLen(buf []byte, v, size int) {
14
- for i := 0; i < size; i++ {
15
- buf[size-i-1] = byte(v)
16
- v >>= 8
17
- }
18
- if v != 0 {
19
- panic("length is too long")
20
- }
21
- }
22
-
23
- type byteBuilder struct {
24
- buf *[]byte
25
- start int
26
- prefixLen int
27
- child *byteBuilder
28
- }
29
-
30
- func newByteBuilder() *byteBuilder {
31
- buf := make([]byte, 0, 32)
32
- return &byteBuilder{buf: &buf}
33
- }
34
-
35
- func (bb *byteBuilder) len() int {
36
- return len(*bb.buf) - bb.start - bb.prefixLen
37
- }
38
-
39
- func (bb *byteBuilder) data() []byte {
40
- bb.flush()
41
- return (*bb.buf)[bb.start+bb.prefixLen:]
42
- }
43
-
44
- func (bb *byteBuilder) flush() {
45
- if bb.child == nil {
46
- return
47
- }
48
- bb.child.flush()
49
- writeLen((*bb.buf)[bb.child.start:], bb.child.len(), bb.child.prefixLen)
50
- bb.child = nil
51
- return
52
- }
53
-
54
- func (bb *byteBuilder) finish() []byte {
55
- bb.flush()
56
- return *bb.buf
57
- }
58
-
59
- func (bb *byteBuilder) addU8(u uint8) {
60
- bb.flush()
61
- *bb.buf = append(*bb.buf, u)
62
- }
63
-
64
- func (bb *byteBuilder) addU16(u uint16) {
65
- bb.flush()
66
- *bb.buf = append(*bb.buf, byte(u>>8), byte(u))
67
- }
68
-
69
- func (bb *byteBuilder) addU24(u int) {
70
- bb.flush()
71
- *bb.buf = append(*bb.buf, byte(u>>16), byte(u>>8), byte(u))
72
- }
73
-
74
- func (bb *byteBuilder) addU32(u uint32) {
75
- bb.flush()
76
- *bb.buf = append(*bb.buf, byte(u>>24), byte(u>>16), byte(u>>8), byte(u))
77
- }
78
-
79
- func (bb *byteBuilder) addU64(u uint64) {
80
- bb.flush()
81
- var b [8]byte
82
- binary.BigEndian.PutUint64(b[:], u)
83
- *bb.buf = append(*bb.buf, b[:]...)
84
- }
85
-
86
- func (bb *byteBuilder) addU8LengthPrefixed() *byteBuilder {
87
- return bb.createChild(1)
88
- }
89
-
90
- func (bb *byteBuilder) addU16LengthPrefixed() *byteBuilder {
91
- return bb.createChild(2)
92
- }
93
-
94
- func (bb *byteBuilder) addU24LengthPrefixed() *byteBuilder {
95
- return bb.createChild(3)
96
- }
97
-
98
- func (bb *byteBuilder) addU32LengthPrefixed() *byteBuilder {
99
- return bb.createChild(4)
100
- }
101
-
102
- func (bb *byteBuilder) addBytes(b []byte) {
103
- bb.flush()
104
- *bb.buf = append(*bb.buf, b...)
105
- }
106
-
107
- func (bb *byteBuilder) createChild(lengthPrefixSize int) *byteBuilder {
108
- bb.flush()
109
- bb.child = &byteBuilder{
110
- buf: bb.buf,
111
- start: len(*bb.buf),
112
- prefixLen: lengthPrefixSize,
113
- }
114
- for i := 0; i < lengthPrefixSize; i++ {
115
- *bb.buf = append(*bb.buf, 0)
116
- }
117
- return bb.child
118
- }
119
10
 
120
- func (bb *byteBuilder) discardChild() {
121
- if bb.child == nil {
122
- return
123
- }
124
- *bb.buf = (*bb.buf)[:bb.child.start]
125
- bb.child = nil
126
- }
127
-
128
- type byteReader []byte
129
-
130
- func (br *byteReader) readInternal(out *byteReader, n int) bool {
131
- if len(*br) < n {
132
- return false
133
- }
134
- *out = (*br)[:n]
135
- *br = (*br)[n:]
136
- return true
137
- }
138
-
139
- func (br *byteReader) readBytes(out *[]byte, n int) bool {
140
- var child byteReader
141
- if !br.readInternal(&child, n) {
142
- return false
143
- }
144
- *out = []byte(child)
145
- return true
146
- }
147
-
148
- func (br *byteReader) readUint(out *uint64, n int) bool {
149
- var b []byte
150
- if !br.readBytes(&b, n) {
151
- return false
152
- }
153
- *out = 0
154
- for _, v := range b {
155
- *out <<= 8
156
- *out |= uint64(v)
157
- }
158
- return true
159
- }
160
-
161
- func (br *byteReader) readU8(out *uint8) bool {
162
- var b []byte
163
- if !br.readBytes(&b, 1) {
164
- return false
165
- }
166
- *out = b[0]
167
- return true
168
- }
11
+ "golang.org/x/crypto/cryptobyte"
12
+ )
169
13
 
170
- func (br *byteReader) readU16(out *uint16) bool {
171
- var v uint64
172
- if !br.readUint(&v, 2) {
14
+ func readUint8LengthPrefixedBytes(s *cryptobyte.String, out *[]byte) bool {
15
+ var child cryptobyte.String
16
+ if !s.ReadUint8LengthPrefixed(&child) {
173
17
  return false
174
18
  }
175
- *out = uint16(v)
19
+ *out = child
176
20
  return true
177
21
  }
178
22
 
179
- func (br *byteReader) readU24(out *uint32) bool {
180
- var v uint64
181
- if !br.readUint(&v, 3) {
23
+ func readUint16LengthPrefixedBytes(s *cryptobyte.String, out *[]byte) bool {
24
+ var child cryptobyte.String
25
+ if !s.ReadUint16LengthPrefixed(&child) {
182
26
  return false
183
27
  }
184
- *out = uint32(v)
28
+ *out = child
185
29
  return true
186
30
  }
187
31
 
188
- func (br *byteReader) readU32(out *uint32) bool {
189
- var v uint64
190
- if !br.readUint(&v, 4) {
32
+ func readUint24LengthPrefixedBytes(s *cryptobyte.String, out *[]byte) bool {
33
+ var child cryptobyte.String
34
+ if !s.ReadUint24LengthPrefixed(&child) {
191
35
  return false
192
36
  }
193
- *out = uint32(v)
37
+ *out = child
194
38
  return true
195
39
  }
196
40
 
197
- func (br *byteReader) readU64(out *uint64) bool {
198
- return br.readUint(out, 8)
41
+ func addUint8LengthPrefixedBytes(b *cryptobyte.Builder, v []byte) {
42
+ b.AddUint8LengthPrefixed(func(child *cryptobyte.Builder) { child.AddBytes(v) })
199
43
  }
200
44
 
201
- func (br *byteReader) readLengthPrefixed(out *byteReader, n int) bool {
202
- var length uint64
203
- return br.readUint(&length, n) &&
204
- uint64(len(*br)) >= length &&
205
- br.readInternal(out, int(length))
45
+ func addUint16LengthPrefixedBytes(b *cryptobyte.Builder, v []byte) {
46
+ b.AddUint16LengthPrefixed(func(child *cryptobyte.Builder) { child.AddBytes(v) })
206
47
  }
207
48
 
208
- func (br *byteReader) readLengthPrefixedBytes(out *[]byte, n int) bool {
209
- var length uint64
210
- return br.readUint(&length, n) &&
211
- uint64(len(*br)) >= length &&
212
- br.readBytes(out, int(length))
213
- }
214
-
215
- func (br *byteReader) readU8LengthPrefixed(out *byteReader) bool {
216
- return br.readLengthPrefixed(out, 1)
217
- }
218
- func (br *byteReader) readU8LengthPrefixedBytes(out *[]byte) bool {
219
- return br.readLengthPrefixedBytes(out, 1)
220
- }
221
-
222
- func (br *byteReader) readU16LengthPrefixed(out *byteReader) bool {
223
- return br.readLengthPrefixed(out, 2)
224
- }
225
- func (br *byteReader) readU16LengthPrefixedBytes(out *[]byte) bool {
226
- return br.readLengthPrefixedBytes(out, 2)
227
- }
228
-
229
- func (br *byteReader) readU24LengthPrefixed(out *byteReader) bool {
230
- return br.readLengthPrefixed(out, 3)
231
- }
232
- func (br *byteReader) readU24LengthPrefixedBytes(out *[]byte) bool {
233
- return br.readLengthPrefixedBytes(out, 3)
234
- }
235
-
236
- func (br *byteReader) readU32LengthPrefixed(out *byteReader) bool {
237
- return br.readLengthPrefixed(out, 4)
238
- }
239
- func (br *byteReader) readU32LengthPrefixedBytes(out *[]byte) bool {
240
- return br.readLengthPrefixedBytes(out, 4)
49
+ func addUint24LengthPrefixedBytes(b *cryptobyte.Builder, v []byte) {
50
+ b.AddUint24LengthPrefixed(func(child *cryptobyte.Builder) { child.AddBytes(v) })
241
51
  }
242
52
 
243
53
  type keyShareEntry struct {
@@ -269,48 +79,52 @@ type ECHConfig struct {
269
79
  }
270
80
 
271
81
  func CreateECHConfig(template *ECHConfig) *ECHConfig {
272
- bb := newByteBuilder()
82
+ bb := cryptobyte.NewBuilder(nil)
273
83
  // ECHConfig reuses the encrypted_client_hello extension codepoint as a
274
84
  // version identifier.
275
- bb.addU16(extensionEncryptedClientHello)
276
- contents := bb.addU16LengthPrefixed()
277
- contents.addU8(template.ConfigID)
278
- contents.addU16(template.KEM)
279
- contents.addU16LengthPrefixed().addBytes(template.PublicKey)
280
- cipherSuites := contents.addU16LengthPrefixed()
281
- for _, suite := range template.CipherSuites {
282
- cipherSuites.addU16(suite.KDF)
283
- cipherSuites.addU16(suite.AEAD)
284
- }
285
- contents.addU8(template.MaxNameLen)
286
- contents.addU8LengthPrefixed().addBytes([]byte(template.PublicName))
287
- extensions := contents.addU16LengthPrefixed()
288
- // Mandatory extensions have the high bit set.
289
- if template.UnsupportedExtension {
290
- extensions.addU16(0x1111)
291
- extensions.addU16LengthPrefixed().addBytes([]byte("test"))
292
- }
293
- if template.UnsupportedMandatoryExtension {
294
- extensions.addU16(0xaaaa)
295
- extensions.addU16LengthPrefixed().addBytes([]byte("test"))
296
- }
297
-
298
- // This ought to be a call to a function like ParseECHConfig(bb.finish()),
85
+ bb.AddUint16(extensionEncryptedClientHello)
86
+ bb.AddUint16LengthPrefixed(func(contents *cryptobyte.Builder) {
87
+ contents.AddUint8(template.ConfigID)
88
+ contents.AddUint16(template.KEM)
89
+ addUint16LengthPrefixedBytes(contents, template.PublicKey)
90
+ contents.AddUint16LengthPrefixed(func(cipherSuites *cryptobyte.Builder) {
91
+ for _, suite := range template.CipherSuites {
92
+ cipherSuites.AddUint16(suite.KDF)
93
+ cipherSuites.AddUint16(suite.AEAD)
94
+ }
95
+ })
96
+ contents.AddUint8(template.MaxNameLen)
97
+ addUint8LengthPrefixedBytes(contents, []byte(template.PublicName))
98
+ contents.AddUint16LengthPrefixed(func(extensions *cryptobyte.Builder) {
99
+ // Mandatory extensions have the high bit set.
100
+ if template.UnsupportedExtension {
101
+ extensions.AddUint16(0x1111)
102
+ addUint16LengthPrefixedBytes(extensions, []byte("test"))
103
+ }
104
+ if template.UnsupportedMandatoryExtension {
105
+ extensions.AddUint16(0xaaaa)
106
+ addUint16LengthPrefixedBytes(extensions, []byte("test"))
107
+ }
108
+ })
109
+ })
110
+
111
+ // This ought to be a call to a function like ParseECHConfig(bb.BytesOrPanic()),
299
112
  // but this constrains us to constructing ECHConfigs we are willing to
300
113
  // support. We need to test the client's behavior in response to unparsable
301
114
  // or unsupported ECHConfigs, so populate fields from the template directly.
302
115
  ret := *template
303
- ret.Raw = bb.finish()
116
+ ret.Raw = bb.BytesOrPanic()
304
117
  return &ret
305
118
  }
306
119
 
307
120
  func CreateECHConfigList(configs ...[]byte) []byte {
308
- bb := newByteBuilder()
309
- list := bb.addU16LengthPrefixed()
310
- for _, config := range configs {
311
- list.addBytes(config)
312
- }
313
- return bb.finish()
121
+ bb := cryptobyte.NewBuilder(nil)
122
+ bb.AddUint16LengthPrefixed(func(list *cryptobyte.Builder) {
123
+ for _, config := range configs {
124
+ list.AddBytes(config)
125
+ }
126
+ })
127
+ return bb.BytesOrPanic()
314
128
  }
315
129
 
316
130
  type ServerECHConfig struct {
@@ -392,16 +206,16 @@ type clientHelloMsg struct {
392
206
  rawExtensions []byte
393
207
  }
394
208
 
395
- func (m *clientHelloMsg) marshalKeyShares(bb *byteBuilder) {
396
- keyShares := bb.addU16LengthPrefixed()
397
- for _, keyShare := range m.keyShares {
398
- keyShares.addU16(uint16(keyShare.group))
399
- keyExchange := keyShares.addU16LengthPrefixed()
400
- keyExchange.addBytes(keyShare.keyExchange)
401
- }
402
- if m.trailingKeyShareData {
403
- keyShares.addU8(0)
404
- }
209
+ func (m *clientHelloMsg) marshalKeyShares(bb *cryptobyte.Builder) {
210
+ bb.AddUint16LengthPrefixed(func(keyShares *cryptobyte.Builder) {
211
+ for _, keyShare := range m.keyShares {
212
+ keyShares.AddUint16(uint16(keyShare.group))
213
+ addUint16LengthPrefixedBytes(keyShares, keyShare.keyExchange)
214
+ }
215
+ if m.trailingKeyShareData {
216
+ keyShares.AddUint8(0)
217
+ }
218
+ })
405
219
  }
406
220
 
407
221
  type clientHelloType int
@@ -411,23 +225,27 @@ const (
411
225
  clientHelloEncodedInner
412
226
  )
413
227
 
414
- func (m *clientHelloMsg) marshalBody(hello *byteBuilder, typ clientHelloType) {
415
- hello.addU16(m.vers)
416
- hello.addBytes(m.random)
417
- sessionID := hello.addU8LengthPrefixed()
418
- if typ != clientHelloEncodedInner {
419
- sessionID.addBytes(m.sessionID)
420
- }
228
+ func (m *clientHelloMsg) marshalBody(hello *cryptobyte.Builder, typ clientHelloType) {
229
+ hello.AddUint16(m.vers)
230
+ hello.AddBytes(m.random)
231
+ hello.AddUint8LengthPrefixed(func(sessionID *cryptobyte.Builder) {
232
+ if typ != clientHelloEncodedInner {
233
+ sessionID.AddBytes(m.sessionID)
234
+ }
235
+ })
421
236
  if m.isDTLS {
422
- cookie := hello.addU8LengthPrefixed()
423
- cookie.addBytes(m.cookie)
424
- }
425
- cipherSuites := hello.addU16LengthPrefixed()
426
- for _, suite := range m.cipherSuites {
427
- cipherSuites.addU16(suite)
237
+ hello.AddUint8LengthPrefixed(func(cookie *cryptobyte.Builder) {
238
+ cookie.AddBytes(m.cookie)
239
+ })
428
240
  }
429
- compressionMethods := hello.addU8LengthPrefixed()
430
- compressionMethods.addBytes(m.compressionMethods)
241
+ hello.AddUint16LengthPrefixed(func(cipherSuites *cryptobyte.Builder) {
242
+ for _, suite := range m.cipherSuites {
243
+ cipherSuites.AddUint16(suite)
244
+ }
245
+ })
246
+ hello.AddUint8LengthPrefixed(func(compressionMethods *cryptobyte.Builder) {
247
+ compressionMethods.AddBytes(m.compressionMethods)
248
+ })
431
249
 
432
250
  type extension struct {
433
251
  id uint16
@@ -462,99 +280,99 @@ func (m *clientHelloMsg) marshalBody(hello *byteBuilder, typ clientHelloType) {
462
280
  // ServerName server_name_list<1..2^16-1>
463
281
  // } ServerNameList;
464
282
 
465
- serverNameList := newByteBuilder()
466
- serverName := serverNameList.addU16LengthPrefixed()
467
- serverName.addU8(0) // NameType host_name(0)
468
- hostName := serverName.addU16LengthPrefixed()
469
- hostName.addBytes([]byte(m.serverName))
283
+ serverNameList := cryptobyte.NewBuilder(nil)
284
+ serverNameList.AddUint16LengthPrefixed(func(serverName *cryptobyte.Builder) {
285
+ serverName.AddUint8(0) // NameType host_name(0)
286
+ addUint16LengthPrefixedBytes(serverName, []byte(m.serverName))
287
+ })
470
288
 
471
289
  extensions = append(extensions, extension{
472
290
  id: extensionServerName,
473
- body: serverNameList.finish(),
291
+ body: serverNameList.BytesOrPanic(),
474
292
  })
475
293
  }
476
294
  if m.echOuter != nil {
477
- body := newByteBuilder()
478
- body.addU8(echClientTypeOuter)
479
- body.addU16(m.echOuter.kdfID)
480
- body.addU16(m.echOuter.aeadID)
481
- body.addU8(m.echOuter.configID)
482
- body.addU16LengthPrefixed().addBytes(m.echOuter.enc)
483
- body.addU16LengthPrefixed().addBytes(m.echOuter.payload)
295
+ body := cryptobyte.NewBuilder(nil)
296
+ body.AddUint8(echClientTypeOuter)
297
+ body.AddUint16(m.echOuter.kdfID)
298
+ body.AddUint16(m.echOuter.aeadID)
299
+ body.AddUint8(m.echOuter.configID)
300
+ addUint16LengthPrefixedBytes(body, m.echOuter.enc)
301
+ addUint16LengthPrefixedBytes(body, m.echOuter.payload)
484
302
  extensions = append(extensions, extension{
485
303
  id: extensionEncryptedClientHello,
486
- body: body.finish(),
304
+ body: body.BytesOrPanic(),
487
305
  })
488
306
  }
489
307
  if m.echInner {
490
- body := newByteBuilder()
491
- body.addU8(echClientTypeInner)
308
+ body := cryptobyte.NewBuilder(nil)
309
+ body.AddUint8(echClientTypeInner)
492
310
  // If unset, invalidECHInner is empty, which is the correct serialization.
493
- body.addBytes(m.invalidECHInner)
311
+ body.AddBytes(m.invalidECHInner)
494
312
  extensions = append(extensions, extension{
495
313
  id: extensionEncryptedClientHello,
496
- body: body.finish(),
314
+ body: body.BytesOrPanic(),
497
315
  })
498
316
  }
499
317
  if m.ocspStapling {
500
- certificateStatusRequest := newByteBuilder()
318
+ certificateStatusRequest := cryptobyte.NewBuilder(nil)
501
319
  // RFC 4366, section 3.6
502
- certificateStatusRequest.addU8(1) // OCSP type
320
+ certificateStatusRequest.AddUint8(1) // OCSP type
503
321
  // Two zero valued uint16s for the two lengths.
504
- certificateStatusRequest.addU16(0) // ResponderID length
505
- certificateStatusRequest.addU16(0) // Extensions length
322
+ certificateStatusRequest.AddUint16(0) // ResponderID length
323
+ certificateStatusRequest.AddUint16(0) // Extensions length
506
324
  extensions = append(extensions, extension{
507
325
  id: extensionStatusRequest,
508
- body: certificateStatusRequest.finish(),
326
+ body: certificateStatusRequest.BytesOrPanic(),
509
327
  })
510
328
  }
511
329
  if len(m.supportedCurves) > 0 {
512
330
  // http://tools.ietf.org/html/rfc4492#section-5.1.1
513
- supportedCurvesList := newByteBuilder()
514
- supportedCurves := supportedCurvesList.addU16LengthPrefixed()
515
- for _, curve := range m.supportedCurves {
516
- supportedCurves.addU16(uint16(curve))
517
- }
331
+ supportedCurvesList := cryptobyte.NewBuilder(nil)
332
+ supportedCurvesList.AddUint16LengthPrefixed(func(supportedCurves *cryptobyte.Builder) {
333
+ for _, curve := range m.supportedCurves {
334
+ supportedCurves.AddUint16(uint16(curve))
335
+ }
336
+ })
518
337
  extensions = append(extensions, extension{
519
338
  id: extensionSupportedCurves,
520
- body: supportedCurvesList.finish(),
339
+ body: supportedCurvesList.BytesOrPanic(),
521
340
  })
522
341
  }
523
342
  if len(m.supportedPoints) > 0 {
524
343
  // http://tools.ietf.org/html/rfc4492#section-5.1.2
525
- supportedPointsList := newByteBuilder()
526
- supportedPoints := supportedPointsList.addU8LengthPrefixed()
527
- supportedPoints.addBytes(m.supportedPoints)
344
+ supportedPointsList := cryptobyte.NewBuilder(nil)
345
+ addUint8LengthPrefixedBytes(supportedPointsList, m.supportedPoints)
528
346
  extensions = append(extensions, extension{
529
347
  id: extensionSupportedPoints,
530
- body: supportedPointsList.finish(),
348
+ body: supportedPointsList.BytesOrPanic(),
531
349
  })
532
350
  }
533
351
  if m.hasKeyShares {
534
- keyShareList := newByteBuilder()
352
+ keyShareList := cryptobyte.NewBuilder(nil)
535
353
  m.marshalKeyShares(keyShareList)
536
354
  extensions = append(extensions, extension{
537
355
  id: extensionKeyShare,
538
- body: keyShareList.finish(),
356
+ body: keyShareList.BytesOrPanic(),
539
357
  })
540
358
  }
541
359
  if len(m.pskKEModes) > 0 {
542
- pskModesExtension := newByteBuilder()
543
- pskModesExtension.addU8LengthPrefixed().addBytes(m.pskKEModes)
360
+ pskModesExtension := cryptobyte.NewBuilder(nil)
361
+ addUint8LengthPrefixedBytes(pskModesExtension, m.pskKEModes)
544
362
  extensions = append(extensions, extension{
545
363
  id: extensionPSKKeyExchangeModes,
546
- body: pskModesExtension.finish(),
364
+ body: pskModesExtension.BytesOrPanic(),
547
365
  })
548
366
  }
549
367
  if m.hasEarlyData {
550
368
  extensions = append(extensions, extension{id: extensionEarlyData})
551
369
  }
552
370
  if len(m.tls13Cookie) > 0 {
553
- body := newByteBuilder()
554
- body.addU16LengthPrefixed().addBytes(m.tls13Cookie)
371
+ body := cryptobyte.NewBuilder(nil)
372
+ addUint16LengthPrefixedBytes(body, m.tls13Cookie)
555
373
  extensions = append(extensions, extension{
556
374
  id: extensionCookie,
557
- body: body.finish(),
375
+ body: body.BytesOrPanic(),
558
376
  })
559
377
  }
560
378
  if m.ticketSupported {
@@ -566,57 +384,60 @@ func (m *clientHelloMsg) marshalBody(hello *byteBuilder, typ clientHelloType) {
566
384
  }
567
385
  if len(m.signatureAlgorithms) > 0 {
568
386
  // https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1
569
- signatureAlgorithmsExtension := newByteBuilder()
570
- signatureAlgorithms := signatureAlgorithmsExtension.addU16LengthPrefixed()
571
- for _, sigAlg := range m.signatureAlgorithms {
572
- signatureAlgorithms.addU16(uint16(sigAlg))
573
- }
387
+ signatureAlgorithmsExtension := cryptobyte.NewBuilder(nil)
388
+ signatureAlgorithmsExtension.AddUint16LengthPrefixed(func(signatureAlgorithms *cryptobyte.Builder) {
389
+ for _, sigAlg := range m.signatureAlgorithms {
390
+ signatureAlgorithms.AddUint16(uint16(sigAlg))
391
+ }
392
+ })
574
393
  extensions = append(extensions, extension{
575
394
  id: extensionSignatureAlgorithms,
576
- body: signatureAlgorithmsExtension.finish(),
395
+ body: signatureAlgorithmsExtension.BytesOrPanic(),
577
396
  })
578
397
  }
579
398
  if len(m.signatureAlgorithmsCert) > 0 {
580
- signatureAlgorithmsCertExtension := newByteBuilder()
581
- signatureAlgorithmsCert := signatureAlgorithmsCertExtension.addU16LengthPrefixed()
582
- for _, sigAlg := range m.signatureAlgorithmsCert {
583
- signatureAlgorithmsCert.addU16(uint16(sigAlg))
584
- }
399
+ signatureAlgorithmsCertExtension := cryptobyte.NewBuilder(nil)
400
+ signatureAlgorithmsCertExtension.AddUint16LengthPrefixed(func(signatureAlgorithmsCert *cryptobyte.Builder) {
401
+ for _, sigAlg := range m.signatureAlgorithmsCert {
402
+ signatureAlgorithmsCert.AddUint16(uint16(sigAlg))
403
+ }
404
+ })
585
405
  extensions = append(extensions, extension{
586
406
  id: extensionSignatureAlgorithmsCert,
587
- body: signatureAlgorithmsCertExtension.finish(),
407
+ body: signatureAlgorithmsCertExtension.BytesOrPanic(),
588
408
  })
589
409
  }
590
410
  if len(m.supportedVersions) > 0 {
591
- supportedVersionsExtension := newByteBuilder()
592
- supportedVersions := supportedVersionsExtension.addU8LengthPrefixed()
593
- for _, version := range m.supportedVersions {
594
- supportedVersions.addU16(uint16(version))
595
- }
411
+ supportedVersionsExtension := cryptobyte.NewBuilder(nil)
412
+ supportedVersionsExtension.AddUint8LengthPrefixed(func(supportedVersions *cryptobyte.Builder) {
413
+ for _, version := range m.supportedVersions {
414
+ supportedVersions.AddUint16(uint16(version))
415
+ }
416
+ })
596
417
  extensions = append(extensions, extension{
597
418
  id: extensionSupportedVersions,
598
- body: supportedVersionsExtension.finish(),
419
+ body: supportedVersionsExtension.BytesOrPanic(),
599
420
  })
600
421
  }
601
422
  if m.secureRenegotiation != nil {
602
- secureRenegoExt := newByteBuilder()
603
- secureRenegoExt.addU8LengthPrefixed().addBytes(m.secureRenegotiation)
423
+ secureRenegoExt := cryptobyte.NewBuilder(nil)
424
+ addUint8LengthPrefixedBytes(secureRenegoExt, m.secureRenegotiation)
604
425
  extensions = append(extensions, extension{
605
426
  id: extensionRenegotiationInfo,
606
- body: secureRenegoExt.finish(),
427
+ body: secureRenegoExt.BytesOrPanic(),
607
428
  })
608
429
  }
609
430
  if len(m.alpnProtocols) > 0 {
610
431
  // https://tools.ietf.org/html/rfc7301#section-3.1
611
- alpnExtension := newByteBuilder()
612
- protocolNameList := alpnExtension.addU16LengthPrefixed()
613
- for _, s := range m.alpnProtocols {
614
- protocolName := protocolNameList.addU8LengthPrefixed()
615
- protocolName.addBytes([]byte(s))
616
- }
432
+ alpnExtension := cryptobyte.NewBuilder(nil)
433
+ alpnExtension.AddUint16LengthPrefixed(func(protocolNameList *cryptobyte.Builder) {
434
+ for _, s := range m.alpnProtocols {
435
+ addUint8LengthPrefixedBytes(protocolNameList, []byte(s))
436
+ }
437
+ })
617
438
  extensions = append(extensions, extension{
618
439
  id: extensionALPN,
619
- body: alpnExtension.finish(),
440
+ body: alpnExtension.BytesOrPanic(),
620
441
  })
621
442
  }
622
443
  if len(m.quicTransportParams) > 0 {
@@ -644,18 +465,18 @@ func (m *clientHelloMsg) marshalBody(hello *byteBuilder, typ clientHelloType) {
644
465
  }
645
466
  if len(m.srtpProtectionProfiles) > 0 {
646
467
  // https://tools.ietf.org/html/rfc5764#section-4.1.1
647
- useSrtpExt := newByteBuilder()
468
+ useSrtpExt := cryptobyte.NewBuilder(nil)
648
469
 
649
- srtpProtectionProfiles := useSrtpExt.addU16LengthPrefixed()
650
- for _, p := range m.srtpProtectionProfiles {
651
- srtpProtectionProfiles.addU16(p)
652
- }
653
- srtpMki := useSrtpExt.addU8LengthPrefixed()
654
- srtpMki.addBytes([]byte(m.srtpMasterKeyIdentifier))
470
+ useSrtpExt.AddUint16LengthPrefixed(func(srtpProtectionProfiles *cryptobyte.Builder) {
471
+ for _, p := range m.srtpProtectionProfiles {
472
+ srtpProtectionProfiles.AddUint16(p)
473
+ }
474
+ })
475
+ addUint8LengthPrefixedBytes(useSrtpExt, []byte(m.srtpMasterKeyIdentifier))
655
476
 
656
477
  extensions = append(extensions, extension{
657
478
  id: extensionUseSRTP,
658
- body: useSrtpExt.finish(),
479
+ body: useSrtpExt.BytesOrPanic(),
659
480
  })
660
481
  }
661
482
  if m.sctListSupported {
@@ -668,130 +489,138 @@ func (m *clientHelloMsg) marshalBody(hello *byteBuilder, typ clientHelloType) {
668
489
  })
669
490
  }
670
491
  if len(m.compressedCertAlgs) > 0 {
671
- body := newByteBuilder()
672
- algIDs := body.addU8LengthPrefixed()
673
- for _, v := range m.compressedCertAlgs {
674
- algIDs.addU16(v)
675
- }
492
+ body := cryptobyte.NewBuilder(nil)
493
+ body.AddUint8LengthPrefixed(func(algIDs *cryptobyte.Builder) {
494
+ for _, v := range m.compressedCertAlgs {
495
+ algIDs.AddUint16(v)
496
+ }
497
+ })
676
498
  extensions = append(extensions, extension{
677
499
  id: extensionCompressedCertAlgs,
678
- body: body.finish(),
500
+ body: body.BytesOrPanic(),
679
501
  })
680
502
  }
681
503
  if m.delegatedCredentials {
682
- body := newByteBuilder()
683
- signatureSchemeList := body.addU16LengthPrefixed()
684
- for _, sigAlg := range m.signatureAlgorithms {
685
- signatureSchemeList.addU16(uint16(sigAlg))
686
- }
504
+ body := cryptobyte.NewBuilder(nil)
505
+ body.AddUint16LengthPrefixed(func(signatureSchemeList *cryptobyte.Builder) {
506
+ for _, sigAlg := range m.signatureAlgorithms {
507
+ signatureSchemeList.AddUint16(uint16(sigAlg))
508
+ }
509
+ })
687
510
  extensions = append(extensions, extension{
688
511
  id: extensionDelegatedCredentials,
689
- body: body.finish(),
512
+ body: body.BytesOrPanic(),
690
513
  })
691
514
  }
692
515
  if len(m.alpsProtocols) > 0 {
693
- body := newByteBuilder()
694
- protocolNameList := body.addU16LengthPrefixed()
695
- for _, s := range m.alpsProtocols {
696
- protocolNameList.addU8LengthPrefixed().addBytes([]byte(s))
697
- }
516
+ body := cryptobyte.NewBuilder(nil)
517
+ body.AddUint16LengthPrefixed(func(protocolNameList *cryptobyte.Builder) {
518
+ for _, s := range m.alpsProtocols {
519
+ addUint8LengthPrefixedBytes(protocolNameList, []byte(s))
520
+ }
521
+ })
698
522
  extensions = append(extensions, extension{
699
523
  id: extensionApplicationSettings,
700
- body: body.finish(),
524
+ body: body.BytesOrPanic(),
701
525
  })
702
526
  }
703
527
 
704
528
  // The PSK extension must be last. See https://tools.ietf.org/html/rfc8446#section-4.2.11
705
529
  if len(m.pskIdentities) > 0 {
706
- pskExtension := newByteBuilder()
707
- pskIdentities := pskExtension.addU16LengthPrefixed()
708
- for _, psk := range m.pskIdentities {
709
- pskIdentities.addU16LengthPrefixed().addBytes(psk.ticket)
710
- pskIdentities.addU32(psk.obfuscatedTicketAge)
711
- }
712
- pskBinders := pskExtension.addU16LengthPrefixed()
713
- for _, binder := range m.pskBinders {
714
- pskBinders.addU8LengthPrefixed().addBytes(binder)
715
- }
530
+ pskExtension := cryptobyte.NewBuilder(nil)
531
+ pskExtension.AddUint16LengthPrefixed(func(pskIdentities *cryptobyte.Builder) {
532
+ for _, psk := range m.pskIdentities {
533
+ addUint16LengthPrefixedBytes(pskIdentities, psk.ticket)
534
+ pskIdentities.AddUint32(psk.obfuscatedTicketAge)
535
+ }
536
+ })
537
+ pskExtension.AddUint16LengthPrefixed(func(pskBinders *cryptobyte.Builder) {
538
+ for _, binder := range m.pskBinders {
539
+ addUint8LengthPrefixedBytes(pskBinders, binder)
540
+ }
541
+ })
716
542
  extensions = append(extensions, extension{
717
543
  id: extensionPreSharedKey,
718
- body: pskExtension.finish(),
544
+ body: pskExtension.BytesOrPanic(),
719
545
  })
720
546
  }
721
547
 
722
- extensionsBB := hello.addU16LengthPrefixed()
723
- extMap := make(map[uint16][]byte)
724
- extsWritten := make(map[uint16]struct{})
725
- for _, ext := range extensions {
726
- extMap[ext.id] = ext.body
727
- }
728
- // Write each of the prefix extensions, if we have it.
729
- for _, extID := range m.prefixExtensions {
730
- if body, ok := extMap[extID]; ok {
731
- extensionsBB.addU16(extID)
732
- extensionsBB.addU16LengthPrefixed().addBytes(body)
733
- extsWritten[extID] = struct{}{}
734
- }
548
+ if m.omitExtensions {
549
+ return
735
550
  }
736
- // Write outer extensions, possibly in compressed form.
737
- if m.outerExtensions != nil {
738
- if typ == clientHelloEncodedInner && !m.reorderOuterExtensionsWithoutCompressing {
739
- extensionsBB.addU16(extensionECHOuterExtensions)
740
- list := extensionsBB.addU16LengthPrefixed().addU8LengthPrefixed()
741
- for _, extID := range m.outerExtensions {
742
- list.addU16(extID)
551
+ hello.AddUint16LengthPrefixed(func(extensionsBB *cryptobyte.Builder) {
552
+ if m.emptyExtensions {
553
+ return
554
+ }
555
+ extMap := make(map[uint16][]byte)
556
+ extsWritten := make(map[uint16]struct{})
557
+ for _, ext := range extensions {
558
+ extMap[ext.id] = ext.body
559
+ }
560
+ // Write each of the prefix extensions, if we have it.
561
+ for _, extID := range m.prefixExtensions {
562
+ if body, ok := extMap[extID]; ok {
563
+ extensionsBB.AddUint16(extID)
564
+ addUint16LengthPrefixedBytes(extensionsBB, body)
743
565
  extsWritten[extID] = struct{}{}
744
566
  }
745
- } else {
746
- for _, extID := range m.outerExtensions {
747
- // m.outerExtensions may intentionally contain duplicates to test the
748
- // server's reaction. If m.reorderOuterExtensionsWithoutCompressing
749
- // is set, we are targetting the second ClientHello and wish to send a
750
- // valid first ClientHello. In that case, deduplicate so the error
751
- // only appears later.
752
- if _, written := extsWritten[extID]; m.reorderOuterExtensionsWithoutCompressing && written {
753
- continue
754
- }
755
- if body, ok := extMap[extID]; ok {
756
- extensionsBB.addU16(extID)
757
- extensionsBB.addU16LengthPrefixed().addBytes(body)
758
- extsWritten[extID] = struct{}{}
567
+ }
568
+ // Write outer extensions, possibly in compressed form.
569
+ if m.outerExtensions != nil {
570
+ if typ == clientHelloEncodedInner && !m.reorderOuterExtensionsWithoutCompressing {
571
+ extensionsBB.AddUint16(extensionECHOuterExtensions)
572
+ extensionsBB.AddUint16LengthPrefixed(func(child *cryptobyte.Builder) {
573
+ child.AddUint8LengthPrefixed(func(list *cryptobyte.Builder) {
574
+ for _, extID := range m.outerExtensions {
575
+ list.AddUint16(extID)
576
+ extsWritten[extID] = struct{}{}
577
+ }
578
+ })
579
+ })
580
+ } else {
581
+ for _, extID := range m.outerExtensions {
582
+ // m.outerExtensions may intentionally contain duplicates to test the
583
+ // server's reaction. If m.reorderOuterExtensionsWithoutCompressing
584
+ // is set, we are targetting the second ClientHello and wish to send a
585
+ // valid first ClientHello. In that case, deduplicate so the error
586
+ // only appears later.
587
+ if _, written := extsWritten[extID]; m.reorderOuterExtensionsWithoutCompressing && written {
588
+ continue
589
+ }
590
+ if body, ok := extMap[extID]; ok {
591
+ extensionsBB.AddUint16(extID)
592
+ addUint16LengthPrefixedBytes(extensionsBB, body)
593
+ extsWritten[extID] = struct{}{}
594
+ }
759
595
  }
760
596
  }
761
597
  }
762
- }
763
-
764
- // Write each of the remaining extensions in their original order.
765
- for _, ext := range extensions {
766
- if _, written := extsWritten[ext.id]; !written {
767
- extensionsBB.addU16(ext.id)
768
- extensionsBB.addU16LengthPrefixed().addBytes(ext.body)
769
- }
770
- }
771
598
 
772
- if m.pad != 0 && hello.len()%m.pad != 0 {
773
- extensionsBB.addU16(extensionPadding)
774
- padding := extensionsBB.addU16LengthPrefixed()
775
- // Note hello.len() has changed at this point from the length
776
- // prefix.
777
- if l := hello.len() % m.pad; l != 0 {
778
- padding.addBytes(make([]byte, m.pad-l))
599
+ // Write each of the remaining extensions in their original order.
600
+ for _, ext := range extensions {
601
+ if _, written := extsWritten[ext.id]; !written {
602
+ extensionsBB.AddUint16(ext.id)
603
+ addUint16LengthPrefixedBytes(extensionsBB, ext.body)
604
+ }
779
605
  }
780
- }
781
606
 
782
- if m.omitExtensions || m.emptyExtensions {
783
- // Silently erase any extensions which were sent.
784
- hello.discardChild()
785
- if m.emptyExtensions {
786
- hello.addU16(0)
607
+ if m.pad != 0 && len(hello.BytesOrPanic())%m.pad != 0 {
608
+ extensionsBB.AddUint16(extensionPadding)
609
+ extensionsBB.AddUint16LengthPrefixed(func(padding *cryptobyte.Builder) {
610
+ // Note hello.len() has changed at this point from the length
611
+ // prefix.
612
+ if l := len(hello.BytesOrPanic()) % m.pad; l != 0 {
613
+ padding.AddBytes(make([]byte, m.pad-l))
614
+ }
615
+ })
787
616
  }
788
- }
617
+ })
789
618
  }
790
619
 
791
620
  func (m *clientHelloMsg) marshalForEncodedInner() []byte {
792
- hello := newByteBuilder()
621
+ hello := cryptobyte.NewBuilder(nil)
793
622
  m.marshalBody(hello, clientHelloEncodedInner)
794
- return hello.finish()
623
+ return hello.BytesOrPanic()
795
624
  }
796
625
 
797
626
  func (m *clientHelloMsg) marshal() []byte {
@@ -800,26 +629,27 @@ func (m *clientHelloMsg) marshal() []byte {
800
629
  }
801
630
 
802
631
  if m.isV2ClientHello {
803
- v2Msg := newByteBuilder()
804
- v2Msg.addU8(1)
805
- v2Msg.addU16(m.vers)
806
- v2Msg.addU16(uint16(len(m.cipherSuites) * 3))
807
- v2Msg.addU16(uint16(len(m.sessionID)))
808
- v2Msg.addU16(uint16(len(m.v2Challenge)))
632
+ v2Msg := cryptobyte.NewBuilder(nil)
633
+ v2Msg.AddUint8(1)
634
+ v2Msg.AddUint16(m.vers)
635
+ v2Msg.AddUint16(uint16(len(m.cipherSuites) * 3))
636
+ v2Msg.AddUint16(uint16(len(m.sessionID)))
637
+ v2Msg.AddUint16(uint16(len(m.v2Challenge)))
809
638
  for _, spec := range m.cipherSuites {
810
- v2Msg.addU24(int(spec))
639
+ v2Msg.AddUint24(uint32(spec))
811
640
  }
812
- v2Msg.addBytes(m.sessionID)
813
- v2Msg.addBytes(m.v2Challenge)
814
- m.raw = v2Msg.finish()
641
+ v2Msg.AddBytes(m.sessionID)
642
+ v2Msg.AddBytes(m.v2Challenge)
643
+ m.raw = v2Msg.BytesOrPanic()
815
644
  return m.raw
816
645
  }
817
646
 
818
- handshakeMsg := newByteBuilder()
819
- handshakeMsg.addU8(typeClientHello)
820
- hello := handshakeMsg.addU24LengthPrefixed()
821
- m.marshalBody(hello, clientHelloNormal)
822
- m.raw = handshakeMsg.finish()
647
+ handshakeMsg := cryptobyte.NewBuilder(nil)
648
+ handshakeMsg.AddUint8(typeClientHello)
649
+ handshakeMsg.AddUint24LengthPrefixed(func(hello *cryptobyte.Builder) {
650
+ m.marshalBody(hello, clientHelloNormal)
651
+ })
652
+ m.raw = handshakeMsg.BytesOrPanic()
823
653
  // Sanity-check padding.
824
654
  if m.pad != 0 && (len(m.raw)-4)%m.pad != 0 {
825
655
  panic(fmt.Sprintf("%d is not a multiple of %d", len(m.raw)-4, m.pad))
@@ -827,9 +657,9 @@ func (m *clientHelloMsg) marshal() []byte {
827
657
  return m.raw
828
658
  }
829
659
 
830
- func parseSignatureAlgorithms(reader *byteReader, out *[]signatureAlgorithm, allowEmpty bool) bool {
831
- var sigAlgs byteReader
832
- if !reader.readU16LengthPrefixed(&sigAlgs) {
660
+ func parseSignatureAlgorithms(reader *cryptobyte.String, out *[]signatureAlgorithm, allowEmpty bool) bool {
661
+ var sigAlgs cryptobyte.String
662
+ if !reader.ReadUint16LengthPrefixed(&sigAlgs) {
833
663
  return false
834
664
  }
835
665
  if !allowEmpty && len(sigAlgs) == 0 {
@@ -838,7 +668,7 @@ func parseSignatureAlgorithms(reader *byteReader, out *[]signatureAlgorithm, all
838
668
  *out = make([]signatureAlgorithm, 0, len(sigAlgs)/2)
839
669
  for len(sigAlgs) > 0 {
840
670
  var v uint16
841
- if !sigAlgs.readU16(&v) {
671
+ if !sigAlgs.ReadUint16(&v) {
842
672
  return false
843
673
  }
844
674
  if signatureAlgorithm(v) == signatureRSAPKCS1WithMD5AndSHA1 {
@@ -852,13 +682,13 @@ func parseSignatureAlgorithms(reader *byteReader, out *[]signatureAlgorithm, all
852
682
  return true
853
683
  }
854
684
 
855
- func checkDuplicateExtensions(extensions byteReader) bool {
685
+ func checkDuplicateExtensions(extensions cryptobyte.String) bool {
856
686
  seen := make(map[uint16]struct{})
857
687
  for len(extensions) > 0 {
858
688
  var extension uint16
859
- var body byteReader
860
- if !extensions.readU16(&extension) ||
861
- !extensions.readU16LengthPrefixed(&body) {
689
+ var body cryptobyte.String
690
+ if !extensions.ReadUint16(&extension) ||
691
+ !extensions.ReadUint16LengthPrefixed(&body) {
862
692
  return false
863
693
  }
864
694
  if _, ok := seen[extension]; ok {
@@ -871,26 +701,26 @@ func checkDuplicateExtensions(extensions byteReader) bool {
871
701
 
872
702
  func (m *clientHelloMsg) unmarshal(data []byte) bool {
873
703
  m.raw = data
874
- reader := byteReader(data[4:])
875
- if !reader.readU16(&m.vers) ||
876
- !reader.readBytes(&m.random, 32) ||
877
- !reader.readU8LengthPrefixedBytes(&m.sessionID) ||
704
+ reader := cryptobyte.String(data[4:])
705
+ if !reader.ReadUint16(&m.vers) ||
706
+ !reader.ReadBytes(&m.random, 32) ||
707
+ !readUint8LengthPrefixedBytes(&reader, &m.sessionID) ||
878
708
  len(m.sessionID) > 32 {
879
709
  return false
880
710
  }
881
- if m.isDTLS && !reader.readU8LengthPrefixedBytes(&m.cookie) {
711
+ if m.isDTLS && !readUint8LengthPrefixedBytes(&reader, &m.cookie) {
882
712
  return false
883
713
  }
884
- var cipherSuites byteReader
885
- if !reader.readU16LengthPrefixed(&cipherSuites) ||
886
- !reader.readU8LengthPrefixedBytes(&m.compressionMethods) {
714
+ var cipherSuites cryptobyte.String
715
+ if !reader.ReadUint16LengthPrefixed(&cipherSuites) ||
716
+ !readUint8LengthPrefixedBytes(&reader, &m.compressionMethods) {
887
717
  return false
888
718
  }
889
719
 
890
720
  m.cipherSuites = make([]uint16, 0, len(cipherSuites)/2)
891
721
  for len(cipherSuites) > 0 {
892
722
  var v uint16
893
- if !cipherSuites.readU16(&v) {
723
+ if !cipherSuites.ReadUint16(&v) {
894
724
  return false
895
725
  }
896
726
  m.cipherSuites = append(m.cipherSuites, v)
@@ -921,29 +751,29 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool {
921
751
  return true
922
752
  }
923
753
 
924
- var extensions byteReader
925
- if !reader.readU16LengthPrefixed(&extensions) || len(reader) != 0 || !checkDuplicateExtensions(extensions) {
754
+ var extensions cryptobyte.String
755
+ if !reader.ReadUint16LengthPrefixed(&extensions) || len(reader) != 0 || !checkDuplicateExtensions(extensions) {
926
756
  return false
927
757
  }
928
758
  m.rawExtensions = extensions
929
759
  for len(extensions) > 0 {
930
760
  var extension uint16
931
- var body byteReader
932
- if !extensions.readU16(&extension) ||
933
- !extensions.readU16LengthPrefixed(&body) {
761
+ var body cryptobyte.String
762
+ if !extensions.ReadUint16(&extension) ||
763
+ !extensions.ReadUint16LengthPrefixed(&body) {
934
764
  return false
935
765
  }
936
766
  switch extension {
937
767
  case extensionServerName:
938
- var names byteReader
939
- if !body.readU16LengthPrefixed(&names) || len(body) != 0 {
768
+ var names cryptobyte.String
769
+ if !body.ReadUint16LengthPrefixed(&names) || len(body) != 0 {
940
770
  return false
941
771
  }
942
772
  for len(names) > 0 {
943
773
  var nameType byte
944
774
  var name []byte
945
- if !names.readU8(&nameType) ||
946
- !names.readU16LengthPrefixedBytes(&name) {
775
+ if !names.ReadUint8(&nameType) ||
776
+ !readUint16LengthPrefixedBytes(&names, &name) {
947
777
  return false
948
778
  }
949
779
  if nameType == 0 {
@@ -952,17 +782,17 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool {
952
782
  }
953
783
  case extensionEncryptedClientHello:
954
784
  var typ byte
955
- if !body.readU8(&typ) {
785
+ if !body.ReadUint8(&typ) {
956
786
  return false
957
787
  }
958
788
  switch typ {
959
789
  case echClientTypeOuter:
960
790
  var echOuter echClientOuter
961
- if !body.readU16(&echOuter.kdfID) ||
962
- !body.readU16(&echOuter.aeadID) ||
963
- !body.readU8(&echOuter.configID) ||
964
- !body.readU16LengthPrefixedBytes(&echOuter.enc) ||
965
- !body.readU16LengthPrefixedBytes(&echOuter.payload) ||
791
+ if !body.ReadUint16(&echOuter.kdfID) ||
792
+ !body.ReadUint16(&echOuter.aeadID) ||
793
+ !body.ReadUint8(&echOuter.configID) ||
794
+ !readUint16LengthPrefixedBytes(&body, &echOuter.enc) ||
795
+ !readUint16LengthPrefixedBytes(&body, &echOuter.payload) ||
966
796
  len(echOuter.payload) == 0 ||
967
797
  len(body) > 0 {
968
798
  return false
@@ -989,11 +819,11 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool {
989
819
  // extensibility, but we expect our client to only send empty
990
820
  // requests of type OCSP.
991
821
  var statusType uint8
992
- var responderIDList, innerExtensions byteReader
993
- if !body.readU8(&statusType) ||
822
+ var responderIDList, innerExtensions cryptobyte.String
823
+ if !body.ReadUint8(&statusType) ||
994
824
  statusType != statusTypeOCSP ||
995
- !body.readU16LengthPrefixed(&responderIDList) ||
996
- !body.readU16LengthPrefixed(&innerExtensions) ||
825
+ !body.ReadUint16LengthPrefixed(&responderIDList) ||
826
+ !body.ReadUint16LengthPrefixed(&innerExtensions) ||
997
827
  len(responderIDList) != 0 ||
998
828
  len(innerExtensions) != 0 ||
999
829
  len(body) != 0 {
@@ -1002,21 +832,21 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool {
1002
832
  m.ocspStapling = true
1003
833
  case extensionSupportedCurves:
1004
834
  // http://tools.ietf.org/html/rfc4492#section-5.5.1
1005
- var curves byteReader
1006
- if !body.readU16LengthPrefixed(&curves) || len(body) != 0 {
835
+ var curves cryptobyte.String
836
+ if !body.ReadUint16LengthPrefixed(&curves) || len(body) != 0 {
1007
837
  return false
1008
838
  }
1009
839
  m.supportedCurves = make([]CurveID, 0, len(curves)/2)
1010
840
  for len(curves) > 0 {
1011
841
  var v uint16
1012
- if !curves.readU16(&v) {
842
+ if !curves.ReadUint16(&v) {
1013
843
  return false
1014
844
  }
1015
845
  m.supportedCurves = append(m.supportedCurves, CurveID(v))
1016
846
  }
1017
847
  case extensionSupportedPoints:
1018
848
  // http://tools.ietf.org/html/rfc4492#section-5.1.2
1019
- if !body.readU8LengthPrefixedBytes(&m.supportedPoints) || len(m.supportedPoints) == 0 || len(body) != 0 {
849
+ if !readUint8LengthPrefixedBytes(&body, &m.supportedPoints) || len(m.supportedPoints) == 0 || len(body) != 0 {
1020
850
  return false
1021
851
  }
1022
852
  case extensionSessionTicket:
@@ -1027,15 +857,15 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool {
1027
857
  // https://tools.ietf.org/html/rfc8446#section-4.2.8
1028
858
  m.hasKeyShares = true
1029
859
  m.keySharesRaw = body
1030
- var keyShares byteReader
1031
- if !body.readU16LengthPrefixed(&keyShares) || len(body) != 0 {
860
+ var keyShares cryptobyte.String
861
+ if !body.ReadUint16LengthPrefixed(&keyShares) || len(body) != 0 {
1032
862
  return false
1033
863
  }
1034
864
  for len(keyShares) > 0 {
1035
865
  var entry keyShareEntry
1036
866
  var group uint16
1037
- if !keyShares.readU16(&group) ||
1038
- !keyShares.readU16LengthPrefixedBytes(&entry.keyExchange) {
867
+ if !keyShares.ReadUint16(&group) ||
868
+ !readUint16LengthPrefixedBytes(&keyShares, &entry.keyExchange) {
1039
869
  return false
1040
870
  }
1041
871
  entry.group = CurveID(group)
@@ -1043,23 +873,23 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool {
1043
873
  }
1044
874
  case extensionPreSharedKey:
1045
875
  // https://tools.ietf.org/html/rfc8446#section-4.2.11
1046
- var psks, binders byteReader
1047
- if !body.readU16LengthPrefixed(&psks) ||
1048
- !body.readU16LengthPrefixed(&binders) ||
876
+ var psks, binders cryptobyte.String
877
+ if !body.ReadUint16LengthPrefixed(&psks) ||
878
+ !body.ReadUint16LengthPrefixed(&binders) ||
1049
879
  len(body) != 0 {
1050
880
  return false
1051
881
  }
1052
882
  for len(psks) > 0 {
1053
883
  var psk pskIdentity
1054
- if !psks.readU16LengthPrefixedBytes(&psk.ticket) ||
1055
- !psks.readU32(&psk.obfuscatedTicketAge) {
884
+ if !readUint16LengthPrefixedBytes(&psks, &psk.ticket) ||
885
+ !psks.ReadUint32(&psk.obfuscatedTicketAge) {
1056
886
  return false
1057
887
  }
1058
888
  m.pskIdentities = append(m.pskIdentities, psk)
1059
889
  }
1060
890
  for len(binders) > 0 {
1061
891
  var binder []byte
1062
- if !binders.readU8LengthPrefixedBytes(&binder) {
892
+ if !readUint8LengthPrefixedBytes(&binders, &binder) {
1063
893
  return false
1064
894
  }
1065
895
  m.pskBinders = append(m.pskBinders, binder)
@@ -1071,7 +901,7 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool {
1071
901
  }
1072
902
  case extensionPSKKeyExchangeModes:
1073
903
  // https://tools.ietf.org/html/rfc8446#section-4.2.9
1074
- if !body.readU8LengthPrefixedBytes(&m.pskKEModes) || len(body) != 0 {
904
+ if !readUint8LengthPrefixedBytes(&body, &m.pskKEModes) || len(body) != 0 {
1075
905
  return false
1076
906
  }
1077
907
  case extensionEarlyData:
@@ -1081,7 +911,7 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool {
1081
911
  }
1082
912
  m.hasEarlyData = true
1083
913
  case extensionCookie:
1084
- if !body.readU16LengthPrefixedBytes(&m.tls13Cookie) || len(body) != 0 {
914
+ if !readUint16LengthPrefixedBytes(&body, &m.tls13Cookie) || len(body) != 0 {
1085
915
  return false
1086
916
  }
1087
917
  case extensionSignatureAlgorithms:
@@ -1094,30 +924,30 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool {
1094
924
  return false
1095
925
  }
1096
926
  case extensionSupportedVersions:
1097
- var versions byteReader
1098
- if !body.readU8LengthPrefixed(&versions) || len(body) != 0 {
927
+ var versions cryptobyte.String
928
+ if !body.ReadUint8LengthPrefixed(&versions) || len(body) != 0 {
1099
929
  return false
1100
930
  }
1101
931
  m.supportedVersions = make([]uint16, 0, len(versions)/2)
1102
932
  for len(versions) > 0 {
1103
933
  var v uint16
1104
- if !versions.readU16(&v) {
934
+ if !versions.ReadUint16(&v) {
1105
935
  return false
1106
936
  }
1107
937
  m.supportedVersions = append(m.supportedVersions, v)
1108
938
  }
1109
939
  case extensionRenegotiationInfo:
1110
- if !body.readU8LengthPrefixedBytes(&m.secureRenegotiation) || len(body) != 0 {
940
+ if !readUint8LengthPrefixedBytes(&body, &m.secureRenegotiation) || len(body) != 0 {
1111
941
  return false
1112
942
  }
1113
943
  case extensionALPN:
1114
- var protocols byteReader
1115
- if !body.readU16LengthPrefixed(&protocols) || len(body) != 0 {
944
+ var protocols cryptobyte.String
945
+ if !body.ReadUint16LengthPrefixed(&protocols) || len(body) != 0 {
1116
946
  return false
1117
947
  }
1118
948
  for len(protocols) > 0 {
1119
949
  var protocol []byte
1120
- if !protocols.readU8LengthPrefixedBytes(&protocol) || len(protocol) == 0 {
950
+ if !readUint8LengthPrefixedBytes(&protocols, &protocol) || len(protocol) == 0 {
1121
951
  return false
1122
952
  }
1123
953
  m.alpnProtocols = append(m.alpnProtocols, string(protocol))
@@ -1137,17 +967,17 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool {
1137
967
  }
1138
968
  m.extendedMasterSecret = true
1139
969
  case extensionUseSRTP:
1140
- var profiles byteReader
970
+ var profiles cryptobyte.String
1141
971
  var mki []byte
1142
- if !body.readU16LengthPrefixed(&profiles) ||
1143
- !body.readU8LengthPrefixedBytes(&mki) ||
972
+ if !body.ReadUint16LengthPrefixed(&profiles) ||
973
+ !readUint8LengthPrefixedBytes(&body, &mki) ||
1144
974
  len(body) != 0 {
1145
975
  return false
1146
976
  }
1147
977
  m.srtpProtectionProfiles = make([]uint16, 0, len(profiles)/2)
1148
978
  for len(profiles) > 0 {
1149
979
  var v uint16
1150
- if !profiles.readU16(&v) {
980
+ if !profiles.ReadUint16(&v) {
1151
981
  return false
1152
982
  }
1153
983
  m.srtpProtectionProfiles = append(m.srtpProtectionProfiles, v)
@@ -1161,15 +991,15 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool {
1161
991
  case extensionCustom:
1162
992
  m.customExtension = string(body)
1163
993
  case extensionCompressedCertAlgs:
1164
- var algIDs byteReader
1165
- if !body.readU8LengthPrefixed(&algIDs) {
994
+ var algIDs cryptobyte.String
995
+ if !body.ReadUint8LengthPrefixed(&algIDs) {
1166
996
  return false
1167
997
  }
1168
998
 
1169
999
  seen := make(map[uint16]struct{})
1170
1000
  for len(algIDs) > 0 {
1171
1001
  var algID uint16
1172
- if !algIDs.readU16(&algID) {
1002
+ if !algIDs.ReadUint16(&algID) {
1173
1003
  return false
1174
1004
  }
1175
1005
  if _, ok := seen[algID]; ok {
@@ -1191,13 +1021,13 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool {
1191
1021
  }
1192
1022
  m.delegatedCredentials = true
1193
1023
  case extensionApplicationSettings:
1194
- var protocols byteReader
1195
- if !body.readU16LengthPrefixed(&protocols) || len(body) != 0 {
1024
+ var protocols cryptobyte.String
1025
+ if !body.ReadUint16LengthPrefixed(&protocols) || len(body) != 0 {
1196
1026
  return false
1197
1027
  }
1198
1028
  for len(protocols) > 0 {
1199
1029
  var protocol []byte
1200
- if !protocols.readU8LengthPrefixedBytes(&protocol) || len(protocol) == 0 {
1030
+ if !readUint8LengthPrefixedBytes(&protocols, &protocol) || len(protocol) == 0 {
1201
1031
  return false
1202
1032
  }
1203
1033
  m.alpsProtocols = append(m.alpsProtocols, string(protocol))
@@ -1213,15 +1043,15 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool {
1213
1043
  }
1214
1044
 
1215
1045
  func decodeClientHelloInner(config *Config, encoded []byte, helloOuter *clientHelloMsg) (*clientHelloMsg, error) {
1216
- reader := byteReader(encoded)
1046
+ reader := cryptobyte.String(encoded)
1217
1047
  var versAndRandom, sessionID, cipherSuites, compressionMethods []byte
1218
- var extensions byteReader
1219
- if !reader.readBytes(&versAndRandom, 2+32) ||
1220
- !reader.readU8LengthPrefixedBytes(&sessionID) ||
1048
+ var extensions cryptobyte.String
1049
+ if !reader.ReadBytes(&versAndRandom, 2+32) ||
1050
+ !readUint8LengthPrefixedBytes(&reader, &sessionID) ||
1221
1051
  len(sessionID) != 0 || // Copied from |helloOuter|
1222
- !reader.readU16LengthPrefixedBytes(&cipherSuites) ||
1223
- !reader.readU8LengthPrefixedBytes(&compressionMethods) ||
1224
- !reader.readU16LengthPrefixed(&extensions) {
1052
+ !readUint16LengthPrefixedBytes(&reader, &cipherSuites) ||
1053
+ !readUint8LengthPrefixedBytes(&reader, &compressionMethods) ||
1054
+ !reader.ReadUint16LengthPrefixed(&extensions) {
1225
1055
  return nil, errors.New("tls: error parsing EncodedClientHelloInner")
1226
1056
  }
1227
1057
 
@@ -1232,64 +1062,77 @@ func decodeClientHelloInner(config *Config, encoded []byte, helloOuter *clientHe
1232
1062
  }
1233
1063
  }
1234
1064
 
1235
- builder := newByteBuilder()
1236
- builder.addU8(typeClientHello)
1237
- body := builder.addU24LengthPrefixed()
1238
- body.addBytes(versAndRandom)
1239
- body.addU8LengthPrefixed().addBytes(helloOuter.sessionID)
1240
- body.addU16LengthPrefixed().addBytes(cipherSuites)
1241
- body.addU8LengthPrefixed().addBytes(compressionMethods)
1242
- newExtensions := body.addU16LengthPrefixed()
1243
-
1244
- var seenOuterExtensions bool
1245
- outerExtensions := byteReader(helloOuter.rawExtensions)
1246
1065
  copied := make(map[uint16]struct{})
1247
- for len(extensions) > 0 {
1248
- var extType uint16
1249
- var extBody byteReader
1250
- if !extensions.readU16(&extType) ||
1251
- !extensions.readU16LengthPrefixed(&extBody) {
1252
- return nil, errors.New("tls: error parsing EncodedClientHelloInner")
1253
- }
1254
- if extType != extensionECHOuterExtensions {
1255
- newExtensions.addU16(extType)
1256
- newExtensions.addU16LengthPrefixed().addBytes(extBody)
1257
- continue
1258
- }
1259
- if seenOuterExtensions {
1260
- return nil, errors.New("tls: duplicate ech_outer_extensions extension")
1261
- }
1262
- seenOuterExtensions = true
1263
- var extList byteReader
1264
- if !extBody.readU8LengthPrefixed(&extList) || len(extList) == 0 || len(extBody) != 0 {
1265
- return nil, errors.New("tls: error parsing ech_outer_extensions")
1266
- }
1267
- for len(extList) != 0 {
1268
- var newExtType uint16
1269
- if !extList.readU16(&newExtType) {
1270
- return nil, errors.New("tls: error parsing ech_outer_extensions")
1271
- }
1272
- if newExtType == extensionEncryptedClientHello {
1273
- return nil, errors.New("tls: error parsing ech_outer_extensions")
1274
- }
1275
- for {
1276
- if len(outerExtensions) == 0 {
1277
- return nil, fmt.Errorf("tls: extension %d not found in ClientHelloOuter", newExtType)
1066
+ builder := cryptobyte.NewBuilder(nil)
1067
+ builder.AddUint8(typeClientHello)
1068
+ builder.AddUint24LengthPrefixed(func(body *cryptobyte.Builder) {
1069
+ body.AddBytes(versAndRandom)
1070
+ addUint8LengthPrefixedBytes(body, helloOuter.sessionID)
1071
+ addUint16LengthPrefixedBytes(body, cipherSuites)
1072
+ addUint8LengthPrefixedBytes(body, compressionMethods)
1073
+ body.AddUint16LengthPrefixed(func(newExtensions *cryptobyte.Builder) {
1074
+ var seenOuterExtensions bool
1075
+ outerExtensions := cryptobyte.String(helloOuter.rawExtensions)
1076
+ for len(extensions) > 0 {
1077
+ var extType uint16
1078
+ var extBody cryptobyte.String
1079
+ if !extensions.ReadUint16(&extType) ||
1080
+ !extensions.ReadUint16LengthPrefixed(&extBody) {
1081
+ newExtensions.SetError(errors.New("tls: error parsing EncodedClientHelloInner"))
1082
+ return
1083
+ }
1084
+ if extType != extensionECHOuterExtensions {
1085
+ newExtensions.AddUint16(extType)
1086
+ addUint16LengthPrefixedBytes(newExtensions, extBody)
1087
+ continue
1278
1088
  }
1279
- var foundExt uint16
1280
- var newExtBody []byte
1281
- if !outerExtensions.readU16(&foundExt) ||
1282
- !outerExtensions.readU16LengthPrefixedBytes(&newExtBody) {
1283
- return nil, errors.New("tls: error parsing ClientHelloOuter")
1089
+ if seenOuterExtensions {
1090
+ newExtensions.SetError(errors.New("tls: duplicate ech_outer_extensions extension"))
1091
+ return
1284
1092
  }
1285
- if foundExt == newExtType {
1286
- newExtensions.addU16(newExtType)
1287
- newExtensions.addU16LengthPrefixed().addBytes(newExtBody)
1288
- copied[newExtType] = struct{}{}
1289
- break
1093
+ seenOuterExtensions = true
1094
+ var extList cryptobyte.String
1095
+ if !extBody.ReadUint8LengthPrefixed(&extList) || len(extList) == 0 || len(extBody) != 0 {
1096
+ newExtensions.SetError(errors.New("tls: error parsing ech_outer_extensions"))
1097
+ return
1098
+ }
1099
+ for len(extList) != 0 {
1100
+ var newExtType uint16
1101
+ if !extList.ReadUint16(&newExtType) {
1102
+ newExtensions.SetError(errors.New("tls: error parsing ech_outer_extensions"))
1103
+ return
1104
+ }
1105
+ if newExtType == extensionEncryptedClientHello {
1106
+ newExtensions.SetError(errors.New("tls: error parsing ech_outer_extensions"))
1107
+ return
1108
+ }
1109
+ for {
1110
+ if len(outerExtensions) == 0 {
1111
+ newExtensions.SetError(fmt.Errorf("tls: extension %d not found in ClientHelloOuter", newExtType))
1112
+ return
1113
+ }
1114
+ var foundExt uint16
1115
+ var newExtBody []byte
1116
+ if !outerExtensions.ReadUint16(&foundExt) ||
1117
+ !readUint16LengthPrefixedBytes(&outerExtensions, &newExtBody) {
1118
+ newExtensions.SetError(errors.New("tls: error parsing ClientHelloOuter"))
1119
+ return
1120
+ }
1121
+ if foundExt == newExtType {
1122
+ newExtensions.AddUint16(newExtType)
1123
+ addUint16LengthPrefixedBytes(newExtensions, newExtBody)
1124
+ copied[newExtType] = struct{}{}
1125
+ break
1126
+ }
1127
+ }
1290
1128
  }
1291
1129
  }
1292
- }
1130
+ })
1131
+ })
1132
+
1133
+ bytes, err := builder.Bytes()
1134
+ if err != nil {
1135
+ return nil, err
1293
1136
  }
1294
1137
 
1295
1138
  for _, expected := range config.Bugs.ExpectECHOuterExtensions {
@@ -1304,9 +1147,10 @@ func decodeClientHelloInner(config *Config, encoded []byte, helloOuter *clientHe
1304
1147
  }
1305
1148
 
1306
1149
  ret := new(clientHelloMsg)
1307
- if !ret.unmarshal(builder.finish()) {
1150
+ if !ret.unmarshal(bytes) {
1308
1151
  return nil, errors.New("tls: error parsing reconstructed ClientHello")
1309
1152
  }
1153
+
1310
1154
  return ret, nil
1311
1155
  }
1312
1156
 
@@ -1337,102 +1181,100 @@ func (m *serverHelloMsg) marshal() []byte {
1337
1181
  return m.raw
1338
1182
  }
1339
1183
 
1340
- handshakeMsg := newByteBuilder()
1341
- handshakeMsg.addU8(typeServerHello)
1342
- hello := handshakeMsg.addU24LengthPrefixed()
1343
-
1344
- // m.vers is used both to determine the format of the rest of the
1345
- // ServerHello and to override the value, so include a second version
1346
- // field.
1347
- vers, ok := wireToVersion(m.vers, m.isDTLS)
1348
- if !ok {
1349
- panic("unknown version")
1350
- }
1351
- if m.versOverride != 0 {
1352
- hello.addU16(m.versOverride)
1353
- } else if vers >= VersionTLS13 {
1354
- hello.addU16(VersionTLS12)
1355
- } else {
1356
- hello.addU16(m.vers)
1357
- }
1358
-
1359
- hello.addBytes(m.random)
1360
- sessionID := hello.addU8LengthPrefixed()
1361
- sessionID.addBytes(m.sessionID)
1362
- hello.addU16(m.cipherSuite)
1363
- hello.addU8(m.compressionMethod)
1364
-
1365
- extensions := hello.addU16LengthPrefixed()
1366
-
1367
- if vers >= VersionTLS13 {
1368
- if m.hasKeyShare {
1369
- extensions.addU16(extensionKeyShare)
1370
- keyShare := extensions.addU16LengthPrefixed()
1371
- keyShare.addU16(uint16(m.keyShare.group))
1372
- keyExchange := keyShare.addU16LengthPrefixed()
1373
- keyExchange.addBytes(m.keyShare.keyExchange)
1374
- }
1375
- if m.hasPSKIdentity {
1376
- extensions.addU16(extensionPreSharedKey)
1377
- extensions.addU16(2) // Length
1378
- extensions.addU16(m.pskIdentity)
1379
- }
1380
- if !m.omitSupportedVers {
1381
- extensions.addU16(extensionSupportedVersions)
1382
- extensions.addU16(2) // Length
1383
- if m.supportedVersOverride != 0 {
1384
- extensions.addU16(m.supportedVersOverride)
1184
+ handshakeMsg := cryptobyte.NewBuilder(nil)
1185
+ handshakeMsg.AddUint8(typeServerHello)
1186
+ handshakeMsg.AddUint24LengthPrefixed(func(hello *cryptobyte.Builder) {
1187
+ // m.vers is used both to determine the format of the rest of the
1188
+ // ServerHello and to override the value, so include a second version
1189
+ // field.
1190
+ vers, ok := wireToVersion(m.vers, m.isDTLS)
1191
+ if !ok {
1192
+ panic("unknown version")
1193
+ }
1194
+ if m.versOverride != 0 {
1195
+ hello.AddUint16(m.versOverride)
1196
+ } else if vers >= VersionTLS13 {
1197
+ hello.AddUint16(VersionTLS12)
1198
+ } else {
1199
+ hello.AddUint16(m.vers)
1200
+ }
1201
+
1202
+ hello.AddBytes(m.random)
1203
+ addUint8LengthPrefixedBytes(hello, m.sessionID)
1204
+ hello.AddUint16(m.cipherSuite)
1205
+ hello.AddUint8(m.compressionMethod)
1206
+
1207
+ hello.AddUint16LengthPrefixed(func(extensions *cryptobyte.Builder) {
1208
+ if vers >= VersionTLS13 {
1209
+ if m.hasKeyShare {
1210
+ extensions.AddUint16(extensionKeyShare)
1211
+ extensions.AddUint16LengthPrefixed(func(keyShare *cryptobyte.Builder) {
1212
+ keyShare.AddUint16(uint16(m.keyShare.group))
1213
+ addUint16LengthPrefixedBytes(keyShare, m.keyShare.keyExchange)
1214
+ })
1215
+ }
1216
+ if m.hasPSKIdentity {
1217
+ extensions.AddUint16(extensionPreSharedKey)
1218
+ extensions.AddUint16(2) // Length
1219
+ extensions.AddUint16(m.pskIdentity)
1220
+ }
1221
+ if !m.omitSupportedVers {
1222
+ extensions.AddUint16(extensionSupportedVersions)
1223
+ extensions.AddUint16(2) // Length
1224
+ if m.supportedVersOverride != 0 {
1225
+ extensions.AddUint16(m.supportedVersOverride)
1226
+ } else {
1227
+ extensions.AddUint16(m.vers)
1228
+ }
1229
+ }
1230
+ if len(m.customExtension) > 0 {
1231
+ extensions.AddUint16(extensionCustom)
1232
+ addUint16LengthPrefixedBytes(extensions, []byte(m.customExtension))
1233
+ }
1234
+ if len(m.unencryptedALPN) > 0 {
1235
+ extensions.AddUint16(extensionALPN)
1236
+ extensions.AddUint16LengthPrefixed(func(extension *cryptobyte.Builder) {
1237
+ extension.AddUint16LengthPrefixed(func(protocolNameList *cryptobyte.Builder) {
1238
+ addUint8LengthPrefixedBytes(protocolNameList, []byte(m.unencryptedALPN))
1239
+ })
1240
+ })
1241
+ }
1385
1242
  } else {
1386
- extensions.addU16(m.vers)
1387
- }
1388
- }
1389
- if len(m.customExtension) > 0 {
1390
- extensions.addU16(extensionCustom)
1391
- customExt := extensions.addU16LengthPrefixed()
1392
- customExt.addBytes([]byte(m.customExtension))
1393
- }
1394
- if len(m.unencryptedALPN) > 0 {
1395
- extensions.addU16(extensionALPN)
1396
- extension := extensions.addU16LengthPrefixed()
1397
-
1398
- protocolNameList := extension.addU16LengthPrefixed()
1399
- protocolName := protocolNameList.addU8LengthPrefixed()
1400
- protocolName.addBytes([]byte(m.unencryptedALPN))
1401
- }
1402
- } else {
1403
- m.extensions.marshal(extensions)
1404
- if m.omitExtensions || m.emptyExtensions {
1405
- // Silently erasing server extensions will break the handshake. Instead,
1406
- // assert that tests which use this field also disable all features which
1407
- // would write an extension.
1408
- if extensions.len() != 0 {
1409
- panic(fmt.Sprintf("ServerHello unexpectedly contained extensions: %x, %+v", extensions.data(), m))
1410
- }
1411
- hello.discardChild()
1412
- if m.emptyExtensions {
1413
- hello.addU16(0)
1243
+ m.extensions.marshal(extensions)
1244
+ }
1245
+ if m.omitExtensions || m.emptyExtensions {
1246
+ // Silently erasing server extensions will break the handshake. Instead,
1247
+ // assert that tests which use this field also disable all features which
1248
+ // would write an extension. Note the length includes the length prefix.
1249
+ if b := extensions.BytesOrPanic(); len(b) != 2 {
1250
+ panic(fmt.Sprintf("ServerHello unexpectedly contained extensions: %x, %+v", b, m))
1251
+ }
1414
1252
  }
1253
+ })
1254
+ // Remove the length prefix.
1255
+ if m.omitExtensions {
1256
+ hello.Unwrite(2)
1415
1257
  }
1416
- }
1258
+ })
1417
1259
 
1418
- m.raw = handshakeMsg.finish()
1260
+ m.raw = handshakeMsg.BytesOrPanic()
1419
1261
  return m.raw
1420
1262
  }
1421
1263
 
1422
1264
  func (m *serverHelloMsg) unmarshal(data []byte) bool {
1423
1265
  m.raw = data
1424
- reader := byteReader(data[4:])
1425
- if !reader.readU16(&m.vers) ||
1426
- !reader.readBytes(&m.random, 32) {
1266
+ reader := cryptobyte.String(data[4:])
1267
+ if !reader.ReadUint16(&m.vers) ||
1268
+ !reader.ReadBytes(&m.random, 32) {
1427
1269
  return false
1428
1270
  }
1429
1271
  vers, ok := wireToVersion(m.vers, m.isDTLS)
1430
1272
  if !ok {
1431
1273
  return false
1432
1274
  }
1433
- if !reader.readU8LengthPrefixedBytes(&m.sessionID) ||
1434
- !reader.readU16(&m.cipherSuite) ||
1435
- !reader.readU8(&m.compressionMethod) {
1275
+ if !readUint8LengthPrefixedBytes(&reader, &m.sessionID) ||
1276
+ !reader.ReadUint16(&m.cipherSuite) ||
1277
+ !reader.ReadUint8(&m.compressionMethod) {
1436
1278
  return false
1437
1279
  }
1438
1280
 
@@ -1443,8 +1285,8 @@ func (m *serverHelloMsg) unmarshal(data []byte) bool {
1443
1285
  return true
1444
1286
  }
1445
1287
 
1446
- var extensions byteReader
1447
- if !reader.readU16LengthPrefixed(&extensions) || len(reader) != 0 || !checkDuplicateExtensions(extensions) {
1288
+ var extensions cryptobyte.String
1289
+ if !reader.ReadUint16LengthPrefixed(&extensions) || len(reader) != 0 || !checkDuplicateExtensions(extensions) {
1448
1290
  return false
1449
1291
  }
1450
1292
 
@@ -1453,13 +1295,13 @@ func (m *serverHelloMsg) unmarshal(data []byte) bool {
1453
1295
  extensionsCopy := extensions
1454
1296
  for len(extensionsCopy) > 0 {
1455
1297
  var extension uint16
1456
- var body byteReader
1457
- if !extensionsCopy.readU16(&extension) ||
1458
- !extensionsCopy.readU16LengthPrefixed(&body) {
1298
+ var body cryptobyte.String
1299
+ if !extensionsCopy.ReadUint16(&extension) ||
1300
+ !extensionsCopy.ReadUint16LengthPrefixed(&body) {
1459
1301
  return false
1460
1302
  }
1461
1303
  if extension == extensionSupportedVersions {
1462
- if !body.readU16(&m.vers) || len(body) != 0 {
1304
+ if !body.ReadUint16(&m.vers) || len(body) != 0 {
1463
1305
  return false
1464
1306
  }
1465
1307
  vers, ok = wireToVersion(m.vers, m.isDTLS)
@@ -1473,23 +1315,23 @@ func (m *serverHelloMsg) unmarshal(data []byte) bool {
1473
1315
  if vers >= VersionTLS13 {
1474
1316
  for len(extensions) > 0 {
1475
1317
  var extension uint16
1476
- var body byteReader
1477
- if !extensions.readU16(&extension) ||
1478
- !extensions.readU16LengthPrefixed(&body) {
1318
+ var body cryptobyte.String
1319
+ if !extensions.ReadUint16(&extension) ||
1320
+ !extensions.ReadUint16LengthPrefixed(&body) {
1479
1321
  return false
1480
1322
  }
1481
1323
  switch extension {
1482
1324
  case extensionKeyShare:
1483
1325
  m.hasKeyShare = true
1484
1326
  var group uint16
1485
- if !body.readU16(&group) ||
1486
- !body.readU16LengthPrefixedBytes(&m.keyShare.keyExchange) ||
1327
+ if !body.ReadUint16(&group) ||
1328
+ !readUint16LengthPrefixedBytes(&body, &m.keyShare.keyExchange) ||
1487
1329
  len(body) != 0 {
1488
1330
  return false
1489
1331
  }
1490
1332
  m.keyShare.group = CurveID(group)
1491
1333
  case extensionPreSharedKey:
1492
- if !body.readU16(&m.pskIdentity) || len(body) != 0 {
1334
+ if !body.ReadUint16(&m.pskIdentity) || len(body) != 0 {
1493
1335
  return false
1494
1336
  }
1495
1337
  m.hasPSKIdentity = true
@@ -1519,23 +1361,25 @@ func (m *encryptedExtensionsMsg) marshal() []byte {
1519
1361
  return m.raw
1520
1362
  }
1521
1363
 
1522
- encryptedExtensionsMsg := newByteBuilder()
1523
- encryptedExtensionsMsg.addU8(typeEncryptedExtensions)
1524
- encryptedExtensions := encryptedExtensionsMsg.addU24LengthPrefixed()
1525
- if !m.empty {
1526
- extensions := encryptedExtensions.addU16LengthPrefixed()
1527
- m.extensions.marshal(extensions)
1528
- }
1364
+ encryptedExtensionsMsg := cryptobyte.NewBuilder(nil)
1365
+ encryptedExtensionsMsg.AddUint8(typeEncryptedExtensions)
1366
+ encryptedExtensionsMsg.AddUint24LengthPrefixed(func(encryptedExtensions *cryptobyte.Builder) {
1367
+ if !m.empty {
1368
+ encryptedExtensions.AddUint16LengthPrefixed(func(extensions *cryptobyte.Builder) {
1369
+ m.extensions.marshal(extensions)
1370
+ })
1371
+ }
1372
+ })
1529
1373
 
1530
- m.raw = encryptedExtensionsMsg.finish()
1374
+ m.raw = encryptedExtensionsMsg.BytesOrPanic()
1531
1375
  return m.raw
1532
1376
  }
1533
1377
 
1534
1378
  func (m *encryptedExtensionsMsg) unmarshal(data []byte) bool {
1535
1379
  m.raw = data
1536
- reader := byteReader(data[4:])
1537
- var extensions byteReader
1538
- if !reader.readU16LengthPrefixed(&extensions) || len(reader) != 0 {
1380
+ reader := cryptobyte.String(data[4:])
1381
+ var extensions cryptobyte.String
1382
+ if !reader.ReadUint16LengthPrefixed(&extensions) || len(reader) != 0 {
1539
1383
  return false
1540
1384
  }
1541
1385
  return m.extensions.unmarshal(extensions, VersionTLS13)
@@ -1571,147 +1415,137 @@ type serverExtensions struct {
1571
1415
  echRetryConfigs []byte
1572
1416
  }
1573
1417
 
1574
- func (m *serverExtensions) marshal(extensions *byteBuilder) {
1418
+ func (m *serverExtensions) marshal(extensions *cryptobyte.Builder) {
1575
1419
  if m.duplicateExtension {
1576
1420
  // Add a duplicate bogus extension at the beginning and end.
1577
- extensions.addU16(extensionDuplicate)
1578
- extensions.addU16(0) // length = 0 for empty extension
1421
+ extensions.AddUint16(extensionDuplicate)
1422
+ extensions.AddUint16(0) // length = 0 for empty extension
1579
1423
  }
1580
1424
  if m.nextProtoNeg && !m.npnAfterAlpn {
1581
- extensions.addU16(extensionNextProtoNeg)
1582
- extension := extensions.addU16LengthPrefixed()
1583
-
1584
- for _, v := range m.nextProtos {
1585
- if len(v) > 255 {
1586
- v = v[:255]
1425
+ extensions.AddUint16(extensionNextProtoNeg)
1426
+ extensions.AddUint16LengthPrefixed(func(extension *cryptobyte.Builder) {
1427
+ for _, v := range m.nextProtos {
1428
+ addUint8LengthPrefixedBytes(extension, []byte(v))
1587
1429
  }
1588
- npn := extension.addU8LengthPrefixed()
1589
- npn.addBytes([]byte(v))
1590
- }
1430
+ })
1591
1431
  }
1592
1432
  if m.ocspStapling {
1593
- extensions.addU16(extensionStatusRequest)
1594
- extensions.addU16(0)
1433
+ extensions.AddUint16(extensionStatusRequest)
1434
+ extensions.AddUint16(0)
1595
1435
  }
1596
1436
  if m.ticketSupported {
1597
- extensions.addU16(extensionSessionTicket)
1598
- extensions.addU16(0)
1437
+ extensions.AddUint16(extensionSessionTicket)
1438
+ extensions.AddUint16(0)
1599
1439
  }
1600
1440
  if m.secureRenegotiation != nil {
1601
- extensions.addU16(extensionRenegotiationInfo)
1602
- extension := extensions.addU16LengthPrefixed()
1603
- secureRenego := extension.addU8LengthPrefixed()
1604
- secureRenego.addBytes(m.secureRenegotiation)
1441
+ extensions.AddUint16(extensionRenegotiationInfo)
1442
+ extensions.AddUint16LengthPrefixed(func(extension *cryptobyte.Builder) {
1443
+ addUint8LengthPrefixedBytes(extension, m.secureRenegotiation)
1444
+ })
1605
1445
  }
1606
1446
  if len(m.alpnProtocol) > 0 || m.alpnProtocolEmpty {
1607
- extensions.addU16(extensionALPN)
1608
- extension := extensions.addU16LengthPrefixed()
1609
-
1610
- protocolNameList := extension.addU16LengthPrefixed()
1611
- protocolName := protocolNameList.addU8LengthPrefixed()
1612
- protocolName.addBytes([]byte(m.alpnProtocol))
1447
+ extensions.AddUint16(extensionALPN)
1448
+ extensions.AddUint16LengthPrefixed(func(extension *cryptobyte.Builder) {
1449
+ extension.AddUint16LengthPrefixed(func(protocolNameList *cryptobyte.Builder) {
1450
+ addUint8LengthPrefixedBytes(protocolNameList, []byte(m.alpnProtocol))
1451
+ })
1452
+ })
1613
1453
  }
1614
1454
  if m.channelIDRequested {
1615
- extensions.addU16(extensionChannelID)
1616
- extensions.addU16(0)
1455
+ extensions.AddUint16(extensionChannelID)
1456
+ extensions.AddUint16(0)
1617
1457
  }
1618
1458
  if m.duplicateExtension {
1619
1459
  // Add a duplicate bogus extension at the beginning and end.
1620
- extensions.addU16(extensionDuplicate)
1621
- extensions.addU16(0)
1460
+ extensions.AddUint16(extensionDuplicate)
1461
+ extensions.AddUint16(0)
1622
1462
  }
1623
1463
  if m.extendedMasterSecret {
1624
- extensions.addU16(extensionExtendedMasterSecret)
1625
- extensions.addU16(0)
1464
+ extensions.AddUint16(extensionExtendedMasterSecret)
1465
+ extensions.AddUint16(0)
1626
1466
  }
1627
1467
  if m.srtpProtectionProfile != 0 {
1628
- extensions.addU16(extensionUseSRTP)
1629
- extension := extensions.addU16LengthPrefixed()
1630
-
1631
- srtpProtectionProfiles := extension.addU16LengthPrefixed()
1632
- srtpProtectionProfiles.addU16(m.srtpProtectionProfile)
1633
- srtpMki := extension.addU8LengthPrefixed()
1634
- srtpMki.addBytes([]byte(m.srtpMasterKeyIdentifier))
1468
+ extensions.AddUint16(extensionUseSRTP)
1469
+ extensions.AddUint16LengthPrefixed(func(extension *cryptobyte.Builder) {
1470
+ extension.AddUint16LengthPrefixed(func(srtpProtectionProfiles *cryptobyte.Builder) {
1471
+ srtpProtectionProfiles.AddUint16(m.srtpProtectionProfile)
1472
+ })
1473
+ addUint8LengthPrefixedBytes(extension, []byte(m.srtpMasterKeyIdentifier))
1474
+ })
1635
1475
  }
1636
1476
  if m.sctList != nil {
1637
- extensions.addU16(extensionSignedCertificateTimestamp)
1638
- extension := extensions.addU16LengthPrefixed()
1639
- extension.addBytes(m.sctList)
1477
+ extensions.AddUint16(extensionSignedCertificateTimestamp)
1478
+ addUint16LengthPrefixedBytes(extensions, m.sctList)
1640
1479
  }
1641
1480
  if l := len(m.customExtension); l > 0 {
1642
- extensions.addU16(extensionCustom)
1643
- customExt := extensions.addU16LengthPrefixed()
1644
- customExt.addBytes([]byte(m.customExtension))
1481
+ extensions.AddUint16(extensionCustom)
1482
+ addUint16LengthPrefixedBytes(extensions, []byte(m.customExtension))
1645
1483
  }
1646
1484
  if m.nextProtoNeg && m.npnAfterAlpn {
1647
- extensions.addU16(extensionNextProtoNeg)
1648
- extension := extensions.addU16LengthPrefixed()
1649
-
1650
- for _, v := range m.nextProtos {
1651
- if len(v) > 255 {
1652
- v = v[0:255]
1485
+ extensions.AddUint16(extensionNextProtoNeg)
1486
+ extensions.AddUint16LengthPrefixed(func(extension *cryptobyte.Builder) {
1487
+ for _, v := range m.nextProtos {
1488
+ addUint8LengthPrefixedBytes(extension, []byte(v))
1653
1489
  }
1654
- npn := extension.addU8LengthPrefixed()
1655
- npn.addBytes([]byte(v))
1656
- }
1490
+ })
1657
1491
  }
1658
1492
  if m.hasKeyShare {
1659
- extensions.addU16(extensionKeyShare)
1660
- keyShare := extensions.addU16LengthPrefixed()
1661
- keyShare.addU16(uint16(m.keyShare.group))
1662
- keyExchange := keyShare.addU16LengthPrefixed()
1663
- keyExchange.addBytes(m.keyShare.keyExchange)
1493
+ extensions.AddUint16(extensionKeyShare)
1494
+ extensions.AddUint16LengthPrefixed(func(keyShare *cryptobyte.Builder) {
1495
+ keyShare.AddUint16(uint16(m.keyShare.group))
1496
+ addUint16LengthPrefixedBytes(keyShare, m.keyShare.keyExchange)
1497
+ })
1664
1498
  }
1665
1499
  if m.supportedVersion != 0 {
1666
- extensions.addU16(extensionSupportedVersions)
1667
- extensions.addU16(2) // Length
1668
- extensions.addU16(m.supportedVersion)
1500
+ extensions.AddUint16(extensionSupportedVersions)
1501
+ extensions.AddUint16(2) // Length
1502
+ extensions.AddUint16(m.supportedVersion)
1669
1503
  }
1670
1504
  if len(m.supportedPoints) > 0 {
1671
1505
  // http://tools.ietf.org/html/rfc4492#section-5.1.2
1672
- extensions.addU16(extensionSupportedPoints)
1673
- supportedPointsList := extensions.addU16LengthPrefixed()
1674
- supportedPoints := supportedPointsList.addU8LengthPrefixed()
1675
- supportedPoints.addBytes(m.supportedPoints)
1506
+ extensions.AddUint16(extensionSupportedPoints)
1507
+ extensions.AddUint16LengthPrefixed(func(supportedPointsList *cryptobyte.Builder) {
1508
+ addUint8LengthPrefixedBytes(supportedPointsList, m.supportedPoints)
1509
+ })
1676
1510
  }
1677
1511
  if len(m.supportedCurves) > 0 {
1678
1512
  // https://tools.ietf.org/html/rfc8446#section-4.2.7
1679
- extensions.addU16(extensionSupportedCurves)
1680
- supportedCurvesList := extensions.addU16LengthPrefixed()
1681
- supportedCurves := supportedCurvesList.addU16LengthPrefixed()
1682
- for _, curve := range m.supportedCurves {
1683
- supportedCurves.addU16(uint16(curve))
1684
- }
1513
+ extensions.AddUint16(extensionSupportedCurves)
1514
+ extensions.AddUint16LengthPrefixed(func(supportedCurvesList *cryptobyte.Builder) {
1515
+ supportedCurvesList.AddUint16LengthPrefixed(func(supportedCurves *cryptobyte.Builder) {
1516
+ for _, curve := range m.supportedCurves {
1517
+ supportedCurves.AddUint16(uint16(curve))
1518
+ }
1519
+ })
1520
+ })
1685
1521
  }
1686
1522
  if len(m.quicTransportParams) > 0 {
1687
- extensions.addU16(extensionQUICTransportParams)
1688
- params := extensions.addU16LengthPrefixed()
1689
- params.addBytes(m.quicTransportParams)
1523
+ extensions.AddUint16(extensionQUICTransportParams)
1524
+ addUint16LengthPrefixedBytes(extensions, m.quicTransportParams)
1690
1525
  }
1691
1526
  if len(m.quicTransportParamsLegacy) > 0 {
1692
- extensions.addU16(extensionQUICTransportParamsLegacy)
1693
- params := extensions.addU16LengthPrefixed()
1694
- params.addBytes(m.quicTransportParamsLegacy)
1527
+ extensions.AddUint16(extensionQUICTransportParamsLegacy)
1528
+ addUint16LengthPrefixedBytes(extensions, m.quicTransportParamsLegacy)
1695
1529
  }
1696
1530
  if m.hasEarlyData {
1697
- extensions.addU16(extensionEarlyData)
1698
- extensions.addBytes([]byte{0, 0})
1531
+ extensions.AddUint16(extensionEarlyData)
1532
+ extensions.AddBytes([]byte{0, 0})
1699
1533
  }
1700
1534
  if m.serverNameAck {
1701
- extensions.addU16(extensionServerName)
1702
- extensions.addU16(0) // zero length
1535
+ extensions.AddUint16(extensionServerName)
1536
+ extensions.AddUint16(0) // zero length
1703
1537
  }
1704
1538
  if m.hasApplicationSettings {
1705
- extensions.addU16(extensionApplicationSettings)
1706
- extensions.addU16LengthPrefixed().addBytes(m.applicationSettings)
1539
+ extensions.AddUint16(extensionApplicationSettings)
1540
+ addUint16LengthPrefixedBytes(extensions, m.applicationSettings)
1707
1541
  }
1708
1542
  if len(m.echRetryConfigs) > 0 {
1709
- extensions.addU16(extensionEncryptedClientHello)
1710
- extensions.addU16LengthPrefixed().addBytes(m.echRetryConfigs)
1543
+ extensions.AddUint16(extensionEncryptedClientHello)
1544
+ addUint16LengthPrefixedBytes(extensions, m.echRetryConfigs)
1711
1545
  }
1712
1546
  }
1713
1547
 
1714
- func (m *serverExtensions) unmarshal(data byteReader, version uint16) bool {
1548
+ func (m *serverExtensions) unmarshal(data cryptobyte.String, version uint16) bool {
1715
1549
  // Reset all fields.
1716
1550
  *m = serverExtensions{}
1717
1551
 
@@ -1721,9 +1555,9 @@ func (m *serverExtensions) unmarshal(data byteReader, version uint16) bool {
1721
1555
 
1722
1556
  for len(data) > 0 {
1723
1557
  var extension uint16
1724
- var body byteReader
1725
- if !data.readU16(&extension) ||
1726
- !data.readU16LengthPrefixed(&body) {
1558
+ var body cryptobyte.String
1559
+ if !data.ReadUint16(&extension) ||
1560
+ !data.ReadUint16LengthPrefixed(&body) {
1727
1561
  return false
1728
1562
  }
1729
1563
  switch extension {
@@ -1731,7 +1565,7 @@ func (m *serverExtensions) unmarshal(data byteReader, version uint16) bool {
1731
1565
  m.nextProtoNeg = true
1732
1566
  for len(body) > 0 {
1733
1567
  var protocol []byte
1734
- if !body.readU8LengthPrefixedBytes(&protocol) {
1568
+ if !readUint8LengthPrefixedBytes(&body, &protocol) {
1735
1569
  return false
1736
1570
  }
1737
1571
  m.nextProtos = append(m.nextProtos, string(protocol))
@@ -1747,14 +1581,14 @@ func (m *serverExtensions) unmarshal(data byteReader, version uint16) bool {
1747
1581
  }
1748
1582
  m.ticketSupported = true
1749
1583
  case extensionRenegotiationInfo:
1750
- if !body.readU8LengthPrefixedBytes(&m.secureRenegotiation) || len(body) != 0 {
1584
+ if !readUint8LengthPrefixedBytes(&body, &m.secureRenegotiation) || len(body) != 0 {
1751
1585
  return false
1752
1586
  }
1753
1587
  case extensionALPN:
1754
- var protocols, protocol byteReader
1755
- if !body.readU16LengthPrefixed(&protocols) ||
1588
+ var protocols, protocol cryptobyte.String
1589
+ if !body.ReadUint16LengthPrefixed(&protocols) ||
1756
1590
  len(body) != 0 ||
1757
- !protocols.readU8LengthPrefixed(&protocol) ||
1591
+ !protocols.ReadUint8LengthPrefixed(&protocol) ||
1758
1592
  len(protocols) != 0 {
1759
1593
  return false
1760
1594
  }
@@ -1771,11 +1605,11 @@ func (m *serverExtensions) unmarshal(data byteReader, version uint16) bool {
1771
1605
  }
1772
1606
  m.extendedMasterSecret = true
1773
1607
  case extensionUseSRTP:
1774
- var profiles, mki byteReader
1775
- if !body.readU16LengthPrefixed(&profiles) ||
1776
- !profiles.readU16(&m.srtpProtectionProfile) ||
1608
+ var profiles, mki cryptobyte.String
1609
+ if !body.ReadUint16LengthPrefixed(&profiles) ||
1610
+ !profiles.ReadUint16(&m.srtpProtectionProfile) ||
1777
1611
  len(profiles) != 0 ||
1778
- !body.readU8LengthPrefixed(&mki) ||
1612
+ !body.ReadUint8LengthPrefixed(&mki) ||
1779
1613
  len(body) != 0 {
1780
1614
  return false
1781
1615
  }
@@ -1795,7 +1629,7 @@ func (m *serverExtensions) unmarshal(data byteReader, version uint16) bool {
1795
1629
  return false
1796
1630
  }
1797
1631
  // http://tools.ietf.org/html/rfc4492#section-5.5.2
1798
- if !body.readU8LengthPrefixedBytes(&m.supportedPoints) || len(body) != 0 {
1632
+ if !readUint8LengthPrefixedBytes(&body, &m.supportedPoints) || len(body) != 0 {
1799
1633
  return false
1800
1634
  }
1801
1635
  case extensionSupportedCurves:
@@ -1822,15 +1656,15 @@ func (m *serverExtensions) unmarshal(data byteReader, version uint16) bool {
1822
1656
  m.echRetryConfigs = body
1823
1657
 
1824
1658
  // Validate the ECHConfig with a top-level parse.
1825
- var echConfigs byteReader
1826
- if !body.readU16LengthPrefixed(&echConfigs) {
1659
+ var echConfigs cryptobyte.String
1660
+ if !body.ReadUint16LengthPrefixed(&echConfigs) {
1827
1661
  return false
1828
1662
  }
1829
1663
  for len(echConfigs) > 0 {
1830
1664
  var version uint16
1831
- var contents byteReader
1832
- if !echConfigs.readU16(&version) ||
1833
- !echConfigs.readU16LengthPrefixed(&contents) {
1665
+ var contents cryptobyte.String
1666
+ if !echConfigs.ReadUint16(&version) ||
1667
+ !echConfigs.ReadUint16LengthPrefixed(&contents) {
1834
1668
  return false
1835
1669
  }
1836
1670
  }
@@ -1858,29 +1692,31 @@ func (m *clientEncryptedExtensionsMsg) marshal() (x []byte) {
1858
1692
  return m.raw
1859
1693
  }
1860
1694
 
1861
- builder := newByteBuilder()
1862
- builder.addU8(typeEncryptedExtensions)
1863
- body := builder.addU24LengthPrefixed()
1864
- extensions := body.addU16LengthPrefixed()
1865
- if m.hasApplicationSettings {
1866
- extensions.addU16(extensionApplicationSettings)
1867
- extensions.addU16LengthPrefixed().addBytes(m.applicationSettings)
1868
- }
1869
- if len(m.customExtension) > 0 {
1870
- extensions.addU16(extensionCustom)
1871
- extensions.addU16LengthPrefixed().addBytes(m.customExtension)
1872
- }
1695
+ builder := cryptobyte.NewBuilder(nil)
1696
+ builder.AddUint8(typeEncryptedExtensions)
1697
+ builder.AddUint24LengthPrefixed(func(body *cryptobyte.Builder) {
1698
+ body.AddUint16LengthPrefixed(func(extensions *cryptobyte.Builder) {
1699
+ if m.hasApplicationSettings {
1700
+ extensions.AddUint16(extensionApplicationSettings)
1701
+ addUint16LengthPrefixedBytes(extensions, m.applicationSettings)
1702
+ }
1703
+ if len(m.customExtension) > 0 {
1704
+ extensions.AddUint16(extensionCustom)
1705
+ addUint16LengthPrefixedBytes(extensions, m.customExtension)
1706
+ }
1707
+ })
1708
+ })
1873
1709
 
1874
- m.raw = builder.finish()
1710
+ m.raw = builder.BytesOrPanic()
1875
1711
  return m.raw
1876
1712
  }
1877
1713
 
1878
1714
  func (m *clientEncryptedExtensionsMsg) unmarshal(data []byte) bool {
1879
1715
  m.raw = data
1880
- reader := byteReader(data[4:])
1716
+ reader := cryptobyte.String(data[4:])
1881
1717
 
1882
- var extensions byteReader
1883
- if !reader.readU16LengthPrefixed(&extensions) ||
1718
+ var extensions cryptobyte.String
1719
+ if !reader.ReadUint16LengthPrefixed(&extensions) ||
1884
1720
  len(reader) != 0 {
1885
1721
  return false
1886
1722
  }
@@ -1891,9 +1727,9 @@ func (m *clientEncryptedExtensionsMsg) unmarshal(data []byte) bool {
1891
1727
 
1892
1728
  for len(extensions) > 0 {
1893
1729
  var extension uint16
1894
- var body byteReader
1895
- if !extensions.readU16(&extension) ||
1896
- !extensions.readU16LengthPrefixed(&body) {
1730
+ var body cryptobyte.String
1731
+ if !extensions.ReadUint16(&extension) ||
1732
+ !extensions.ReadUint16LengthPrefixed(&body) {
1897
1733
  return false
1898
1734
  }
1899
1735
  switch extension {
@@ -1928,92 +1764,93 @@ func (m *helloRetryRequestMsg) marshal() []byte {
1928
1764
  return m.raw
1929
1765
  }
1930
1766
 
1931
- retryRequestMsg := newByteBuilder()
1932
- retryRequestMsg.addU8(typeServerHello)
1933
- retryRequest := retryRequestMsg.addU24LengthPrefixed()
1934
- retryRequest.addU16(VersionTLS12)
1935
- retryRequest.addBytes(tls13HelloRetryRequest)
1936
- sessionID := retryRequest.addU8LengthPrefixed()
1937
- sessionID.addBytes(m.sessionID)
1938
- retryRequest.addU16(m.cipherSuite)
1939
- retryRequest.addU8(m.compressionMethod)
1940
-
1941
- extensions := retryRequest.addU16LengthPrefixed()
1767
+ retryRequestMsg := cryptobyte.NewBuilder(nil)
1768
+ retryRequestMsg.AddUint8(typeServerHello)
1769
+ retryRequestMsg.AddUint24LengthPrefixed(func(retryRequest *cryptobyte.Builder) {
1770
+ retryRequest.AddUint16(VersionTLS12)
1771
+ retryRequest.AddBytes(tls13HelloRetryRequest)
1772
+ addUint8LengthPrefixedBytes(retryRequest, m.sessionID)
1773
+ retryRequest.AddUint16(m.cipherSuite)
1774
+ retryRequest.AddUint8(m.compressionMethod)
1942
1775
 
1943
- count := 1
1944
- if m.duplicateExtensions {
1945
- count = 2
1946
- }
1776
+ retryRequest.AddUint16LengthPrefixed(func(extensions *cryptobyte.Builder) {
1777
+ count := 1
1778
+ if m.duplicateExtensions {
1779
+ count = 2
1780
+ }
1947
1781
 
1948
- for i := 0; i < count; i++ {
1949
- extensions.addU16(extensionSupportedVersions)
1950
- extensions.addU16(2) // Length
1951
- extensions.addU16(m.vers)
1952
- if m.hasSelectedGroup {
1953
- extensions.addU16(extensionKeyShare)
1954
- extensions.addU16(2) // length
1955
- extensions.addU16(uint16(m.selectedGroup))
1956
- }
1957
- // m.cookie may be a non-nil empty slice for empty cookie tests.
1958
- if m.cookie != nil {
1959
- extensions.addU16(extensionCookie)
1960
- body := extensions.addU16LengthPrefixed()
1961
- body.addU16LengthPrefixed().addBytes(m.cookie)
1962
- }
1963
- if len(m.customExtension) > 0 {
1964
- extensions.addU16(extensionCustom)
1965
- extensions.addU16LengthPrefixed().addBytes([]byte(m.customExtension))
1966
- }
1967
- if len(m.echConfirmation) > 0 {
1968
- extensions.addU16(extensionEncryptedClientHello)
1969
- extensions.addU16LengthPrefixed().addBytes(m.echConfirmation)
1970
- }
1971
- }
1782
+ for i := 0; i < count; i++ {
1783
+ extensions.AddUint16(extensionSupportedVersions)
1784
+ extensions.AddUint16(2) // Length
1785
+ extensions.AddUint16(m.vers)
1786
+ if m.hasSelectedGroup {
1787
+ extensions.AddUint16(extensionKeyShare)
1788
+ extensions.AddUint16(2) // length
1789
+ extensions.AddUint16(uint16(m.selectedGroup))
1790
+ }
1791
+ // m.cookie may be a non-nil empty slice for empty cookie tests.
1792
+ if m.cookie != nil {
1793
+ extensions.AddUint16(extensionCookie)
1794
+ extensions.AddUint16LengthPrefixed(func(body *cryptobyte.Builder) {
1795
+ addUint16LengthPrefixedBytes(body, m.cookie)
1796
+ })
1797
+ }
1798
+ if len(m.customExtension) > 0 {
1799
+ extensions.AddUint16(extensionCustom)
1800
+ addUint16LengthPrefixedBytes(extensions, []byte(m.customExtension))
1801
+ }
1802
+ if len(m.echConfirmation) > 0 {
1803
+ extensions.AddUint16(extensionEncryptedClientHello)
1804
+ addUint16LengthPrefixedBytes(extensions, m.echConfirmation)
1805
+ }
1806
+ }
1807
+ })
1808
+ })
1972
1809
 
1973
- m.raw = retryRequestMsg.finish()
1810
+ m.raw = retryRequestMsg.BytesOrPanic()
1974
1811
  return m.raw
1975
1812
  }
1976
1813
 
1977
1814
  func (m *helloRetryRequestMsg) unmarshal(data []byte) bool {
1978
1815
  m.raw = data
1979
- reader := byteReader(data[4:])
1816
+ reader := cryptobyte.String(data[4:])
1980
1817
  var legacyVers uint16
1981
1818
  var random []byte
1982
1819
  var compressionMethod byte
1983
- var extensions byteReader
1984
- if !reader.readU16(&legacyVers) ||
1820
+ var extensions cryptobyte.String
1821
+ if !reader.ReadUint16(&legacyVers) ||
1985
1822
  legacyVers != VersionTLS12 ||
1986
- !reader.readBytes(&random, 32) ||
1987
- !reader.readU8LengthPrefixedBytes(&m.sessionID) ||
1988
- !reader.readU16(&m.cipherSuite) ||
1989
- !reader.readU8(&compressionMethod) ||
1823
+ !reader.ReadBytes(&random, 32) ||
1824
+ !readUint8LengthPrefixedBytes(&reader, &m.sessionID) ||
1825
+ !reader.ReadUint16(&m.cipherSuite) ||
1826
+ !reader.ReadUint8(&compressionMethod) ||
1990
1827
  compressionMethod != 0 ||
1991
- !reader.readU16LengthPrefixed(&extensions) ||
1828
+ !reader.ReadUint16LengthPrefixed(&extensions) ||
1992
1829
  len(reader) != 0 {
1993
1830
  return false
1994
1831
  }
1995
1832
  for len(extensions) > 0 {
1996
1833
  var extension uint16
1997
- var body byteReader
1998
- if !extensions.readU16(&extension) ||
1999
- !extensions.readU16LengthPrefixed(&body) {
1834
+ var body cryptobyte.String
1835
+ if !extensions.ReadUint16(&extension) ||
1836
+ !extensions.ReadUint16LengthPrefixed(&body) {
2000
1837
  return false
2001
1838
  }
2002
1839
  switch extension {
2003
1840
  case extensionSupportedVersions:
2004
- if !body.readU16(&m.vers) ||
1841
+ if !body.ReadUint16(&m.vers) ||
2005
1842
  len(body) != 0 {
2006
1843
  return false
2007
1844
  }
2008
1845
  case extensionKeyShare:
2009
1846
  var v uint16
2010
- if !body.readU16(&v) || len(body) != 0 {
1847
+ if !body.ReadUint16(&v) || len(body) != 0 {
2011
1848
  return false
2012
1849
  }
2013
1850
  m.hasSelectedGroup = true
2014
1851
  m.selectedGroup = CurveID(v)
2015
1852
  case extensionCookie:
2016
- if !body.readU16LengthPrefixedBytes(&m.cookie) ||
1853
+ if !readUint16LengthPrefixedBytes(&body, &m.cookie) ||
2017
1854
  len(m.cookie) == 0 ||
2018
1855
  len(body) != 0 {
2019
1856
  return false
@@ -2063,85 +1900,86 @@ func (m *certificateMsg) marshal() (x []byte) {
2063
1900
  return m.raw
2064
1901
  }
2065
1902
 
2066
- certMsg := newByteBuilder()
2067
- certMsg.addU8(typeCertificate)
2068
- certificate := certMsg.addU24LengthPrefixed()
2069
- if m.hasRequestContext {
2070
- context := certificate.addU8LengthPrefixed()
2071
- context.addBytes(m.requestContext)
2072
- }
2073
- certificateList := certificate.addU24LengthPrefixed()
2074
- for _, cert := range m.certificates {
2075
- certEntry := certificateList.addU24LengthPrefixed()
2076
- certEntry.addBytes(cert.data)
1903
+ certMsg := cryptobyte.NewBuilder(nil)
1904
+ certMsg.AddUint8(typeCertificate)
1905
+ certMsg.AddUint24LengthPrefixed(func(certificate *cryptobyte.Builder) {
2077
1906
  if m.hasRequestContext {
2078
- extensions := certificateList.addU16LengthPrefixed()
2079
- count := 1
2080
- if cert.duplicateExtensions {
2081
- count = 2
2082
- }
2083
-
2084
- for i := 0; i < count; i++ {
2085
- if cert.ocspResponse != nil {
2086
- extensions.addU16(extensionStatusRequest)
2087
- body := extensions.addU16LengthPrefixed()
2088
- body.addU8(statusTypeOCSP)
2089
- response := body.addU24LengthPrefixed()
2090
- response.addBytes(cert.ocspResponse)
2091
- }
2092
-
2093
- if cert.sctList != nil {
2094
- extensions.addU16(extensionSignedCertificateTimestamp)
2095
- extension := extensions.addU16LengthPrefixed()
2096
- extension.addBytes(cert.sctList)
1907
+ addUint8LengthPrefixedBytes(certificate, m.requestContext)
1908
+ }
1909
+ certificate.AddUint24LengthPrefixed(func(certificateList *cryptobyte.Builder) {
1910
+ for _, cert := range m.certificates {
1911
+ addUint24LengthPrefixedBytes(certificateList, cert.data)
1912
+ if m.hasRequestContext {
1913
+ certificateList.AddUint16LengthPrefixed(func(extensions *cryptobyte.Builder) {
1914
+ count := 1
1915
+ if cert.duplicateExtensions {
1916
+ count = 2
1917
+ }
1918
+
1919
+ for i := 0; i < count; i++ {
1920
+ if cert.ocspResponse != nil {
1921
+ extensions.AddUint16(extensionStatusRequest)
1922
+ extensions.AddUint16LengthPrefixed(func(body *cryptobyte.Builder) {
1923
+ body.AddUint8(statusTypeOCSP)
1924
+ addUint24LengthPrefixedBytes(body, cert.ocspResponse)
1925
+ })
1926
+ }
1927
+
1928
+ if cert.sctList != nil {
1929
+ extensions.AddUint16(extensionSignedCertificateTimestamp)
1930
+ addUint16LengthPrefixedBytes(extensions, cert.sctList)
1931
+ }
1932
+ }
1933
+ if cert.extraExtension != nil {
1934
+ extensions.AddBytes(cert.extraExtension)
1935
+ }
1936
+ })
2097
1937
  }
2098
1938
  }
2099
- if cert.extraExtension != nil {
2100
- extensions.addBytes(cert.extraExtension)
2101
- }
2102
- }
2103
- }
1939
+ })
2104
1940
 
2105
- m.raw = certMsg.finish()
1941
+ })
1942
+
1943
+ m.raw = certMsg.BytesOrPanic()
2106
1944
  return m.raw
2107
1945
  }
2108
1946
 
2109
1947
  func (m *certificateMsg) unmarshal(data []byte) bool {
2110
1948
  m.raw = data
2111
- reader := byteReader(data[4:])
1949
+ reader := cryptobyte.String(data[4:])
2112
1950
 
2113
- if m.hasRequestContext && !reader.readU8LengthPrefixedBytes(&m.requestContext) {
1951
+ if m.hasRequestContext && !readUint8LengthPrefixedBytes(&reader, &m.requestContext) {
2114
1952
  return false
2115
1953
  }
2116
1954
 
2117
- var certs byteReader
2118
- if !reader.readU24LengthPrefixed(&certs) || len(reader) != 0 {
1955
+ var certs cryptobyte.String
1956
+ if !reader.ReadUint24LengthPrefixed(&certs) || len(reader) != 0 {
2119
1957
  return false
2120
1958
  }
2121
1959
  m.certificates = nil
2122
1960
  for len(certs) > 0 {
2123
1961
  var cert certificateEntry
2124
- if !certs.readU24LengthPrefixedBytes(&cert.data) {
1962
+ if !readUint24LengthPrefixedBytes(&certs, &cert.data) {
2125
1963
  return false
2126
1964
  }
2127
1965
  if m.hasRequestContext {
2128
- var extensions byteReader
2129
- if !certs.readU16LengthPrefixed(&extensions) || !checkDuplicateExtensions(extensions) {
1966
+ var extensions cryptobyte.String
1967
+ if !certs.ReadUint16LengthPrefixed(&extensions) || !checkDuplicateExtensions(extensions) {
2130
1968
  return false
2131
1969
  }
2132
1970
  for len(extensions) > 0 {
2133
1971
  var extension uint16
2134
- var body byteReader
2135
- if !extensions.readU16(&extension) ||
2136
- !extensions.readU16LengthPrefixed(&body) {
1972
+ var body cryptobyte.String
1973
+ if !extensions.ReadUint16(&extension) ||
1974
+ !extensions.ReadUint16LengthPrefixed(&body) {
2137
1975
  return false
2138
1976
  }
2139
1977
  switch extension {
2140
1978
  case extensionStatusRequest:
2141
1979
  var statusType byte
2142
- if !body.readU8(&statusType) ||
1980
+ if !body.ReadUint8(&statusType) ||
2143
1981
  statusType != statusTypeOCSP ||
2144
- !body.readU24LengthPrefixedBytes(&cert.ocspResponse) ||
1982
+ !readUint24LengthPrefixedBytes(&body, &cert.ocspResponse) ||
2145
1983
  len(body) != 0 {
2146
1984
  return false
2147
1985
  }
@@ -2157,11 +1995,11 @@ func (m *certificateMsg) unmarshal(data []byte) bool {
2157
1995
  origBody := body
2158
1996
  var expectedCertVerifyAlgo, algorithm uint16
2159
1997
 
2160
- if !body.readU32(&dc.lifetimeSecs) ||
2161
- !body.readU16(&expectedCertVerifyAlgo) ||
2162
- !body.readU24LengthPrefixedBytes(&dc.pkixPublicKey) ||
2163
- !body.readU16(&algorithm) ||
2164
- !body.readU16LengthPrefixedBytes(&dc.signature) ||
1998
+ if !body.ReadUint32(&dc.lifetimeSecs) ||
1999
+ !body.ReadUint16(&expectedCertVerifyAlgo) ||
2000
+ !readUint24LengthPrefixedBytes(&body, &dc.pkixPublicKey) ||
2001
+ !body.ReadUint16(&algorithm) ||
2002
+ !readUint16LengthPrefixedBytes(&body, &dc.signature) ||
2165
2003
  len(body) != 0 {
2166
2004
  return false
2167
2005
  }
@@ -2193,25 +2031,25 @@ func (m *compressedCertificateMsg) marshal() (x []byte) {
2193
2031
  return m.raw
2194
2032
  }
2195
2033
 
2196
- certMsg := newByteBuilder()
2197
- certMsg.addU8(typeCompressedCertificate)
2198
- certificate := certMsg.addU24LengthPrefixed()
2199
- certificate.addU16(m.algID)
2200
- certificate.addU24(int(m.uncompressedLength))
2201
- compressed := certificate.addU24LengthPrefixed()
2202
- compressed.addBytes(m.compressed)
2034
+ certMsg := cryptobyte.NewBuilder(nil)
2035
+ certMsg.AddUint8(typeCompressedCertificate)
2036
+ certMsg.AddUint24LengthPrefixed(func(certificate *cryptobyte.Builder) {
2037
+ certificate.AddUint16(m.algID)
2038
+ certificate.AddUint24(m.uncompressedLength)
2039
+ addUint24LengthPrefixedBytes(certificate, m.compressed)
2040
+ })
2203
2041
 
2204
- m.raw = certMsg.finish()
2042
+ m.raw = certMsg.BytesOrPanic()
2205
2043
  return m.raw
2206
2044
  }
2207
2045
 
2208
2046
  func (m *compressedCertificateMsg) unmarshal(data []byte) bool {
2209
2047
  m.raw = data
2210
- reader := byteReader(data[4:])
2048
+ reader := cryptobyte.String(data[4:])
2211
2049
 
2212
- if !reader.readU16(&m.algID) ||
2213
- !reader.readU24(&m.uncompressedLength) ||
2214
- !reader.readU24LengthPrefixedBytes(&m.compressed) ||
2050
+ if !reader.ReadUint16(&m.algID) ||
2051
+ !reader.ReadUint24(&m.uncompressedLength) ||
2052
+ !readUint24LengthPrefixedBytes(&reader, &m.compressed) ||
2215
2053
  len(reader) != 0 {
2216
2054
  return false
2217
2055
  }
@@ -2232,10 +2070,10 @@ func (m *serverKeyExchangeMsg) marshal() []byte {
2232
2070
  if m.raw != nil {
2233
2071
  return m.raw
2234
2072
  }
2235
- msg := newByteBuilder()
2236
- msg.addU8(typeServerKeyExchange)
2237
- msg.addU24LengthPrefixed().addBytes(m.key)
2238
- m.raw = msg.finish()
2073
+ msg := cryptobyte.NewBuilder(nil)
2074
+ msg.AddUint8(typeServerKeyExchange)
2075
+ addUint24LengthPrefixedBytes(msg, m.key)
2076
+ m.raw = msg.BytesOrPanic()
2239
2077
  return m.raw
2240
2078
  }
2241
2079
 
@@ -2261,12 +2099,13 @@ func (m *certificateStatusMsg) marshal() []byte {
2261
2099
 
2262
2100
  var x []byte
2263
2101
  if m.statusType == statusTypeOCSP {
2264
- msg := newByteBuilder()
2265
- msg.addU8(typeCertificateStatus)
2266
- body := msg.addU24LengthPrefixed()
2267
- body.addU8(statusTypeOCSP)
2268
- body.addU24LengthPrefixed().addBytes(m.response)
2269
- x = msg.finish()
2102
+ msg := cryptobyte.NewBuilder(nil)
2103
+ msg.AddUint8(typeCertificateStatus)
2104
+ msg.AddUint24LengthPrefixed(func(body *cryptobyte.Builder) {
2105
+ body.AddUint8(statusTypeOCSP)
2106
+ addUint24LengthPrefixedBytes(body, m.response)
2107
+ })
2108
+ x = msg.BytesOrPanic()
2270
2109
  } else {
2271
2110
  x = []byte{typeCertificateStatus, 0, 0, 1, m.statusType}
2272
2111
  }
@@ -2277,10 +2116,10 @@ func (m *certificateStatusMsg) marshal() []byte {
2277
2116
 
2278
2117
  func (m *certificateStatusMsg) unmarshal(data []byte) bool {
2279
2118
  m.raw = data
2280
- reader := byteReader(data[4:])
2281
- if !reader.readU8(&m.statusType) ||
2119
+ reader := cryptobyte.String(data[4:])
2120
+ if !reader.ReadUint8(&m.statusType) ||
2282
2121
  m.statusType != statusTypeOCSP ||
2283
- !reader.readU24LengthPrefixedBytes(&m.response) ||
2122
+ !readUint24LengthPrefixedBytes(&reader, &m.response) ||
2284
2123
  len(reader) != 0 {
2285
2124
  return false
2286
2125
  }
@@ -2308,10 +2147,10 @@ func (m *clientKeyExchangeMsg) marshal() []byte {
2308
2147
  if m.raw != nil {
2309
2148
  return m.raw
2310
2149
  }
2311
- msg := newByteBuilder()
2312
- msg.addU8(typeClientKeyExchange)
2313
- msg.addU24LengthPrefixed().addBytes(m.ciphertext)
2314
- m.raw = msg.finish()
2150
+ msg := cryptobyte.NewBuilder(nil)
2151
+ msg.AddUint8(typeClientKeyExchange)
2152
+ addUint24LengthPrefixedBytes(msg, m.ciphertext)
2153
+ m.raw = msg.BytesOrPanic()
2315
2154
  return m.raw
2316
2155
  }
2317
2156
 
@@ -2338,10 +2177,10 @@ func (m *finishedMsg) marshal() []byte {
2338
2177
  return m.raw
2339
2178
  }
2340
2179
 
2341
- msg := newByteBuilder()
2342
- msg.addU8(typeFinished)
2343
- msg.addU24LengthPrefixed().addBytes(m.verifyData)
2344
- m.raw = msg.finish()
2180
+ msg := cryptobyte.NewBuilder(nil)
2181
+ msg.AddUint8(typeFinished)
2182
+ addUint24LengthPrefixedBytes(msg, m.verifyData)
2183
+ m.raw = msg.BytesOrPanic()
2345
2184
  return m.raw
2346
2185
  }
2347
2186
 
@@ -2366,21 +2205,22 @@ func (m *nextProtoMsg) marshal() []byte {
2366
2205
 
2367
2206
  padding := 32 - (len(m.proto)+2)%32
2368
2207
 
2369
- msg := newByteBuilder()
2370
- msg.addU8(typeNextProtocol)
2371
- body := msg.addU24LengthPrefixed()
2372
- body.addU8LengthPrefixed().addBytes([]byte(m.proto))
2373
- body.addU8LengthPrefixed().addBytes(make([]byte, padding))
2374
- m.raw = msg.finish()
2208
+ msg := cryptobyte.NewBuilder(nil)
2209
+ msg.AddUint8(typeNextProtocol)
2210
+ msg.AddUint24LengthPrefixed(func(body *cryptobyte.Builder) {
2211
+ addUint8LengthPrefixedBytes(body, []byte(m.proto))
2212
+ addUint8LengthPrefixedBytes(body, make([]byte, padding))
2213
+ })
2214
+ m.raw = msg.BytesOrPanic()
2375
2215
  return m.raw
2376
2216
  }
2377
2217
 
2378
2218
  func (m *nextProtoMsg) unmarshal(data []byte) bool {
2379
2219
  m.raw = data
2380
- reader := byteReader(data[4:])
2220
+ reader := cryptobyte.String(data[4:])
2381
2221
  var proto, padding []byte
2382
- if !reader.readU8LengthPrefixedBytes(&proto) ||
2383
- !reader.readU8LengthPrefixedBytes(&padding) ||
2222
+ if !readUint8LengthPrefixedBytes(&reader, &proto) ||
2223
+ !readUint8LengthPrefixedBytes(&reader, &padding) ||
2384
2224
  len(reader) != 0 {
2385
2225
  return false
2386
2226
  }
@@ -2427,72 +2267,79 @@ func (m *certificateRequestMsg) marshal() []byte {
2427
2267
  }
2428
2268
 
2429
2269
  // See http://tools.ietf.org/html/rfc4346#section-7.4.4
2430
- builder := newByteBuilder()
2431
- builder.addU8(typeCertificateRequest)
2432
- body := builder.addU24LengthPrefixed()
2433
-
2434
- if m.hasRequestContext {
2435
- requestContext := body.addU8LengthPrefixed()
2436
- requestContext.addBytes(m.requestContext)
2437
- extensions := newByteBuilder()
2438
- extensions = body.addU16LengthPrefixed()
2439
- if m.hasSignatureAlgorithm {
2440
- extensions.addU16(extensionSignatureAlgorithms)
2441
- signatureAlgorithms := extensions.addU16LengthPrefixed().addU16LengthPrefixed()
2442
- for _, sigAlg := range m.signatureAlgorithms {
2443
- signatureAlgorithms.addU16(uint16(sigAlg))
2444
- }
2445
- }
2446
- if len(m.signatureAlgorithmsCert) > 0 {
2447
- extensions.addU16(extensionSignatureAlgorithmsCert)
2448
- signatureAlgorithmsCert := extensions.addU16LengthPrefixed().addU16LengthPrefixed()
2449
- for _, sigAlg := range m.signatureAlgorithmsCert {
2450
- signatureAlgorithmsCert.addU16(uint16(sigAlg))
2451
- }
2452
- }
2453
- if len(m.certificateAuthorities) > 0 {
2454
- extensions.addU16(extensionCertificateAuthorities)
2455
- certificateAuthorities := extensions.addU16LengthPrefixed().addU16LengthPrefixed()
2456
- for _, ca := range m.certificateAuthorities {
2457
- caEntry := certificateAuthorities.addU16LengthPrefixed()
2458
- caEntry.addBytes(ca)
2459
- }
2460
- }
2270
+ builder := cryptobyte.NewBuilder(nil)
2271
+ builder.AddUint8(typeCertificateRequest)
2272
+ builder.AddUint24LengthPrefixed(func(body *cryptobyte.Builder) {
2273
+ if m.hasRequestContext {
2274
+ addUint8LengthPrefixedBytes(body, m.requestContext)
2275
+ body.AddUint16LengthPrefixed(func(extensions *cryptobyte.Builder) {
2276
+ if m.hasSignatureAlgorithm {
2277
+ extensions.AddUint16(extensionSignatureAlgorithms)
2278
+ extensions.AddUint16LengthPrefixed(func(extension *cryptobyte.Builder) {
2279
+ extension.AddUint16LengthPrefixed(func(signatureAlgorithms *cryptobyte.Builder) {
2280
+ for _, sigAlg := range m.signatureAlgorithms {
2281
+ signatureAlgorithms.AddUint16(uint16(sigAlg))
2282
+ }
2283
+ })
2284
+ })
2285
+ }
2286
+ if len(m.signatureAlgorithmsCert) > 0 {
2287
+ extensions.AddUint16(extensionSignatureAlgorithmsCert)
2288
+ extensions.AddUint16LengthPrefixed(func(extension *cryptobyte.Builder) {
2289
+ extension.AddUint16LengthPrefixed(func(signatureAlgorithmsCert *cryptobyte.Builder) {
2290
+ for _, sigAlg := range m.signatureAlgorithmsCert {
2291
+ signatureAlgorithmsCert.AddUint16(uint16(sigAlg))
2292
+ }
2293
+ })
2294
+ })
2295
+ }
2296
+ if len(m.certificateAuthorities) > 0 {
2297
+ extensions.AddUint16(extensionCertificateAuthorities)
2298
+ extensions.AddUint16LengthPrefixed(func(extension *cryptobyte.Builder) {
2299
+ extension.AddUint16LengthPrefixed(func(certificateAuthorities *cryptobyte.Builder) {
2300
+ for _, ca := range m.certificateAuthorities {
2301
+ addUint16LengthPrefixedBytes(certificateAuthorities, ca)
2302
+ }
2303
+ })
2304
+ })
2305
+ }
2461
2306
 
2462
- if m.customExtension > 0 {
2463
- extensions.addU16(m.customExtension)
2464
- extensions.addU16LengthPrefixed()
2465
- }
2466
- } else {
2467
- certificateTypes := body.addU8LengthPrefixed()
2468
- certificateTypes.addBytes(m.certificateTypes)
2307
+ if m.customExtension > 0 {
2308
+ extensions.AddUint16(m.customExtension)
2309
+ extensions.AddUint16(0) // Empty extension
2310
+ }
2311
+ })
2312
+ } else {
2313
+ addUint8LengthPrefixedBytes(body, m.certificateTypes)
2469
2314
 
2470
- if m.hasSignatureAlgorithm {
2471
- signatureAlgorithms := body.addU16LengthPrefixed()
2472
- for _, sigAlg := range m.signatureAlgorithms {
2473
- signatureAlgorithms.addU16(uint16(sigAlg))
2315
+ if m.hasSignatureAlgorithm {
2316
+ body.AddUint16LengthPrefixed(func(signatureAlgorithms *cryptobyte.Builder) {
2317
+ for _, sigAlg := range m.signatureAlgorithms {
2318
+ signatureAlgorithms.AddUint16(uint16(sigAlg))
2319
+ }
2320
+ })
2474
2321
  }
2475
- }
2476
2322
 
2477
- certificateAuthorities := body.addU16LengthPrefixed()
2478
- for _, ca := range m.certificateAuthorities {
2479
- caEntry := certificateAuthorities.addU16LengthPrefixed()
2480
- caEntry.addBytes(ca)
2323
+ body.AddUint16LengthPrefixed(func(certificateAuthorities *cryptobyte.Builder) {
2324
+ for _, ca := range m.certificateAuthorities {
2325
+ addUint16LengthPrefixedBytes(certificateAuthorities, ca)
2326
+ }
2327
+ })
2481
2328
  }
2482
- }
2329
+ })
2483
2330
 
2484
- m.raw = builder.finish()
2331
+ m.raw = builder.BytesOrPanic()
2485
2332
  return m.raw
2486
2333
  }
2487
2334
 
2488
- func parseCAs(reader *byteReader, out *[][]byte) bool {
2489
- var cas byteReader
2490
- if !reader.readU16LengthPrefixed(&cas) {
2335
+ func parseCAs(reader *cryptobyte.String, out *[][]byte) bool {
2336
+ var cas cryptobyte.String
2337
+ if !reader.ReadUint16LengthPrefixed(&cas) {
2491
2338
  return false
2492
2339
  }
2493
2340
  for len(cas) > 0 {
2494
2341
  var ca []byte
2495
- if !cas.readU16LengthPrefixedBytes(&ca) {
2342
+ if !readUint16LengthPrefixedBytes(&cas, &ca) {
2496
2343
  return false
2497
2344
  }
2498
2345
  *out = append(*out, ca)
@@ -2502,21 +2349,21 @@ func parseCAs(reader *byteReader, out *[][]byte) bool {
2502
2349
 
2503
2350
  func (m *certificateRequestMsg) unmarshal(data []byte) bool {
2504
2351
  m.raw = data
2505
- reader := byteReader(data[4:])
2352
+ reader := cryptobyte.String(data[4:])
2506
2353
 
2507
2354
  if m.hasRequestContext {
2508
- var extensions byteReader
2509
- if !reader.readU8LengthPrefixedBytes(&m.requestContext) ||
2510
- !reader.readU16LengthPrefixed(&extensions) ||
2355
+ var extensions cryptobyte.String
2356
+ if !readUint8LengthPrefixedBytes(&reader, &m.requestContext) ||
2357
+ !reader.ReadUint16LengthPrefixed(&extensions) ||
2511
2358
  len(reader) != 0 ||
2512
2359
  !checkDuplicateExtensions(extensions) {
2513
2360
  return false
2514
2361
  }
2515
2362
  for len(extensions) > 0 {
2516
2363
  var extension uint16
2517
- var body byteReader
2518
- if !extensions.readU16(&extension) ||
2519
- !extensions.readU16LengthPrefixed(&body) {
2364
+ var body cryptobyte.String
2365
+ if !extensions.ReadUint16(&extension) ||
2366
+ !extensions.ReadUint16LengthPrefixed(&body) {
2520
2367
  return false
2521
2368
  }
2522
2369
  switch extension {
@@ -2536,7 +2383,7 @@ func (m *certificateRequestMsg) unmarshal(data []byte) bool {
2536
2383
  }
2537
2384
  }
2538
2385
  } else {
2539
- if !reader.readU8LengthPrefixedBytes(&m.certificateTypes) {
2386
+ if !readUint8LengthPrefixedBytes(&reader, &m.certificateTypes) {
2540
2387
  return false
2541
2388
  }
2542
2389
  // In TLS 1.2, the supported_signature_algorithms field in
@@ -2648,35 +2495,40 @@ func (m *newSessionTicketMsg) marshal() []byte {
2648
2495
  }
2649
2496
 
2650
2497
  // See http://tools.ietf.org/html/rfc5077#section-3.3
2651
- ticketMsg := newByteBuilder()
2652
- ticketMsg.addU8(typeNewSessionTicket)
2653
- body := ticketMsg.addU24LengthPrefixed()
2654
- body.addU32(m.ticketLifetime)
2655
- if version >= VersionTLS13 {
2656
- body.addU32(m.ticketAgeAdd)
2657
- body.addU8LengthPrefixed().addBytes(m.ticketNonce)
2658
- }
2659
-
2660
- ticket := body.addU16LengthPrefixed()
2661
- ticket.addBytes(m.ticket)
2662
-
2663
- if version >= VersionTLS13 {
2664
- extensions := body.addU16LengthPrefixed()
2665
- if m.maxEarlyDataSize > 0 {
2666
- extensions.addU16(extensionEarlyData)
2667
- extensions.addU16LengthPrefixed().addU32(m.maxEarlyDataSize)
2668
- if m.duplicateEarlyDataExtension {
2669
- extensions.addU16(extensionEarlyData)
2670
- extensions.addU16LengthPrefixed().addU32(m.maxEarlyDataSize)
2671
- }
2672
- }
2673
- if len(m.customExtension) > 0 {
2674
- extensions.addU16(extensionCustom)
2675
- extensions.addU16LengthPrefixed().addBytes([]byte(m.customExtension))
2498
+ ticketMsg := cryptobyte.NewBuilder(nil)
2499
+ ticketMsg.AddUint8(typeNewSessionTicket)
2500
+ ticketMsg.AddUint24LengthPrefixed(func(body *cryptobyte.Builder) {
2501
+ body.AddUint32(m.ticketLifetime)
2502
+ if version >= VersionTLS13 {
2503
+ body.AddUint32(m.ticketAgeAdd)
2504
+ addUint8LengthPrefixedBytes(body, m.ticketNonce)
2505
+ }
2506
+
2507
+ addUint16LengthPrefixedBytes(body, m.ticket)
2508
+
2509
+ if version >= VersionTLS13 {
2510
+ body.AddUint16LengthPrefixed(func(extensions *cryptobyte.Builder) {
2511
+ if m.maxEarlyDataSize > 0 {
2512
+ extensions.AddUint16(extensionEarlyData)
2513
+ extensions.AddUint16LengthPrefixed(func(child *cryptobyte.Builder) {
2514
+ child.AddUint32(m.maxEarlyDataSize)
2515
+ })
2516
+ if m.duplicateEarlyDataExtension {
2517
+ extensions.AddUint16(extensionEarlyData)
2518
+ extensions.AddUint16LengthPrefixed(func(child *cryptobyte.Builder) {
2519
+ child.AddUint32(m.maxEarlyDataSize)
2520
+ })
2521
+ }
2522
+ }
2523
+ if len(m.customExtension) > 0 {
2524
+ extensions.AddUint16(extensionCustom)
2525
+ addUint16LengthPrefixedBytes(extensions, []byte(m.customExtension))
2526
+ }
2527
+ })
2676
2528
  }
2677
- }
2529
+ })
2678
2530
 
2679
- m.raw = ticketMsg.finish()
2531
+ m.raw = ticketMsg.BytesOrPanic()
2680
2532
  return m.raw
2681
2533
  }
2682
2534