protocol-quic 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/ext/ngtcp2/AUTHORS +44 -0
  4. data/ext/ngtcp2/CMakeLists.txt +431 -0
  5. data/ext/ngtcp2/CMakeOptions.txt +17 -0
  6. data/ext/ngtcp2/COPYING +22 -0
  7. data/ext/ngtcp2/ChangeLog +0 -0
  8. data/ext/ngtcp2/Makefile.am +60 -0
  9. data/ext/ngtcp2/NEWS +0 -0
  10. data/ext/ngtcp2/README +1 -0
  11. data/ext/ngtcp2/README.rst +258 -0
  12. data/ext/ngtcp2/ci/build_boringssl.sh +10 -0
  13. data/ext/ngtcp2/ci/build_nghttp3.sh +9 -0
  14. data/ext/ngtcp2/ci/build_openssl1.sh +8 -0
  15. data/ext/ngtcp2/ci/build_openssl1_cross.sh +9 -0
  16. data/ext/ngtcp2/ci/build_openssl3.sh +8 -0
  17. data/ext/ngtcp2/ci/build_picotls.sh +26 -0
  18. data/ext/ngtcp2/ci/build_wolfssl.sh +9 -0
  19. data/ext/ngtcp2/ci/gen-certificate.sh +8 -0
  20. data/ext/ngtcp2/cmake/ExtractValidFlags.cmake +31 -0
  21. data/ext/ngtcp2/cmake/FindCUnit.cmake +40 -0
  22. data/ext/ngtcp2/cmake/FindJemalloc.cmake +40 -0
  23. data/ext/ngtcp2/cmake/FindLibev.cmake +38 -0
  24. data/ext/ngtcp2/cmake/FindLibnghttp3.cmake +41 -0
  25. data/ext/ngtcp2/cmake/Findwolfssl.cmake +41 -0
  26. data/ext/ngtcp2/cmake/Version.cmake +11 -0
  27. data/ext/ngtcp2/cmakeconfig.h.in +36 -0
  28. data/ext/ngtcp2/configure.ac +755 -0
  29. data/ext/ngtcp2/crypto/CMakeLists.txt +56 -0
  30. data/ext/ngtcp2/crypto/Makefile.am +49 -0
  31. data/ext/ngtcp2/crypto/boringssl/CMakeLists.txt +64 -0
  32. data/ext/ngtcp2/crypto/boringssl/Makefile.am +39 -0
  33. data/ext/ngtcp2/crypto/boringssl/boringssl.c +630 -0
  34. data/ext/ngtcp2/crypto/boringssl/libngtcp2_crypto_boringssl.pc.in +33 -0
  35. data/ext/ngtcp2/crypto/gnutls/CMakeLists.txt +86 -0
  36. data/ext/ngtcp2/crypto/gnutls/Makefile.am +43 -0
  37. data/ext/ngtcp2/crypto/gnutls/gnutls.c +644 -0
  38. data/ext/ngtcp2/crypto/gnutls/libngtcp2_crypto_gnutls.pc.in +33 -0
  39. data/ext/ngtcp2/crypto/includes/CMakeLists.txt +56 -0
  40. data/ext/ngtcp2/crypto/includes/Makefile.am +45 -0
  41. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h +893 -0
  42. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_boringssl.h +104 -0
  43. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_gnutls.h +107 -0
  44. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_openssl.h +132 -0
  45. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_picotls.h +246 -0
  46. data/ext/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_wolfssl.h +106 -0
  47. data/ext/ngtcp2/crypto/openssl/CMakeLists.txt +86 -0
  48. data/ext/ngtcp2/crypto/openssl/Makefile.am +43 -0
  49. data/ext/ngtcp2/crypto/openssl/libngtcp2_crypto_openssl.pc.in +33 -0
  50. data/ext/ngtcp2/crypto/openssl/openssl.c +807 -0
  51. data/ext/ngtcp2/crypto/picotls/CMakeLists.txt +65 -0
  52. data/ext/ngtcp2/crypto/picotls/Makefile.am +39 -0
  53. data/ext/ngtcp2/crypto/picotls/libngtcp2_crypto_picotls.pc.in +33 -0
  54. data/ext/ngtcp2/crypto/picotls/picotls.c +707 -0
  55. data/ext/ngtcp2/crypto/shared.c +1431 -0
  56. data/ext/ngtcp2/crypto/shared.h +350 -0
  57. data/ext/ngtcp2/crypto/wolfssl/CMakeLists.txt +84 -0
  58. data/ext/ngtcp2/crypto/wolfssl/Makefile.am +43 -0
  59. data/ext/ngtcp2/crypto/wolfssl/libngtcp2_crypto_wolfssl.pc.in +33 -0
  60. data/ext/ngtcp2/crypto/wolfssl/wolfssl.c +534 -0
  61. data/ext/ngtcp2/doc/Makefile.am +65 -0
  62. data/ext/ngtcp2/doc/make.bat +35 -0
  63. data/ext/ngtcp2/doc/mkapiref.py +356 -0
  64. data/ext/ngtcp2/doc/source/conf.py.in +94 -0
  65. data/ext/ngtcp2/doc/source/index.rst +22 -0
  66. data/ext/ngtcp2/doc/source/programmers-guide.rst +476 -0
  67. data/ext/ngtcp2/docker/Dockerfile +39 -0
  68. data/ext/ngtcp2/examples/CMakeLists.txt +361 -0
  69. data/ext/ngtcp2/examples/Makefile.am +228 -0
  70. data/ext/ngtcp2/examples/client.cc +3049 -0
  71. data/ext/ngtcp2/examples/client.h +192 -0
  72. data/ext/ngtcp2/examples/client_base.cc +202 -0
  73. data/ext/ngtcp2/examples/client_base.h +213 -0
  74. data/ext/ngtcp2/examples/debug.cc +298 -0
  75. data/ext/ngtcp2/examples/debug.h +124 -0
  76. data/ext/ngtcp2/examples/examplestest.cc +84 -0
  77. data/ext/ngtcp2/examples/gtlssimpleclient.c +720 -0
  78. data/ext/ngtcp2/examples/h09client.cc +2601 -0
  79. data/ext/ngtcp2/examples/h09client.h +196 -0
  80. data/ext/ngtcp2/examples/h09server.cc +3024 -0
  81. data/ext/ngtcp2/examples/h09server.h +237 -0
  82. data/ext/ngtcp2/examples/http.cc +138 -0
  83. data/ext/ngtcp2/examples/http.h +44 -0
  84. data/ext/ngtcp2/examples/network.h +80 -0
  85. data/ext/ngtcp2/examples/server.cc +3731 -0
  86. data/ext/ngtcp2/examples/server.h +256 -0
  87. data/ext/ngtcp2/examples/server_base.cc +58 -0
  88. data/ext/ngtcp2/examples/server_base.h +195 -0
  89. data/ext/ngtcp2/examples/shared.cc +385 -0
  90. data/ext/ngtcp2/examples/shared.h +96 -0
  91. data/ext/ngtcp2/examples/simpleclient.c +683 -0
  92. data/ext/ngtcp2/examples/template.h +71 -0
  93. data/ext/ngtcp2/examples/tests/README.rst +60 -0
  94. data/ext/ngtcp2/examples/tests/__init__.py +0 -0
  95. data/ext/ngtcp2/examples/tests/config.ini.in +32 -0
  96. data/ext/ngtcp2/examples/tests/conftest.py +28 -0
  97. data/ext/ngtcp2/examples/tests/ngtcp2test/__init__.py +6 -0
  98. data/ext/ngtcp2/examples/tests/ngtcp2test/certs.py +476 -0
  99. data/ext/ngtcp2/examples/tests/ngtcp2test/client.py +187 -0
  100. data/ext/ngtcp2/examples/tests/ngtcp2test/env.py +191 -0
  101. data/ext/ngtcp2/examples/tests/ngtcp2test/log.py +101 -0
  102. data/ext/ngtcp2/examples/tests/ngtcp2test/server.py +137 -0
  103. data/ext/ngtcp2/examples/tests/ngtcp2test/tls.py +983 -0
  104. data/ext/ngtcp2/examples/tests/test_01_handshake.py +30 -0
  105. data/ext/ngtcp2/examples/tests/test_02_resume.py +46 -0
  106. data/ext/ngtcp2/examples/tests/test_03_earlydata.py +56 -0
  107. data/ext/ngtcp2/examples/tests/test_04_clientcert.py +57 -0
  108. data/ext/ngtcp2/examples/tests/test_05_ciphers.py +46 -0
  109. data/ext/ngtcp2/examples/tls_client_context.h +52 -0
  110. data/ext/ngtcp2/examples/tls_client_context_boringssl.cc +126 -0
  111. data/ext/ngtcp2/examples/tls_client_context_boringssl.h +49 -0
  112. data/ext/ngtcp2/examples/tls_client_context_gnutls.cc +74 -0
  113. data/ext/ngtcp2/examples/tls_client_context_gnutls.h +50 -0
  114. data/ext/ngtcp2/examples/tls_client_context_openssl.cc +137 -0
  115. data/ext/ngtcp2/examples/tls_client_context_openssl.h +49 -0
  116. data/ext/ngtcp2/examples/tls_client_context_picotls.cc +158 -0
  117. data/ext/ngtcp2/examples/tls_client_context_picotls.h +53 -0
  118. data/ext/ngtcp2/examples/tls_client_context_wolfssl.cc +177 -0
  119. data/ext/ngtcp2/examples/tls_client_context_wolfssl.h +51 -0
  120. data/ext/ngtcp2/examples/tls_client_session.h +52 -0
  121. data/ext/ngtcp2/examples/tls_client_session_boringssl.cc +110 -0
  122. data/ext/ngtcp2/examples/tls_client_session_boringssl.h +52 -0
  123. data/ext/ngtcp2/examples/tls_client_session_gnutls.cc +190 -0
  124. data/ext/ngtcp2/examples/tls_client_session_gnutls.h +52 -0
  125. data/ext/ngtcp2/examples/tls_client_session_openssl.cc +113 -0
  126. data/ext/ngtcp2/examples/tls_client_session_openssl.h +52 -0
  127. data/ext/ngtcp2/examples/tls_client_session_picotls.cc +147 -0
  128. data/ext/ngtcp2/examples/tls_client_session_picotls.h +52 -0
  129. data/ext/ngtcp2/examples/tls_client_session_wolfssl.cc +160 -0
  130. data/ext/ngtcp2/examples/tls_client_session_wolfssl.h +52 -0
  131. data/ext/ngtcp2/examples/tls_server_context.h +52 -0
  132. data/ext/ngtcp2/examples/tls_server_context_boringssl.cc +257 -0
  133. data/ext/ngtcp2/examples/tls_server_context_boringssl.h +54 -0
  134. data/ext/ngtcp2/examples/tls_server_context_gnutls.cc +99 -0
  135. data/ext/ngtcp2/examples/tls_server_context_gnutls.h +59 -0
  136. data/ext/ngtcp2/examples/tls_server_context_openssl.cc +338 -0
  137. data/ext/ngtcp2/examples/tls_server_context_openssl.h +54 -0
  138. data/ext/ngtcp2/examples/tls_server_context_picotls.cc +321 -0
  139. data/ext/ngtcp2/examples/tls_server_context_picotls.h +58 -0
  140. data/ext/ngtcp2/examples/tls_server_context_wolfssl.cc +284 -0
  141. data/ext/ngtcp2/examples/tls_server_context_wolfssl.h +55 -0
  142. data/ext/ngtcp2/examples/tls_server_session.h +52 -0
  143. data/ext/ngtcp2/examples/tls_server_session_boringssl.cc +84 -0
  144. data/ext/ngtcp2/examples/tls_server_session_boringssl.h +47 -0
  145. data/ext/ngtcp2/examples/tls_server_session_gnutls.cc +155 -0
  146. data/ext/ngtcp2/examples/tls_server_session_gnutls.h +46 -0
  147. data/ext/ngtcp2/examples/tls_server_session_openssl.cc +54 -0
  148. data/ext/ngtcp2/examples/tls_server_session_openssl.h +47 -0
  149. data/ext/ngtcp2/examples/tls_server_session_picotls.cc +70 -0
  150. data/ext/ngtcp2/examples/tls_server_session_picotls.h +47 -0
  151. data/ext/ngtcp2/examples/tls_server_session_wolfssl.cc +55 -0
  152. data/ext/ngtcp2/examples/tls_server_session_wolfssl.h +47 -0
  153. data/ext/ngtcp2/examples/tls_session_base_gnutls.cc +87 -0
  154. data/ext/ngtcp2/examples/tls_session_base_gnutls.h +51 -0
  155. data/ext/ngtcp2/examples/tls_session_base_openssl.cc +54 -0
  156. data/ext/ngtcp2/examples/tls_session_base_openssl.h +52 -0
  157. data/ext/ngtcp2/examples/tls_session_base_picotls.cc +56 -0
  158. data/ext/ngtcp2/examples/tls_session_base_picotls.h +54 -0
  159. data/ext/ngtcp2/examples/tls_session_base_wolfssl.cc +54 -0
  160. data/ext/ngtcp2/examples/tls_session_base_wolfssl.h +54 -0
  161. data/ext/ngtcp2/examples/tls_shared_picotls.cc +59 -0
  162. data/ext/ngtcp2/examples/tls_shared_picotls.h +36 -0
  163. data/ext/ngtcp2/examples/util.cc +646 -0
  164. data/ext/ngtcp2/examples/util.h +361 -0
  165. data/ext/ngtcp2/examples/util_gnutls.cc +136 -0
  166. data/ext/ngtcp2/examples/util_openssl.cc +131 -0
  167. data/ext/ngtcp2/examples/util_test.cc +237 -0
  168. data/ext/ngtcp2/examples/util_test.h +45 -0
  169. data/ext/ngtcp2/examples/util_wolfssl.cc +130 -0
  170. data/ext/ngtcp2/fuzz/corpus/decode_frame/ack +0 -0
  171. data/ext/ngtcp2/fuzz/corpus/decode_frame/ack_ecn +0 -0
  172. data/ext/ngtcp2/fuzz/corpus/decode_frame/connection_close +0 -0
  173. data/ext/ngtcp2/fuzz/corpus/decode_frame/crypto +1 -0
  174. data/ext/ngtcp2/fuzz/corpus/decode_frame/data_blocked +1 -0
  175. data/ext/ngtcp2/fuzz/corpus/decode_frame/datagram +1 -0
  176. data/ext/ngtcp2/fuzz/corpus/decode_frame/datagram_len +1 -0
  177. data/ext/ngtcp2/fuzz/corpus/decode_frame/max_data +1 -0
  178. data/ext/ngtcp2/fuzz/corpus/decode_frame/max_stream_data +0 -0
  179. data/ext/ngtcp2/fuzz/corpus/decode_frame/max_streams +0 -0
  180. data/ext/ngtcp2/fuzz/corpus/decode_frame/new_connection_id +1 -0
  181. data/ext/ngtcp2/fuzz/corpus/decode_frame/new_token +1 -0
  182. data/ext/ngtcp2/fuzz/corpus/decode_frame/path_challenge +1 -0
  183. data/ext/ngtcp2/fuzz/corpus/decode_frame/path_response +1 -0
  184. data/ext/ngtcp2/fuzz/corpus/decode_frame/reset_stream +0 -0
  185. data/ext/ngtcp2/fuzz/corpus/decode_frame/retire_connection_id +1 -0
  186. data/ext/ngtcp2/fuzz/corpus/decode_frame/stop_sending +0 -0
  187. data/ext/ngtcp2/fuzz/corpus/decode_frame/stream +0 -0
  188. data/ext/ngtcp2/fuzz/corpus/decode_frame/stream_data_blocked +0 -0
  189. data/ext/ngtcp2/fuzz/corpus/decode_frame/stream_len +0 -0
  190. data/ext/ngtcp2/fuzz/corpus/decode_frame/streams_blocked +0 -0
  191. data/ext/ngtcp2/fuzz/corpus/ksl/random +0 -0
  192. data/ext/ngtcp2/fuzz/decode_frame.cc +25 -0
  193. data/ext/ngtcp2/fuzz/ksl.cc +77 -0
  194. data/ext/ngtcp2/interop/Dockerfile +39 -0
  195. data/ext/ngtcp2/interop/run_endpoint.sh +93 -0
  196. data/ext/ngtcp2/lib/CMakeLists.txt +110 -0
  197. data/ext/ngtcp2/lib/Makefile.am +122 -0
  198. data/ext/ngtcp2/lib/includes/CMakeLists.txt +4 -0
  199. data/ext/ngtcp2/lib/includes/Makefile.am +25 -0
  200. data/ext/ngtcp2/lib/includes/ngtcp2/ngtcp2.h +5843 -0
  201. data/ext/ngtcp2/lib/includes/ngtcp2/version.h.in +51 -0
  202. data/ext/ngtcp2/lib/libngtcp2.pc.in +33 -0
  203. data/ext/ngtcp2/lib/ngtcp2_acktr.c +335 -0
  204. data/ext/ngtcp2/lib/ngtcp2_acktr.h +221 -0
  205. data/ext/ngtcp2/lib/ngtcp2_addr.c +117 -0
  206. data/ext/ngtcp2/lib/ngtcp2_addr.h +69 -0
  207. data/ext/ngtcp2/lib/ngtcp2_balloc.c +90 -0
  208. data/ext/ngtcp2/lib/ngtcp2_balloc.h +91 -0
  209. data/ext/ngtcp2/lib/ngtcp2_bbr.c +693 -0
  210. data/ext/ngtcp2/lib/ngtcp2_bbr.h +157 -0
  211. data/ext/ngtcp2/lib/ngtcp2_bbr2.c +1490 -0
  212. data/ext/ngtcp2/lib/ngtcp2_bbr2.h +149 -0
  213. data/ext/ngtcp2/lib/ngtcp2_buf.c +56 -0
  214. data/ext/ngtcp2/lib/ngtcp2_buf.h +108 -0
  215. data/ext/ngtcp2/lib/ngtcp2_cc.c +616 -0
  216. data/ext/ngtcp2/lib/ngtcp2_cc.h +422 -0
  217. data/ext/ngtcp2/lib/ngtcp2_cid.c +147 -0
  218. data/ext/ngtcp2/lib/ngtcp2_cid.h +175 -0
  219. data/ext/ngtcp2/lib/ngtcp2_conn.c +13731 -0
  220. data/ext/ngtcp2/lib/ngtcp2_conn.h +1119 -0
  221. data/ext/ngtcp2/lib/ngtcp2_conn_stat.h +131 -0
  222. data/ext/ngtcp2/lib/ngtcp2_conv.c +291 -0
  223. data/ext/ngtcp2/lib/ngtcp2_conv.h +208 -0
  224. data/ext/ngtcp2/lib/ngtcp2_crypto.c +895 -0
  225. data/ext/ngtcp2/lib/ngtcp2_crypto.h +148 -0
  226. data/ext/ngtcp2/lib/ngtcp2_err.c +154 -0
  227. data/ext/ngtcp2/lib/ngtcp2_err.h +34 -0
  228. data/ext/ngtcp2/lib/ngtcp2_gaptr.c +167 -0
  229. data/ext/ngtcp2/lib/ngtcp2_gaptr.h +98 -0
  230. data/ext/ngtcp2/lib/ngtcp2_idtr.c +79 -0
  231. data/ext/ngtcp2/lib/ngtcp2_idtr.h +89 -0
  232. data/ext/ngtcp2/lib/ngtcp2_ksl.c +819 -0
  233. data/ext/ngtcp2/lib/ngtcp2_ksl.h +345 -0
  234. data/ext/ngtcp2/lib/ngtcp2_log.c +822 -0
  235. data/ext/ngtcp2/lib/ngtcp2_log.h +123 -0
  236. data/ext/ngtcp2/lib/ngtcp2_macro.h +58 -0
  237. data/ext/ngtcp2/lib/ngtcp2_map.c +336 -0
  238. data/ext/ngtcp2/lib/ngtcp2_map.h +136 -0
  239. data/ext/ngtcp2/lib/ngtcp2_mem.c +113 -0
  240. data/ext/ngtcp2/lib/ngtcp2_mem.h +72 -0
  241. data/ext/ngtcp2/lib/ngtcp2_net.h +136 -0
  242. data/ext/ngtcp2/lib/ngtcp2_objalloc.c +40 -0
  243. data/ext/ngtcp2/lib/ngtcp2_objalloc.h +140 -0
  244. data/ext/ngtcp2/lib/ngtcp2_opl.c +46 -0
  245. data/ext/ngtcp2/lib/ngtcp2_opl.h +65 -0
  246. data/ext/ngtcp2/lib/ngtcp2_path.c +77 -0
  247. data/ext/ngtcp2/lib/ngtcp2_path.h +49 -0
  248. data/ext/ngtcp2/lib/ngtcp2_pkt.c +2527 -0
  249. data/ext/ngtcp2/lib/ngtcp2_pkt.h +1235 -0
  250. data/ext/ngtcp2/lib/ngtcp2_pmtud.c +160 -0
  251. data/ext/ngtcp2/lib/ngtcp2_pmtud.h +123 -0
  252. data/ext/ngtcp2/lib/ngtcp2_ppe.c +230 -0
  253. data/ext/ngtcp2/lib/ngtcp2_ppe.h +153 -0
  254. data/ext/ngtcp2/lib/ngtcp2_pq.c +164 -0
  255. data/ext/ngtcp2/lib/ngtcp2_pq.h +126 -0
  256. data/ext/ngtcp2/lib/ngtcp2_pv.c +172 -0
  257. data/ext/ngtcp2/lib/ngtcp2_pv.h +194 -0
  258. data/ext/ngtcp2/lib/ngtcp2_qlog.c +1219 -0
  259. data/ext/ngtcp2/lib/ngtcp2_qlog.h +161 -0
  260. data/ext/ngtcp2/lib/ngtcp2_range.c +61 -0
  261. data/ext/ngtcp2/lib/ngtcp2_range.h +80 -0
  262. data/ext/ngtcp2/lib/ngtcp2_rcvry.h +40 -0
  263. data/ext/ngtcp2/lib/ngtcp2_ringbuf.c +121 -0
  264. data/ext/ngtcp2/lib/ngtcp2_ringbuf.h +132 -0
  265. data/ext/ngtcp2/lib/ngtcp2_rob.c +319 -0
  266. data/ext/ngtcp2/lib/ngtcp2_rob.h +197 -0
  267. data/ext/ngtcp2/lib/ngtcp2_rst.c +138 -0
  268. data/ext/ngtcp2/lib/ngtcp2_rst.h +86 -0
  269. data/ext/ngtcp2/lib/ngtcp2_rtb.c +1676 -0
  270. data/ext/ngtcp2/lib/ngtcp2_rtb.h +468 -0
  271. data/ext/ngtcp2/lib/ngtcp2_str.c +233 -0
  272. data/ext/ngtcp2/lib/ngtcp2_str.h +94 -0
  273. data/ext/ngtcp2/lib/ngtcp2_strm.c +698 -0
  274. data/ext/ngtcp2/lib/ngtcp2_strm.h +310 -0
  275. data/ext/ngtcp2/lib/ngtcp2_unreachable.c +71 -0
  276. data/ext/ngtcp2/lib/ngtcp2_unreachable.h +46 -0
  277. data/ext/ngtcp2/lib/ngtcp2_vec.c +243 -0
  278. data/ext/ngtcp2/lib/ngtcp2_vec.h +120 -0
  279. data/ext/ngtcp2/lib/ngtcp2_version.c +39 -0
  280. data/ext/ngtcp2/lib/ngtcp2_window_filter.c +99 -0
  281. data/ext/ngtcp2/lib/ngtcp2_window_filter.h +65 -0
  282. data/ext/ngtcp2/m4/ax_check_compile_flag.m4 +74 -0
  283. data/ext/ngtcp2/m4/ax_cxx_compile_stdcxx.m4 +1009 -0
  284. data/ext/ngtcp2/tests/CMakeLists.txt +68 -0
  285. data/ext/ngtcp2/tests/Makefile.am +94 -0
  286. data/ext/ngtcp2/tests/main.c +358 -0
  287. data/ext/ngtcp2/tests/ngtcp2_acktr_test.c +367 -0
  288. data/ext/ngtcp2/tests/ngtcp2_acktr_test.h +37 -0
  289. data/ext/ngtcp2/tests/ngtcp2_conn_test.c +9821 -0
  290. data/ext/ngtcp2/tests/ngtcp2_conn_test.h +104 -0
  291. data/ext/ngtcp2/tests/ngtcp2_conv_test.c +430 -0
  292. data/ext/ngtcp2/tests/ngtcp2_conv_test.h +46 -0
  293. data/ext/ngtcp2/tests/ngtcp2_crypto_test.c +667 -0
  294. data/ext/ngtcp2/tests/ngtcp2_crypto_test.h +35 -0
  295. data/ext/ngtcp2/tests/ngtcp2_gaptr_test.c +127 -0
  296. data/ext/ngtcp2/tests/ngtcp2_gaptr_test.h +36 -0
  297. data/ext/ngtcp2/tests/ngtcp2_idtr_test.c +79 -0
  298. data/ext/ngtcp2/tests/ngtcp2_idtr_test.h +34 -0
  299. data/ext/ngtcp2/tests/ngtcp2_ksl_test.c +502 -0
  300. data/ext/ngtcp2/tests/ngtcp2_ksl_test.h +39 -0
  301. data/ext/ngtcp2/tests/ngtcp2_map_test.c +206 -0
  302. data/ext/ngtcp2/tests/ngtcp2_map_test.h +38 -0
  303. data/ext/ngtcp2/tests/ngtcp2_pkt_test.c +1645 -0
  304. data/ext/ngtcp2/tests/ngtcp2_pkt_test.h +68 -0
  305. data/ext/ngtcp2/tests/ngtcp2_pmtud_test.c +153 -0
  306. data/ext/ngtcp2/tests/ngtcp2_pmtud_test.h +34 -0
  307. data/ext/ngtcp2/tests/ngtcp2_pv_test.c +129 -0
  308. data/ext/ngtcp2/tests/ngtcp2_pv_test.h +35 -0
  309. data/ext/ngtcp2/tests/ngtcp2_range_test.c +105 -0
  310. data/ext/ngtcp2/tests/ngtcp2_range_test.h +36 -0
  311. data/ext/ngtcp2/tests/ngtcp2_ringbuf_test.c +91 -0
  312. data/ext/ngtcp2/tests/ngtcp2_ringbuf_test.h +35 -0
  313. data/ext/ngtcp2/tests/ngtcp2_rob_test.c +552 -0
  314. data/ext/ngtcp2/tests/ngtcp2_rob_test.h +37 -0
  315. data/ext/ngtcp2/tests/ngtcp2_rtb_test.c +470 -0
  316. data/ext/ngtcp2/tests/ngtcp2_rtb_test.h +38 -0
  317. data/ext/ngtcp2/tests/ngtcp2_str_test.c +96 -0
  318. data/ext/ngtcp2/tests/ngtcp2_str_test.h +36 -0
  319. data/ext/ngtcp2/tests/ngtcp2_strm_test.c +575 -0
  320. data/ext/ngtcp2/tests/ngtcp2_strm_test.h +36 -0
  321. data/ext/ngtcp2/tests/ngtcp2_test_helper.c +404 -0
  322. data/ext/ngtcp2/tests/ngtcp2_test_helper.h +191 -0
  323. data/ext/ngtcp2/tests/ngtcp2_vec_test.c +426 -0
  324. data/ext/ngtcp2/tests/ngtcp2_vec_test.h +36 -0
  325. data/ext/ngtcp2/third-party/CMakeLists.txt +34 -0
  326. data/ext/ngtcp2/third-party/Makefile.am +31 -0
  327. data/ext/ngtcp2/third-party/http-parser/AUTHORS +68 -0
  328. data/ext/ngtcp2/third-party/http-parser/LICENSE-MIT +23 -0
  329. data/ext/ngtcp2/third-party/http-parser/Makefile +157 -0
  330. data/ext/ngtcp2/third-party/http-parser/README.md +246 -0
  331. data/ext/ngtcp2/third-party/http-parser/bench.c +111 -0
  332. data/ext/ngtcp2/third-party/http-parser/contrib/parsertrace.c +160 -0
  333. data/ext/ngtcp2/third-party/http-parser/contrib/url_parser.c +47 -0
  334. data/ext/ngtcp2/third-party/http-parser/http_parser.c +2419 -0
  335. data/ext/ngtcp2/third-party/http-parser/http_parser.gyp +111 -0
  336. data/ext/ngtcp2/third-party/http-parser/http_parser.h +431 -0
  337. data/ext/ngtcp2/third-party/http-parser/test.c +4411 -0
  338. data/lib/protocol/quic/version.rb +10 -0
  339. data/lib/protocol/quic.rb +9 -0
  340. data/license.md +21 -0
  341. data.tar.gz.sig +1 -0
  342. metadata +424 -0
  343. metadata.gz.sig +1 -0
@@ -0,0 +1,1645 @@
1
+ /*
2
+ * ngtcp2
3
+ *
4
+ * Copyright (c) 2017 ngtcp2 contributors
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining
7
+ * a copy of this software and associated documentation files (the
8
+ * "Software"), to deal in the Software without restriction, including
9
+ * without limitation the rights to use, copy, modify, merge, publish,
10
+ * distribute, sublicense, and/or sell copies of the Software, and to
11
+ * permit persons to whom the Software is furnished to do so, subject to
12
+ * the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be
15
+ * included in all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+ */
25
+ #include "ngtcp2_pkt_test.h"
26
+
27
+ #include <CUnit/CUnit.h>
28
+
29
+ #include "ngtcp2_pkt.h"
30
+ #include "ngtcp2_test_helper.h"
31
+ #include "ngtcp2_conv.h"
32
+ #include "ngtcp2_cid.h"
33
+ #include "ngtcp2_str.h"
34
+ #include "ngtcp2_vec.h"
35
+
36
+ static int null_retry_encrypt(uint8_t *dest, const ngtcp2_crypto_aead *aead,
37
+ const ngtcp2_crypto_aead_ctx *aead_ctx,
38
+ const uint8_t *plaintext, size_t plaintextlen,
39
+ const uint8_t *nonce, size_t noncelen,
40
+ const uint8_t *aad, size_t aadlen) {
41
+ (void)dest;
42
+ (void)aead;
43
+ (void)aead_ctx;
44
+ (void)plaintext;
45
+ (void)plaintextlen;
46
+ (void)nonce;
47
+ (void)noncelen;
48
+ (void)aad;
49
+ (void)aadlen;
50
+
51
+ if (plaintextlen && plaintext != dest) {
52
+ memcpy(dest, plaintext, plaintextlen);
53
+ }
54
+ memset(dest + plaintextlen, 0, NGTCP2_RETRY_TAGLEN);
55
+
56
+ return 0;
57
+ }
58
+
59
+ void test_ngtcp2_pkt_decode_version_cid(void) {
60
+ uint8_t buf[NGTCP2_MAX_UDP_PAYLOAD_SIZE];
61
+ ngtcp2_version_cid vc;
62
+ int rv;
63
+ uint8_t *p;
64
+
65
+ /* Supported QUIC version */
66
+ p = buf;
67
+ *p++ = NGTCP2_HEADER_FORM_BIT;
68
+ p = ngtcp2_put_uint32be(p, NGTCP2_PROTO_VER_V1);
69
+ *p++ = NGTCP2_MAX_CIDLEN;
70
+ p = ngtcp2_setmem(p, 0xf1, NGTCP2_MAX_CIDLEN);
71
+ *p++ = NGTCP2_MAX_CIDLEN - 1;
72
+ p = ngtcp2_setmem(p, 0xf2, NGTCP2_MAX_CIDLEN - 1);
73
+
74
+ rv = ngtcp2_pkt_decode_version_cid(&vc, buf, (size_t)(p - buf), 0);
75
+
76
+ CU_ASSERT(0 == rv);
77
+ CU_ASSERT(NGTCP2_PROTO_VER_V1 == vc.version);
78
+ CU_ASSERT(NGTCP2_MAX_CIDLEN == vc.dcidlen);
79
+ CU_ASSERT(&buf[6] == vc.dcid);
80
+ CU_ASSERT(NGTCP2_MAX_CIDLEN - 1 == vc.scidlen);
81
+ CU_ASSERT(&buf[6 + NGTCP2_MAX_CIDLEN + 1] == vc.scid);
82
+
83
+ /* Unsupported QUIC version */
84
+ memset(buf, 0, sizeof(buf));
85
+ p = buf;
86
+ *p++ = NGTCP2_HEADER_FORM_BIT;
87
+ p = ngtcp2_put_uint32be(p, 0xffffff00);
88
+ *p++ = NGTCP2_MAX_CIDLEN;
89
+ p = ngtcp2_setmem(p, 0xf1, NGTCP2_MAX_CIDLEN);
90
+ *p++ = NGTCP2_MAX_CIDLEN - 1;
91
+ ngtcp2_setmem(p, 0xf2, NGTCP2_MAX_CIDLEN - 1);
92
+
93
+ rv = ngtcp2_pkt_decode_version_cid(&vc, buf, sizeof(buf), 0);
94
+
95
+ CU_ASSERT(NGTCP2_ERR_VERSION_NEGOTIATION == rv);
96
+ CU_ASSERT(0xffffff00 == vc.version);
97
+ CU_ASSERT(NGTCP2_MAX_CIDLEN == vc.dcidlen);
98
+ CU_ASSERT(&buf[6] == vc.dcid);
99
+ CU_ASSERT(NGTCP2_MAX_CIDLEN - 1 == vc.scidlen);
100
+ CU_ASSERT(&buf[6 + NGTCP2_MAX_CIDLEN + 1] == vc.scid);
101
+
102
+ /* Unsupported QUIC version with UDP payload size < 1200 */
103
+ p = buf;
104
+ *p++ = NGTCP2_HEADER_FORM_BIT;
105
+ p = ngtcp2_put_uint32be(p, 0xffffff00);
106
+ *p++ = NGTCP2_MAX_CIDLEN;
107
+ p = ngtcp2_setmem(p, 0xf1, NGTCP2_MAX_CIDLEN);
108
+ *p++ = NGTCP2_MAX_CIDLEN - 1;
109
+ p = ngtcp2_setmem(p, 0xf2, NGTCP2_MAX_CIDLEN - 1);
110
+
111
+ rv = ngtcp2_pkt_decode_version_cid(&vc, buf, (size_t)(p - buf), 0);
112
+
113
+ CU_ASSERT(NGTCP2_ERR_INVALID_ARGUMENT == rv);
114
+
115
+ /* Supported QUIC version with long CID */
116
+ p = buf;
117
+ *p++ = NGTCP2_HEADER_FORM_BIT;
118
+ p = ngtcp2_put_uint32be(p, NGTCP2_PROTO_VER_V1);
119
+ *p++ = NGTCP2_MAX_CIDLEN + 1;
120
+ p = ngtcp2_setmem(p, 0xf1, NGTCP2_MAX_CIDLEN + 1);
121
+ *p++ = NGTCP2_MAX_CIDLEN;
122
+ p = ngtcp2_setmem(p, 0xf2, NGTCP2_MAX_CIDLEN);
123
+
124
+ rv = ngtcp2_pkt_decode_version_cid(&vc, buf, (size_t)(p - buf), 0);
125
+
126
+ CU_ASSERT(NGTCP2_ERR_INVALID_ARGUMENT == rv);
127
+
128
+ /* Unsupported QUIC version with long CID */
129
+ memset(buf, 0, sizeof(buf));
130
+ p = buf;
131
+ *p++ = NGTCP2_HEADER_FORM_BIT;
132
+ p = ngtcp2_put_uint32be(p, 0xffffff00);
133
+ *p++ = NGTCP2_MAX_CIDLEN + 1;
134
+ p = ngtcp2_setmem(p, 0xf1, NGTCP2_MAX_CIDLEN + 1);
135
+ *p++ = NGTCP2_MAX_CIDLEN;
136
+ ngtcp2_setmem(p, 0xf2, NGTCP2_MAX_CIDLEN);
137
+
138
+ rv = ngtcp2_pkt_decode_version_cid(&vc, buf, sizeof(buf), 0);
139
+
140
+ CU_ASSERT(NGTCP2_ERR_VERSION_NEGOTIATION == rv);
141
+ CU_ASSERT(0xffffff00 == vc.version);
142
+ CU_ASSERT(NGTCP2_MAX_CIDLEN + 1 == vc.dcidlen);
143
+ CU_ASSERT(&buf[6] == vc.dcid);
144
+ CU_ASSERT(NGTCP2_MAX_CIDLEN == vc.scidlen);
145
+ CU_ASSERT(&buf[6 + NGTCP2_MAX_CIDLEN + 1 + 1] == vc.scid);
146
+
147
+ /* VN */
148
+ p = buf;
149
+ *p++ = NGTCP2_HEADER_FORM_BIT;
150
+ p = ngtcp2_put_uint32be(p, 0);
151
+ *p++ = NGTCP2_MAX_CIDLEN;
152
+ p = ngtcp2_setmem(p, 0xf1, NGTCP2_MAX_CIDLEN);
153
+ *p++ = NGTCP2_MAX_CIDLEN - 1;
154
+ p = ngtcp2_setmem(p, 0xf2, NGTCP2_MAX_CIDLEN - 1);
155
+
156
+ rv = ngtcp2_pkt_decode_version_cid(&vc, buf, (size_t)(p - buf), 0);
157
+
158
+ CU_ASSERT(0 == rv);
159
+ CU_ASSERT(0 == vc.version);
160
+ CU_ASSERT(NGTCP2_MAX_CIDLEN == vc.dcidlen);
161
+ CU_ASSERT(&buf[6] == vc.dcid);
162
+ CU_ASSERT(NGTCP2_MAX_CIDLEN - 1 == vc.scidlen);
163
+ CU_ASSERT(&buf[6 + NGTCP2_MAX_CIDLEN + 1] == vc.scid);
164
+
165
+ /* VN with long CID */
166
+ p = buf;
167
+ *p++ = NGTCP2_HEADER_FORM_BIT;
168
+ p = ngtcp2_put_uint32be(p, 0);
169
+ *p++ = NGTCP2_MAX_CIDLEN + 1;
170
+ p = ngtcp2_setmem(p, 0xf1, NGTCP2_MAX_CIDLEN + 1);
171
+ *p++ = NGTCP2_MAX_CIDLEN;
172
+ p = ngtcp2_setmem(p, 0xf2, NGTCP2_MAX_CIDLEN);
173
+
174
+ rv = ngtcp2_pkt_decode_version_cid(&vc, buf, (size_t)(p - buf), 0);
175
+
176
+ CU_ASSERT(0 == rv);
177
+ CU_ASSERT(0 == vc.version);
178
+ CU_ASSERT(NGTCP2_MAX_CIDLEN + 1 == vc.dcidlen);
179
+ CU_ASSERT(&buf[6] == vc.dcid);
180
+ CU_ASSERT(NGTCP2_MAX_CIDLEN == vc.scidlen);
181
+ CU_ASSERT(&buf[6 + NGTCP2_MAX_CIDLEN + 1 + 1] == vc.scid);
182
+
183
+ /* Malformed Long packet */
184
+ p = buf;
185
+ *p++ = NGTCP2_HEADER_FORM_BIT;
186
+ p = ngtcp2_put_uint32be(p, NGTCP2_PROTO_VER_V1);
187
+ *p++ = NGTCP2_MAX_CIDLEN;
188
+ p = ngtcp2_setmem(p, 0xf1, NGTCP2_MAX_CIDLEN);
189
+ *p++ = NGTCP2_MAX_CIDLEN - 1;
190
+ p = ngtcp2_setmem(p, 0xf2, NGTCP2_MAX_CIDLEN - 1);
191
+ --p;
192
+
193
+ rv = ngtcp2_pkt_decode_version_cid(&vc, buf, (size_t)(p - buf), 0);
194
+
195
+ CU_ASSERT(NGTCP2_ERR_INVALID_ARGUMENT == rv);
196
+
197
+ /* Short packet */
198
+ p = buf;
199
+ *p++ = 0;
200
+ p = ngtcp2_setmem(p, 0xf1, NGTCP2_MAX_CIDLEN);
201
+
202
+ rv = ngtcp2_pkt_decode_version_cid(&vc, buf, (size_t)(p - buf),
203
+ NGTCP2_MAX_CIDLEN);
204
+
205
+ CU_ASSERT(0 == rv);
206
+ CU_ASSERT(0 == vc.version);
207
+ CU_ASSERT(&buf[1] == vc.dcid);
208
+ CU_ASSERT(NGTCP2_MAX_CIDLEN == vc.dcidlen);
209
+ CU_ASSERT(NULL == vc.scid);
210
+ CU_ASSERT(0 == vc.scidlen);
211
+
212
+ /* Malformed Short packet */
213
+ p = buf;
214
+ *p++ = 0;
215
+ p = ngtcp2_setmem(p, 0xf1, NGTCP2_MAX_CIDLEN);
216
+ --p;
217
+
218
+ rv = ngtcp2_pkt_decode_version_cid(&vc, buf, (size_t)(p - buf),
219
+ NGTCP2_MAX_CIDLEN);
220
+
221
+ CU_ASSERT(NGTCP2_ERR_INVALID_ARGUMENT == rv);
222
+ }
223
+
224
+ void test_ngtcp2_pkt_decode_hd_long(void) {
225
+ ngtcp2_pkt_hd hd, nhd;
226
+ uint8_t buf[256];
227
+ ngtcp2_ssize rv;
228
+ ngtcp2_cid dcid, scid;
229
+ size_t len;
230
+
231
+ dcid_init(&dcid);
232
+ scid_init(&scid);
233
+
234
+ /* Handshake */
235
+ ngtcp2_pkt_hd_init(&hd, NGTCP2_PKT_FLAG_LONG_FORM, NGTCP2_PKT_HANDSHAKE,
236
+ &dcid, &scid, 0xe1e2e3e4u, 4, NGTCP2_PROTO_VER_V1, 16383);
237
+
238
+ rv = ngtcp2_pkt_encode_hd_long(buf, sizeof(buf), &hd);
239
+
240
+ len = 1 + 4 + 1 + dcid.datalen + 1 + scid.datalen + NGTCP2_PKT_LENGTHLEN + 4;
241
+
242
+ CU_ASSERT((ngtcp2_ssize)len == rv);
243
+ CU_ASSERT(buf[0] & NGTCP2_FIXED_BIT_MASK);
244
+
245
+ rv = pkt_decode_hd_long(&nhd, buf, len);
246
+
247
+ CU_ASSERT((ngtcp2_ssize)len == rv);
248
+ CU_ASSERT(hd.type == nhd.type);
249
+ CU_ASSERT(hd.flags == nhd.flags);
250
+ CU_ASSERT(ngtcp2_cid_eq(&hd.dcid, &nhd.dcid));
251
+ CU_ASSERT(ngtcp2_cid_eq(&hd.scid, &nhd.scid));
252
+ CU_ASSERT(0xe1e2e3e4u == nhd.pkt_num);
253
+ CU_ASSERT(hd.version == nhd.version);
254
+ CU_ASSERT(hd.len == nhd.len);
255
+
256
+ /* Handshake without Fixed Bit set */
257
+ ngtcp2_pkt_hd_init(
258
+ &hd, NGTCP2_PKT_FLAG_LONG_FORM | NGTCP2_PKT_FLAG_FIXED_BIT_CLEAR,
259
+ NGTCP2_PKT_HANDSHAKE, &dcid, &scid, 0xe1e2e3e4u, 4, NGTCP2_PROTO_VER_V1,
260
+ 16383);
261
+
262
+ rv = ngtcp2_pkt_encode_hd_long(buf, sizeof(buf), &hd);
263
+
264
+ len = 1 + 4 + 1 + dcid.datalen + 1 + scid.datalen + NGTCP2_PKT_LENGTHLEN + 4;
265
+
266
+ CU_ASSERT((ngtcp2_ssize)len == rv);
267
+ CU_ASSERT((buf[0] & NGTCP2_FIXED_BIT_MASK) == 0);
268
+
269
+ rv = pkt_decode_hd_long(&nhd, buf, len);
270
+
271
+ CU_ASSERT((ngtcp2_ssize)len == rv);
272
+ CU_ASSERT(hd.type == nhd.type);
273
+ CU_ASSERT(hd.flags == nhd.flags);
274
+ CU_ASSERT(ngtcp2_cid_eq(&hd.dcid, &nhd.dcid));
275
+ CU_ASSERT(ngtcp2_cid_eq(&hd.scid, &nhd.scid));
276
+ CU_ASSERT(0xe1e2e3e4u == nhd.pkt_num);
277
+ CU_ASSERT(hd.version == nhd.version);
278
+ CU_ASSERT(hd.len == nhd.len);
279
+
280
+ /* VN */
281
+ /* Set random packet type */
282
+ ngtcp2_pkt_hd_init(&hd, NGTCP2_PKT_FLAG_LONG_FORM, NGTCP2_PKT_HANDSHAKE,
283
+ &dcid, &scid, 0, 4, NGTCP2_PROTO_VER_V1, 0);
284
+
285
+ rv = ngtcp2_pkt_encode_hd_long(buf, sizeof(buf), &hd);
286
+ /* Set version field to 0 */
287
+ memset(&buf[1], 0, 4);
288
+
289
+ len = 1 + 4 + 1 + dcid.datalen + 1 + scid.datalen;
290
+
291
+ CU_ASSERT((ngtcp2_ssize)len == rv - NGTCP2_PKT_LENGTHLEN - 4 /* pkt_num */);
292
+
293
+ rv = pkt_decode_hd_long(&nhd, buf, len);
294
+
295
+ CU_ASSERT((ngtcp2_ssize)len == rv);
296
+ CU_ASSERT(NGTCP2_PKT_VERSION_NEGOTIATION == nhd.type);
297
+ CU_ASSERT((hd.flags & ~NGTCP2_PKT_FLAG_LONG_FORM) == nhd.flags);
298
+ CU_ASSERT(ngtcp2_cid_eq(&hd.dcid, &nhd.dcid));
299
+ CU_ASSERT(ngtcp2_cid_eq(&hd.scid, &nhd.scid));
300
+ CU_ASSERT(hd.pkt_num == nhd.pkt_num);
301
+ CU_ASSERT(0 == nhd.version);
302
+ CU_ASSERT(hd.len == nhd.len);
303
+ }
304
+
305
+ void test_ngtcp2_pkt_decode_hd_short(void) {
306
+ ngtcp2_pkt_hd hd, nhd;
307
+ uint8_t buf[256];
308
+ ngtcp2_ssize rv;
309
+ size_t expectedlen;
310
+ ngtcp2_cid dcid, zcid;
311
+
312
+ dcid_init(&dcid);
313
+ ngtcp2_cid_zero(&zcid);
314
+
315
+ /* 4 bytes packet number */
316
+ ngtcp2_pkt_hd_init(&hd, NGTCP2_PKT_FLAG_NONE, NGTCP2_PKT_1RTT, &dcid, NULL,
317
+ 0xe1e2e3e4u, 4, 0xd1d2d3d4u, 0);
318
+
319
+ expectedlen = 1 + dcid.datalen + 4;
320
+
321
+ rv = ngtcp2_pkt_encode_hd_short(buf, sizeof(buf), &hd);
322
+
323
+ CU_ASSERT((ngtcp2_ssize)expectedlen == rv);
324
+ CU_ASSERT(buf[0] & NGTCP2_FIXED_BIT_MASK);
325
+
326
+ rv = pkt_decode_hd_short(&nhd, buf, expectedlen, dcid.datalen);
327
+
328
+ CU_ASSERT((ngtcp2_ssize)expectedlen == rv);
329
+ CU_ASSERT(hd.flags == nhd.flags);
330
+ CU_ASSERT(NGTCP2_PKT_1RTT == nhd.type);
331
+ CU_ASSERT(ngtcp2_cid_eq(&dcid, &nhd.dcid));
332
+ CU_ASSERT(ngtcp2_cid_empty(&nhd.scid));
333
+ CU_ASSERT(0xe1e2e3e4u == nhd.pkt_num);
334
+ CU_ASSERT(hd.pkt_numlen == nhd.pkt_numlen);
335
+ CU_ASSERT(0 == nhd.version);
336
+ CU_ASSERT(0 == nhd.len);
337
+
338
+ /* 4 bytes packet number without Fixed Bit set */
339
+ ngtcp2_pkt_hd_init(
340
+ &hd, NGTCP2_PKT_FLAG_NONE | NGTCP2_PKT_FLAG_FIXED_BIT_CLEAR,
341
+ NGTCP2_PKT_1RTT, &dcid, NULL, 0xe1e2e3e4u, 4, 0xd1d2d3d4u, 0);
342
+
343
+ expectedlen = 1 + dcid.datalen + 4;
344
+
345
+ rv = ngtcp2_pkt_encode_hd_short(buf, sizeof(buf), &hd);
346
+
347
+ CU_ASSERT((ngtcp2_ssize)expectedlen == rv);
348
+ CU_ASSERT((buf[0] & NGTCP2_FIXED_BIT_MASK) == 0);
349
+
350
+ rv = pkt_decode_hd_short(&nhd, buf, expectedlen, dcid.datalen);
351
+
352
+ CU_ASSERT((ngtcp2_ssize)expectedlen == rv);
353
+ CU_ASSERT(hd.flags == nhd.flags);
354
+ CU_ASSERT(NGTCP2_PKT_1RTT == nhd.type);
355
+ CU_ASSERT(ngtcp2_cid_eq(&dcid, &nhd.dcid));
356
+ CU_ASSERT(ngtcp2_cid_empty(&nhd.scid));
357
+ CU_ASSERT(0xe1e2e3e4u == nhd.pkt_num);
358
+ CU_ASSERT(hd.pkt_numlen == nhd.pkt_numlen);
359
+ CU_ASSERT(0 == nhd.version);
360
+ CU_ASSERT(0 == nhd.len);
361
+
362
+ /* 2 bytes packet number */
363
+ ngtcp2_pkt_hd_init(&hd, NGTCP2_PKT_FLAG_NONE, NGTCP2_PKT_1RTT, &dcid, NULL,
364
+ 0xe1e2e3e4u, 2, 0xd1d2d3d4u, 0);
365
+
366
+ expectedlen = 1 + dcid.datalen + 2;
367
+
368
+ rv = ngtcp2_pkt_encode_hd_short(buf, sizeof(buf), &hd);
369
+
370
+ CU_ASSERT((ngtcp2_ssize)expectedlen == rv);
371
+
372
+ rv = pkt_decode_hd_short(&nhd, buf, expectedlen, dcid.datalen);
373
+
374
+ CU_ASSERT((ngtcp2_ssize)expectedlen == rv);
375
+ CU_ASSERT(hd.flags == nhd.flags);
376
+ CU_ASSERT(NGTCP2_PKT_1RTT == nhd.type);
377
+ CU_ASSERT(ngtcp2_cid_eq(&dcid, &nhd.dcid));
378
+ CU_ASSERT(ngtcp2_cid_empty(&nhd.scid));
379
+ CU_ASSERT(0xe3e4u == nhd.pkt_num);
380
+ CU_ASSERT(hd.pkt_numlen == nhd.pkt_numlen);
381
+ CU_ASSERT(0 == nhd.version);
382
+ CU_ASSERT(0 == nhd.len);
383
+
384
+ /* 1 byte packet number */
385
+ ngtcp2_pkt_hd_init(&hd, NGTCP2_PKT_FLAG_NONE, NGTCP2_PKT_1RTT, &dcid, NULL,
386
+ 0xe1e2e3e4u, 1, 0xd1d2d3d4u, 0);
387
+
388
+ expectedlen = 1 + dcid.datalen + 1;
389
+
390
+ rv = ngtcp2_pkt_encode_hd_short(buf, sizeof(buf), &hd);
391
+
392
+ CU_ASSERT((ngtcp2_ssize)expectedlen == rv);
393
+
394
+ rv = pkt_decode_hd_short(&nhd, buf, expectedlen, dcid.datalen);
395
+
396
+ CU_ASSERT((ngtcp2_ssize)expectedlen == rv);
397
+ CU_ASSERT(hd.flags == nhd.flags);
398
+ CU_ASSERT(NGTCP2_PKT_1RTT == nhd.type);
399
+ CU_ASSERT(ngtcp2_cid_eq(&dcid, &nhd.dcid));
400
+ CU_ASSERT(ngtcp2_cid_empty(&nhd.scid));
401
+ CU_ASSERT(0xe4 == nhd.pkt_num);
402
+ CU_ASSERT(hd.pkt_numlen == nhd.pkt_numlen);
403
+ CU_ASSERT(0 == nhd.version);
404
+ CU_ASSERT(0 == nhd.len);
405
+
406
+ /* With Key Phase */
407
+ ngtcp2_pkt_hd_init(&hd, NGTCP2_PKT_FLAG_KEY_PHASE, NGTCP2_PKT_1RTT, &dcid,
408
+ NULL, 0xe1e2e3e4u, 4, 0xd1d2d3d4u, 0);
409
+
410
+ expectedlen = 1 + dcid.datalen + 4;
411
+
412
+ rv = ngtcp2_pkt_encode_hd_short(buf, sizeof(buf), &hd);
413
+
414
+ CU_ASSERT((ngtcp2_ssize)expectedlen == rv);
415
+
416
+ rv = pkt_decode_hd_short(&nhd, buf, expectedlen, dcid.datalen);
417
+
418
+ CU_ASSERT((ngtcp2_ssize)expectedlen == rv);
419
+ /* key phase bit is protected by header protection and
420
+ ngtcp2_pkt_decode_hd_short does not decode it. */
421
+ CU_ASSERT(NGTCP2_PKT_FLAG_NONE == nhd.flags);
422
+ CU_ASSERT(NGTCP2_PKT_1RTT == nhd.type);
423
+ CU_ASSERT(ngtcp2_cid_eq(&dcid, &nhd.dcid));
424
+ CU_ASSERT(ngtcp2_cid_empty(&nhd.scid));
425
+ CU_ASSERT(0xe1e2e3e4u == nhd.pkt_num);
426
+ CU_ASSERT(hd.pkt_numlen == nhd.pkt_numlen);
427
+ CU_ASSERT(0 == nhd.version);
428
+ CU_ASSERT(0 == nhd.len);
429
+
430
+ /* With empty DCID */
431
+ ngtcp2_pkt_hd_init(&hd, NGTCP2_PKT_FLAG_NONE, NGTCP2_PKT_1RTT, NULL, NULL,
432
+ 0xe1e2e3e4u, 4, 0xd1d2d3d4u, 0);
433
+
434
+ expectedlen = 1 + 4;
435
+
436
+ rv = ngtcp2_pkt_encode_hd_short(buf, sizeof(buf), &hd);
437
+
438
+ CU_ASSERT((ngtcp2_ssize)expectedlen == rv);
439
+
440
+ rv = pkt_decode_hd_short(&nhd, buf, expectedlen, 0);
441
+
442
+ CU_ASSERT((ngtcp2_ssize)expectedlen == rv);
443
+ CU_ASSERT(hd.flags == nhd.flags);
444
+ CU_ASSERT(NGTCP2_PKT_1RTT == nhd.type);
445
+ CU_ASSERT(ngtcp2_cid_empty(&nhd.dcid));
446
+ CU_ASSERT(ngtcp2_cid_empty(&nhd.scid));
447
+ CU_ASSERT(0xe1e2e3e4u == nhd.pkt_num);
448
+ CU_ASSERT(hd.pkt_numlen == nhd.pkt_numlen);
449
+ CU_ASSERT(0 == nhd.version);
450
+ CU_ASSERT(0 == nhd.len);
451
+ }
452
+
453
+ void test_ngtcp2_pkt_decode_stream_frame(void) {
454
+ uint8_t buf[256];
455
+ size_t buflen;
456
+ ngtcp2_frame fr;
457
+ ngtcp2_ssize rv;
458
+ size_t expectedlen;
459
+
460
+ /* 32 bits Stream ID + 62 bits Offset + Data Length */
461
+ buflen = ngtcp2_t_encode_stream_frame(buf, NGTCP2_STREAM_LEN_BIT, 0xf1f2f3f4u,
462
+ 0x31f2f3f4f5f6f7f8llu, 0x14);
463
+
464
+ expectedlen = 1 + 8 + 8 + 1 + 20;
465
+
466
+ CU_ASSERT(expectedlen == buflen);
467
+
468
+ rv = ngtcp2_pkt_decode_stream_frame(&fr.stream, buf, buflen);
469
+
470
+ CU_ASSERT((ngtcp2_ssize)expectedlen == rv);
471
+ CU_ASSERT(0 == fr.stream.fin);
472
+ CU_ASSERT(0xf1f2f3f4u == fr.stream.stream_id);
473
+ CU_ASSERT(0x31f2f3f4f5f6f7f8llu == fr.stream.offset);
474
+ CU_ASSERT(1 == fr.stream.datacnt);
475
+ CU_ASSERT(0x14 == fr.stream.data[0].len);
476
+
477
+ /* Cutting 1 bytes from the tail must cause invalid argument
478
+ error */
479
+ rv = ngtcp2_pkt_decode_stream_frame(&fr.stream, buf, buflen - 1);
480
+
481
+ CU_ASSERT(NGTCP2_ERR_FRAME_ENCODING == rv);
482
+
483
+ memset(&fr, 0, sizeof(fr));
484
+
485
+ /* 6 bits Stream ID + no Offset + Data Length */
486
+ buflen = ngtcp2_t_encode_stream_frame(buf, NGTCP2_STREAM_LEN_BIT, 0x31, 0x00,
487
+ 0x14);
488
+
489
+ expectedlen = 1 + 1 + 0 + 1 + 20;
490
+
491
+ CU_ASSERT(expectedlen == buflen);
492
+
493
+ rv = ngtcp2_pkt_decode_stream_frame(&fr.stream, buf, buflen);
494
+
495
+ CU_ASSERT((ngtcp2_ssize)expectedlen == rv);
496
+ CU_ASSERT(0 == fr.stream.fin);
497
+ CU_ASSERT(0x31 == fr.stream.stream_id);
498
+ CU_ASSERT(0x00 == fr.stream.offset);
499
+ CU_ASSERT(1 == fr.stream.datacnt);
500
+ CU_ASSERT(0x14 == fr.stream.data[0].len);
501
+
502
+ /* Cutting 1 bytes from the tail must cause invalid argument
503
+ error */
504
+ rv = ngtcp2_pkt_decode_stream_frame(&fr.stream, buf, buflen - 1);
505
+
506
+ CU_ASSERT(NGTCP2_ERR_FRAME_ENCODING == rv);
507
+
508
+ memset(&fr, 0, sizeof(fr));
509
+
510
+ /* Fin bit set + no Data Length */
511
+ buflen = ngtcp2_t_encode_stream_frame(buf, NGTCP2_STREAM_FIN_BIT, 0x31f2f3f4u,
512
+ 0x00, 0x14);
513
+
514
+ expectedlen = 1 + 4 + 20;
515
+
516
+ CU_ASSERT(expectedlen == buflen);
517
+
518
+ rv = ngtcp2_pkt_decode_stream_frame(&fr.stream, buf, buflen);
519
+
520
+ CU_ASSERT((ngtcp2_ssize)expectedlen == rv);
521
+ CU_ASSERT(1 == fr.stream.fin);
522
+ CU_ASSERT(0x31f2f3f4u == fr.stream.stream_id);
523
+ CU_ASSERT(0x00 == fr.stream.offset);
524
+ CU_ASSERT(1 == fr.stream.datacnt);
525
+ CU_ASSERT(0x14 == fr.stream.data[0].len);
526
+
527
+ memset(&fr, 0, sizeof(fr));
528
+ }
529
+
530
+ void test_ngtcp2_pkt_decode_ack_frame(void) {
531
+ uint8_t buf[256];
532
+ size_t buflen;
533
+ ngtcp2_frame fr;
534
+ ngtcp2_ssize rv;
535
+ size_t expectedlen;
536
+
537
+ /* 62 bits Largest Acknowledged */
538
+ buflen = ngtcp2_t_encode_ack_frame(buf, 0x31f2f3f4f5f6f7f8llu,
539
+ 0x31e2e3e4e5e6e7e8llu, 99,
540
+ 0x31d2d3d4d5d6d7d8llu);
541
+
542
+ expectedlen = 1 + 8 + 1 + 1 + 8 + 2 + 8;
543
+
544
+ CU_ASSERT(expectedlen == buflen);
545
+
546
+ rv = ngtcp2_pkt_decode_ack_frame(&fr.ack, buf, buflen);
547
+
548
+ CU_ASSERT((ngtcp2_ssize)expectedlen == rv);
549
+ CU_ASSERT(0x31f2f3f4f5f6f7f8llu == fr.ack.largest_ack);
550
+ CU_ASSERT(1 == fr.ack.rangecnt);
551
+ CU_ASSERT(0x31e2e3e4e5e6e7e8llu == fr.ack.first_ack_range);
552
+ CU_ASSERT(99 == fr.ack.ranges[0].gap);
553
+ CU_ASSERT(0x31d2d3d4d5d6d7d8llu == fr.ack.ranges[0].len);
554
+ }
555
+
556
+ void test_ngtcp2_pkt_decode_padding_frame(void) {
557
+ uint8_t buf[256];
558
+ ngtcp2_frame fr;
559
+ ngtcp2_ssize rv;
560
+ size_t paddinglen = 31;
561
+
562
+ memset(buf, 0, paddinglen);
563
+ buf[paddinglen] = NGTCP2_FRAME_STREAM;
564
+
565
+ rv = ngtcp2_pkt_decode_padding_frame(&fr.padding, buf, paddinglen + 1);
566
+
567
+ CU_ASSERT((ngtcp2_ssize)paddinglen == rv);
568
+ CU_ASSERT((size_t)31 == fr.padding.len);
569
+ }
570
+
571
+ void test_ngtcp2_pkt_encode_stream_frame(void) {
572
+ const uint8_t data[] = "0123456789abcdef0";
573
+ uint8_t buf[256];
574
+ ngtcp2_frame fr, nfr;
575
+ ngtcp2_ssize rv;
576
+ size_t framelen;
577
+ size_t i;
578
+
579
+ /* 32 bits Stream ID + 62 bits Offset + Data Length */
580
+ fr.type = NGTCP2_FRAME_STREAM;
581
+ fr.stream.fin = 0;
582
+ fr.stream.stream_id = 0xf1f2f3f4u;
583
+ fr.stream.offset = 0x31f2f3f4f5f6f7f8llu;
584
+ fr.stream.datacnt = 1;
585
+ fr.stream.data[0].len = strsize(data);
586
+ fr.stream.data[0].base = (uint8_t *)data;
587
+
588
+ framelen = 1 + 8 + 8 + 1 + 17;
589
+
590
+ rv = ngtcp2_pkt_encode_stream_frame(buf, sizeof(buf), &fr.stream);
591
+
592
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
593
+
594
+ rv = ngtcp2_pkt_decode_stream_frame(&nfr.stream, buf, framelen);
595
+
596
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
597
+ CU_ASSERT(fr.type == nfr.type);
598
+ CU_ASSERT((NGTCP2_STREAM_OFF_BIT | NGTCP2_STREAM_LEN_BIT) ==
599
+ nfr.stream.flags);
600
+ CU_ASSERT(fr.stream.fin == nfr.stream.fin);
601
+ CU_ASSERT(fr.stream.stream_id == nfr.stream.stream_id);
602
+ CU_ASSERT(fr.stream.offset == nfr.stream.offset);
603
+ CU_ASSERT(1 == nfr.stream.datacnt);
604
+ CU_ASSERT(fr.stream.data[0].len == nfr.stream.data[0].len);
605
+ CU_ASSERT(0 == memcmp(fr.stream.data[0].base, nfr.stream.data[0].base,
606
+ fr.stream.data[0].len));
607
+
608
+ memset(&nfr, 0, sizeof(nfr));
609
+
610
+ /* 6 bits Stream ID + No Offset + Data Length */
611
+ fr.type = NGTCP2_FRAME_STREAM;
612
+ fr.stream.fin = 0;
613
+ fr.stream.stream_id = 0x31;
614
+ fr.stream.offset = 0;
615
+ fr.stream.datacnt = 1;
616
+ fr.stream.data[0].len = strsize(data);
617
+ fr.stream.data[0].base = (uint8_t *)data;
618
+
619
+ framelen = 1 + 1 + 1 + 17;
620
+
621
+ rv = ngtcp2_pkt_encode_stream_frame(buf, sizeof(buf), &fr.stream);
622
+
623
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
624
+
625
+ rv = ngtcp2_pkt_decode_stream_frame(&nfr.stream, buf, framelen);
626
+
627
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
628
+ CU_ASSERT(fr.type == nfr.type);
629
+ CU_ASSERT(NGTCP2_STREAM_LEN_BIT == nfr.stream.flags);
630
+ CU_ASSERT(fr.stream.fin == nfr.stream.fin);
631
+ CU_ASSERT(fr.stream.stream_id == nfr.stream.stream_id);
632
+ CU_ASSERT(fr.stream.offset == nfr.stream.offset);
633
+ CU_ASSERT(1 == nfr.stream.datacnt);
634
+ CU_ASSERT(fr.stream.data[0].len == nfr.stream.data[0].len);
635
+ CU_ASSERT(0 == memcmp(fr.stream.data[0].base, nfr.stream.data[0].base,
636
+ fr.stream.data[0].len));
637
+
638
+ memset(&nfr, 0, sizeof(nfr));
639
+
640
+ /* Fin + 32 bits Stream ID + 62 bits Offset + Data Length */
641
+ fr.type = NGTCP2_FRAME_STREAM;
642
+ fr.stream.fin = 1;
643
+ fr.stream.stream_id = 0xf1f2f3f4u;
644
+ fr.stream.offset = 0x31f2f3f4f5f6f7f8llu;
645
+ fr.stream.datacnt = 1;
646
+ fr.stream.data[0].len = strsize(data);
647
+ fr.stream.data[0].base = (uint8_t *)data;
648
+
649
+ framelen = 1 + 8 + 8 + 1 + 17;
650
+
651
+ rv = ngtcp2_pkt_encode_stream_frame(buf, sizeof(buf), &fr.stream);
652
+
653
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
654
+
655
+ rv = ngtcp2_pkt_decode_stream_frame(&nfr.stream, buf, framelen);
656
+
657
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
658
+ CU_ASSERT(fr.type == nfr.type);
659
+ CU_ASSERT((NGTCP2_STREAM_FIN_BIT | NGTCP2_STREAM_OFF_BIT |
660
+ NGTCP2_STREAM_LEN_BIT) == nfr.stream.flags);
661
+ CU_ASSERT(fr.stream.fin == nfr.stream.fin);
662
+ CU_ASSERT(fr.stream.stream_id == nfr.stream.stream_id);
663
+ CU_ASSERT(fr.stream.offset == nfr.stream.offset);
664
+ CU_ASSERT(1 == nfr.stream.datacnt);
665
+ CU_ASSERT(fr.stream.data[0].len == nfr.stream.data[0].len);
666
+ CU_ASSERT(0 == memcmp(fr.stream.data[0].base, nfr.stream.data[0].base,
667
+ fr.stream.data[0].len));
668
+
669
+ /* Make sure that we check the length properly. */
670
+ for (i = 1; i < framelen; ++i) {
671
+ rv = ngtcp2_pkt_decode_stream_frame(&nfr.stream, buf, i);
672
+
673
+ CU_ASSERT(NGTCP2_ERR_FRAME_ENCODING == rv);
674
+ }
675
+
676
+ memset(&nfr, 0, sizeof(nfr));
677
+
678
+ /* NOBUF: Fin + 32 bits Stream ID + 62 bits Offset + Data Length */
679
+ fr.type = NGTCP2_FRAME_STREAM;
680
+ fr.stream.fin = 1;
681
+ fr.stream.stream_id = 0xf1f2f3f4u;
682
+ fr.stream.offset = 0x31f2f3f4f5f6f7f8llu;
683
+ fr.stream.datacnt = 1;
684
+ fr.stream.data[0].len = strsize(data);
685
+ fr.stream.data[0].base = (uint8_t *)data;
686
+
687
+ framelen = 1 + 8 + 8 + 1 + 17;
688
+
689
+ rv = ngtcp2_pkt_encode_stream_frame(buf, framelen - 1, &fr.stream);
690
+
691
+ CU_ASSERT(NGTCP2_ERR_NOBUF == rv);
692
+ }
693
+
694
+ void test_ngtcp2_pkt_encode_ack_frame(void) {
695
+ uint8_t buf[256];
696
+ ngtcp2_max_frame mfr, nmfr;
697
+ ngtcp2_frame *fr = &mfr.fr, *nfr = &nmfr.fr;
698
+ ngtcp2_ssize rv;
699
+ size_t framelen;
700
+ size_t i;
701
+ ngtcp2_ack_range *ranges;
702
+
703
+ /* 0 Num Blocks */
704
+ fr->type = NGTCP2_FRAME_ACK;
705
+ fr->ack.largest_ack = 0xf1f2f3f4llu;
706
+ fr->ack.first_ack_range = 0;
707
+ fr->ack.ack_delay = 0;
708
+ fr->ack.rangecnt = 0;
709
+
710
+ framelen = 1 + 8 + 1 + 1 + 1;
711
+
712
+ rv = ngtcp2_pkt_encode_ack_frame(buf, sizeof(buf), &fr->ack);
713
+
714
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
715
+
716
+ rv = ngtcp2_pkt_decode_ack_frame(&nfr->ack, buf, framelen);
717
+
718
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
719
+ CU_ASSERT(fr->type == nfr->type);
720
+ CU_ASSERT(fr->ack.largest_ack == nfr->ack.largest_ack);
721
+ CU_ASSERT(fr->ack.ack_delay == nfr->ack.ack_delay);
722
+ CU_ASSERT(fr->ack.rangecnt == nfr->ack.rangecnt);
723
+
724
+ memset(&nmfr, 0, sizeof(nmfr));
725
+
726
+ /* 2 Num Blocks */
727
+ fr->type = NGTCP2_FRAME_ACK;
728
+ fr->ack.largest_ack = 0xf1f2f3f4llu;
729
+ fr->ack.first_ack_range = 0xe1e2e3e4llu;
730
+ fr->ack.ack_delay = 0xf1f2;
731
+ fr->ack.rangecnt = 2;
732
+ ranges = fr->ack.ranges;
733
+ ranges[0].gap = 255;
734
+ ranges[0].len = 0xd1d2d3d4llu;
735
+ ranges[1].gap = 1;
736
+ ranges[1].len = 0xd1d2d3d4llu;
737
+
738
+ framelen = 1 + 8 + 4 + 1 + 8 + (2 + 8) + (1 + 8);
739
+
740
+ rv = ngtcp2_pkt_encode_ack_frame(buf, sizeof(buf), &fr->ack);
741
+
742
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
743
+
744
+ rv = ngtcp2_pkt_decode_ack_frame(&nfr->ack, buf, framelen);
745
+
746
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
747
+ CU_ASSERT(fr->type == nfr->type);
748
+ CU_ASSERT(fr->ack.largest_ack == nfr->ack.largest_ack);
749
+ CU_ASSERT(fr->ack.ack_delay == nfr->ack.ack_delay);
750
+ CU_ASSERT(fr->ack.rangecnt == nfr->ack.rangecnt);
751
+
752
+ for (i = 0; i < fr->ack.rangecnt; ++i) {
753
+ CU_ASSERT(fr->ack.ranges[i].gap == nfr->ack.ranges[i].gap);
754
+ CU_ASSERT(fr->ack.ranges[i].len == nfr->ack.ranges[i].len);
755
+ }
756
+
757
+ memset(&nmfr, 0, sizeof(nmfr));
758
+ }
759
+
760
+ void test_ngtcp2_pkt_encode_ack_ecn_frame(void) {
761
+ uint8_t buf[256];
762
+ ngtcp2_max_frame mfr, nmfr;
763
+ ngtcp2_frame *fr = &mfr.fr, *nfr = &nmfr.fr;
764
+ ngtcp2_ssize rv;
765
+ size_t framelen;
766
+ size_t i;
767
+ ngtcp2_ack_range *ranges;
768
+
769
+ /* 0 Num Blocks */
770
+ fr->type = NGTCP2_FRAME_ACK_ECN;
771
+ fr->ack.largest_ack = 0xf1f2f3f4llu;
772
+ fr->ack.first_ack_range = 0;
773
+ fr->ack.ack_delay = 0;
774
+ fr->ack.rangecnt = 0;
775
+ fr->ack.ecn.ect0 = 64;
776
+ fr->ack.ecn.ect1 = 16384;
777
+ fr->ack.ecn.ce = 1073741824;
778
+
779
+ framelen = 1 + 8 + 1 + 1 + 1 + 2 + 4 + 8;
780
+
781
+ rv = ngtcp2_pkt_encode_ack_frame(buf, sizeof(buf), &fr->ack);
782
+
783
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
784
+
785
+ rv = ngtcp2_pkt_decode_ack_frame(&nfr->ack, buf, framelen);
786
+
787
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
788
+ CU_ASSERT(fr->type == nfr->type);
789
+ CU_ASSERT(fr->ack.largest_ack == nfr->ack.largest_ack);
790
+ CU_ASSERT(fr->ack.ack_delay == nfr->ack.ack_delay);
791
+ CU_ASSERT(fr->ack.rangecnt == nfr->ack.rangecnt);
792
+ CU_ASSERT(fr->ack.ecn.ect0 == nfr->ack.ecn.ect0);
793
+ CU_ASSERT(fr->ack.ecn.ect1 == nfr->ack.ecn.ect1);
794
+ CU_ASSERT(fr->ack.ecn.ce == nfr->ack.ecn.ce);
795
+
796
+ memset(&nmfr, 0, sizeof(nmfr));
797
+
798
+ /* 2 Num Blocks */
799
+ fr->type = NGTCP2_FRAME_ACK_ECN;
800
+ fr->ack.largest_ack = 0xf1f2f3f4llu;
801
+ fr->ack.first_ack_range = 0xe1e2e3e4llu;
802
+ fr->ack.ack_delay = 0xf1f2;
803
+ fr->ack.rangecnt = 2;
804
+ ranges = fr->ack.ranges;
805
+ ranges[0].gap = 255;
806
+ ranges[0].len = 0xd1d2d3d4llu;
807
+ ranges[1].gap = 1;
808
+ ranges[1].len = 0xd1d2d3d4llu;
809
+ fr->ack.ecn.ect0 = 0;
810
+ fr->ack.ecn.ect1 = 64;
811
+ fr->ack.ecn.ce = 16384;
812
+
813
+ framelen = 1 + 8 + 4 + 1 + 8 + (2 + 8) + (1 + 8) + 1 + 2 + 4;
814
+
815
+ rv = ngtcp2_pkt_encode_ack_frame(buf, sizeof(buf), &fr->ack);
816
+
817
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
818
+
819
+ rv = ngtcp2_pkt_decode_ack_frame(&nfr->ack, buf, framelen);
820
+
821
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
822
+ CU_ASSERT(fr->type == nfr->type);
823
+ CU_ASSERT(fr->ack.largest_ack == nfr->ack.largest_ack);
824
+ CU_ASSERT(fr->ack.ack_delay == nfr->ack.ack_delay);
825
+ CU_ASSERT(fr->ack.rangecnt == nfr->ack.rangecnt);
826
+
827
+ for (i = 0; i < fr->ack.rangecnt; ++i) {
828
+ CU_ASSERT(fr->ack.ranges[i].gap == nfr->ack.ranges[i].gap);
829
+ CU_ASSERT(fr->ack.ranges[i].len == nfr->ack.ranges[i].len);
830
+ }
831
+
832
+ CU_ASSERT(fr->ack.ecn.ect0 == nfr->ack.ecn.ect0);
833
+ CU_ASSERT(fr->ack.ecn.ect1 == nfr->ack.ecn.ect1);
834
+ CU_ASSERT(fr->ack.ecn.ce == nfr->ack.ecn.ce);
835
+
836
+ memset(&nmfr, 0, sizeof(nmfr));
837
+ }
838
+
839
+ void test_ngtcp2_pkt_encode_reset_stream_frame(void) {
840
+ uint8_t buf[32];
841
+ ngtcp2_reset_stream fr, nfr;
842
+ ngtcp2_ssize rv;
843
+ size_t framelen = 1 + 4 + 4 + 8;
844
+
845
+ fr.type = NGTCP2_FRAME_RESET_STREAM;
846
+ fr.stream_id = 1000000007;
847
+ fr.app_error_code = 0xe1e2;
848
+ fr.final_size = 0x31f2f3f4f5f6f7f8llu;
849
+
850
+ rv = ngtcp2_pkt_encode_reset_stream_frame(buf, sizeof(buf), &fr);
851
+
852
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
853
+
854
+ rv = ngtcp2_pkt_decode_reset_stream_frame(&nfr, buf, framelen);
855
+
856
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
857
+ CU_ASSERT(fr.type == nfr.type);
858
+ CU_ASSERT(fr.stream_id == nfr.stream_id);
859
+ CU_ASSERT(fr.app_error_code == nfr.app_error_code);
860
+ CU_ASSERT(fr.final_size == nfr.final_size);
861
+ }
862
+
863
+ void test_ngtcp2_pkt_encode_connection_close_frame(void) {
864
+ uint8_t buf[2048];
865
+ ngtcp2_frame fr, nfr;
866
+ ngtcp2_ssize rv;
867
+ size_t framelen;
868
+ uint8_t reason[1024];
869
+
870
+ memset(reason, 0xfa, sizeof(reason));
871
+
872
+ /* no Reason Phrase */
873
+ fr.type = NGTCP2_FRAME_CONNECTION_CLOSE;
874
+ fr.connection_close.error_code = 0xf1f2u;
875
+ fr.connection_close.frame_type = 255;
876
+ fr.connection_close.reasonlen = 0;
877
+ fr.connection_close.reason = NULL;
878
+
879
+ framelen = 1 + 4 + 2 + 1;
880
+
881
+ rv = ngtcp2_pkt_encode_connection_close_frame(buf, sizeof(buf),
882
+ &fr.connection_close);
883
+
884
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
885
+
886
+ rv = ngtcp2_pkt_decode_connection_close_frame(&nfr.connection_close, buf,
887
+ framelen);
888
+
889
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
890
+ CU_ASSERT(fr.type == nfr.type);
891
+ CU_ASSERT(fr.connection_close.error_code == nfr.connection_close.error_code);
892
+ CU_ASSERT(fr.connection_close.reasonlen == nfr.connection_close.reasonlen);
893
+ CU_ASSERT(fr.connection_close.reason == nfr.connection_close.reason);
894
+
895
+ memset(&nfr, 0, sizeof(nfr));
896
+
897
+ /* 1024 bytes Reason Phrase */
898
+ fr.type = NGTCP2_FRAME_CONNECTION_CLOSE;
899
+ fr.connection_close.error_code = 0xf3f4u;
900
+ fr.connection_close.frame_type = 0;
901
+ fr.connection_close.reasonlen = sizeof(reason);
902
+ fr.connection_close.reason = reason;
903
+
904
+ framelen = 1 + 4 + 1 + 2 + sizeof(reason);
905
+
906
+ rv = ngtcp2_pkt_encode_connection_close_frame(buf, sizeof(buf),
907
+ &fr.connection_close);
908
+
909
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
910
+
911
+ rv = ngtcp2_pkt_decode_connection_close_frame(&nfr.connection_close, buf,
912
+ framelen);
913
+
914
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
915
+ CU_ASSERT(fr.type == nfr.type);
916
+ CU_ASSERT(fr.connection_close.error_code == nfr.connection_close.error_code);
917
+ CU_ASSERT(fr.connection_close.reasonlen == nfr.connection_close.reasonlen);
918
+ CU_ASSERT(0 == memcmp(reason, nfr.connection_close.reason, sizeof(reason)));
919
+
920
+ memset(&nfr, 0, sizeof(nfr));
921
+ }
922
+
923
+ void test_ngtcp2_pkt_encode_connection_close_app_frame(void) {
924
+ uint8_t buf[2048];
925
+ ngtcp2_frame fr, nfr;
926
+ ngtcp2_ssize rv;
927
+ size_t framelen;
928
+ uint8_t reason[1024];
929
+
930
+ memset(reason, 0xfa, sizeof(reason));
931
+
932
+ /* no Reason Phrase */
933
+ fr.type = NGTCP2_FRAME_CONNECTION_CLOSE_APP;
934
+ fr.connection_close.error_code = 0xf1f2u;
935
+ fr.connection_close.frame_type = 0xff; /* This must be ignored. */
936
+ fr.connection_close.reasonlen = 0;
937
+ fr.connection_close.reason = NULL;
938
+
939
+ framelen = 1 + 4 + 1;
940
+
941
+ rv = ngtcp2_pkt_encode_connection_close_frame(buf, sizeof(buf),
942
+ &fr.connection_close);
943
+
944
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
945
+
946
+ rv = ngtcp2_pkt_decode_connection_close_frame(&nfr.connection_close, buf,
947
+ framelen);
948
+
949
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
950
+ CU_ASSERT(fr.type == nfr.type);
951
+ CU_ASSERT(fr.connection_close.error_code == nfr.connection_close.error_code);
952
+ CU_ASSERT(0 == nfr.connection_close.frame_type);
953
+ CU_ASSERT(fr.connection_close.reasonlen == nfr.connection_close.reasonlen);
954
+ CU_ASSERT(fr.connection_close.reason == nfr.connection_close.reason);
955
+
956
+ memset(&nfr, 0, sizeof(nfr));
957
+ }
958
+
959
+ void test_ngtcp2_pkt_encode_max_data_frame(void) {
960
+ uint8_t buf[16];
961
+ ngtcp2_max_data fr, nfr;
962
+ ngtcp2_ssize rv;
963
+ size_t framelen = 1 + 8;
964
+
965
+ fr.type = NGTCP2_FRAME_MAX_DATA;
966
+ fr.max_data = 0x31f2f3f4f5f6f7f8llu;
967
+
968
+ rv = ngtcp2_pkt_encode_max_data_frame(buf, sizeof(buf), &fr);
969
+
970
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
971
+
972
+ rv = ngtcp2_pkt_decode_max_data_frame(&nfr, buf, framelen);
973
+
974
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
975
+ CU_ASSERT(fr.type == nfr.type);
976
+ CU_ASSERT(fr.max_data == nfr.max_data);
977
+ }
978
+
979
+ void test_ngtcp2_pkt_encode_max_stream_data_frame(void) {
980
+ uint8_t buf[17];
981
+ ngtcp2_max_stream_data fr, nfr;
982
+ ngtcp2_ssize rv;
983
+ size_t framelen = 1 + 8 + 8;
984
+
985
+ fr.type = NGTCP2_FRAME_MAX_STREAM_DATA;
986
+ fr.stream_id = 0xf1f2f3f4u;
987
+ fr.max_stream_data = 0x35f6f7f8f9fafbfcllu;
988
+
989
+ rv = ngtcp2_pkt_encode_max_stream_data_frame(buf, sizeof(buf), &fr);
990
+
991
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
992
+
993
+ rv = ngtcp2_pkt_decode_max_stream_data_frame(&nfr, buf, framelen);
994
+
995
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
996
+ CU_ASSERT(fr.type == nfr.type);
997
+ CU_ASSERT(fr.stream_id == nfr.stream_id);
998
+ CU_ASSERT(fr.max_stream_data == nfr.max_stream_data);
999
+ }
1000
+
1001
+ void test_ngtcp2_pkt_encode_max_streams_frame(void) {
1002
+ uint8_t buf[16];
1003
+ ngtcp2_max_streams fr, nfr;
1004
+ ngtcp2_ssize rv;
1005
+ size_t framelen = 1 + 8;
1006
+
1007
+ fr.type = NGTCP2_FRAME_MAX_STREAMS_BIDI;
1008
+ fr.max_streams = 0xf1f2f3f4u;
1009
+
1010
+ rv = ngtcp2_pkt_encode_max_streams_frame(buf, sizeof(buf), &fr);
1011
+
1012
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1013
+
1014
+ rv = ngtcp2_pkt_decode_max_streams_frame(&nfr, buf, framelen);
1015
+
1016
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1017
+ CU_ASSERT(fr.type == nfr.type);
1018
+ CU_ASSERT(fr.max_streams == nfr.max_streams);
1019
+ }
1020
+
1021
+ void test_ngtcp2_pkt_encode_ping_frame(void) {
1022
+ uint8_t buf[3];
1023
+ ngtcp2_ping fr, nfr;
1024
+ ngtcp2_ssize rv;
1025
+ size_t framelen;
1026
+
1027
+ fr.type = NGTCP2_FRAME_PING;
1028
+
1029
+ framelen = 1;
1030
+
1031
+ rv = ngtcp2_pkt_encode_ping_frame(buf, sizeof(buf), &fr);
1032
+
1033
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1034
+
1035
+ rv = ngtcp2_pkt_decode_ping_frame(&nfr, buf, framelen);
1036
+
1037
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1038
+ CU_ASSERT(fr.type == nfr.type);
1039
+ }
1040
+
1041
+ void test_ngtcp2_pkt_encode_data_blocked_frame(void) {
1042
+ uint8_t buf[9];
1043
+ ngtcp2_data_blocked fr, nfr;
1044
+ ngtcp2_ssize rv;
1045
+ size_t framelen = 1 + 8;
1046
+
1047
+ fr.type = NGTCP2_FRAME_DATA_BLOCKED;
1048
+ fr.offset = 0x31f2f3f4f5f6f7f8llu;
1049
+
1050
+ rv = ngtcp2_pkt_encode_data_blocked_frame(buf, sizeof(buf), &fr);
1051
+
1052
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1053
+
1054
+ rv = ngtcp2_pkt_decode_data_blocked_frame(&nfr, buf, framelen);
1055
+
1056
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1057
+ CU_ASSERT(fr.type == nfr.type);
1058
+ CU_ASSERT(fr.offset == nfr.offset);
1059
+ }
1060
+
1061
+ void test_ngtcp2_pkt_encode_stream_data_blocked_frame(void) {
1062
+ uint8_t buf[17];
1063
+ ngtcp2_stream_data_blocked fr, nfr;
1064
+ ngtcp2_ssize rv;
1065
+ size_t framelen = 1 + 8 + 8;
1066
+
1067
+ fr.type = NGTCP2_FRAME_STREAM_DATA_BLOCKED;
1068
+ fr.stream_id = 0xf1f2f3f4u;
1069
+ fr.offset = 0x35f6f7f8f9fafbfcllu;
1070
+
1071
+ rv = ngtcp2_pkt_encode_stream_data_blocked_frame(buf, sizeof(buf), &fr);
1072
+
1073
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1074
+
1075
+ rv = ngtcp2_pkt_decode_stream_data_blocked_frame(&nfr, buf, framelen);
1076
+
1077
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1078
+ CU_ASSERT(fr.type == nfr.type);
1079
+ CU_ASSERT(fr.stream_id == nfr.stream_id);
1080
+ CU_ASSERT(fr.offset == nfr.offset);
1081
+ }
1082
+
1083
+ void test_ngtcp2_pkt_encode_streams_blocked_frame(void) {
1084
+ uint8_t buf[9];
1085
+ ngtcp2_streams_blocked fr, nfr;
1086
+ ngtcp2_ssize rv;
1087
+ size_t framelen = 1 + 8;
1088
+
1089
+ fr.type = NGTCP2_FRAME_STREAMS_BLOCKED_BIDI;
1090
+ fr.max_streams = 0xf1f2f3f4u;
1091
+
1092
+ rv = ngtcp2_pkt_encode_streams_blocked_frame(buf, sizeof(buf), &fr);
1093
+
1094
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1095
+
1096
+ rv = ngtcp2_pkt_decode_streams_blocked_frame(&nfr, buf, framelen);
1097
+
1098
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1099
+ CU_ASSERT(fr.type == nfr.type);
1100
+ CU_ASSERT(fr.max_streams == nfr.max_streams);
1101
+ }
1102
+
1103
+ void test_ngtcp2_pkt_encode_new_connection_id_frame(void) {
1104
+ uint8_t buf[256];
1105
+ ngtcp2_new_connection_id fr, nfr;
1106
+ ngtcp2_ssize rv;
1107
+ size_t framelen = 1 + 4 + 2 + 1 + 18 + NGTCP2_STATELESS_RESET_TOKENLEN;
1108
+
1109
+ fr.type = NGTCP2_FRAME_NEW_CONNECTION_ID;
1110
+ fr.seq = 1000000009;
1111
+ fr.retire_prior_to = 255;
1112
+ scid_init(&fr.cid);
1113
+ memset(fr.stateless_reset_token, 0xe1, sizeof(fr.stateless_reset_token));
1114
+
1115
+ rv = ngtcp2_pkt_encode_new_connection_id_frame(buf, sizeof(buf), &fr);
1116
+
1117
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1118
+
1119
+ rv = ngtcp2_pkt_decode_new_connection_id_frame(&nfr, buf, framelen);
1120
+
1121
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1122
+ CU_ASSERT(fr.type == nfr.type);
1123
+ CU_ASSERT(fr.seq == nfr.seq);
1124
+ CU_ASSERT(ngtcp2_cid_eq(&fr.cid, &nfr.cid));
1125
+ CU_ASSERT(0 == memcmp(fr.stateless_reset_token, nfr.stateless_reset_token,
1126
+ sizeof(fr.stateless_reset_token)));
1127
+ }
1128
+
1129
+ void test_ngtcp2_pkt_encode_stop_sending_frame(void) {
1130
+ uint8_t buf[16];
1131
+ ngtcp2_stop_sending fr, nfr;
1132
+ ngtcp2_ssize rv;
1133
+ size_t framelen = 1 + 8 + 4;
1134
+
1135
+ fr.type = NGTCP2_FRAME_STOP_SENDING;
1136
+ fr.stream_id = 0xf1f2f3f4u;
1137
+ fr.app_error_code = 0xe1e2u;
1138
+
1139
+ rv = ngtcp2_pkt_encode_stop_sending_frame(buf, sizeof(buf), &fr);
1140
+
1141
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1142
+
1143
+ rv = ngtcp2_pkt_decode_stop_sending_frame(&nfr, buf, framelen);
1144
+
1145
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1146
+ CU_ASSERT(fr.type == nfr.type);
1147
+ CU_ASSERT(fr.stream_id == nfr.stream_id);
1148
+ CU_ASSERT(fr.app_error_code == nfr.app_error_code);
1149
+ }
1150
+
1151
+ void test_ngtcp2_pkt_encode_path_challenge_frame(void) {
1152
+ uint8_t buf[9];
1153
+ ngtcp2_path_challenge fr, nfr;
1154
+ ngtcp2_ssize rv;
1155
+ size_t framelen = 1 + 8;
1156
+ size_t i;
1157
+
1158
+ fr.type = NGTCP2_FRAME_PATH_CHALLENGE;
1159
+ for (i = 0; i < sizeof(fr.data); ++i) {
1160
+ fr.data[i] = (uint8_t)(i + 1);
1161
+ }
1162
+
1163
+ rv = ngtcp2_pkt_encode_path_challenge_frame(buf, sizeof(buf), &fr);
1164
+
1165
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1166
+
1167
+ rv = ngtcp2_pkt_decode_path_challenge_frame(&nfr, buf, framelen);
1168
+
1169
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1170
+ CU_ASSERT(fr.type == nfr.type);
1171
+ CU_ASSERT(0 == memcmp(fr.data, nfr.data, sizeof(fr.data)));
1172
+ }
1173
+
1174
+ void test_ngtcp2_pkt_encode_path_response_frame(void) {
1175
+ uint8_t buf[9];
1176
+ ngtcp2_path_response fr, nfr;
1177
+ ngtcp2_ssize rv;
1178
+ size_t framelen = 1 + 8;
1179
+ size_t i;
1180
+
1181
+ fr.type = NGTCP2_FRAME_PATH_RESPONSE;
1182
+ for (i = 0; i < sizeof(fr.data); ++i) {
1183
+ fr.data[i] = (uint8_t)(i + 1);
1184
+ }
1185
+
1186
+ rv = ngtcp2_pkt_encode_path_response_frame(buf, sizeof(buf), &fr);
1187
+
1188
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1189
+
1190
+ rv = ngtcp2_pkt_decode_path_response_frame(&nfr, buf, framelen);
1191
+
1192
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1193
+ CU_ASSERT(fr.type == nfr.type);
1194
+ CU_ASSERT(0 == memcmp(fr.data, nfr.data, sizeof(fr.data)));
1195
+ }
1196
+
1197
+ void test_ngtcp2_pkt_encode_crypto_frame(void) {
1198
+ const uint8_t data[] = "0123456789abcdef1";
1199
+ uint8_t buf[256];
1200
+ ngtcp2_frame fr, nfr;
1201
+ ngtcp2_ssize rv;
1202
+ size_t framelen;
1203
+
1204
+ fr.type = NGTCP2_FRAME_CRYPTO;
1205
+ fr.crypto.offset = 0x31f2f3f4f5f6f7f8llu;
1206
+ fr.crypto.datacnt = 1;
1207
+ fr.crypto.data[0].len = strsize(data);
1208
+ fr.crypto.data[0].base = (uint8_t *)data;
1209
+
1210
+ framelen = 1 + 8 + 1 + 17;
1211
+
1212
+ rv = ngtcp2_pkt_encode_crypto_frame(buf, sizeof(buf), &fr.crypto);
1213
+
1214
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1215
+
1216
+ rv = ngtcp2_pkt_decode_crypto_frame(&nfr.crypto, buf, framelen);
1217
+
1218
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1219
+ CU_ASSERT(fr.type == nfr.type);
1220
+ CU_ASSERT(fr.crypto.offset == nfr.crypto.offset);
1221
+ CU_ASSERT(fr.crypto.datacnt == nfr.crypto.datacnt);
1222
+ CU_ASSERT(fr.crypto.data[0].len == nfr.crypto.data[0].len);
1223
+ CU_ASSERT(0 == memcmp(fr.crypto.data[0].base, nfr.crypto.data[0].base,
1224
+ fr.crypto.data[0].len));
1225
+ }
1226
+
1227
+ void test_ngtcp2_pkt_encode_new_token_frame(void) {
1228
+ const uint8_t token[] = "0123456789abcdef2";
1229
+ uint8_t buf[256];
1230
+ ngtcp2_frame fr, nfr;
1231
+ ngtcp2_ssize rv;
1232
+ size_t framelen;
1233
+
1234
+ fr.type = NGTCP2_FRAME_NEW_TOKEN;
1235
+ fr.new_token.token = (uint8_t *)token;
1236
+ fr.new_token.tokenlen = strsize(token);
1237
+
1238
+ framelen = 1 + 1 + strsize(token);
1239
+
1240
+ rv = ngtcp2_pkt_encode_new_token_frame(buf, sizeof(buf), &fr.new_token);
1241
+
1242
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1243
+
1244
+ rv = ngtcp2_pkt_decode_new_token_frame(&nfr.new_token, buf, framelen);
1245
+
1246
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1247
+ CU_ASSERT(fr.type == nfr.type);
1248
+ CU_ASSERT(fr.new_token.tokenlen == nfr.new_token.tokenlen);
1249
+ CU_ASSERT(0 == memcmp(fr.new_token.token, nfr.new_token.token,
1250
+ fr.new_token.tokenlen));
1251
+ }
1252
+
1253
+ void test_ngtcp2_pkt_encode_retire_connection_id_frame(void) {
1254
+ uint8_t buf[256];
1255
+ ngtcp2_frame fr, nfr;
1256
+ ngtcp2_ssize rv;
1257
+ size_t framelen;
1258
+
1259
+ fr.type = NGTCP2_FRAME_RETIRE_CONNECTION_ID;
1260
+ fr.retire_connection_id.seq = 1000000007;
1261
+
1262
+ framelen = 1 + ngtcp2_put_uvarintlen(fr.retire_connection_id.seq);
1263
+
1264
+ rv = ngtcp2_pkt_encode_retire_connection_id_frame(buf, sizeof(buf),
1265
+ &fr.retire_connection_id);
1266
+
1267
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1268
+
1269
+ rv = ngtcp2_pkt_decode_retire_connection_id_frame(&nfr.retire_connection_id,
1270
+ buf, framelen);
1271
+
1272
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1273
+ CU_ASSERT(fr.type == nfr.type);
1274
+ CU_ASSERT(fr.retire_connection_id.seq == nfr.retire_connection_id.seq);
1275
+ }
1276
+
1277
+ void test_ngtcp2_pkt_encode_handshake_done_frame(void) {
1278
+ uint8_t buf[16];
1279
+ ngtcp2_handshake_done fr, nfr;
1280
+ ngtcp2_ssize rv;
1281
+ size_t framelen = 1;
1282
+
1283
+ fr.type = NGTCP2_FRAME_HANDSHAKE_DONE;
1284
+
1285
+ rv = ngtcp2_pkt_encode_handshake_done_frame(buf, sizeof(buf), &fr);
1286
+
1287
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1288
+
1289
+ rv = ngtcp2_pkt_decode_handshake_done_frame(&nfr, buf, framelen);
1290
+
1291
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1292
+ CU_ASSERT(fr.type == nfr.type);
1293
+ }
1294
+
1295
+ void test_ngtcp2_pkt_encode_datagram_frame(void) {
1296
+ const uint8_t data[] = "0123456789abcdef3";
1297
+ uint8_t buf[256];
1298
+ ngtcp2_frame fr, nfr;
1299
+ ngtcp2_ssize rv;
1300
+ size_t framelen;
1301
+
1302
+ fr.type = NGTCP2_FRAME_DATAGRAM_LEN;
1303
+ fr.datagram.datacnt = 1;
1304
+ fr.datagram.data = fr.datagram.rdata;
1305
+ fr.datagram.rdata[0].len = strsize(data);
1306
+ fr.datagram.rdata[0].base = (uint8_t *)data;
1307
+
1308
+ framelen = 1 + 1 + 17;
1309
+
1310
+ rv = ngtcp2_pkt_encode_datagram_frame(buf, sizeof(buf), &fr.datagram);
1311
+
1312
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1313
+
1314
+ rv = ngtcp2_pkt_decode_datagram_frame(&nfr.datagram, buf, framelen);
1315
+
1316
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1317
+ CU_ASSERT(fr.type == nfr.type);
1318
+ CU_ASSERT(fr.datagram.datacnt == nfr.datagram.datacnt);
1319
+ CU_ASSERT(fr.datagram.data->len == nfr.datagram.data->len);
1320
+ CU_ASSERT(0 == memcmp(fr.datagram.data->base, nfr.datagram.data->base,
1321
+ fr.datagram.data->len));
1322
+
1323
+ memset(&nfr, 0, sizeof(nfr));
1324
+
1325
+ /* Without length field */
1326
+ fr.type = NGTCP2_FRAME_DATAGRAM;
1327
+ fr.datagram.datacnt = 1;
1328
+ fr.datagram.data = fr.datagram.rdata;
1329
+ fr.datagram.rdata[0].len = strsize(data);
1330
+ fr.datagram.rdata[0].base = (uint8_t *)data;
1331
+
1332
+ framelen = 1 + 17;
1333
+
1334
+ rv = ngtcp2_pkt_encode_datagram_frame(buf, sizeof(buf), &fr.datagram);
1335
+
1336
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1337
+
1338
+ rv = ngtcp2_pkt_decode_datagram_frame(&nfr.datagram, buf, framelen);
1339
+
1340
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1341
+ CU_ASSERT(fr.type == nfr.type);
1342
+ CU_ASSERT(fr.datagram.datacnt == nfr.datagram.datacnt);
1343
+ CU_ASSERT(fr.datagram.data->len == nfr.datagram.data->len);
1344
+ CU_ASSERT(0 == memcmp(fr.datagram.data->base, nfr.datagram.data->base,
1345
+ fr.datagram.data->len));
1346
+
1347
+ memset(&nfr, 0, sizeof(nfr));
1348
+
1349
+ /* Zero length data with length field */
1350
+ fr.type = NGTCP2_FRAME_DATAGRAM_LEN;
1351
+ fr.datagram.datacnt = 0;
1352
+ fr.datagram.data = NULL;
1353
+
1354
+ framelen = 1 + 1;
1355
+
1356
+ rv = ngtcp2_pkt_encode_datagram_frame(buf, sizeof(buf), &fr.datagram);
1357
+
1358
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1359
+
1360
+ rv = ngtcp2_pkt_decode_datagram_frame(&nfr.datagram, buf, framelen);
1361
+
1362
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1363
+ CU_ASSERT(fr.type == nfr.type);
1364
+ CU_ASSERT(fr.datagram.datacnt == nfr.datagram.datacnt);
1365
+ CU_ASSERT(NULL == nfr.datagram.data);
1366
+
1367
+ /* Zero length data without length field */
1368
+ fr.type = NGTCP2_FRAME_DATAGRAM;
1369
+ fr.datagram.datacnt = 0;
1370
+ fr.datagram.data = NULL;
1371
+
1372
+ framelen = 1;
1373
+
1374
+ rv = ngtcp2_pkt_encode_datagram_frame(buf, sizeof(buf), &fr.datagram);
1375
+
1376
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1377
+
1378
+ rv = ngtcp2_pkt_decode_datagram_frame(&nfr.datagram, buf, framelen);
1379
+
1380
+ CU_ASSERT((ngtcp2_ssize)framelen == rv);
1381
+ CU_ASSERT(fr.type == nfr.type);
1382
+ CU_ASSERT(fr.datagram.datacnt == nfr.datagram.datacnt);
1383
+ CU_ASSERT(NULL == nfr.datagram.data);
1384
+ }
1385
+
1386
+ void test_ngtcp2_pkt_adjust_pkt_num(void) {
1387
+ CU_ASSERT(0xaa831f94llu ==
1388
+ ngtcp2_pkt_adjust_pkt_num(0xaa82f30ellu, 0x1f94, 16));
1389
+
1390
+ CU_ASSERT(0xff == ngtcp2_pkt_adjust_pkt_num(0x0100, 0xff, 8));
1391
+ CU_ASSERT(0x01ff == ngtcp2_pkt_adjust_pkt_num(0x01ff, 0xff, 8));
1392
+ CU_ASSERT(0x0fff == ngtcp2_pkt_adjust_pkt_num(0x1000, 0xff, 8));
1393
+ CU_ASSERT(0x80 == ngtcp2_pkt_adjust_pkt_num(0x00, 0x80, 8));
1394
+ CU_ASSERT(0x3fffffffffffffabllu ==
1395
+ ngtcp2_pkt_adjust_pkt_num(NGTCP2_MAX_PKT_NUM, 0xab, 8));
1396
+ CU_ASSERT(0x4000000000000000llu ==
1397
+ ngtcp2_pkt_adjust_pkt_num(NGTCP2_MAX_PKT_NUM, 0x00, 8));
1398
+ CU_ASSERT(250 == ngtcp2_pkt_adjust_pkt_num(255, 250, 8));
1399
+ CU_ASSERT(8 == ngtcp2_pkt_adjust_pkt_num(50, 8, 8));
1400
+ CU_ASSERT(0 == ngtcp2_pkt_adjust_pkt_num(-1, 0, 8));
1401
+ }
1402
+
1403
+ void test_ngtcp2_pkt_validate_ack(void) {
1404
+ int rv;
1405
+ ngtcp2_ack fr;
1406
+
1407
+ /* too long first_ack_range */
1408
+ fr.largest_ack = 1;
1409
+ fr.first_ack_range = 2;
1410
+ fr.rangecnt = 0;
1411
+
1412
+ rv = ngtcp2_pkt_validate_ack(&fr);
1413
+
1414
+ CU_ASSERT(NGTCP2_ERR_ACK_FRAME == rv);
1415
+
1416
+ /* gap is too large */
1417
+ fr.largest_ack = 250;
1418
+ fr.first_ack_range = 1;
1419
+ fr.rangecnt = 1;
1420
+ fr.ranges[0].gap = 248;
1421
+ fr.ranges[0].len = 0;
1422
+
1423
+ rv = ngtcp2_pkt_validate_ack(&fr);
1424
+
1425
+ CU_ASSERT(NGTCP2_ERR_ACK_FRAME == rv);
1426
+
1427
+ /* too large range len */
1428
+ fr.largest_ack = 250;
1429
+ fr.first_ack_range = 0;
1430
+ fr.rangecnt = 1;
1431
+ fr.ranges[0].gap = 248;
1432
+ fr.ranges[0].len = 1;
1433
+
1434
+ rv = ngtcp2_pkt_validate_ack(&fr);
1435
+
1436
+ CU_ASSERT(NGTCP2_ERR_ACK_FRAME == rv);
1437
+ }
1438
+
1439
+ void test_ngtcp2_pkt_write_stateless_reset(void) {
1440
+ uint8_t buf[256];
1441
+ ngtcp2_ssize spktlen;
1442
+ uint8_t token[NGTCP2_STATELESS_RESET_TOKENLEN];
1443
+ uint8_t rand[256];
1444
+ size_t i;
1445
+ uint8_t *p;
1446
+ size_t randlen;
1447
+
1448
+ memset(rand, 0, sizeof(rand));
1449
+ for (i = 0; i < NGTCP2_STATELESS_RESET_TOKENLEN; ++i) {
1450
+ token[i] = (uint8_t)(i + 1);
1451
+ }
1452
+
1453
+ spktlen = ngtcp2_pkt_write_stateless_reset(buf, sizeof(buf), token, rand,
1454
+ sizeof(rand));
1455
+
1456
+ p = buf;
1457
+
1458
+ CU_ASSERT(256 == spktlen);
1459
+ CU_ASSERT(0 == (*p & NGTCP2_HEADER_FORM_BIT));
1460
+ CU_ASSERT((*p & NGTCP2_FIXED_BIT_MASK));
1461
+
1462
+ ++p;
1463
+
1464
+ randlen = (size_t)(spktlen - (p - buf) - NGTCP2_STATELESS_RESET_TOKENLEN);
1465
+
1466
+ CU_ASSERT(0 == memcmp(rand, p, randlen));
1467
+
1468
+ p += randlen;
1469
+
1470
+ CU_ASSERT(0 == memcmp(token, p, NGTCP2_STATELESS_RESET_TOKENLEN));
1471
+
1472
+ p += NGTCP2_STATELESS_RESET_TOKENLEN;
1473
+
1474
+ CU_ASSERT(spktlen == p - buf);
1475
+
1476
+ /* Not enough buffer */
1477
+ spktlen = ngtcp2_pkt_write_stateless_reset(
1478
+ buf,
1479
+ NGTCP2_MIN_STATELESS_RESET_RANDLEN - 1 + NGTCP2_STATELESS_RESET_TOKENLEN,
1480
+ token, rand, sizeof(rand));
1481
+
1482
+ CU_ASSERT(NGTCP2_ERR_NOBUF == spktlen);
1483
+ }
1484
+
1485
+ void test_ngtcp2_pkt_write_retry(void) {
1486
+ uint8_t buf[256];
1487
+ ngtcp2_ssize spktlen;
1488
+ ngtcp2_cid scid, dcid, odcid;
1489
+ ngtcp2_pkt_hd nhd;
1490
+ uint8_t token[32];
1491
+ size_t i;
1492
+ ngtcp2_pkt_retry retry;
1493
+ ngtcp2_ssize nread;
1494
+ int rv;
1495
+ ngtcp2_crypto_aead aead = {0};
1496
+ ngtcp2_crypto_aead_ctx aead_ctx = {0};
1497
+ uint8_t tag[NGTCP2_RETRY_TAGLEN] = {0};
1498
+
1499
+ scid_init(&scid);
1500
+ dcid_init(&dcid);
1501
+ rcid_init(&odcid);
1502
+
1503
+ for (i = 0; i < sizeof(token); ++i) {
1504
+ token[i] = (uint8_t)i;
1505
+ }
1506
+
1507
+ spktlen = ngtcp2_pkt_write_retry(buf, sizeof(buf), NGTCP2_PROTO_VER_V1, &dcid,
1508
+ &scid, &odcid, token, sizeof(token),
1509
+ null_retry_encrypt, &aead, &aead_ctx);
1510
+
1511
+ CU_ASSERT(spktlen > 0);
1512
+
1513
+ memset(&nhd, 0, sizeof(nhd));
1514
+
1515
+ nread = ngtcp2_pkt_decode_hd_long(&nhd, buf, (size_t)spktlen);
1516
+
1517
+ CU_ASSERT(nread > 0);
1518
+ CU_ASSERT(NGTCP2_PKT_RETRY == nhd.type);
1519
+ CU_ASSERT(NGTCP2_PROTO_VER_V1 == nhd.version);
1520
+ CU_ASSERT(ngtcp2_cid_eq(&dcid, &nhd.dcid));
1521
+ CU_ASSERT(ngtcp2_cid_eq(&scid, &nhd.scid));
1522
+
1523
+ rv = ngtcp2_pkt_decode_retry(&retry, buf + nread, (size_t)(spktlen - nread));
1524
+
1525
+ CU_ASSERT(0 == rv);
1526
+ CU_ASSERT(sizeof(token) == retry.tokenlen);
1527
+ CU_ASSERT(0 == memcmp(token, retry.token, sizeof(token)));
1528
+ CU_ASSERT(0 == memcmp(tag, retry.tag, sizeof(tag)));
1529
+ }
1530
+
1531
+ void test_ngtcp2_pkt_write_version_negotiation(void) {
1532
+ uint8_t buf[256];
1533
+ ngtcp2_ssize spktlen;
1534
+ const uint32_t sv[] = {0xf1f2f3f4, 0x1f2f3f4f};
1535
+ const uint8_t *p;
1536
+ size_t i;
1537
+ ngtcp2_cid dcid, scid;
1538
+ uint32_t v;
1539
+
1540
+ dcid_init(&dcid);
1541
+ scid_init(&scid);
1542
+
1543
+ spktlen = ngtcp2_pkt_write_version_negotiation(
1544
+ buf, sizeof(buf), 133, dcid.data, dcid.datalen, scid.data, scid.datalen,
1545
+ sv, ngtcp2_arraylen(sv));
1546
+
1547
+ CU_ASSERT((ngtcp2_ssize)(1 + 4 + 1 + dcid.datalen + 1 + scid.datalen +
1548
+ ngtcp2_arraylen(sv) * 4) == spktlen);
1549
+
1550
+ p = buf;
1551
+
1552
+ CU_ASSERT((0x80 | 133) == buf[0]);
1553
+
1554
+ ++p;
1555
+
1556
+ p = ngtcp2_get_uint32(&v, p);
1557
+
1558
+ CU_ASSERT(0 == v);
1559
+
1560
+ CU_ASSERT(dcid.datalen == *p);
1561
+
1562
+ ++p;
1563
+
1564
+ CU_ASSERT(0 == memcmp(dcid.data, p, dcid.datalen));
1565
+
1566
+ p += dcid.datalen;
1567
+
1568
+ CU_ASSERT(scid.datalen == *p);
1569
+
1570
+ ++p;
1571
+
1572
+ CU_ASSERT(0 == memcmp(scid.data, p, scid.datalen));
1573
+
1574
+ p += scid.datalen;
1575
+
1576
+ for (i = 0; i < ngtcp2_arraylen(sv); ++i) {
1577
+ p = ngtcp2_get_uint32(&v, p);
1578
+
1579
+ CU_ASSERT(sv[i] == v);
1580
+ }
1581
+ }
1582
+
1583
+ void test_ngtcp2_pkt_stream_max_datalen(void) {
1584
+ size_t len;
1585
+
1586
+ len = ngtcp2_pkt_stream_max_datalen(63, 0, 0, 2);
1587
+
1588
+ CU_ASSERT((size_t)-1 == len);
1589
+
1590
+ len = ngtcp2_pkt_stream_max_datalen(63, 0, 0, 3);
1591
+
1592
+ CU_ASSERT(0 == len);
1593
+
1594
+ len = ngtcp2_pkt_stream_max_datalen(63, 0, 1, 3);
1595
+
1596
+ CU_ASSERT(0 == len);
1597
+
1598
+ len = ngtcp2_pkt_stream_max_datalen(63, 0, 1, 4);
1599
+
1600
+ CU_ASSERT(1 == len);
1601
+
1602
+ len = ngtcp2_pkt_stream_max_datalen(63, 1, 1, 4);
1603
+
1604
+ CU_ASSERT(0 == len);
1605
+
1606
+ len = ngtcp2_pkt_stream_max_datalen(63, 0, 63, 66);
1607
+
1608
+ CU_ASSERT(63 == len);
1609
+
1610
+ len = ngtcp2_pkt_stream_max_datalen(63, 0, 63, 65);
1611
+
1612
+ CU_ASSERT(62 == len);
1613
+
1614
+ len = ngtcp2_pkt_stream_max_datalen(63, 0, 1396, 1400);
1615
+
1616
+ CU_ASSERT(1396 == len);
1617
+
1618
+ len = ngtcp2_pkt_stream_max_datalen(63, 0, 1396, 1399);
1619
+
1620
+ CU_ASSERT(1395 == len);
1621
+
1622
+ len = ngtcp2_pkt_stream_max_datalen(63, 0, 1396, 9);
1623
+
1624
+ CU_ASSERT(6 == len);
1625
+
1626
+ len = ngtcp2_pkt_stream_max_datalen(63, 0, 16385, 16391);
1627
+
1628
+ CU_ASSERT(16385 == len);
1629
+
1630
+ len = ngtcp2_pkt_stream_max_datalen(63, 0, 16385, 16390);
1631
+
1632
+ CU_ASSERT(16384 == len);
1633
+
1634
+ len = ngtcp2_pkt_stream_max_datalen(63, 0, 1073741824, 1073741834);
1635
+
1636
+ CU_ASSERT(1073741824 == len);
1637
+
1638
+ len = ngtcp2_pkt_stream_max_datalen(63, 0, 1073741824, 1073741833);
1639
+
1640
+ CU_ASSERT(1073741823 == len);
1641
+
1642
+ len = ngtcp2_pkt_stream_max_datalen(63, 0, 16383, 16387);
1643
+
1644
+ CU_ASSERT(16383 == len);
1645
+ }