@annadata/capacitor-mqtt-quic 0.1.6 → 0.1.7

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 (656) hide show
  1. package/AnnadataCapacitorMqttQuic.podspec +2 -1
  2. package/README.md +121 -12
  3. package/android/NGTCP2_BUILD_INSTRUCTIONS.md +65 -44
  4. package/android/build-openssl.sh +1 -1
  5. package/android/install/nghttp3-android/arm64-v8a/include/nghttp3/nghttp3.h +3295 -0
  6. package/android/install/nghttp3-android/arm64-v8a/include/nghttp3/version.h +46 -0
  7. package/android/install/nghttp3-android/arm64-v8a/lib/cmake/nghttp3/nghttp3Config.cmake +3 -0
  8. package/android/install/nghttp3-android/arm64-v8a/lib/cmake/nghttp3/nghttp3ConfigVersion.cmake +65 -0
  9. package/android/install/nghttp3-android/arm64-v8a/lib/cmake/nghttp3/nghttp3Targets-release.cmake +29 -0
  10. package/android/install/nghttp3-android/arm64-v8a/lib/cmake/nghttp3/nghttp3Targets.cmake +114 -0
  11. package/android/install/nghttp3-android/arm64-v8a/lib/libnghttp3.a +0 -0
  12. package/android/install/nghttp3-android/arm64-v8a/lib/libnghttp3.so +0 -0
  13. package/android/install/nghttp3-android/arm64-v8a/lib/pkgconfig/libnghttp3.pc +34 -0
  14. package/android/install/nghttp3-android/arm64-v8a/share/doc/nghttp3/README.rst +75 -0
  15. package/android/install/nghttp3-android/armeabi-v7a/include/nghttp3/nghttp3.h +3295 -0
  16. package/android/install/nghttp3-android/armeabi-v7a/include/nghttp3/version.h +46 -0
  17. package/android/install/nghttp3-android/armeabi-v7a/lib/cmake/nghttp3/nghttp3Config.cmake +3 -0
  18. package/android/install/nghttp3-android/armeabi-v7a/lib/cmake/nghttp3/nghttp3ConfigVersion.cmake +65 -0
  19. package/android/install/nghttp3-android/armeabi-v7a/lib/cmake/nghttp3/nghttp3Targets-release.cmake +29 -0
  20. package/android/install/nghttp3-android/armeabi-v7a/lib/cmake/nghttp3/nghttp3Targets.cmake +114 -0
  21. package/android/install/nghttp3-android/armeabi-v7a/lib/libnghttp3.a +0 -0
  22. package/android/install/nghttp3-android/armeabi-v7a/lib/libnghttp3.so +0 -0
  23. package/android/install/nghttp3-android/armeabi-v7a/lib/pkgconfig/libnghttp3.pc +34 -0
  24. package/android/install/nghttp3-android/armeabi-v7a/share/doc/nghttp3/README.rst +75 -0
  25. package/android/install/nghttp3-android/x86_64/include/nghttp3/nghttp3.h +3295 -0
  26. package/android/install/nghttp3-android/x86_64/include/nghttp3/version.h +46 -0
  27. package/android/install/nghttp3-android/x86_64/lib/cmake/nghttp3/nghttp3Config.cmake +3 -0
  28. package/android/install/nghttp3-android/x86_64/lib/cmake/nghttp3/nghttp3ConfigVersion.cmake +65 -0
  29. package/android/install/nghttp3-android/x86_64/lib/cmake/nghttp3/nghttp3Targets-release.cmake +29 -0
  30. package/android/install/nghttp3-android/x86_64/lib/cmake/nghttp3/nghttp3Targets.cmake +114 -0
  31. package/android/install/nghttp3-android/x86_64/lib/libnghttp3.a +0 -0
  32. package/android/install/nghttp3-android/x86_64/lib/libnghttp3.so +0 -0
  33. package/android/install/nghttp3-android/x86_64/lib/pkgconfig/libnghttp3.pc +34 -0
  34. package/android/install/nghttp3-android/x86_64/share/doc/nghttp3/README.rst +75 -0
  35. package/android/install/ngtcp2-android/arm64-v8a/include/ngtcp2/ngtcp2.h +6254 -0
  36. package/android/install/ngtcp2-android/arm64-v8a/include/ngtcp2/ngtcp2_crypto.h +1037 -0
  37. package/android/install/ngtcp2-android/arm64-v8a/include/ngtcp2/ngtcp2_crypto_wolfssl.h +106 -0
  38. package/android/install/ngtcp2-android/arm64-v8a/include/ngtcp2/version.h +51 -0
  39. package/android/install/ngtcp2-android/arm64-v8a/lib/cmake/ngtcp2/ngtcp2Config.cmake +6 -0
  40. package/android/install/ngtcp2-android/arm64-v8a/lib/cmake/ngtcp2/ngtcp2ConfigVersion.cmake +65 -0
  41. package/android/install/ngtcp2-android/arm64-v8a/lib/cmake/ngtcp2/ngtcp2Targets-release.cmake +29 -0
  42. package/android/install/ngtcp2-android/arm64-v8a/lib/cmake/ngtcp2/ngtcp2Targets.cmake +114 -0
  43. package/android/install/ngtcp2-android/arm64-v8a/lib/libngtcp2.a +0 -0
  44. package/android/install/ngtcp2-android/arm64-v8a/lib/libngtcp2.so +0 -0
  45. package/android/install/ngtcp2-android/arm64-v8a/lib/libngtcp2_crypto_wolfssl.a +0 -0
  46. package/android/install/ngtcp2-android/arm64-v8a/lib/libngtcp2_crypto_wolfssl.so +0 -0
  47. package/android/install/ngtcp2-android/arm64-v8a/lib/pkgconfig/libngtcp2.pc +33 -0
  48. package/android/install/ngtcp2-android/arm64-v8a/lib/pkgconfig/libngtcp2_crypto_wolfssl.pc +34 -0
  49. package/android/install/ngtcp2-android/arm64-v8a/share/doc/ngtcp2/README.rst +385 -0
  50. package/android/install/ngtcp2-android/armeabi-v7a/include/ngtcp2/ngtcp2.h +6254 -0
  51. package/android/install/ngtcp2-android/armeabi-v7a/include/ngtcp2/ngtcp2_crypto.h +1037 -0
  52. package/android/install/ngtcp2-android/armeabi-v7a/include/ngtcp2/ngtcp2_crypto_wolfssl.h +106 -0
  53. package/android/install/ngtcp2-android/armeabi-v7a/include/ngtcp2/version.h +51 -0
  54. package/android/install/ngtcp2-android/armeabi-v7a/lib/cmake/ngtcp2/ngtcp2Config.cmake +6 -0
  55. package/android/install/ngtcp2-android/armeabi-v7a/lib/cmake/ngtcp2/ngtcp2ConfigVersion.cmake +65 -0
  56. package/android/install/ngtcp2-android/armeabi-v7a/lib/cmake/ngtcp2/ngtcp2Targets-release.cmake +29 -0
  57. package/android/install/ngtcp2-android/armeabi-v7a/lib/cmake/ngtcp2/ngtcp2Targets.cmake +114 -0
  58. package/android/install/ngtcp2-android/armeabi-v7a/lib/libngtcp2.a +0 -0
  59. package/android/install/ngtcp2-android/armeabi-v7a/lib/libngtcp2.so +0 -0
  60. package/android/install/ngtcp2-android/armeabi-v7a/lib/libngtcp2_crypto_wolfssl.a +0 -0
  61. package/android/install/ngtcp2-android/armeabi-v7a/lib/libngtcp2_crypto_wolfssl.so +0 -0
  62. package/android/install/ngtcp2-android/armeabi-v7a/lib/pkgconfig/libngtcp2.pc +33 -0
  63. package/android/install/ngtcp2-android/armeabi-v7a/lib/pkgconfig/libngtcp2_crypto_wolfssl.pc +34 -0
  64. package/android/install/ngtcp2-android/armeabi-v7a/share/doc/ngtcp2/README.rst +385 -0
  65. package/android/install/ngtcp2-android/x86_64/include/ngtcp2/ngtcp2.h +6254 -0
  66. package/android/install/ngtcp2-android/x86_64/include/ngtcp2/ngtcp2_crypto.h +1037 -0
  67. package/android/install/ngtcp2-android/x86_64/include/ngtcp2/ngtcp2_crypto_wolfssl.h +106 -0
  68. package/android/install/ngtcp2-android/x86_64/include/ngtcp2/version.h +51 -0
  69. package/android/install/ngtcp2-android/x86_64/lib/cmake/ngtcp2/ngtcp2Config.cmake +6 -0
  70. package/android/install/ngtcp2-android/x86_64/lib/cmake/ngtcp2/ngtcp2ConfigVersion.cmake +65 -0
  71. package/android/install/ngtcp2-android/x86_64/lib/cmake/ngtcp2/ngtcp2Targets-release.cmake +29 -0
  72. package/android/install/ngtcp2-android/x86_64/lib/cmake/ngtcp2/ngtcp2Targets.cmake +114 -0
  73. package/android/install/ngtcp2-android/x86_64/lib/libngtcp2.a +0 -0
  74. package/android/install/ngtcp2-android/x86_64/lib/libngtcp2.so +0 -0
  75. package/android/install/ngtcp2-android/x86_64/lib/libngtcp2_crypto_wolfssl.a +0 -0
  76. package/android/install/ngtcp2-android/x86_64/lib/libngtcp2_crypto_wolfssl.so +0 -0
  77. package/android/install/ngtcp2-android/x86_64/lib/pkgconfig/libngtcp2.pc +33 -0
  78. package/android/install/ngtcp2-android/x86_64/lib/pkgconfig/libngtcp2_crypto_wolfssl.pc +34 -0
  79. package/android/install/ngtcp2-android/x86_64/share/doc/ngtcp2/README.rst +385 -0
  80. package/android/install/wolfssl-android/arm64-v8a/bin/wolfssl-config +117 -0
  81. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/callbacks.h +93 -0
  82. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/certs_test.h +7073 -0
  83. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/certs_test_sm.h +2913 -0
  84. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/crl.h +58 -0
  85. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/error-ssl.h +280 -0
  86. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/ocsp.h +191 -0
  87. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/aes.h +117 -0
  88. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/asn1.h +315 -0
  89. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/asn1t.h +30 -0
  90. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/bio.h +237 -0
  91. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/bn.h +332 -0
  92. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/buffer.h +57 -0
  93. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/camellia.h +27 -0
  94. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/cmac.h +66 -0
  95. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/cms.h +26 -0
  96. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/compat_types.h +70 -0
  97. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/conf.h +117 -0
  98. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/crypto.h +171 -0
  99. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/des.h +124 -0
  100. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/dh.h +144 -0
  101. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/dsa.h +164 -0
  102. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/ec.h +525 -0
  103. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/ec25519.h +46 -0
  104. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/ec448.h +46 -0
  105. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/ecdh.h +49 -0
  106. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/ecdsa.h +87 -0
  107. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/ed25519.h +49 -0
  108. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/ed448.h +49 -0
  109. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/engine.h +9 -0
  110. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/err.h +84 -0
  111. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/evp.h +1540 -0
  112. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/fips_rand.h +125 -0
  113. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/hmac.h +98 -0
  114. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/kdf.h +45 -0
  115. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/lhash.h +64 -0
  116. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/md4.h +66 -0
  117. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/md5.h +108 -0
  118. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/modes.h +45 -0
  119. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/obj_mac.h +92 -0
  120. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/objects.h +86 -0
  121. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/ocsp.h +108 -0
  122. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/opensslconf.h +8 -0
  123. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/opensslv.h +78 -0
  124. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/ossl_typ.h +32 -0
  125. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/pem.h +301 -0
  126. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/pkcs12.h +57 -0
  127. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/pkcs7.h +110 -0
  128. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/rand.h +38 -0
  129. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/rc4.h +64 -0
  130. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/ripemd.h +58 -0
  131. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/rsa.h +291 -0
  132. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/safestack.h +40 -0
  133. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/sha.h +331 -0
  134. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/sha3.h +158 -0
  135. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/srp.h +33 -0
  136. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/ssl.h +1923 -0
  137. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/ssl23.h +1 -0
  138. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/stack.h +61 -0
  139. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/tls1.h +64 -0
  140. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/txt_db.h +60 -0
  141. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/ui.h +2 -0
  142. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/x509.h +227 -0
  143. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/x509_vfy.h +50 -0
  144. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/openssl/x509v3.h +237 -0
  145. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/options.h +273 -0
  146. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/quic.h +310 -0
  147. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/sniffer.h +359 -0
  148. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/sniffer_error.h +151 -0
  149. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/ssl.h +6300 -0
  150. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/test.h +4989 -0
  151. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/version.h +40 -0
  152. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/aes.h +1074 -0
  153. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/arc4.h +69 -0
  154. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/ascon.h +109 -0
  155. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/asn.h +2855 -0
  156. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/asn_public.h +1009 -0
  157. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/blake2-impl.h +155 -0
  158. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/blake2-int.h +174 -0
  159. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/blake2.h +108 -0
  160. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/camellia.h +116 -0
  161. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/chacha.h +133 -0
  162. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/chacha20_poly1305.h +157 -0
  163. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/cmac.h +168 -0
  164. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/coding.h +107 -0
  165. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/compress.h +60 -0
  166. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/cpuid.h +153 -0
  167. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/cryptocb.h +770 -0
  168. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/curve25519.h +225 -0
  169. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/curve448.h +151 -0
  170. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/des3.h +167 -0
  171. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/dh.h +210 -0
  172. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/dilithium.h +1051 -0
  173. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/dsa.h +121 -0
  174. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/ecc.h +1074 -0
  175. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/eccsi.h +176 -0
  176. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/ed25519.h +239 -0
  177. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/ed448.h +214 -0
  178. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/error-crypt.h +368 -0
  179. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/ext_lms.h +62 -0
  180. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/ext_mlkem.h +74 -0
  181. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/ext_xmss.h +53 -0
  182. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/falcon.h +180 -0
  183. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/fe_448.h +122 -0
  184. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/fe_operations.h +189 -0
  185. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/fips_test.h +131 -0
  186. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/ge_448.h +84 -0
  187. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/ge_operations.h +134 -0
  188. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/hash.h +296 -0
  189. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/hmac.h +231 -0
  190. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/hpke.h +145 -0
  191. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/integer.h +449 -0
  192. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/kdf.h +199 -0
  193. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/lms.h +202 -0
  194. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/logging.h +588 -0
  195. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/md2.h +83 -0
  196. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/md4.h +77 -0
  197. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/md5.h +141 -0
  198. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/mem_track.h +968 -0
  199. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/memory.h +545 -0
  200. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/misc.h +214 -0
  201. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/mlkem.h +377 -0
  202. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/mpi_class.h +1021 -0
  203. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/mpi_superclass.h +96 -0
  204. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/oid_sum.h +1907 -0
  205. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/pkcs12.h +79 -0
  206. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/pkcs7.h +578 -0
  207. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/poly1305.h +207 -0
  208. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/pwdbased.h +81 -0
  209. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/random.h +300 -0
  210. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/rc2.h +68 -0
  211. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/ripemd.h +67 -0
  212. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/rsa.h +494 -0
  213. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/sakke.h +228 -0
  214. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/settings.h +4762 -0
  215. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/sha.h +237 -0
  216. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/sha256.h +360 -0
  217. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/sha3.h +274 -0
  218. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/sha512.h +372 -0
  219. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/signature.h +87 -0
  220. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/siphash.h +101 -0
  221. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/sm2.h +27 -0
  222. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/sm3.h +27 -0
  223. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/sm4.h +27 -0
  224. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/sp_int.h +1396 -0
  225. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/sphincs.h +167 -0
  226. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/srp.h +313 -0
  227. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/tfm.h +941 -0
  228. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/types.h +2383 -0
  229. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/visibility.h +97 -0
  230. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/wc_encrypt.h +126 -0
  231. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/wc_lms.h +506 -0
  232. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/wc_mlkem.h +370 -0
  233. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/wc_port.h +1764 -0
  234. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/wc_xmss.h +285 -0
  235. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/wolfevent.h +120 -0
  236. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/wolfmath.h +175 -0
  237. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfcrypt/xmss.h +203 -0
  238. package/android/install/wolfssl-android/arm64-v8a/include/wolfssl/wolfio.h +1035 -0
  239. package/android/install/wolfssl-android/arm64-v8a/lib/libwolfssl.a +0 -0
  240. package/android/install/wolfssl-android/arm64-v8a/lib/libwolfssl.la +41 -0
  241. package/android/install/wolfssl-android/arm64-v8a/lib/pkgconfig/wolfssl.pc +11 -0
  242. package/android/install/wolfssl-android/arm64-v8a/share/doc/wolfssl/QUIC.md +117 -0
  243. package/android/install/wolfssl-android/arm64-v8a/share/doc/wolfssl/README.txt +8 -0
  244. package/android/install/wolfssl-android/arm64-v8a/share/doc/wolfssl/example/async_client.c +245 -0
  245. package/android/install/wolfssl-android/arm64-v8a/share/doc/wolfssl/example/async_server.c +331 -0
  246. package/android/install/wolfssl-android/arm64-v8a/share/doc/wolfssl/example/client.c +4885 -0
  247. package/android/install/wolfssl-android/arm64-v8a/share/doc/wolfssl/example/echoclient.c +341 -0
  248. package/android/install/wolfssl-android/arm64-v8a/share/doc/wolfssl/example/echoserver.c +498 -0
  249. package/android/install/wolfssl-android/arm64-v8a/share/doc/wolfssl/example/sctp-client-dtls.c +135 -0
  250. package/android/install/wolfssl-android/arm64-v8a/share/doc/wolfssl/example/sctp-client.c +78 -0
  251. package/android/install/wolfssl-android/arm64-v8a/share/doc/wolfssl/example/sctp-server-dtls.c +134 -0
  252. package/android/install/wolfssl-android/arm64-v8a/share/doc/wolfssl/example/sctp-server.c +83 -0
  253. package/android/install/wolfssl-android/arm64-v8a/share/doc/wolfssl/example/server.c +4124 -0
  254. package/android/install/wolfssl-android/arm64-v8a/share/doc/wolfssl/example/tls_bench.c +2357 -0
  255. package/android/install/wolfssl-android/arm64-v8a/share/doc/wolfssl/taoCert.txt +176 -0
  256. package/android/install/wolfssl-android/armeabi-v7a/bin/wolfssl-config +117 -0
  257. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/callbacks.h +93 -0
  258. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/certs_test.h +7073 -0
  259. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/certs_test_sm.h +2913 -0
  260. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/crl.h +58 -0
  261. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/error-ssl.h +280 -0
  262. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/ocsp.h +191 -0
  263. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/aes.h +117 -0
  264. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/asn1.h +315 -0
  265. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/asn1t.h +30 -0
  266. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/bio.h +237 -0
  267. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/bn.h +332 -0
  268. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/buffer.h +57 -0
  269. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/camellia.h +27 -0
  270. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/cmac.h +66 -0
  271. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/cms.h +26 -0
  272. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/compat_types.h +70 -0
  273. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/conf.h +117 -0
  274. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/crypto.h +171 -0
  275. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/des.h +124 -0
  276. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/dh.h +144 -0
  277. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/dsa.h +164 -0
  278. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/ec.h +525 -0
  279. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/ec25519.h +46 -0
  280. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/ec448.h +46 -0
  281. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/ecdh.h +49 -0
  282. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/ecdsa.h +87 -0
  283. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/ed25519.h +49 -0
  284. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/ed448.h +49 -0
  285. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/engine.h +9 -0
  286. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/err.h +84 -0
  287. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/evp.h +1540 -0
  288. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/fips_rand.h +125 -0
  289. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/hmac.h +98 -0
  290. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/kdf.h +45 -0
  291. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/lhash.h +64 -0
  292. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/md4.h +66 -0
  293. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/md5.h +108 -0
  294. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/modes.h +45 -0
  295. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/obj_mac.h +92 -0
  296. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/objects.h +86 -0
  297. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/ocsp.h +108 -0
  298. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/opensslconf.h +8 -0
  299. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/opensslv.h +78 -0
  300. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/ossl_typ.h +32 -0
  301. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/pem.h +301 -0
  302. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/pkcs12.h +57 -0
  303. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/pkcs7.h +110 -0
  304. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/rand.h +38 -0
  305. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/rc4.h +64 -0
  306. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/ripemd.h +58 -0
  307. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/rsa.h +291 -0
  308. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/safestack.h +40 -0
  309. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/sha.h +331 -0
  310. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/sha3.h +158 -0
  311. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/srp.h +33 -0
  312. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/ssl.h +1923 -0
  313. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/ssl23.h +1 -0
  314. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/stack.h +61 -0
  315. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/tls1.h +64 -0
  316. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/txt_db.h +60 -0
  317. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/ui.h +2 -0
  318. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/x509.h +227 -0
  319. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/x509_vfy.h +50 -0
  320. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/openssl/x509v3.h +237 -0
  321. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/options.h +261 -0
  322. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/quic.h +310 -0
  323. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/sniffer.h +359 -0
  324. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/sniffer_error.h +151 -0
  325. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/ssl.h +6300 -0
  326. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/test.h +4989 -0
  327. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/version.h +40 -0
  328. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/aes.h +1074 -0
  329. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/arc4.h +69 -0
  330. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/ascon.h +109 -0
  331. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/asn.h +2855 -0
  332. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/asn_public.h +1009 -0
  333. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/blake2-impl.h +155 -0
  334. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/blake2-int.h +174 -0
  335. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/blake2.h +108 -0
  336. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/camellia.h +116 -0
  337. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/chacha.h +133 -0
  338. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/chacha20_poly1305.h +157 -0
  339. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/cmac.h +168 -0
  340. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/coding.h +107 -0
  341. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/compress.h +60 -0
  342. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/cpuid.h +153 -0
  343. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/cryptocb.h +770 -0
  344. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/curve25519.h +225 -0
  345. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/curve448.h +151 -0
  346. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/des3.h +167 -0
  347. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/dh.h +210 -0
  348. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/dilithium.h +1051 -0
  349. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/dsa.h +121 -0
  350. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/ecc.h +1074 -0
  351. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/eccsi.h +176 -0
  352. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/ed25519.h +239 -0
  353. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/ed448.h +214 -0
  354. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/error-crypt.h +368 -0
  355. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/ext_lms.h +62 -0
  356. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/ext_mlkem.h +74 -0
  357. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/ext_xmss.h +53 -0
  358. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/falcon.h +180 -0
  359. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/fe_448.h +122 -0
  360. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/fe_operations.h +189 -0
  361. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/fips_test.h +131 -0
  362. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/ge_448.h +84 -0
  363. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/ge_operations.h +134 -0
  364. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/hash.h +296 -0
  365. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/hmac.h +231 -0
  366. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/hpke.h +145 -0
  367. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/integer.h +449 -0
  368. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/kdf.h +199 -0
  369. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/lms.h +202 -0
  370. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/logging.h +588 -0
  371. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/md2.h +83 -0
  372. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/md4.h +77 -0
  373. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/md5.h +141 -0
  374. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/mem_track.h +968 -0
  375. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/memory.h +545 -0
  376. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/misc.h +214 -0
  377. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/mlkem.h +377 -0
  378. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/mpi_class.h +1021 -0
  379. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/mpi_superclass.h +96 -0
  380. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/oid_sum.h +1907 -0
  381. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/pkcs12.h +79 -0
  382. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/pkcs7.h +578 -0
  383. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/poly1305.h +207 -0
  384. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/pwdbased.h +81 -0
  385. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/random.h +300 -0
  386. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/rc2.h +68 -0
  387. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/ripemd.h +67 -0
  388. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/rsa.h +494 -0
  389. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/sakke.h +228 -0
  390. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/settings.h +4762 -0
  391. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/sha.h +237 -0
  392. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/sha256.h +360 -0
  393. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/sha3.h +274 -0
  394. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/sha512.h +372 -0
  395. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/signature.h +87 -0
  396. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/siphash.h +101 -0
  397. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/sm2.h +27 -0
  398. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/sm3.h +27 -0
  399. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/sm4.h +27 -0
  400. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/sp_int.h +1396 -0
  401. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/sphincs.h +167 -0
  402. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/srp.h +313 -0
  403. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/tfm.h +941 -0
  404. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/types.h +2383 -0
  405. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/visibility.h +97 -0
  406. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/wc_encrypt.h +126 -0
  407. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/wc_lms.h +506 -0
  408. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/wc_mlkem.h +370 -0
  409. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/wc_port.h +1764 -0
  410. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/wc_xmss.h +285 -0
  411. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/wolfevent.h +120 -0
  412. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/wolfmath.h +175 -0
  413. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfcrypt/xmss.h +203 -0
  414. package/android/install/wolfssl-android/armeabi-v7a/include/wolfssl/wolfio.h +1035 -0
  415. package/android/install/wolfssl-android/armeabi-v7a/lib/libwolfssl.a +0 -0
  416. package/android/install/wolfssl-android/armeabi-v7a/lib/libwolfssl.la +41 -0
  417. package/android/install/wolfssl-android/armeabi-v7a/lib/pkgconfig/wolfssl.pc +11 -0
  418. package/android/install/wolfssl-android/armeabi-v7a/share/doc/wolfssl/QUIC.md +117 -0
  419. package/android/install/wolfssl-android/armeabi-v7a/share/doc/wolfssl/README.txt +8 -0
  420. package/android/install/wolfssl-android/armeabi-v7a/share/doc/wolfssl/example/async_client.c +245 -0
  421. package/android/install/wolfssl-android/armeabi-v7a/share/doc/wolfssl/example/async_server.c +331 -0
  422. package/android/install/wolfssl-android/armeabi-v7a/share/doc/wolfssl/example/client.c +4885 -0
  423. package/android/install/wolfssl-android/armeabi-v7a/share/doc/wolfssl/example/echoclient.c +341 -0
  424. package/android/install/wolfssl-android/armeabi-v7a/share/doc/wolfssl/example/echoserver.c +498 -0
  425. package/android/install/wolfssl-android/armeabi-v7a/share/doc/wolfssl/example/sctp-client-dtls.c +135 -0
  426. package/android/install/wolfssl-android/armeabi-v7a/share/doc/wolfssl/example/sctp-client.c +78 -0
  427. package/android/install/wolfssl-android/armeabi-v7a/share/doc/wolfssl/example/sctp-server-dtls.c +134 -0
  428. package/android/install/wolfssl-android/armeabi-v7a/share/doc/wolfssl/example/sctp-server.c +83 -0
  429. package/android/install/wolfssl-android/armeabi-v7a/share/doc/wolfssl/example/server.c +4124 -0
  430. package/android/install/wolfssl-android/armeabi-v7a/share/doc/wolfssl/example/tls_bench.c +2357 -0
  431. package/android/install/wolfssl-android/armeabi-v7a/share/doc/wolfssl/taoCert.txt +176 -0
  432. package/android/install/wolfssl-android/x86_64/bin/wolfssl-config +117 -0
  433. package/android/install/wolfssl-android/x86_64/include/wolfssl/callbacks.h +93 -0
  434. package/android/install/wolfssl-android/x86_64/include/wolfssl/certs_test.h +7073 -0
  435. package/android/install/wolfssl-android/x86_64/include/wolfssl/certs_test_sm.h +2913 -0
  436. package/android/install/wolfssl-android/x86_64/include/wolfssl/crl.h +58 -0
  437. package/android/install/wolfssl-android/x86_64/include/wolfssl/error-ssl.h +280 -0
  438. package/android/install/wolfssl-android/x86_64/include/wolfssl/ocsp.h +191 -0
  439. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/aes.h +117 -0
  440. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/asn1.h +315 -0
  441. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/asn1t.h +30 -0
  442. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/bio.h +237 -0
  443. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/bn.h +332 -0
  444. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/buffer.h +57 -0
  445. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/camellia.h +27 -0
  446. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/cmac.h +66 -0
  447. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/cms.h +26 -0
  448. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/compat_types.h +70 -0
  449. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/conf.h +117 -0
  450. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/crypto.h +171 -0
  451. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/des.h +124 -0
  452. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/dh.h +144 -0
  453. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/dsa.h +164 -0
  454. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/ec.h +525 -0
  455. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/ec25519.h +46 -0
  456. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/ec448.h +46 -0
  457. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/ecdh.h +49 -0
  458. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/ecdsa.h +87 -0
  459. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/ed25519.h +49 -0
  460. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/ed448.h +49 -0
  461. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/engine.h +9 -0
  462. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/err.h +84 -0
  463. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/evp.h +1540 -0
  464. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/fips_rand.h +125 -0
  465. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/hmac.h +98 -0
  466. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/kdf.h +45 -0
  467. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/lhash.h +64 -0
  468. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/md4.h +66 -0
  469. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/md5.h +108 -0
  470. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/modes.h +45 -0
  471. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/obj_mac.h +92 -0
  472. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/objects.h +86 -0
  473. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/ocsp.h +108 -0
  474. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/opensslconf.h +8 -0
  475. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/opensslv.h +78 -0
  476. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/ossl_typ.h +32 -0
  477. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/pem.h +301 -0
  478. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/pkcs12.h +57 -0
  479. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/pkcs7.h +110 -0
  480. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/rand.h +38 -0
  481. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/rc4.h +64 -0
  482. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/ripemd.h +58 -0
  483. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/rsa.h +291 -0
  484. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/safestack.h +40 -0
  485. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/sha.h +331 -0
  486. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/sha3.h +158 -0
  487. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/srp.h +33 -0
  488. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/ssl.h +1923 -0
  489. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/ssl23.h +1 -0
  490. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/stack.h +61 -0
  491. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/tls1.h +64 -0
  492. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/txt_db.h +60 -0
  493. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/ui.h +2 -0
  494. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/x509.h +227 -0
  495. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/x509_vfy.h +50 -0
  496. package/android/install/wolfssl-android/x86_64/include/wolfssl/openssl/x509v3.h +237 -0
  497. package/android/install/wolfssl-android/x86_64/include/wolfssl/options.h +273 -0
  498. package/android/install/wolfssl-android/x86_64/include/wolfssl/quic.h +310 -0
  499. package/android/install/wolfssl-android/x86_64/include/wolfssl/sniffer.h +359 -0
  500. package/android/install/wolfssl-android/x86_64/include/wolfssl/sniffer_error.h +151 -0
  501. package/android/install/wolfssl-android/x86_64/include/wolfssl/ssl.h +6300 -0
  502. package/android/install/wolfssl-android/x86_64/include/wolfssl/test.h +4989 -0
  503. package/android/install/wolfssl-android/x86_64/include/wolfssl/version.h +40 -0
  504. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/aes.h +1074 -0
  505. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/arc4.h +69 -0
  506. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/ascon.h +109 -0
  507. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/asn.h +2855 -0
  508. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/asn_public.h +1009 -0
  509. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/blake2-impl.h +155 -0
  510. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/blake2-int.h +174 -0
  511. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/blake2.h +108 -0
  512. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/camellia.h +116 -0
  513. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/chacha.h +133 -0
  514. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/chacha20_poly1305.h +157 -0
  515. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/cmac.h +168 -0
  516. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/coding.h +107 -0
  517. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/compress.h +60 -0
  518. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/cpuid.h +153 -0
  519. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/cryptocb.h +770 -0
  520. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/curve25519.h +225 -0
  521. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/curve448.h +151 -0
  522. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/des3.h +167 -0
  523. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/dh.h +210 -0
  524. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/dilithium.h +1051 -0
  525. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/dsa.h +121 -0
  526. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/ecc.h +1074 -0
  527. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/eccsi.h +176 -0
  528. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/ed25519.h +239 -0
  529. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/ed448.h +214 -0
  530. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/error-crypt.h +368 -0
  531. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/ext_lms.h +62 -0
  532. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/ext_mlkem.h +74 -0
  533. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/ext_xmss.h +53 -0
  534. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/falcon.h +180 -0
  535. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/fe_448.h +122 -0
  536. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/fe_operations.h +189 -0
  537. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/fips_test.h +131 -0
  538. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/ge_448.h +84 -0
  539. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/ge_operations.h +134 -0
  540. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/hash.h +296 -0
  541. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/hmac.h +231 -0
  542. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/hpke.h +145 -0
  543. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/integer.h +449 -0
  544. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/kdf.h +199 -0
  545. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/lms.h +202 -0
  546. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/logging.h +588 -0
  547. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/md2.h +83 -0
  548. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/md4.h +77 -0
  549. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/md5.h +141 -0
  550. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/mem_track.h +968 -0
  551. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/memory.h +545 -0
  552. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/misc.h +214 -0
  553. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/mlkem.h +377 -0
  554. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/mpi_class.h +1021 -0
  555. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/mpi_superclass.h +96 -0
  556. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/oid_sum.h +1907 -0
  557. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/pkcs12.h +79 -0
  558. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/pkcs7.h +578 -0
  559. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/poly1305.h +207 -0
  560. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/pwdbased.h +81 -0
  561. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/random.h +300 -0
  562. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/rc2.h +68 -0
  563. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/ripemd.h +67 -0
  564. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/rsa.h +494 -0
  565. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/sakke.h +228 -0
  566. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/settings.h +4762 -0
  567. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/sha.h +237 -0
  568. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/sha256.h +360 -0
  569. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/sha3.h +274 -0
  570. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/sha512.h +372 -0
  571. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/signature.h +87 -0
  572. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/siphash.h +101 -0
  573. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/sm2.h +27 -0
  574. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/sm3.h +27 -0
  575. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/sm4.h +27 -0
  576. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/sp_int.h +1396 -0
  577. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/sphincs.h +167 -0
  578. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/srp.h +313 -0
  579. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/tfm.h +941 -0
  580. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/types.h +2383 -0
  581. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/visibility.h +97 -0
  582. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/wc_encrypt.h +126 -0
  583. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/wc_lms.h +506 -0
  584. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/wc_mlkem.h +370 -0
  585. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/wc_port.h +1764 -0
  586. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/wc_xmss.h +285 -0
  587. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/wolfevent.h +120 -0
  588. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/wolfmath.h +175 -0
  589. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfcrypt/xmss.h +203 -0
  590. package/android/install/wolfssl-android/x86_64/include/wolfssl/wolfio.h +1035 -0
  591. package/android/install/wolfssl-android/x86_64/lib/libwolfssl.a +0 -0
  592. package/android/install/wolfssl-android/x86_64/lib/libwolfssl.la +41 -0
  593. package/android/install/wolfssl-android/x86_64/lib/pkgconfig/wolfssl.pc +11 -0
  594. package/android/install/wolfssl-android/x86_64/share/doc/wolfssl/QUIC.md +117 -0
  595. package/android/install/wolfssl-android/x86_64/share/doc/wolfssl/README.txt +8 -0
  596. package/android/install/wolfssl-android/x86_64/share/doc/wolfssl/example/async_client.c +245 -0
  597. package/android/install/wolfssl-android/x86_64/share/doc/wolfssl/example/async_server.c +331 -0
  598. package/android/install/wolfssl-android/x86_64/share/doc/wolfssl/example/client.c +4885 -0
  599. package/android/install/wolfssl-android/x86_64/share/doc/wolfssl/example/echoclient.c +341 -0
  600. package/android/install/wolfssl-android/x86_64/share/doc/wolfssl/example/echoserver.c +498 -0
  601. package/android/install/wolfssl-android/x86_64/share/doc/wolfssl/example/sctp-client-dtls.c +135 -0
  602. package/android/install/wolfssl-android/x86_64/share/doc/wolfssl/example/sctp-client.c +78 -0
  603. package/android/install/wolfssl-android/x86_64/share/doc/wolfssl/example/sctp-server-dtls.c +134 -0
  604. package/android/install/wolfssl-android/x86_64/share/doc/wolfssl/example/sctp-server.c +83 -0
  605. package/android/install/wolfssl-android/x86_64/share/doc/wolfssl/example/server.c +4124 -0
  606. package/android/install/wolfssl-android/x86_64/share/doc/wolfssl/example/tls_bench.c +2357 -0
  607. package/android/install/wolfssl-android/x86_64/share/doc/wolfssl/taoCert.txt +176 -0
  608. package/android/src/main/cpp/CMakeLists.txt +19 -27
  609. package/android/src/main/cpp/ngtcp2_jni.cpp +30 -36
  610. package/android/src/main/kotlin/ai/annadata/mqttquic/MqttQuicPlugin.kt +15 -0
  611. package/android/src/main/kotlin/ai/annadata/mqttquic/client/MQTTClient.kt +6 -2
  612. package/build-native.sh +397 -0
  613. package/deps-versions.sh +25 -0
  614. package/dist/esm/definitions.d.ts +20 -0
  615. package/dist/esm/definitions.d.ts.map +1 -1
  616. package/dist/esm/web.d.ts +26 -3
  617. package/dist/esm/web.d.ts.map +1 -1
  618. package/dist/esm/web.js +230 -10
  619. package/dist/esm/web.js.map +1 -1
  620. package/dist/plugin.cjs.js +11363 -13
  621. package/dist/plugin.cjs.js.map +1 -1
  622. package/dist/plugin.js +11364 -14
  623. package/dist/plugin.js.map +1 -1
  624. package/docs/ARCHITECTURAL_ANALYSIS.md +710 -0
  625. package/docs/CAPACITOR_MQTT_QUIC_PRODUCTION_PLUGIN.md +190 -0
  626. package/docs/CAPACITOR_VERSION_SUPPORT.md +65 -0
  627. package/docs/IMPLEMENTATION_SUMMARY.md +246 -0
  628. package/docs/MQTT5_CLIENT_COMPLIANCE.md +48 -0
  629. package/docs/MQTT5_IMPLEMENTATION_COMPLETE.md +178 -0
  630. package/docs/MQTT_VERSION_ANALYSIS.md +233 -0
  631. package/docs/NGTCP2_IMPLEMENTATION_STATUS.md +214 -0
  632. package/docs/NGTCP2_INTEGRATION_PLAN.md +597 -0
  633. package/docs/P0_P1_CHANGELOG.md +79 -0
  634. package/docs/PRODUCTION_PUBLISH_STEPS.md +161 -0
  635. package/docs/PROJECT_OVERVIEW.md +193 -0
  636. package/ios/.swiftpm/xcode/xcuserdata/annadata.xcuserdatad/xcschemes/xcschememanagement.plist +1 -1
  637. package/ios/NGTCP2_BUILD_INSTRUCTIONS.md +12 -0
  638. package/ios/Sources/MqttQuicPlugin/MqttQuicPlugin.swift +6 -0
  639. package/ios/Sources/MqttQuicPlugin/QUIC/NGTCP2Bridge.mm +6 -0
  640. package/ios/build-openssl.sh +1 -1
  641. package/ios/libs/MqttQuicLibs.xcframework/Info.plist +44 -0
  642. package/ios/libs/MqttQuicLibs.xcframework/ios-arm64/libmqttquic_native_device.a +0 -0
  643. package/ios/libs/MqttQuicLibs.xcframework/ios-arm64_x86_64-simulator/libmqttquic_native_simulator.a +0 -0
  644. package/ios/libs/libnghttp3.a +0 -0
  645. package/ios/libs/libngtcp2.a +0 -0
  646. package/ios/libs/libngtcp2_crypto_wolfssl.a +0 -0
  647. package/ios/libs/libwolfssl.a +0 -0
  648. package/ios/libs-simulator/libnghttp3.a +0 -0
  649. package/ios/libs-simulator/libngtcp2.a +0 -0
  650. package/ios/libs-simulator/libngtcp2_crypto_wolfssl.a +0 -0
  651. package/ios/libs-simulator/libwolfssl.a +0 -0
  652. package/ios/libs-simulator-x86_64/libnghttp3.a +0 -0
  653. package/ios/libs-simulator-x86_64/libngtcp2.a +0 -0
  654. package/ios/libs-simulator-x86_64/libngtcp2_crypto_wolfssl.a +0 -0
  655. package/ios/libs-simulator-x86_64/libwolfssl.a +0 -0
  656. package/package.json +22 -9
@@ -0,0 +1,4885 @@
1
+ /* client.c
2
+ *
3
+ * Copyright (C) 2006-2025 wolfSSL Inc.
4
+ *
5
+ * This file is part of wolfSSL.
6
+ *
7
+ * wolfSSL is free software; you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation; either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * wolfSSL is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program; if not, write to the Free Software
19
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20
+ */
21
+
22
+ /* For simpler wolfSSL TLS client examples, visit
23
+ * https://github.com/wolfSSL/wolfssl-examples/tree/master/tls
24
+ */
25
+
26
+ #ifdef HAVE_CONFIG_H
27
+ #include <config.h>
28
+ #endif
29
+
30
+ #ifndef WOLFSSL_USER_SETTINGS
31
+ #include <wolfssl/options.h>
32
+ #endif
33
+ #include <wolfssl/wolfcrypt/settings.h>
34
+
35
+ #undef TEST_OPENSSL_COEXIST /* can't use this option with this example */
36
+ #undef OPENSSL_COEXIST /* can't use this option with this example */
37
+
38
+ #include <wolfssl/ssl.h>
39
+
40
+ #ifdef WOLFSSL_WOLFSENTRY_HOOKS
41
+ #include <wolfsentry/wolfsentry.h>
42
+ #if !defined(NO_FILESYSTEM) && !defined(WOLFSENTRY_NO_JSON)
43
+ static const char *wolfsentry_config_path = NULL;
44
+ #endif
45
+ #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
46
+
47
+ #if defined(WOLFSSL_MDK_ARM) || defined(WOLFSSL_KEIL_TCP_NET)
48
+ #include <stdio.h>
49
+ #include <string.h>
50
+ #include "rl_fs.h"
51
+ #include "rl_net.h"
52
+ #endif
53
+
54
+ #include <wolfssl/test.h>
55
+
56
+ #include <examples/client/client.h>
57
+ #include <wolfssl/error-ssl.h>
58
+
59
+ #if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_TLS)
60
+
61
+
62
+ #ifdef NO_FILESYSTEM
63
+ #ifdef NO_RSA
64
+ #error currently the example only tries to load in a RSA buffer
65
+ #endif
66
+ #undef USE_CERT_BUFFERS_256
67
+ #define USE_CERT_BUFFERS_256
68
+ #undef USE_CERT_BUFFERS_2048
69
+ #define USE_CERT_BUFFERS_2048
70
+ #include <wolfssl/certs_test.h>
71
+ #endif
72
+
73
+ #include <wolfssl/wolfcrypt/wolfmath.h> /* for max bits */
74
+
75
+ #ifdef HAVE_ECC
76
+ #include <wolfssl/wolfcrypt/ecc.h>
77
+ #endif
78
+
79
+ #ifdef WOLFSSL_ASYNC_CRYPT
80
+ static int devId = INVALID_DEVID;
81
+ #endif
82
+
83
+ #define DEFAULT_TIMEOUT_SEC 2
84
+ #ifndef MAX_NON_BLOCK_SEC
85
+ #define MAX_NON_BLOCK_SEC 10
86
+ #endif
87
+
88
+ #define OCSP_STAPLING 1
89
+ #define OCSP_STAPLINGV2 2
90
+ #define OCSP_STAPLINGV2_MULTI 3
91
+ #define OCSP_STAPLING_OPT_MAX OCSP_STAPLINGV2_MULTI
92
+
93
+ #ifdef WOLFSSL_ALT_TEST_STRINGS
94
+ #define TEST_STR_TERM "\n"
95
+ #else
96
+ #define TEST_STR_TERM
97
+ #endif
98
+
99
+ static const char kHelloMsg[] = "hello wolfssl!" TEST_STR_TERM;
100
+ #ifndef NO_SESSION_CACHE
101
+ static const char kResumeMsg[] = "resuming wolfssl!" TEST_STR_TERM;
102
+ #endif
103
+
104
+ #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_EARLY_DATA)
105
+ static const char kEarlyMsg[] = "A drop of info" TEST_STR_TERM;
106
+ #endif
107
+ static const char kHttpGetMsg[] = "GET /index.html HTTP/1.0\r\n\r\n";
108
+
109
+ /* Write needs to be largest of the above strings (29) */
110
+ #define CLI_MSG_SZ 32
111
+ /* Read needs to be at least sizeof server.c `webServerMsg` (226) */
112
+ #define CLI_REPLY_SZ 256
113
+
114
+ #if defined(XSLEEP_US) && defined(NO_MAIN_DRIVER)
115
+ /* This is to force the server's thread to get a chance to
116
+ * execute before continuing the resume in non-blocking
117
+ * DTLS test cases. */
118
+ #define TEST_DELAY() XSLEEP_US(10000)
119
+ #else
120
+ #define TEST_DELAY() XSLEEP_MS(1000)
121
+ #endif
122
+
123
+ /* Note on using port 0: the client standalone example doesn't utilize the
124
+ * port 0 port sharing; that is used by (1) the server in external control
125
+ * test mode and (2) the testsuite which uses this code and sets up the correct
126
+ * port numbers when the internal thread using the server code using port 0. */
127
+
128
+ static int lng_index = 0;
129
+ #ifdef WOLFSSL_CALLBACKS
130
+ WOLFSSL_TIMEVAL timeoutConnect;
131
+ static int handShakeCB(HandShakeInfo* info)
132
+ {
133
+ (void)info;
134
+ return 0;
135
+ }
136
+
137
+ static int timeoutCB(TimeoutInfo* info)
138
+ {
139
+ (void)info;
140
+ return 0;
141
+ }
142
+
143
+ #endif
144
+
145
+ static int quieter = 0; /* Print fewer messages. This is helpful with overly
146
+ * ambitious log parsers. */
147
+
148
+ #define LOG_ERROR(...) \
149
+ do { \
150
+ if (!quieter) \
151
+ fprintf(stderr, __VA_ARGS__); \
152
+ } while(0)
153
+
154
+ #ifdef HAVE_SESSION_TICKET
155
+
156
+ #ifndef SESSION_TICKET_LEN
157
+ #define SESSION_TICKET_LEN 256
158
+ #endif
159
+ static int sessionTicketCB(WOLFSSL* ssl,
160
+ const unsigned char* ticket, int ticketSz,
161
+ void* ctx)
162
+ {
163
+ (void)ssl;
164
+ (void)ticket;
165
+ printf("Session Ticket CB: ticketSz = %d, ctx = %s\n",
166
+ ticketSz, (char*)ctx);
167
+ return 0;
168
+ }
169
+ #endif
170
+
171
+ static int NonBlockingSSL_Connect(WOLFSSL* ssl)
172
+ {
173
+ int ret;
174
+ int error;
175
+ SOCKET_T sockfd;
176
+ int select_ret = 0;
177
+ int elapsedSec = 0;
178
+
179
+ #ifndef WOLFSSL_CALLBACKS
180
+ ret = wolfSSL_connect(ssl);
181
+ #else
182
+ ret = wolfSSL_connect_ex(ssl, handShakeCB, timeoutCB, timeoutConnect);
183
+ #endif
184
+ error = wolfSSL_get_error(ssl, 0);
185
+ sockfd = (SOCKET_T)wolfSSL_get_fd(ssl);
186
+
187
+ while (ret != WOLFSSL_SUCCESS &&
188
+ (error == WOLFSSL_ERROR_WANT_READ || error == WOLFSSL_ERROR_WANT_WRITE
189
+ #ifdef WOLFSSL_ASYNC_CRYPT
190
+ || error == WC_NO_ERR_TRACE(WC_PENDING_E)
191
+ #endif
192
+ #ifdef WOLFSSL_NONBLOCK_OCSP
193
+ || error == WC_NO_ERR_TRACE(OCSP_WANT_READ)
194
+ #endif
195
+ )) {
196
+ int currTimeout = 1;
197
+
198
+ if (error == WOLFSSL_ERROR_WANT_READ)
199
+ printf("... client would read block\n");
200
+ else if (error == WOLFSSL_ERROR_WANT_WRITE)
201
+ printf("... client would write block\n");
202
+
203
+ #ifdef WOLFSSL_ASYNC_CRYPT
204
+ if (error == WC_NO_ERR_TRACE(WC_PENDING_E)) {
205
+ ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
206
+ if (ret < 0) break;
207
+ }
208
+ else
209
+ #endif
210
+ {
211
+ if (error == WOLFSSL_ERROR_WANT_WRITE) {
212
+ select_ret = tcp_select_tx(sockfd, currTimeout);
213
+
214
+ }
215
+ else
216
+ {
217
+ #ifdef WOLFSSL_DTLS
218
+ if (wolfSSL_dtls(ssl))
219
+ currTimeout = wolfSSL_dtls_get_current_timeout(ssl);
220
+ #endif
221
+ select_ret = tcp_select(sockfd, currTimeout);
222
+ }
223
+ }
224
+
225
+ if ((select_ret == TEST_RECV_READY) || (select_ret == TEST_SEND_READY)
226
+ || (select_ret == TEST_ERROR_READY)
227
+ #ifdef WOLFSSL_ASYNC_CRYPT
228
+ || error == WC_NO_ERR_TRACE(WC_PENDING_E)
229
+ #endif
230
+ #ifdef WOLFSSL_NONBLOCK_OCSP
231
+ || error == WC_NO_ERR_TRACE(OCSP_WANT_READ)
232
+ #endif
233
+ ) {
234
+ #ifndef WOLFSSL_CALLBACKS
235
+ ret = wolfSSL_connect(ssl);
236
+ #else
237
+ ret = wolfSSL_connect_ex(ssl, handShakeCB, timeoutCB,
238
+ timeoutConnect);
239
+ #endif
240
+ error = wolfSSL_get_error(ssl, 0);
241
+ elapsedSec = 0; /* reset elapsed */
242
+ }
243
+ else if (select_ret == TEST_TIMEOUT && !wolfSSL_dtls(ssl)) {
244
+ error = WOLFSSL_ERROR_WANT_READ;
245
+
246
+ elapsedSec += currTimeout;
247
+ if (elapsedSec > MAX_NON_BLOCK_SEC) {
248
+ printf("Nonblocking connect timeout\n");
249
+ error = WOLFSSL_FATAL_ERROR;
250
+ }
251
+ }
252
+ #ifdef WOLFSSL_DTLS
253
+ else if (select_ret == TEST_TIMEOUT && wolfSSL_dtls(ssl)) {
254
+ ret = wolfSSL_dtls_got_timeout(ssl);
255
+ if (ret != WOLFSSL_SUCCESS)
256
+ error = wolfSSL_get_error(ssl, ret);
257
+ else
258
+ error = WOLFSSL_ERROR_WANT_READ;
259
+ ret = WOLFSSL_FAILURE; /* Reset error so we loop */
260
+ }
261
+ #endif
262
+ else {
263
+ error = WOLFSSL_FATAL_ERROR;
264
+ }
265
+ }
266
+
267
+ return ret;
268
+ }
269
+
270
+
271
+ static void ShowCiphers(void)
272
+ {
273
+ static char ciphers[WOLFSSL_CIPHER_LIST_MAX_SIZE];
274
+ int ret = wolfSSL_get_ciphers(ciphers, (int)sizeof(ciphers));
275
+ if (ret == WOLFSSL_SUCCESS) {
276
+ printf("%s\n", ciphers);
277
+ }
278
+ }
279
+
280
+ /* Shows which versions are valid */
281
+ static void ShowVersions(void)
282
+ {
283
+ char verStr[100];
284
+ XMEMSET(verStr, 0, sizeof(verStr));
285
+ #ifndef NO_OLD_TLS
286
+ #ifdef WOLFSSL_ALLOW_SSLV3
287
+ XSTRNCAT(verStr, "0:", 3);
288
+ #endif
289
+ #ifdef WOLFSSL_ALLOW_TLSV10
290
+ XSTRNCAT(verStr, "1:", 3);
291
+ #endif
292
+ XSTRNCAT(verStr, "2:", 3);
293
+ #endif /* NO_OLD_TLS */
294
+ #ifndef WOLFSSL_NO_TLS12
295
+ XSTRNCAT(verStr, "3:", 3);
296
+ #endif
297
+ #ifdef WOLFSSL_TLS13
298
+ XSTRNCAT(verStr, "4:", 3);
299
+ #endif
300
+ XSTRNCAT(verStr, "d(downgrade):", 14);
301
+ #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
302
+ XSTRNCAT(verStr, "e(either):", 11);
303
+ #endif
304
+ /* print all strings at same time on stdout to avoid any flush issues */
305
+ printf("%s\n", verStr);
306
+ }
307
+
308
+ #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
309
+ #define MAX_GROUP_NUMBER 4
310
+ static void SetKeyShare(WOLFSSL* ssl, int onlyKeyShare, int useX25519,
311
+ int useX448, int usePqc, char* pqcAlg, int setGroups)
312
+ {
313
+ int ret;
314
+ int groups[MAX_GROUP_NUMBER] = {0};
315
+ int count = 0;
316
+
317
+ (void)useX25519;
318
+ (void)useX448;
319
+ (void)usePqc;
320
+ (void)pqcAlg;
321
+
322
+ WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
323
+ if (onlyKeyShare == 0 || onlyKeyShare == 2) {
324
+ if (useX25519) {
325
+ #ifdef HAVE_CURVE25519
326
+ do {
327
+ ret = wolfSSL_UseKeyShare(ssl, WOLFSSL_ECC_X25519);
328
+ if (ret == WOLFSSL_SUCCESS)
329
+ groups[count++] = WOLFSSL_ECC_X25519;
330
+ #ifdef WOLFSSL_ASYNC_CRYPT
331
+ else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
332
+ wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
333
+ #endif
334
+ else
335
+ err_sys("unable to use curve x25519");
336
+ } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E));
337
+ #endif
338
+ }
339
+ else if (useX448) {
340
+ #ifdef HAVE_CURVE448
341
+ do {
342
+ ret = wolfSSL_UseKeyShare(ssl, WOLFSSL_ECC_X448);
343
+ if (ret == WOLFSSL_SUCCESS)
344
+ groups[count++] = WOLFSSL_ECC_X448;
345
+ #ifdef WOLFSSL_ASYNC_CRYPT
346
+ else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
347
+ wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
348
+ #endif
349
+ else
350
+ err_sys("unable to use curve x448");
351
+ } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E));
352
+ #endif
353
+ }
354
+ else {
355
+ #ifdef HAVE_ECC
356
+ #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
357
+ do {
358
+ ret = wolfSSL_UseKeyShare(ssl, WOLFSSL_ECC_SECP256R1);
359
+ if (ret == WOLFSSL_SUCCESS)
360
+ groups[count++] = WOLFSSL_ECC_SECP256R1;
361
+ #ifdef WOLFSSL_ASYNC_CRYPT
362
+ else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
363
+ wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
364
+ #endif
365
+ else
366
+ err_sys("unable to use curve secp256r1");
367
+ } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E));
368
+ #endif
369
+ #ifdef WOLFSSL_SM2
370
+ do {
371
+ ret = wolfSSL_UseKeyShare(ssl, WOLFSSL_ECC_SM2P256V1);
372
+ if (ret == WOLFSSL_SUCCESS)
373
+ groups[count++] = WOLFSSL_ECC_SM2P256V1;
374
+ #ifdef WOLFSSL_ASYNC_CRYPT
375
+ else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
376
+ wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
377
+ #endif
378
+ else
379
+ err_sys("unable to use curve sm2p256v1");
380
+ } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E));
381
+ #endif
382
+ #endif
383
+ }
384
+ }
385
+ if (onlyKeyShare == 0 || onlyKeyShare == 1) {
386
+ #ifdef HAVE_FFDHE_2048
387
+ do {
388
+ ret = wolfSSL_UseKeyShare(ssl, WOLFSSL_FFDHE_2048);
389
+ if (ret == WOLFSSL_SUCCESS)
390
+ groups[count++] = WOLFSSL_FFDHE_2048;
391
+ #ifdef WOLFSSL_ASYNC_CRYPT
392
+ else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
393
+ wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
394
+ #endif
395
+ else
396
+ err_sys("unable to use DH 2048-bit parameters");
397
+ } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E));
398
+ #endif
399
+ }
400
+ #ifdef HAVE_PQC
401
+ if (onlyKeyShare == 0 || onlyKeyShare == 3) {
402
+ if (usePqc) {
403
+ int group = 0;
404
+
405
+ #ifndef WOLFSSL_NO_ML_KEM
406
+ #ifndef WOLFSSL_NO_ML_KEM_512
407
+ if (XSTRCMP(pqcAlg, "ML_KEM_512") == 0) {
408
+ group = WOLFSSL_ML_KEM_512;
409
+ }
410
+ else
411
+ #endif
412
+ #ifndef WOLFSSL_NO_ML_KEM_768
413
+ if (XSTRCMP(pqcAlg, "ML_KEM_768") == 0) {
414
+ group = WOLFSSL_ML_KEM_768;
415
+ }
416
+ else
417
+ #endif
418
+ #ifndef WOLFSSL_NO_ML_KEM_1024
419
+ if (XSTRCMP(pqcAlg, "ML_KEM_1024") == 0) {
420
+ group = WOLFSSL_ML_KEM_1024;
421
+ }
422
+ else
423
+ #endif
424
+ #ifndef WOLFSSL_NO_ML_KEM_512
425
+ if (XSTRCMP(pqcAlg, "SecP256r1MLKEM512") == 0) {
426
+ group = WOLFSSL_SECP256R1MLKEM512;
427
+ }
428
+ else
429
+ #endif
430
+ #ifndef WOLFSSL_NO_ML_KEM_768
431
+ if (XSTRCMP(pqcAlg, "SecP384r1MLKEM768") == 0) {
432
+ group = WOLFSSL_SECP384R1MLKEM768;
433
+ }
434
+ else if (XSTRCMP(pqcAlg, "SecP256r1MLKEM768") == 0) {
435
+ group = WOLFSSL_SECP256R1MLKEM768;
436
+ }
437
+ else
438
+ #endif
439
+ #ifndef WOLFSSL_NO_ML_KEM_1024
440
+ if (XSTRCMP(pqcAlg, "SecP521r1MLKEM1024") == 0) {
441
+ group = WOLFSSL_SECP521R1MLKEM1024;
442
+ }
443
+ else if (XSTRCMP(pqcAlg, "SecP384r1MLKEM1024") == 0) {
444
+ group = WOLFSSL_SECP384R1MLKEM1024;
445
+ }
446
+ else
447
+ #endif
448
+ #if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_CURVE25519)
449
+ if (XSTRCMP(pqcAlg, "X25519MLKEM512") == 0) {
450
+ group = WOLFSSL_X25519MLKEM512;
451
+ }
452
+ else
453
+ #endif
454
+ #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE25519)
455
+ if (XSTRCMP(pqcAlg, "X25519MLKEM768") == 0) {
456
+ group = WOLFSSL_X25519MLKEM768;
457
+ }
458
+ else
459
+ #endif
460
+ #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE448)
461
+ if (XSTRCMP(pqcAlg, "X448MLKEM768") == 0) {
462
+ group = WOLFSSL_X448MLKEM768;
463
+ }
464
+ else
465
+ #endif
466
+ #endif /* WOLFSSL_NO_ML_KEM */
467
+ #ifdef WOLFSSL_MLKEM_KYBER
468
+ #ifndef WOLFSSL_NO_KYBER512
469
+ if (XSTRCMP(pqcAlg, "KYBER_LEVEL1") == 0) {
470
+ group = WOLFSSL_KYBER_LEVEL1;
471
+ }
472
+ else
473
+ #endif
474
+ #ifndef WOLFSSL_NO_KYBER768
475
+ if (XSTRCMP(pqcAlg, "KYBER_LEVEL3") == 0) {
476
+ group = WOLFSSL_KYBER_LEVEL3;
477
+ }
478
+ else
479
+ #endif
480
+ #ifndef WOLFSSL_NO_KYBER1024
481
+ if (XSTRCMP(pqcAlg, "KYBER_LEVEL5") == 0) {
482
+ group = WOLFSSL_KYBER_LEVEL5;
483
+ }
484
+ else
485
+ #endif
486
+ #ifndef WOLFSSL_NO_KYBER512
487
+ if (XSTRCMP(pqcAlg, "P256_KYBER_LEVEL1") == 0) {
488
+ group = WOLFSSL_P256_KYBER_LEVEL1;
489
+ }
490
+ else
491
+ #endif
492
+ #ifndef WOLFSSL_NO_KYBER768
493
+ if (XSTRCMP(pqcAlg, "P384_KYBER_LEVEL3") == 0) {
494
+ group = WOLFSSL_P384_KYBER_LEVEL3;
495
+ }
496
+ else if (XSTRCMP(pqcAlg, "P256_KYBER_LEVEL3") == 0) {
497
+ group = WOLFSSL_P256_KYBER_LEVEL3;
498
+ }
499
+ else
500
+ #endif
501
+ #ifndef WOLFSSL_NO_KYBER1024
502
+ if (XSTRCMP(pqcAlg, "P521_KYBER_LEVEL5") == 0) {
503
+ group = WOLFSSL_P521_KYBER_LEVEL5;
504
+ }
505
+ else
506
+ #endif
507
+ #if !defined(WOLFSSL_NO_KYBER512) && defined(HAVE_CURVE25519)
508
+ if (XSTRCMP(pqcAlg, "X25519_KYBER_LEVEL1") == 0) {
509
+ group = WOLFSSL_X25519_KYBER_LEVEL1;
510
+ }
511
+ else
512
+ #endif
513
+ #if !defined(WOLFSSL_NO_KYBER768) && defined(HAVE_CURVE25519)
514
+ if (XSTRCMP(pqcAlg, "X25519_KYBER_LEVEL3") == 0) {
515
+ group = WOLFSSL_X25519_KYBER_LEVEL3;
516
+ }
517
+ else
518
+ #endif
519
+ #if !defined(WOLFSSL_NO_KYBER768) && defined(HAVE_CURVE448)
520
+ if (XSTRCMP(pqcAlg, "X448_KYBER_LEVEL3") == 0) {
521
+ group = WOLFSSL_X448_KYBER_LEVEL3;
522
+ }
523
+ else
524
+ #endif
525
+ #endif /* WOLFSSL_MLKEM_KYBER */
526
+ {
527
+ err_sys("invalid post-quantum KEM specified");
528
+ }
529
+
530
+ printf("Using Post-Quantum KEM: %s\n", pqcAlg);
531
+ if (wolfSSL_UseKeyShare(ssl, group) == WOLFSSL_SUCCESS) {
532
+ groups[count++] = group;
533
+ }
534
+ else {
535
+ err_sys("unable to use post-quantum KEM");
536
+ }
537
+ }
538
+ }
539
+ #endif
540
+ if (count >= MAX_GROUP_NUMBER)
541
+ err_sys("example group array size error");
542
+ if (setGroups && count > 0) {
543
+ if (wolfSSL_set_groups(ssl, groups, count) != WOLFSSL_SUCCESS)
544
+ err_sys("unable to set groups");
545
+ }
546
+ WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
547
+ }
548
+ #endif /* WOLFSSL_TLS13 && HAVE_SUPPORTED_CURVES */
549
+
550
+ #ifdef WOLFSSL_EARLY_DATA
551
+ static void EarlyData(WOLFSSL_CTX* ctx, WOLFSSL* ssl, const char* msg,
552
+ int msgSz, char* buffer)
553
+ {
554
+ int err;
555
+ int ret;
556
+
557
+ WOLFSSL_ASYNC_WHILE_PENDING(ret = wolfSSL_write_early_data(ssl, msg, msgSz, &msgSz),
558
+ ret <= 0);
559
+ if (ret != msgSz) {
560
+ LOG_ERROR("SSL_write_early_data msg error %d, %s\n", err,
561
+ wolfSSL_ERR_error_string((unsigned long)err, buffer));
562
+ wolfSSL_free(ssl); ssl = NULL;
563
+ wolfSSL_CTX_free(ctx); ctx = NULL;
564
+ err_sys("SSL_write_early_data failed");
565
+ }
566
+ }
567
+ #endif
568
+
569
+ /* Measures average time to create, connect and disconnect a connection (TPS).
570
+ Benchmark = number of connections. */
571
+ static const char* client_bench_conmsg[][5] = {
572
+ /* English */
573
+ {
574
+ "wolfSSL_resume avg took:", "milliseconds\n",
575
+ "wolfSSL_connect avg took:", "milliseconds\n",
576
+ NULL
577
+ },
578
+ #ifndef NO_MULTIBYTE_PRINT
579
+ /* Japanese */
580
+ {
581
+ "wolfSSL_resume 平均時間:", "ミリ秒\n",
582
+ "wolfSSL_connect 平均時間:", "ミリ秒\n",
583
+ }
584
+ #endif
585
+ };
586
+
587
+ static int ClientBenchmarkConnections(WOLFSSL_CTX* ctx, char* host, word16 port,
588
+ int dtlsUDP, int dtlsSCTP, int benchmark, int resumeSession, int useX25519,
589
+ int useX448, int usePqc, char* pqcAlg, int helloRetry, int onlyKeyShare,
590
+ int version, int earlyData)
591
+ {
592
+ /* time passed in number of connects give average */
593
+ int times = benchmark, skip = (int)((double)times * 0.1);
594
+ int loops = resumeSession ? 2 : 1;
595
+ int i = 0, err, ret;
596
+ #ifndef NO_SESSION_CACHE
597
+ WOLFSSL_SESSION* benchSession = NULL;
598
+ #endif
599
+ #ifdef WOLFSSL_TLS13
600
+ byte reply[CLI_REPLY_SZ];
601
+ #endif
602
+ const char** words = client_bench_conmsg[lng_index];
603
+
604
+ (void)resumeSession;
605
+ (void)useX25519;
606
+ (void)useX448;
607
+ (void)usePqc;
608
+ (void)pqcAlg;
609
+ (void)helloRetry;
610
+ (void)onlyKeyShare;
611
+ (void)version;
612
+ (void)earlyData;
613
+
614
+ while (loops--) {
615
+ #ifndef NO_SESSION_CACHE
616
+ int benchResume = resumeSession && loops == 0;
617
+ #endif
618
+ double start = current_time(1), avg;
619
+
620
+ for (i = 0; i < times; i++) {
621
+ SOCKET_T sockfd;
622
+ WOLFSSL* ssl;
623
+
624
+ if (i == skip)
625
+ start = current_time(1);
626
+
627
+ ssl = wolfSSL_new(ctx);
628
+ if (ssl == NULL)
629
+ err_sys("unable to get SSL object");
630
+
631
+ #ifndef NO_SESSION_CACHE
632
+ if (benchResume)
633
+ wolfSSL_set_session(ssl, benchSession);
634
+ #endif
635
+ #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
636
+ else if (version >= 4) {
637
+ if (!helloRetry)
638
+ SetKeyShare(ssl, onlyKeyShare, useX25519, useX448,
639
+ usePqc, pqcAlg, 1);
640
+ else
641
+ wolfSSL_NoKeyShares(ssl);
642
+ }
643
+ #endif
644
+
645
+ tcp_connect(&sockfd, host, port, dtlsUDP, dtlsSCTP, ssl);
646
+
647
+ if (wolfSSL_set_fd(ssl, sockfd) != WOLFSSL_SUCCESS) {
648
+ err_sys("error in setting fd");
649
+ }
650
+
651
+ #if defined(WOLFSSL_TLS13) && !defined(NO_SESSION_CACHE) && \
652
+ defined(WOLFSSL_EARLY_DATA)
653
+ if (version >= 4 && benchResume && earlyData) {
654
+ char buffer[WOLFSSL_MAX_ERROR_SZ];
655
+ EarlyData(ctx, ssl, kEarlyMsg, sizeof(kEarlyMsg)-1, buffer);
656
+ }
657
+ #endif
658
+ WOLFSSL_ASYNC_WHILE_PENDING(ret = wolfSSL_connect(ssl),
659
+ ret != WOLFSSL_SUCCESS);
660
+ #ifdef WOLFSSL_EARLY_DATA
661
+ EarlyDataStatus(ssl);
662
+ #endif
663
+ if (ret != WOLFSSL_SUCCESS) {
664
+ err_sys("SSL_connect failed");
665
+ }
666
+
667
+ #ifdef WOLFSSL_TLS13
668
+ #ifndef NO_SESSION_CACHE
669
+ if (version >= 4 && resumeSession && !benchResume)
670
+ #else
671
+ if (version >= 4 && resumeSession)
672
+ #endif
673
+ {
674
+ /* no null term */
675
+ if (wolfSSL_write(ssl, kHttpGetMsg, sizeof(kHttpGetMsg)-1) <= 0)
676
+ err_sys("SSL_write failed");
677
+
678
+ if (wolfSSL_read(ssl, reply, sizeof(reply)-1) <= 0)
679
+ err_sys("SSL_read failed");
680
+ }
681
+ #endif
682
+
683
+
684
+ wolfSSL_shutdown(ssl);
685
+ #ifndef NO_SESSION_CACHE
686
+ if (i == (times-1) && resumeSession) {
687
+ if (benchSession != NULL)
688
+ wolfSSL_SESSION_free(benchSession);
689
+ benchSession = wolfSSL_get1_session(ssl);
690
+ }
691
+ #endif
692
+ wolfSSL_free(ssl); ssl = NULL;
693
+ CloseSocket(sockfd);
694
+ }
695
+ avg = current_time(0) - start;
696
+ avg /= (times - skip);
697
+ avg *= 1000; /* milliseconds */
698
+ #ifndef NO_SESSION_CACHE
699
+ if (benchResume)
700
+ printf("%s %8.3f %s\n", words[0],avg, words[1]);
701
+ else
702
+ #endif
703
+ printf("%s %8.3f %s\n", words[2],avg, words[3]);
704
+
705
+ WOLFSSL_TIME(times);
706
+ }
707
+
708
+ #ifndef NO_SESSION_CACHE
709
+ if (benchSession != NULL)
710
+ wolfSSL_SESSION_free(benchSession);
711
+ #endif
712
+
713
+ return EXIT_SUCCESS;
714
+ }
715
+
716
+ /* Measures throughput in mbps. Throughput = number of bytes */
717
+ static int ClientBenchmarkThroughput(WOLFSSL_CTX* ctx, char* host, word16 port,
718
+ int dtlsUDP, int dtlsSCTP, int block, size_t throughput, int useX25519,
719
+ int useX448, int usePqc, char* pqcAlg, int exitWithRet, int version,
720
+ int onlyKeyShare)
721
+ {
722
+ double start, conn_time = 0, tx_time = 0, rx_time = 0;
723
+ SOCKET_T sockfd = WOLFSSL_SOCKET_INVALID;
724
+ WOLFSSL* ssl;
725
+ int ret = 0, err = 0;
726
+
727
+ start = current_time(1);
728
+ ssl = wolfSSL_new(ctx);
729
+ if (ssl == NULL)
730
+ err_sys("unable to get SSL object");
731
+
732
+ tcp_connect(&sockfd, host, port, dtlsUDP, dtlsSCTP, ssl);
733
+ if (wolfSSL_set_fd(ssl, sockfd) != WOLFSSL_SUCCESS) {
734
+ err_sys("error in setting fd");
735
+ }
736
+
737
+ (void)useX25519;
738
+ (void)useX448;
739
+ (void)usePqc;
740
+ (void)pqcAlg;
741
+ (void)version;
742
+ (void)onlyKeyShare;
743
+ #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
744
+ if (version >= 4) {
745
+ SetKeyShare(ssl, onlyKeyShare, useX25519, useX448, usePqc,
746
+ pqcAlg, 1);
747
+ }
748
+ #endif
749
+
750
+ WOLFSSL_ASYNC_WHILE_PENDING(ret = wolfSSL_connect(ssl),
751
+ ret != WOLFSSL_SUCCESS);
752
+ if (ret == WOLFSSL_SUCCESS) {
753
+ /* Perform throughput test */
754
+ char *tx_buffer, *rx_buffer;
755
+
756
+ /* Record connection time */
757
+ conn_time = current_time(0) - start;
758
+
759
+ /* Allocate TX/RX buffers */
760
+ tx_buffer = (char*)XMALLOC((size_t)block, NULL, DYNAMIC_TYPE_TMP_BUFFER);
761
+ rx_buffer = (char*)XMALLOC((size_t)block, NULL, DYNAMIC_TYPE_TMP_BUFFER);
762
+ if (tx_buffer && rx_buffer) {
763
+ WC_RNG rng;
764
+
765
+ /* Startup the RNG */
766
+ #if !defined(HAVE_FIPS) && defined(WOLFSSL_ASYNC_CRYPT)
767
+ ret = wc_InitRng_ex(&rng, NULL, devId);
768
+ #else
769
+ ret = wc_InitRng(&rng);
770
+ #endif
771
+ if (ret == 0) {
772
+ size_t xfer_bytes;
773
+
774
+ /* Generate random data to send */
775
+ ret = wc_RNG_GenerateBlock(&rng, (byte*)tx_buffer, (word32)block);
776
+ wc_FreeRng(&rng);
777
+ if(ret != 0) {
778
+ err_sys("wc_RNG_GenerateBlock failed");
779
+ }
780
+
781
+ /* Perform TX and RX of bytes */
782
+ xfer_bytes = 0;
783
+ while (throughput > xfer_bytes) {
784
+ int len, rx_pos, select_ret;
785
+
786
+ /* Determine packet size */
787
+ len = (int)min((word32)block, (word32)(throughput - xfer_bytes));
788
+
789
+ /* Perform TX */
790
+ start = current_time(1);
791
+ WOLFSSL_ASYNC_WHILE_PENDING(ret = wolfSSL_write(ssl, tx_buffer, len),
792
+ ret <= 0);
793
+ if (ret != len) {
794
+ LOG_ERROR("SSL_write bench error %d!\n", err);
795
+ if (!exitWithRet)
796
+ err_sys("SSL_write failed");
797
+ goto doExit;
798
+ }
799
+ tx_time += current_time(0) - start;
800
+
801
+ /* Perform RX */
802
+ select_ret = tcp_select(sockfd, DEFAULT_TIMEOUT_SEC);
803
+ if (select_ret == TEST_RECV_READY) {
804
+ start = current_time(1);
805
+ rx_pos = 0;
806
+ while (rx_pos < len) {
807
+ ret = wolfSSL_read(ssl, &rx_buffer[rx_pos],
808
+ len - rx_pos);
809
+ if (ret <= 0) {
810
+ err = wolfSSL_get_error(ssl, 0);
811
+ #ifdef WOLFSSL_ASYNC_CRYPT
812
+ if (err == WC_NO_ERR_TRACE(WC_PENDING_E)) {
813
+ ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
814
+ if (ret < 0) break;
815
+ }
816
+ else
817
+ #endif
818
+ if (err != WOLFSSL_ERROR_WANT_READ &&
819
+ err != WOLFSSL_ERROR_WANT_WRITE) {
820
+ LOG_ERROR("SSL_read bench error %d\n", err);
821
+ err_sys("SSL_read failed");
822
+ }
823
+ }
824
+ else {
825
+ rx_pos += ret;
826
+ }
827
+ }
828
+ rx_time += current_time(0) - start;
829
+ }
830
+
831
+ /* Compare TX and RX buffers */
832
+ if (XMEMCMP(tx_buffer, rx_buffer, (size_t)len) != 0) {
833
+ XFREE(tx_buffer, NULL, DYNAMIC_TYPE_TMP_BUFFER);
834
+ tx_buffer = NULL;
835
+ XFREE(rx_buffer, NULL, DYNAMIC_TYPE_TMP_BUFFER);
836
+ rx_buffer = NULL;
837
+ err_sys("Compare TX and RX buffers failed");
838
+ }
839
+
840
+ /* Update overall position */
841
+ xfer_bytes += (size_t)len;
842
+ }
843
+ }
844
+ else {
845
+ err_sys("wc_InitRng failed");
846
+ }
847
+ (void)rng; /* for WC_NO_RNG case */
848
+ }
849
+ else {
850
+ err_sys("Client buffer malloc failed");
851
+ }
852
+ doExit:
853
+ XFREE(tx_buffer, NULL, DYNAMIC_TYPE_TMP_BUFFER);
854
+ XFREE(rx_buffer, NULL, DYNAMIC_TYPE_TMP_BUFFER);
855
+ }
856
+ else {
857
+ err_sys("wolfSSL_connect failed");
858
+ }
859
+
860
+ wolfSSL_shutdown(ssl);
861
+ wolfSSL_free(ssl); ssl = NULL;
862
+ CloseSocket(sockfd);
863
+
864
+ if (exitWithRet)
865
+ return err;
866
+
867
+ #if defined(__MINGW32__) || defined(_WIN32)
868
+ #define SIZE_FMT "%d"
869
+ #define SIZE_TYPE int
870
+ #else
871
+ #define SIZE_FMT "%zu"
872
+ #define SIZE_TYPE size_t
873
+ #endif
874
+ printf(
875
+ "wolfSSL Client Benchmark " SIZE_FMT " bytes\n"
876
+ "\tConnect %8.3f ms\n"
877
+ "\tTX %8.3f ms (%8.3f MBps)\n"
878
+ "\tRX %8.3f ms (%8.3f MBps)\n",
879
+ (SIZE_TYPE)throughput,
880
+ conn_time * 1000,
881
+ (double)tx_time * 1000, (double)throughput / tx_time / 1024 / 1024,
882
+ (double)rx_time * 1000, (double)throughput / rx_time / 1024 / 1024
883
+ );
884
+
885
+ return EXIT_SUCCESS;
886
+ }
887
+
888
+ const char* starttlsCmd[6] = {
889
+ "220",
890
+ "EHLO mail.example.com\r\n",
891
+ "250",
892
+ "STARTTLS\r\n",
893
+ "220",
894
+ "QUIT\r\n",
895
+ };
896
+
897
+ /* Initiates the STARTTLS command sequence over TCP */
898
+ static int StartTLS_Init(SOCKET_T* sockfd)
899
+ {
900
+ char tmpBuf[512];
901
+
902
+ if (sockfd == NULL)
903
+ return BAD_FUNC_ARG;
904
+
905
+ /* S: 220 <host> SMTP service ready */
906
+ XMEMSET(tmpBuf, 0, sizeof(tmpBuf));
907
+ if (recv(*sockfd, tmpBuf, sizeof(tmpBuf)-1, 0) < 0)
908
+ err_sys("failed to read STARTTLS command\n");
909
+
910
+ if ((!XSTRNCMP(tmpBuf, starttlsCmd[0], XSTRLEN(starttlsCmd[0]))) &&
911
+ (tmpBuf[XSTRLEN(starttlsCmd[0])] == ' ')) {
912
+ printf("%s\n", tmpBuf);
913
+ } else {
914
+ err_sys("incorrect STARTTLS command received");
915
+ }
916
+
917
+ /* C: EHLO mail.example.com */
918
+ if (send(*sockfd, starttlsCmd[1], (SIZE_TYPE)XSTRLEN(starttlsCmd[1]), 0) !=
919
+ (int)XSTRLEN(starttlsCmd[1]))
920
+ err_sys("failed to send STARTTLS EHLO command\n");
921
+
922
+ /* S: 250 <host> offers a warm hug of welcome */
923
+ XMEMSET(tmpBuf, 0, sizeof(tmpBuf));
924
+ if (recv(*sockfd, tmpBuf, sizeof(tmpBuf)-1, 0) < 0)
925
+ err_sys("failed to read STARTTLS command\n");
926
+
927
+ if ((!XSTRNCMP(tmpBuf, starttlsCmd[2], XSTRLEN(starttlsCmd[2]))) &&
928
+ (tmpBuf[XSTRLEN(starttlsCmd[2])] == '-')) {
929
+ printf("%s\n", tmpBuf);
930
+ } else {
931
+ err_sys("incorrect STARTTLS command received");
932
+ }
933
+
934
+ /* C: STARTTLS */
935
+ if (send(*sockfd, starttlsCmd[3], (SIZE_TYPE)XSTRLEN(starttlsCmd[3]), 0) !=
936
+ (int)XSTRLEN(starttlsCmd[3])) {
937
+ err_sys("failed to send STARTTLS command\n");
938
+ }
939
+
940
+ /* S: 220 Go ahead */
941
+ XMEMSET(tmpBuf, 0, sizeof(tmpBuf));
942
+ if (recv(*sockfd, tmpBuf, sizeof(tmpBuf)-1, 0) < 0)
943
+ err_sys("failed to read STARTTLS command\n");
944
+ tmpBuf[sizeof(tmpBuf)-1] = '\0';
945
+
946
+ if ((!XSTRNCMP(tmpBuf, starttlsCmd[4], XSTRLEN(starttlsCmd[4]))) &&
947
+ (tmpBuf[XSTRLEN(starttlsCmd[4])] == ' ')) {
948
+ printf("%s\n", tmpBuf);
949
+ } else {
950
+ err_sys("incorrect STARTTLS command received, expected 220");
951
+ }
952
+
953
+ return WOLFSSL_SUCCESS;
954
+ }
955
+
956
+ /* Closes down the SMTP connection */
957
+ static int SMTP_Shutdown(WOLFSSL* ssl, int wc_shutdown)
958
+ {
959
+ int ret, err = 0;
960
+ char tmpBuf[256];
961
+
962
+ if (ssl == NULL)
963
+ return BAD_FUNC_ARG;
964
+
965
+ printf("\nwolfSSL client shutting down SMTP connection\n");
966
+
967
+ XMEMSET(tmpBuf, 0, sizeof(tmpBuf));
968
+
969
+ /* C: QUIT */
970
+ WOLFSSL_ASYNC_WHILE_PENDING(
971
+ ret = wolfSSL_write(ssl, starttlsCmd[5], (int)XSTRLEN(starttlsCmd[5])),
972
+ ret < 0);
973
+ if (ret != (int)XSTRLEN(starttlsCmd[5])) {
974
+ err_sys("failed to send SMTP QUIT command\n");
975
+ }
976
+
977
+ /* S: 221 2.0.0 Service closing transmission channel */
978
+ WOLFSSL_ASYNC_WHILE_PENDING(
979
+ ret = wolfSSL_read(ssl, tmpBuf, sizeof(tmpBuf)-1),
980
+ ret < 0);
981
+ if (ret < 0) {
982
+ err_sys("failed to read SMTP closing down response\n");
983
+ }
984
+ tmpBuf[ret] = 0; /* null terminate message */
985
+ printf("%s\n", tmpBuf);
986
+
987
+ ret = wolfSSL_shutdown(ssl);
988
+ if (wc_shutdown && ret == WOLFSSL_SHUTDOWN_NOT_DONE) {
989
+ if (tcp_select(wolfSSL_get_fd(ssl), DEFAULT_TIMEOUT_SEC) ==
990
+ TEST_RECV_READY) {
991
+ ret = wolfSSL_shutdown(ssl); /* bidirectional shutdown */
992
+ if (ret == WOLFSSL_SUCCESS)
993
+ printf("Bidirectional shutdown complete\n");
994
+ }
995
+ if (ret != WOLFSSL_SUCCESS)
996
+ LOG_ERROR("Bidirectional shutdown failed\n");
997
+ }
998
+
999
+ return WOLFSSL_SUCCESS;
1000
+ }
1001
+
1002
+ static int ClientWrite(WOLFSSL* ssl, const char* msg, int msgSz, const char* str,
1003
+ int exitWithRet)
1004
+ {
1005
+ int ret, err;
1006
+
1007
+ do {
1008
+ err = 0; /* reset error */
1009
+ ret = wolfSSL_write(ssl, msg, msgSz);
1010
+ if (ret <= 0) {
1011
+ err = wolfSSL_get_error(ssl, 0);
1012
+ #ifdef WOLFSSL_ASYNC_CRYPT
1013
+ if (err == WC_NO_ERR_TRACE(WC_PENDING_E)) {
1014
+ ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
1015
+ if (ret < 0) break;
1016
+ }
1017
+ #endif
1018
+ }
1019
+ } while (err == WOLFSSL_ERROR_WANT_WRITE ||
1020
+ err == WOLFSSL_ERROR_WANT_READ
1021
+ #ifdef WOLFSSL_ASYNC_CRYPT
1022
+ || err == WC_NO_ERR_TRACE(WC_PENDING_E)
1023
+ #endif
1024
+ );
1025
+ if (ret != msgSz) {
1026
+ char buffer[WOLFSSL_MAX_ERROR_SZ];
1027
+ LOG_ERROR("SSL_write%s msg error %d, %s\n", str, err,
1028
+ wolfSSL_ERR_error_string((unsigned long)err, buffer));
1029
+ if (!exitWithRet) {
1030
+ err_sys("SSL_write failed");
1031
+ }
1032
+ }
1033
+
1034
+ return err;
1035
+ }
1036
+
1037
+ static int ClientRead(WOLFSSL* ssl, char* reply, int replyLen, int mustRead,
1038
+ const char* str, int exitWithRet)
1039
+ {
1040
+ int ret, err;
1041
+ char buffer[WOLFSSL_MAX_ERROR_SZ];
1042
+ double start = current_time(1), elapsed;
1043
+
1044
+ do {
1045
+ err = 0; /* reset error */
1046
+ ret = wolfSSL_read(ssl, reply, replyLen);
1047
+ if (ret <= 0) {
1048
+ err = wolfSSL_get_error(ssl, 0);
1049
+ #ifdef WOLFSSL_ASYNC_CRYPT
1050
+ if (err == WC_NO_ERR_TRACE(WC_PENDING_E)) {
1051
+ ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
1052
+ if (ret < 0) break;
1053
+ }
1054
+ else
1055
+ #endif
1056
+ if (err != WOLFSSL_ERROR_WANT_READ &&
1057
+ err != WOLFSSL_ERROR_WANT_WRITE &&
1058
+ err != WC_NO_ERR_TRACE(APP_DATA_READY))
1059
+ {
1060
+ LOG_ERROR("SSL_read reply error %d, %s\n", err,
1061
+ wolfSSL_ERR_error_string((unsigned long)err, buffer));
1062
+ if (!exitWithRet) {
1063
+ err_sys("SSL_read failed");
1064
+ }
1065
+ else {
1066
+ break;
1067
+ }
1068
+ }
1069
+ }
1070
+
1071
+ if (mustRead &&
1072
+ (err == WOLFSSL_ERROR_WANT_READ
1073
+ || err == WOLFSSL_ERROR_WANT_WRITE)) {
1074
+ elapsed = current_time(0) - start;
1075
+ if (elapsed > MAX_NON_BLOCK_SEC) {
1076
+ LOG_ERROR("Nonblocking read timeout\n");
1077
+ ret = WOLFSSL_FATAL_ERROR;
1078
+ break;
1079
+ }
1080
+ }
1081
+ } while ((mustRead && err == WOLFSSL_ERROR_WANT_READ)
1082
+ || err == WOLFSSL_ERROR_WANT_WRITE
1083
+ #ifdef WOLFSSL_ASYNC_CRYPT
1084
+ || err == WC_NO_ERR_TRACE(WC_PENDING_E)
1085
+ #endif
1086
+ || err == WC_NO_ERR_TRACE(APP_DATA_READY)
1087
+ );
1088
+ if (ret > 0) {
1089
+ reply[ret] = 0; /* null terminate */
1090
+ printf("%s%s\n", str, reply);
1091
+ }
1092
+
1093
+ return err;
1094
+ }
1095
+
1096
+ static int ClientWriteRead(WOLFSSL* ssl, const char* msg, int msgSz,
1097
+ char* reply, int replyLen, int mustRead,
1098
+ const char* str, int exitWithRet)
1099
+ {
1100
+ int ret = 0;
1101
+
1102
+ do {
1103
+ ret = ClientWrite(ssl, msg, msgSz, str, exitWithRet);
1104
+ if (ret != 0) {
1105
+ if (!exitWithRet)
1106
+ err_sys("ClientWrite failed");
1107
+ else
1108
+ break;
1109
+ }
1110
+ if (wolfSSL_dtls(ssl)) {
1111
+ ret = tcp_select(wolfSSL_get_fd(ssl), DEFAULT_TIMEOUT_SEC);
1112
+ if (ret == TEST_TIMEOUT) {
1113
+ continue;
1114
+ }
1115
+ else if (ret == TEST_RECV_READY) {
1116
+ /* Ready to read */
1117
+ }
1118
+ else {
1119
+ LOG_ERROR("%s tcp_select error\n", str);
1120
+ if (!exitWithRet)
1121
+ err_sys("tcp_select failed");
1122
+ else
1123
+ ret = WOLFSSL_FATAL_ERROR;
1124
+ break;
1125
+ }
1126
+ }
1127
+ ret = ClientRead(ssl, reply, replyLen, mustRead, str, exitWithRet);
1128
+ if (mustRead && ret != 0) {
1129
+ if (!exitWithRet)
1130
+ err_sys("ClientRead failed");
1131
+ else
1132
+ break;
1133
+ }
1134
+ break;
1135
+ } while (1);
1136
+
1137
+ if (ret != 0) {
1138
+ char buffer[WOLFSSL_MAX_ERROR_SZ];
1139
+ LOG_ERROR("SSL_write%s msg error %d, %s\n", str, ret,
1140
+ wolfSSL_ERR_error_string((unsigned long)ret, buffer));
1141
+ }
1142
+
1143
+ return ret;
1144
+ }
1145
+
1146
+ /* when adding new option, please follow the steps below: */
1147
+ /* 1. add new option message in English section */
1148
+ /* 2. increase the number of the second column */
1149
+ /* 3. increase the array dimension */
1150
+ /* 4. add the same message into Japanese section */
1151
+ /* (will be translated later) */
1152
+ /* 5. add printf() into suitable position of Usage() */
1153
+ static const char* client_usage_msg[][78] = {
1154
+ /* English */
1155
+ {
1156
+ " NOTE: All files relative to wolfSSL home dir\n", /* 0 */
1157
+ "Max RSA key size in bits for build is set at : ", /* 1 */
1158
+ #ifdef NO_RSA
1159
+ "RSA not supported\n", /* 2 */
1160
+ #elif defined(WOLFSSL_SP_MATH) /* case of SP math only */
1161
+ #ifdef WOLFSSL_SP_4096
1162
+ "4096\n", /* 2 */
1163
+ #elif !defined(WOLFSSL_SP_NO_3072)
1164
+ "3072\n", /* 2 */
1165
+ #elif !defined(WOLFSSL_SP_NO_2048)
1166
+ "2048\n", /* 2 */
1167
+ #else
1168
+ "0\n", /* 2 */
1169
+ #endif
1170
+ #elif defined(USE_FAST_MATH)
1171
+ #else
1172
+ "INFINITE\n", /* 2 */
1173
+ #endif
1174
+ "-? <num> Help, print this usage\n"
1175
+ " 0: English, 1: Japanese\n"
1176
+ "--help Help, in English\n", /* 3 */
1177
+ "-h <host> Host to connect to, default", /* 4 */
1178
+ "-p <num> Port to connect on, not 0, default", /* 5 */
1179
+
1180
+ #ifndef WOLFSSL_TLS13
1181
+ "-v <num> SSL version [0-3], SSLv3(0) - TLS1.2(3)), default", /* 6 */
1182
+ "-V Prints valid ssl version numbers"
1183
+ ", SSLv3(0) - TLS1.2(3)\n", /* 7 */
1184
+ #else
1185
+ "-v <num> SSL version [0-4], SSLv3(0) - TLS1.3(4)), default", /* 6 */
1186
+ "-V Prints valid ssl version numbers,"
1187
+ " SSLv3(0) - TLS1.3(4)\n", /* 7 */
1188
+ #endif
1189
+ "-l <str> Cipher suite list (: delimited)\n", /* 8 */
1190
+ #ifndef NO_CERTS
1191
+ "-c <file> Certificate file, default", /* 9 */
1192
+ "-k <file> Key file, default", /* 10 */
1193
+ "-A <file> Certificate Authority file, default", /* 11 */
1194
+ #endif
1195
+ #ifndef NO_DH
1196
+ "-Z <num> Minimum DH key bits, default", /* 12 */
1197
+ #endif
1198
+ "-b <num> Benchmark <num> connections and print stats\n", /* 13 */
1199
+ #ifdef HAVE_ALPN
1200
+ "-L <str> Application-Layer Protocol"
1201
+ " Negotiation ({C,F}:<list>)\n", /* 14 */
1202
+ #endif
1203
+ "-B <num> Benchmark throughput"
1204
+ " using <num> bytes and print stats\n", /* 15 */
1205
+ #ifndef NO_PSK
1206
+ "-s Use pre Shared keys\n", /* 16 */
1207
+ #endif
1208
+ "-d Disable peer checks\n", /* 17 */
1209
+ "-D Override Date Errors example\n", /* 18 */
1210
+ "-e List Every cipher suite available, \n", /* 19 */
1211
+ "-g Send server HTTP GET\n", /* 20 */
1212
+ #ifdef WOLFSSL_DTLS
1213
+ #ifndef WOLFSSL_DTLS13
1214
+ "-u Use UDP DTLS, add -v 2 for DTLSv1, -v 3 for DTLSv1.2"
1215
+ " (default)\n", /* 21 */
1216
+ #else
1217
+ "-u Use UDP DTLS, add -v 2 for DTLSv1, -v 3 for DTLSv1.2"
1218
+ " (default), -v 4 for DTLSv1.3\n", /* 21 */
1219
+ #endif /* !WOLFSSL_DTLS13 */
1220
+ #endif
1221
+ #ifdef WOLFSSL_SCTP
1222
+ "-G Use SCTP DTLS,"
1223
+ " add -v 2 for DTLSv1, -v 3 for DTLSv1.2 (default)\n", /* 22 */
1224
+ #endif
1225
+ #ifndef NO_CERTS
1226
+ "-m Match domain name in cert\n", /* 23 */
1227
+ #endif
1228
+ "-N Use Non-blocking sockets\n", /* 24 */
1229
+ #ifndef NO_SESSION_CACHE
1230
+ "-r Resume session\n", /* 25 */
1231
+ #endif
1232
+ "-w Wait for bidirectional shutdown\n", /* 26 */
1233
+ "-M <prot> Use STARTTLS, using <prot> protocol (smtp)\n", /* 27 */
1234
+ #ifdef HAVE_SECURE_RENEGOTIATION
1235
+ "-R Allow Secure Renegotiation\n", /* 28 */
1236
+ "-i <str> Force client Initiated Secure Renegotiation. If the\n"
1237
+ " string 'scr-app-data' is passed in as the value and\n"
1238
+ " Non-blocking sockets are enabled ('-N') then wolfSSL\n"
1239
+ " sends a test message during the secure renegotiation.\n"
1240
+ " The string parameter is optional.\n", /* 29 */
1241
+ #endif
1242
+ "-f Fewer packets/group messages\n", /* 30 */
1243
+ #ifndef NO_CERTS
1244
+ "-x Disable client cert/key loading\n", /* 31 */
1245
+ #endif
1246
+ "-X Driven by eXternal test case\n", /* 32 */
1247
+ "-j Use verify callback override\n", /* 33 */
1248
+ #ifdef SHOW_SIZES
1249
+ "-z Print structure sizes\n", /* 34 */
1250
+ #endif
1251
+ #ifdef HAVE_SNI
1252
+ "-S <str> Use Host Name Indication\n", /* 35 */
1253
+ #endif
1254
+ #ifdef HAVE_MAX_FRAGMENT
1255
+ "-F <num> Use Maximum Fragment Length [1-6]\n", /* 36 */
1256
+ #endif
1257
+ #ifdef HAVE_TRUNCATED_HMAC
1258
+ "-T Use Truncated HMAC\n", /* 37 */
1259
+ #endif
1260
+ #ifdef HAVE_EXTENDED_MASTER
1261
+ "-n Disable Extended Master Secret\n", /* 38 */
1262
+ #endif
1263
+ #ifdef HAVE_OCSP
1264
+ "-o Perform OCSP lookup on peer certificate\n", /* 39 */
1265
+ "-O <url> Perform OCSP lookup using <url> as responder\n", /* 40 */
1266
+ #endif
1267
+ #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
1268
+ || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
1269
+ "-W <num> Use OCSP Stapling (1 v1, 2 v2, 3 v2 multi)\n", /* 41 */
1270
+ " With 'm' at end indicates MUST staple\n", /* 42 */
1271
+ #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TLS_OCSP_MULTI)
1272
+ " -W 1 -v 4, Perform multi OCSP stapling for TLS13\n",
1273
+ /* 43 */
1274
+ #endif
1275
+ #endif
1276
+ #if defined(ATOMIC_USER) && !defined(WOLFSSL_AEAD_ONLY)
1277
+ "-U Atomic User Record Layer Callbacks\n", /* 44 */
1278
+ #endif
1279
+ #ifdef HAVE_PK_CALLBACKS
1280
+ "-P Public Key Callbacks\n", /* 45 */
1281
+ #endif
1282
+ #ifdef HAVE_ANON
1283
+ "-a Anonymous client\n", /* 46 */
1284
+ #endif
1285
+ #ifdef HAVE_CRL
1286
+ "-C Disable CRL\n", /* 47 */
1287
+ #endif
1288
+ #ifdef WOLFSSL_TRUST_PEER_CERT
1289
+ "-E <file> Path to load trusted peer cert\n", /* 48 */
1290
+ #endif
1291
+ #ifdef HAVE_WNR
1292
+ "-q <file> Whitewood config file, defaults\n", /* 49 */
1293
+ #endif
1294
+ "-H <arg> Internal tests"
1295
+ " [defCipherList, exitWithRet, verifyFail, useSupCurve,\n"
1296
+ " loadSSL, disallowETM]\n", /* 50 */
1297
+ #ifdef WOLFSSL_TLS13
1298
+ "-J Use HelloRetryRequest to choose group for KE\n", /* 51 */
1299
+ "-K Key Exchange for PSK not using (EC)DHE\n", /* 52 */
1300
+ "-I Update keys and IVs before sending data\n", /* 53 */
1301
+ #ifndef NO_DH
1302
+ "-y Key Share with FFDHE named groups only\n", /* 54 */
1303
+ #endif
1304
+ #ifdef HAVE_ECC
1305
+ "-Y Key Share with ECC named groups only\n", /* 55 */
1306
+ #endif
1307
+ #endif /* WOLFSSL_TLS13 */
1308
+ #ifdef HAVE_CURVE25519
1309
+ "-t Use X25519 for key exchange\n", /* 56 */
1310
+ #endif
1311
+ #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
1312
+ "-Q Support requesting certificate post-handshake\n", /* 57 */
1313
+ #endif
1314
+ #ifdef WOLFSSL_EARLY_DATA
1315
+ "-0 Early data sent to server (0-RTT handshake)\n", /* 58 */
1316
+ #endif
1317
+ #ifdef WOLFSSL_MULTICAST
1318
+ "-3 <grpid> Multicast, grpid < 256\n", /* 59 */
1319
+ #endif
1320
+ "-1 <num> Display a result by specified language.\n"
1321
+ " 0: English, 1: Japanese\n", /* 60 */
1322
+ #if !defined(NO_DH) && !defined(HAVE_FIPS) && \
1323
+ !defined(HAVE_SELFTEST) && !defined(WOLFSSL_OLD_PRIME_CHECK)
1324
+ "-2 Disable DH Prime check\n", /* 61 */
1325
+ #endif
1326
+ #ifdef HAVE_SECURE_RENEGOTIATION
1327
+ "-4 Use resumption for renegotiation\n", /* 62 */
1328
+ #endif
1329
+ #ifdef HAVE_TRUSTED_CA
1330
+ "-5 Use Trusted CA Key Indication\n", /* 63 */
1331
+ #endif
1332
+ "-6 Simulate WANT_WRITE errors on every other IO send\n", /* 64 */
1333
+ #ifdef HAVE_CURVE448
1334
+ "-8 Use X448 for key exchange\n", /* 65 */
1335
+ #endif
1336
+ #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
1337
+ (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
1338
+ !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
1339
+ "-9 Use hash dir look up for certificate loading\n"
1340
+ " loading from <wolfSSL home>/certs folder\n"
1341
+ " files in the folder would have the form \"hash.N\" file name\n"
1342
+ " e.g symbolic link to the file at certs folder\n"
1343
+ " ln -s ca-cert.pem `openssl x509 -in ca-cert.pem -hash -noout`.0\n",
1344
+ /* 66 */
1345
+ #endif
1346
+ #if defined(WOLFSSL_WOLFSENTRY_HOOKS) && !defined(NO_FILESYSTEM) && \
1347
+ !defined(WOLFSENTRY_NO_JSON)
1348
+ "--wolfsentry-config <file> Path for JSON wolfSentry config\n",
1349
+ /* 67 */
1350
+ #endif
1351
+ #ifndef WOLFSSL_TLS13
1352
+ "-7 Set minimum downgrade protocol version [0-3] "
1353
+ " SSLv3(0) - TLS1.2(3)\n",
1354
+ #else
1355
+ "-7 Set minimum downgrade protocol version [0-4] "
1356
+ " SSLv3(0) - TLS1.3(4)\n", /* 68 */
1357
+ #endif
1358
+ #ifdef HAVE_PQC
1359
+ "--pqc <alg> Key Share with specified post-quantum algorithm only:\n"
1360
+ #ifndef WOLFSSL_NO_ML_KEM
1361
+ " ML_KEM_512, ML_KEM_768, ML_KEM_1024,\n"
1362
+ " SecP256r1MLKEM512,\n"
1363
+ " SecP384r1MLKEM768,\n"
1364
+ " SecP521r1MLKEM1024,\n"
1365
+ " SecP256r1MLKEM768,\n"
1366
+ " SecP521r1MLKEM1024,\n"
1367
+ " SecP384r1MLKEM1024,\n"
1368
+ " X25519MLKEM512,\n"
1369
+ " X25519MLKEM768,\n"
1370
+ " X448MLKEM768\n"
1371
+ #endif
1372
+ #ifdef WOLFSSL_MLKEM_KYBER
1373
+ " KYBER_LEVEL1, KYBER_LEVEL3, KYBER_LEVEL5, "
1374
+ "P256_KYBER_LEVEL1,\n"
1375
+ " P384_KYBER_LEVEL3, P256_KYBER_LEVEL3, "
1376
+ "P521_KYBER_LEVEL5,\n"
1377
+ " X25519_KYBER_LEVEL1, X25519_KYBER_LEVEL3, "
1378
+ "X448_KYBER_LEVEL3\n"
1379
+ #endif
1380
+ "",
1381
+ /* 69 */
1382
+ #endif
1383
+ #ifdef WOLFSSL_SRTP
1384
+ "--srtp <profile> (default is SRTP_AES128_CM_SHA1_80)\n", /* 70 */
1385
+ #endif
1386
+ #ifdef WOLFSSL_SYS_CA_CERTS
1387
+ "--sys-ca-certs Load system CA certs for server cert verification\n", /* 71 */
1388
+ #endif
1389
+ #ifdef HAVE_SUPPORTED_CURVES
1390
+ "--onlyPskDheKe Must use DHE key exchange with PSK\n", /* 72 */
1391
+ #endif
1392
+ #ifndef NO_PSK
1393
+ "--openssl-psk Use TLS 1.3 PSK callback compatible with OpenSSL\n", /* 73 */
1394
+ #endif
1395
+ #ifdef HAVE_RPK
1396
+ "--rpk Use RPK for the defined certificates\n", /* 74 */
1397
+ #endif
1398
+ "--files-are-der Specified files are in DER, not PEM format\n", /* 75 */
1399
+ #ifdef WOLFSSL_SYS_CRYPTO_POLICY
1400
+ "--crypto-policy <path to crypto policy file>\n", /* 76 */
1401
+ #endif
1402
+ "\n"
1403
+ "For simpler wolfSSL TLS client examples, visit\n"
1404
+ "https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n", /* 77 */
1405
+ NULL,
1406
+ },
1407
+ #ifndef NO_MULTIBYTE_PRINT
1408
+ /* Japanese */
1409
+ {
1410
+ " 注意 : 全てのファイルは wolfSSL ホーム・ディレクトリからの相対です。"
1411
+ "\n", /* 0 */
1412
+ "RSAの最大ビットは次のように設定されています: ", /* 1 */
1413
+ #ifdef NO_RSA
1414
+ "RSAはサポートされていません。\n", /* 2 */
1415
+ #elif defined(WOLFSSL_SP_MATH) /* case of SP math only */
1416
+ #ifndef WOLFSSL_SP_NO_3072
1417
+ "3072\n", /* 2 */
1418
+ #elif !defined(WOLFSSL_SP_NO_2048)
1419
+ "2048\n", /* 2 */
1420
+ #else
1421
+ "0\n", /* 2 */
1422
+ #endif
1423
+ #elif defined(USE_FAST_MATH)
1424
+ #else
1425
+ "無限\n", /* 2 */
1426
+ #endif
1427
+ "-? <num> ヘルプ, 使い方を表示\n"
1428
+ " 0: 英語、 1: 日本語\n"
1429
+ "--ヘルプ 日本語で使い方を表示\n", /* 3 */
1430
+ "-h <host> 接続先ホスト, 既定値", /* 4 */
1431
+ "-p <num> 接続先ポート, 0は無効, 既定値", /* 5 */
1432
+
1433
+ #ifndef WOLFSSL_TLS13
1434
+ "-v <num> SSL バージョン [0-3], SSLv3(0) - TLS1.2(3)),"
1435
+ " 既定値", /* 6 */
1436
+ "-V 有効な ssl バージョン番号を出力, SSLv3(0) -"
1437
+ " TLS1.2(3)\n", /* 7 */
1438
+ #else
1439
+ "-v <num> SSL バージョン [0-4], SSLv3(0) - TLS1.3(4)),"
1440
+ " 既定値", /* 6 */
1441
+ "-V 有効な ssl バージョン番号を出力, SSLv3(0) -"
1442
+ " TLS1.3(4)\n", /* 7 */
1443
+ #endif
1444
+ "-l <str> 暗号スイートリスト (区切り文字 :)\n", /* 8 */
1445
+ #ifndef NO_CERTS
1446
+ "-c <file> 証明書ファイル, 既定値", /* 9 */
1447
+ "-k <file> 鍵ファイル, 既定値", /* 10 */
1448
+ "-A <file> 認証局ファイル, 既定値", /* 11 */
1449
+ #endif
1450
+ #ifndef NO_DH
1451
+ "-Z <num> 最小 DH 鍵 ビット, 既定値", /* 12 */
1452
+ #endif
1453
+ "-b <num> ベンチマーク <num> 接続及び結果出力する\n", /* 13 */
1454
+ #ifdef HAVE_ALPN
1455
+ "-L <str> アプリケーション層プロトコルネゴシエーションを行う"
1456
+ " ({C,F}:<list>)\n", /* 14 */
1457
+ #endif
1458
+ "-B <num> <num> バイトを用いてのベンチマーク・スループット測定"
1459
+ "と結果を出力する\n", /* 15 */
1460
+ #ifndef NO_PSK
1461
+ "-s 事前共有鍵を使用する\n", /* 16 */
1462
+ #endif
1463
+ "-d ピア確認を無効とする\n", /* 17 */
1464
+ "-D 日付エラー用コールバック例の上書きを行う\n", /* 18 */
1465
+ "-e 利用可能な全ての暗号スイートをリスト, \n", /* 19 */
1466
+ "-g サーバーへ HTTP GET を送信\n", /* 20 */
1467
+ #ifdef WOLFSSL_DTLS
1468
+ "-u UDP DTLSを使用する。\n"
1469
+ #ifndef WOLFSSL_DTLS13
1470
+ " -v 2 を追加指定するとDTLSv1, "
1471
+ "-v 3 を追加指定すると DTLSv1.2 (既定値)\n", /* 21 */
1472
+ #else
1473
+ " -v 2 を追加指定するとDTLSv1, "
1474
+ "-v 3 を追加指定すると DTLSv1.2 (既定値),\n"
1475
+ " -v 4 を追加指定すると DTLSv1.3\n", /* 21 */
1476
+ #endif /* !WOLFSSL_DTLS13 */
1477
+ #endif /* WOLFSSL_DTLS */
1478
+ #ifdef WOLFSSL_SCTP
1479
+ "-G SCTP DTLSを使用する。-v 2 を追加指定すると"
1480
+ " DTLSv1, -v 3 を追加指定すると DTLSv1.2 (既定値)\n", /* 22 */
1481
+ #endif
1482
+ #ifndef NO_CERTS
1483
+ "-m 証明書内のドメイン名一致を確認する\n", /* 23 */
1484
+ #endif
1485
+ "-N ノンブロッキング・ソケットを使用する\n", /* 24 */
1486
+ #ifndef NO_SESSION_CACHE
1487
+ "-r セッションを継続する\n", /* 25 */
1488
+ #endif
1489
+ "-w 双方向シャットダウンを待つ\n", /* 26 */
1490
+ "-M <prot> STARTTLSを使用する, <prot>プロトコル(smtp)を"
1491
+ "使用する\n", /* 27 */
1492
+ #ifdef HAVE_SECURE_RENEGOTIATION
1493
+ "-R セキュアな再ネゴシエーションを許可する\n", /* 28 */
1494
+ "-i <str> クライアント主導のネゴシエーションを強制する\n", /* 29 */
1495
+ #endif
1496
+ "-f より少ないパケット/グループメッセージを使用する\n",/* 30 */
1497
+ #ifndef NO_CERTS
1498
+ "-x クライアントの証明書/鍵のロードを無効する\n", /* 31 */
1499
+ #endif
1500
+ "-X 外部テスト・ケースにより動作する\n", /* 32 */
1501
+ "-j コールバック・オーバーライドの検証を使用する\n", /* 33 */
1502
+ #ifdef SHOW_SIZES
1503
+ "-z 構造体のサイズを表示する\n", /* 34 */
1504
+ #endif
1505
+ #ifdef HAVE_SNI
1506
+ "-S <str> ホスト名表示を使用する\n", /* 35 */
1507
+ #endif
1508
+ #ifdef HAVE_MAX_FRAGMENT
1509
+ "-F <num> 最大フラグメント長[1-6]を設定する\n", /* 36 */
1510
+ #endif
1511
+ #ifdef HAVE_TRUNCATED_HMAC
1512
+ "-T Truncated HMACを使用する\n", /* 37 */
1513
+ #endif
1514
+ #ifdef HAVE_EXTENDED_MASTER
1515
+ "-n マスターシークレット拡張を無効にする\n", /* 38 */
1516
+ #endif
1517
+ #ifdef HAVE_OCSP
1518
+ "-o OCSPルックアップをピア証明書で実施する\n", /* 39 */
1519
+ "-O <url> OCSPルックアップを、<url>を使用し"
1520
+ "応答者として実施する\n", /* 40 */
1521
+ #endif
1522
+ #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
1523
+ || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
1524
+ "-W <num> OCSP Staplingを使用する"
1525
+ " (1 v1, 2 v2, 3 v2 multi)\n", /* 41 */
1526
+ " 'm' を最後に指定すると必ず staple を使用する\n" /* 42 */
1527
+ #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TLS_OCSP_MULTI)
1528
+ " -W 1 -v 4, "
1529
+ "TLS13 使用時に複数(Multi)の OCSP を実施します\n" /* 43 */
1530
+ #endif
1531
+ #endif
1532
+ #if defined(ATOMIC_USER) && !defined(WOLFSSL_AEAD_ONLY)
1533
+ "-U アトミック・ユーザー記録の"
1534
+ "コールバックを利用する\n", /* 44 */
1535
+ #endif
1536
+ #ifdef HAVE_PK_CALLBACKS
1537
+ "-P 公開鍵コールバック\n", /* 45 */
1538
+ #endif
1539
+ #ifdef HAVE_ANON
1540
+ "-a 匿名クライアント\n", /* 46 */
1541
+ #endif
1542
+ #ifdef HAVE_CRL
1543
+ "-C CRLを無効\n", /* 47 */
1544
+ #endif
1545
+ #ifdef WOLFSSL_TRUST_PEER_CERT
1546
+ "-E <file> 信頼出来るピアの証明書ロードの為のパス\n", /* 48 */
1547
+ #endif
1548
+ #ifdef HAVE_WNR
1549
+ "-q <file> Whitewood コンフィグファイル, 既定値\n", /* 49 */
1550
+ #endif
1551
+ "-H <arg> 内部テスト"
1552
+ " [defCipherList, exitWithRet, verifyFail, useSupCurve,\n"
1553
+ " loadSSL, disallowETM]\n", /* 50 */
1554
+ #ifdef WOLFSSL_TLS13
1555
+ "-J HelloRetryRequestをKEのグループ選択に使用する\n", /* 51 */
1556
+ "-K 鍵交換にPSKを使用、(EC)DHEは使用しない\n", /* 52 */
1557
+ "-I データ送信前に、鍵とIVを更新する\n", /* 53 */
1558
+ #ifndef NO_DH
1559
+ "-y FFDHE名前付きグループとの鍵共有のみ\n", /* 54 */
1560
+ #endif
1561
+ #ifdef HAVE_ECC
1562
+ "-Y ECC名前付きグループとの鍵共有のみ\n", /* 55 */
1563
+ #endif
1564
+ #endif /* WOLFSSL_TLS13 */
1565
+ #ifdef HAVE_CURVE25519
1566
+ "-t X25519を鍵交換に使用する\n", /* 56 */
1567
+ #endif
1568
+ #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
1569
+ "-Q ポストハンドシェークの証明要求をサポートする\n", /* 57 */
1570
+ #endif
1571
+ #ifdef WOLFSSL_EARLY_DATA
1572
+ "-0 Early data をサーバーへ送信する"
1573
+ "(0-RTTハンドシェイク)\n", /* 58 */
1574
+ #endif
1575
+ #ifdef WOLFSSL_MULTICAST
1576
+ "-3 <grpid> マルチキャスト, grpid < 256\n", /* 59 */
1577
+ #endif
1578
+ "-1 <num> 指定された言語で結果を表示します。\n"
1579
+ " 0: 英語、 1: 日本語\n", /* 60 */
1580
+ #if !defined(NO_DH) && !defined(HAVE_FIPS) && \
1581
+ !defined(HAVE_SELFTEST) && !defined(WOLFSSL_OLD_PRIME_CHECK)
1582
+ "-2 DHプライム番号チェックを無効にする\n", /* 61 */
1583
+ #endif
1584
+ #ifdef HAVE_SECURE_RENEGOTIATION
1585
+ "-4 再交渉に再開を使用\n", /* 62 */
1586
+ #endif
1587
+ #ifdef HAVE_TRUSTED_CA
1588
+ "-5 信頼できる認証局の鍵表示を使用する\n", /* 63 */
1589
+ #endif
1590
+ "-6 WANT_WRITE エラーを全てのIO 送信でシミュレートします\n", /* 64 */
1591
+ #ifdef HAVE_CURVE448
1592
+ "-8 鍵交換に X448 を使用する\n", /* 65 */
1593
+ #endif
1594
+ #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
1595
+ (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
1596
+ !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
1597
+ "-9 証明書の読み込みに hash dir 機能を使用する\n"
1598
+ " <wolfSSL home>/certs フォルダーからロードします\n"
1599
+ " フォルダー中のファイルは、\"hash.N\"[N:0-9]名である必要があります\n"
1600
+ " 以下の例ではca-cert.pemにシンボリックリンクを設定します\n"
1601
+ " ln -s ca-cert.pem `openssl x509 -in ca-cert.pem -hash -noout`.0\n",
1602
+ /* 66 */
1603
+ #endif
1604
+ #if defined(WOLFSSL_WOLFSENTRY_HOOKS) && !defined(NO_FILESYSTEM) && \
1605
+ !defined(WOLFSENTRY_NO_JSON)
1606
+ "--wolfsentry-config <file> wolfSentry コンフィグファイル\n",
1607
+ /* 67 */
1608
+ #endif
1609
+ #ifndef WOLFSSL_TLS13
1610
+ "-7 最小ダウングレード可能なプロトコルバージョンを設定します [0-3] "
1611
+ " SSLv3(0) - TLS1.2(3)\n",
1612
+ #else
1613
+ "-7 最小ダウングレード可能なプロトコルバージョンを設定します [0-4] "
1614
+ " SSLv3(0) - TLS1.3(4)\n", /* 68 */
1615
+ #endif
1616
+ #ifdef HAVE_PQC
1617
+ "--pqc <alg> post-quantum 名前付きグループとの鍵共有のみ:\n"
1618
+ #ifndef WOLFSSL_NO_ML_KEM
1619
+ " ML_KEM_512, ML_KEM_768, ML_KEM_1024,\n"
1620
+ " SecP256r1MLKEM512,\n"
1621
+ " SecP384r1MLKEM768,\n"
1622
+ " SecP521r1MLKEM1024,\n"
1623
+ " SecP256r1MLKEM768,\n"
1624
+ " SecP521r1MLKEM1024,\n"
1625
+ " SecP384r1MLKEM1024,\n"
1626
+ " X25519MLKEM512,\n"
1627
+ " X25519MLKEM768,\n"
1628
+ " X448MLKEM768\n"
1629
+ #endif
1630
+ #ifdef WOLFSSL_MLKEM_KYBER
1631
+ " KYBER_LEVEL1, KYBER_LEVEL3, KYBER_LEVEL5, "
1632
+ "P256_KYBER_LEVEL1,\n"
1633
+ " P384_KYBER_LEVEL3, P521_KYBER_LEVEL5\n"
1634
+ #endif
1635
+ "",
1636
+ /* 69 */
1637
+ #endif
1638
+ #ifdef WOLFSSL_SRTP
1639
+ "--srtp <profile> (デフォルトは SRTP_AES128_CM_SHA1_80)\n", /* 70 */
1640
+ #endif
1641
+ #ifdef WOLFSSL_SYS_CA_CERTS
1642
+ "--sys-ca-certs Load system CA certs for server cert verification\n", /* 71 */
1643
+ #endif
1644
+ #ifdef HAVE_SUPPORTED_CURVES
1645
+ "--onlyPskDheKe Must use DHE key exchange with PSK\n", /* 72 */
1646
+ #endif
1647
+ #ifndef NO_PSK
1648
+ "--openssl-psk Use TLS 1.3 PSK callback compatible with OpenSSL\n", /* 73 */
1649
+ #endif
1650
+ #ifdef HAVE_RPK
1651
+ "--rpk Use RPK for the defined certificates\n", /* 74 */
1652
+ #endif
1653
+ "--files-are-der Specified files are in DER, not PEM format\n", /* 75 */
1654
+ #ifdef WOLFSSL_SYS_CRYPTO_POLICY
1655
+ "--crypto-policy <path to crypto policy file>\n", /* 76 */
1656
+ #endif
1657
+ "\n"
1658
+ "より簡単なwolfSSL TLS クライアントの例については"
1659
+ "下記にアクセスしてください\n"
1660
+ "https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n", /* 77 */
1661
+ NULL,
1662
+ },
1663
+ #endif
1664
+
1665
+ };
1666
+
1667
+ static void showPeerPEM(WOLFSSL* ssl)
1668
+ {
1669
+ #if defined(OPENSSL_EXTRA) && defined(KEEP_PEER_CERT) && !defined(NO_BIO) && \
1670
+ defined(WOLFSSL_CERT_GEN)
1671
+ WOLFSSL_X509* peer = wolfSSL_get_peer_certificate(ssl);
1672
+ if (peer) {
1673
+ WOLFSSL_BIO* bioOut = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
1674
+ if (bioOut == NULL) {
1675
+ LOG_ERROR("failed to get bio on stdout\n");
1676
+ }
1677
+ else {
1678
+ if (wolfSSL_BIO_set_fp(bioOut, stdout, BIO_NOCLOSE)
1679
+ != WOLFSSL_SUCCESS) {
1680
+ LOG_ERROR("failed to set stdout to bio output\n");
1681
+ wolfSSL_BIO_free(bioOut);
1682
+ bioOut = NULL;
1683
+ }
1684
+ }
1685
+
1686
+ if (bioOut) {
1687
+ wolfSSL_BIO_write(bioOut, "---\nServer certificate\n",
1688
+ XSTRLEN("---\nServer certificate\n"));
1689
+ wolfSSL_PEM_write_bio_X509(bioOut, peer);
1690
+ }
1691
+ wolfSSL_BIO_free(bioOut);
1692
+ }
1693
+ wolfSSL_FreeX509(peer);
1694
+ #endif
1695
+ (void)ssl;
1696
+ }
1697
+
1698
+
1699
+ static void Usage(void)
1700
+ {
1701
+ int msgid = 0;
1702
+ const char** msg = client_usage_msg[lng_index];
1703
+
1704
+ printf("%s%s%s", "wolfSSL client ", LIBWOLFSSL_VERSION_STRING,
1705
+ msg[msgid]);
1706
+
1707
+ /* print out so that scripts can know what the max supported key size is */
1708
+ printf("%s", msg[++msgid]);
1709
+ #ifdef NO_RSA
1710
+ printf("%s", msg[++msgid]);
1711
+ #elif defined(WOLFSSL_SP_MATH) /* case of SP math only */
1712
+ #ifndef WOLFSSL_SP_NO_3072
1713
+ printf("%s", msg[++msgid]);
1714
+ #elif !defined(WOLFSSL_SP_NO_2048)
1715
+ printf("%s", msg[++msgid]);
1716
+ #else
1717
+ printf("%s", msg[++msgid]);
1718
+ #endif
1719
+ #elif defined(USE_FAST_MATH)
1720
+ #if !defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_SP_MATH)
1721
+ printf("%d\n", FP_MAX_BITS/2);
1722
+ #else
1723
+ printf("%d\n", SP_INT_MAX_BITS/2);
1724
+ #endif
1725
+ #else
1726
+ /* normal math has unlimited max size */
1727
+ printf("%s", msg[++msgid]);
1728
+ #endif
1729
+
1730
+ printf("%s", msg[++msgid]); /* ? */
1731
+ printf("%s %s\n", msg[++msgid], wolfSSLIP); /* -h */
1732
+ printf("%s %d\n", msg[++msgid], wolfSSLPort); /* -p */
1733
+ #ifndef WOLFSSL_TLS13
1734
+ printf("%s %d\n", msg[++msgid], CLIENT_DEFAULT_VERSION); /* -v */
1735
+ printf("%s", msg[++msgid]); /* -V */
1736
+ #else
1737
+ printf("%s %d\n", msg[++msgid], CLIENT_DEFAULT_VERSION); /* -v */
1738
+ printf("%s", msg[++msgid]); /* -V */
1739
+ #endif
1740
+ printf("%s", msg[++msgid]); /* -l */
1741
+ #ifndef NO_CERTS
1742
+ printf("%s %s\n", msg[++msgid], cliCertFile); /* -c */
1743
+ printf("%s %s\n", msg[++msgid], cliKeyFile); /* -k */
1744
+ printf("%s %s\n", msg[++msgid], caCertFile); /* -A */
1745
+ #endif
1746
+ #ifndef NO_DH
1747
+ printf("%s %d\n", msg[++msgid], DEFAULT_MIN_DHKEY_BITS);
1748
+ #endif
1749
+ printf("%s", msg[++msgid]); /* -b */
1750
+ #ifdef HAVE_ALPN
1751
+ printf("%s", msg[++msgid]); /* -L <str> */
1752
+ #endif
1753
+ printf("%s", msg[++msgid]); /* -B <num> */
1754
+ #ifndef NO_PSK
1755
+ printf("%s", msg[++msgid]); /* -s */
1756
+ #endif
1757
+ printf("%s", msg[++msgid]); /* -d */
1758
+ printf("%s", msg[++msgid]); /* -D */
1759
+ printf("%s", msg[++msgid]); /* -e */
1760
+ printf("%s", msg[++msgid]); /* -g */
1761
+ #ifdef WOLFSSL_DTLS
1762
+ printf("%s", msg[++msgid]); /* -u */
1763
+ #endif
1764
+ #ifdef WOLFSSL_SCTP
1765
+ printf("%s", msg[++msgid]); /* -G */
1766
+ #endif
1767
+ #ifndef NO_CERTS
1768
+ printf("%s", msg[++msgid]); /* -m */
1769
+ #endif
1770
+ printf("%s", msg[++msgid]); /* -N */
1771
+ #ifndef NO_SESSION_CACHE
1772
+ printf("%s", msg[++msgid]); /* -r */
1773
+ #endif
1774
+ printf("%s", msg[++msgid]); /* -w */
1775
+ printf("%s", msg[++msgid]); /* -M */
1776
+ #ifdef HAVE_SECURE_RENEGOTIATION
1777
+ printf("%s", msg[++msgid]); /* -R */
1778
+ printf("%s", msg[++msgid]); /* -i */
1779
+ #endif
1780
+ printf("%s", msg[++msgid]); /* -f */
1781
+ #ifndef NO_CERTS
1782
+ printf("%s", msg[++msgid]); /* -x */
1783
+ #endif
1784
+ printf("%s", msg[++msgid]); /* -X */
1785
+ printf("%s", msg[++msgid]); /* -j */
1786
+ #ifdef SHOW_SIZES
1787
+ printf("%s", msg[++msgid]); /* -z */
1788
+ #endif
1789
+ #ifdef HAVE_SNI
1790
+ printf("%s", msg[++msgid]); /* -S */
1791
+ #endif
1792
+ #ifdef HAVE_MAX_FRAGMENT
1793
+ printf("%s", msg[++msgid]); /* -F */
1794
+ #endif
1795
+ #ifdef HAVE_TRUNCATED_HMAC
1796
+ printf("%s", msg[++msgid]); /* -T */
1797
+ #endif
1798
+ #ifdef HAVE_EXTENDED_MASTER
1799
+ printf("%s", msg[++msgid]); /* -n */
1800
+ #endif
1801
+ #ifdef HAVE_OCSP
1802
+ printf("%s", msg[++msgid]); /* -o */
1803
+ printf("%s", msg[++msgid]); /* -O */
1804
+ #endif
1805
+ #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
1806
+ || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
1807
+ printf("%s", msg[++msgid]); /* -W */
1808
+ printf("%s", msg[++msgid]); /* note for -W */
1809
+ #endif
1810
+ #if defined(ATOMIC_USER) && !defined(WOLFSSL_AEAD_ONLY)
1811
+ printf("%s", msg[++msgid]); /* -U */
1812
+ #endif
1813
+ #ifdef HAVE_PK_CALLBACKS
1814
+ printf("%s", msg[++msgid]); /* -P */
1815
+ #endif
1816
+ #ifdef HAVE_ANON
1817
+ printf("%s", msg[++msgid]); /* -a */
1818
+ #endif
1819
+ #ifdef HAVE_CRL
1820
+ printf("%s", msg[++msgid]); /* -C */
1821
+ #endif
1822
+ #ifdef WOLFSSL_TRUST_PEER_CERT
1823
+ printf("%s", msg[++msgid]); /* -E */
1824
+ #endif
1825
+ #ifdef HAVE_WNR
1826
+ printf("%s %s\n", msg[++msgid], wnrConfig); /* -q */
1827
+ #endif
1828
+ printf("%s", msg[++msgid]); /* -H */
1829
+ printf("%s", msg[++msgid]); /* more -H options */
1830
+ #ifdef WOLFSSL_TLS13
1831
+ printf("%s", msg[++msgid]); /* -J */
1832
+ printf("%s", msg[++msgid]); /* -K */
1833
+ printf("%s", msg[++msgid]); /* -I */
1834
+ #ifndef NO_DH
1835
+ printf("%s", msg[++msgid]); /* -y */
1836
+ #endif
1837
+ #ifdef HAVE_ECC
1838
+ printf("%s", msg[++msgid]); /* -Y */
1839
+ #endif
1840
+ #endif /* WOLFSSL_TLS13 */
1841
+ #ifdef HAVE_CURVE25519
1842
+ printf("%s", msg[++msgid]); /* -t */
1843
+ #endif
1844
+ #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
1845
+ printf("%s", msg[++msgid]); /* -Q */
1846
+ #endif
1847
+ #ifdef WOLFSSL_EARLY_DATA
1848
+ printf("%s", msg[++msgid]); /* -0 */
1849
+ #endif
1850
+ #ifdef WOLFSSL_MULTICAST
1851
+ printf("%s", msg[++msgid]); /* -3 */
1852
+ #endif
1853
+ printf("%s", msg[++msgid]); /* -1 */
1854
+ #if !defined(NO_DH) && !defined(HAVE_FIPS) && \
1855
+ !defined(HAVE_SELFTEST) && !defined(WOLFSSL_OLD_PRIME_CHECK)
1856
+ printf("%s", msg[++msgid]); /* -2 */
1857
+ #endif
1858
+ #ifdef HAVE_SECURE_RENEGOTIATION
1859
+ printf("%s", msg[++msgid]); /* -4 */
1860
+ #endif
1861
+ #ifdef HAVE_TRUSTED_CA
1862
+ printf("%s", msg[++msgid]); /* -5 */
1863
+ #endif
1864
+ printf("%s", msg[++msgid]); /* -6 */
1865
+ #ifdef HAVE_CURVE448
1866
+ printf("%s", msg[++msgid]); /* -8 */
1867
+ #endif
1868
+ #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
1869
+ (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
1870
+ !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
1871
+ printf("%s", msg[++msgid]); /* -9 */
1872
+ #endif
1873
+ #if defined(WOLFSSL_WOLFSENTRY_HOOKS) && !defined(NO_FILESYSTEM) && \
1874
+ !defined(WOLFSENTRY_NO_JSON)
1875
+ printf("%s", msg[++msgid]); /* --wolfsentry-config */
1876
+ #endif
1877
+ printf("%s", msg[++msgid]); /* -7 */
1878
+ #ifdef HAVE_PQC
1879
+ printf("%s", msg[++msgid]); /* --pqc */
1880
+ #endif
1881
+ #ifdef WOLFSSL_SRTP
1882
+ printf("%s", msg[++msgid]); /* dtls-srtp */
1883
+ #endif
1884
+ #ifdef WOLFSSL_SYS_CA_CERTS
1885
+ printf("%s", msg[++msgid]); /* --sys-ca-certs */
1886
+ #endif
1887
+ #ifdef HAVE_SUPPORTED_CURVES
1888
+ printf("%s", msg[++msgid]); /* --onlyPskDheKe */
1889
+ #endif
1890
+ #ifndef NO_PSK
1891
+ printf("%s", msg[++msgid]); /* --openssl-psk */
1892
+ #endif
1893
+ #ifdef HAVE_RPK
1894
+ printf("%s", msg[++msgid]); /* --rpk */
1895
+ #endif
1896
+ printf("%s", msg[++msgid]); /* --files-are-der */
1897
+ printf("%s", msg[++msgid]); /* Documentation Hint */
1898
+ }
1899
+
1900
+ #ifdef WOLFSSL_SRTP
1901
+ /**
1902
+ * client_srtp_test() - test that the computed ekm matches with the server one
1903
+ * @ssl: ssl context
1904
+ * @srtp_helper: srtp_test_helper struct shared with the server
1905
+ *
1906
+ * if @srtp_helper is NULL no check is made, but the ekm is printed.
1907
+ *
1908
+ * calls srtp_helper_get_ekm() to wait and then get the ekm computed by the
1909
+ * server, then check if it matches the one computed by itself.
1910
+ */
1911
+ static int client_srtp_test(WOLFSSL *ssl, func_args *args)
1912
+ {
1913
+ size_t srtp_secret_length;
1914
+ byte *srtp_secret, *p;
1915
+ int ret;
1916
+ #ifdef WOLFSSL_COND
1917
+ srtp_test_helper *srtp_helper = args->srtp_helper;
1918
+ byte *other_secret = NULL;
1919
+ size_t other_size = 0;
1920
+ #else
1921
+ (void)args;
1922
+ #endif
1923
+
1924
+ ret = wolfSSL_export_dtls_srtp_keying_material(ssl, NULL,
1925
+ &srtp_secret_length);
1926
+ if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) {
1927
+ LOG_ERROR("DTLS SRTP: Error getting keying material length\n");
1928
+ return ret;
1929
+ }
1930
+
1931
+ srtp_secret = (byte*)XMALLOC(srtp_secret_length,
1932
+ NULL, DYNAMIC_TYPE_TMP_BUFFER);
1933
+ if (srtp_secret == NULL) {
1934
+ err_sys("DTLS SRTP: Low memory");
1935
+ }
1936
+
1937
+ ret = wolfSSL_export_dtls_srtp_keying_material(ssl, srtp_secret,
1938
+ &srtp_secret_length);
1939
+ if (ret != WOLFSSL_SUCCESS) {
1940
+ XFREE(srtp_secret, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1941
+ LOG_ERROR("DTLS SRTP: Error getting keying material\n");
1942
+ return ret;
1943
+ }
1944
+
1945
+ printf("DTLS SRTP: Exported key material: ");
1946
+ for (p = srtp_secret; p < srtp_secret + srtp_secret_length; p++)
1947
+ printf("%02X", *p);
1948
+ printf("\n");
1949
+
1950
+ #ifdef WOLFSSL_COND
1951
+ if (srtp_helper != NULL) {
1952
+ srtp_helper_get_ekm(srtp_helper, &other_secret, &other_size);
1953
+
1954
+ if (other_size != srtp_secret_length ||
1955
+ (XMEMCMP(other_secret, srtp_secret, srtp_secret_length) != 0)) {
1956
+
1957
+ /* we are delegated from server to free this buffer */
1958
+ XFREE(other_secret, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1959
+ printf("DTLS SRTP: Exported Keying Material mismatch\n");
1960
+ return WOLFSSL_UNKNOWN;
1961
+ }
1962
+
1963
+ /* we are delegated from server to free this buffer */
1964
+ XFREE(other_secret, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1965
+ }
1966
+ #endif /* WOLFSSL_COND */
1967
+
1968
+ XFREE(srtp_secret, NULL, DYNAMIC_TYPE_TMP_BUFFER);
1969
+
1970
+ return 0;
1971
+ }
1972
+ #endif /* WOLFSSL_SRTP */
1973
+
1974
+ #if defined(WOLFSSL_STATIC_MEMORY) && \
1975
+ defined(WOLFSSL_STATIC_MEMORY_DEBUG_CALLBACK)
1976
+ static void ExampleDebugMemoryCb(size_t sz, int bucketSz, byte st, int type) {
1977
+ switch (st) {
1978
+ case WOLFSSL_DEBUG_MEMORY_ALLOC:
1979
+ if (type == DYNAMIC_TYPE_IN_BUFFER) {
1980
+ printf("IN BUFFER: ");
1981
+ }
1982
+
1983
+ if (type == DYNAMIC_TYPE_OUT_BUFFER) {
1984
+ printf("OUT BUFFER: ");
1985
+ }
1986
+
1987
+ printf("Alloc'd %d bytes using bucket size %d\n", (int)sz,
1988
+ bucketSz);
1989
+ break;
1990
+
1991
+ case WOLFSSL_DEBUG_MEMORY_FAIL:
1992
+ printf("Failed when trying to allocate %d bytes\n", (int)sz);
1993
+ break;
1994
+
1995
+ case WOLFSSL_DEBUG_MEMORY_FREE:
1996
+ printf("Free'ing : %d\n", (int)sz);
1997
+ break;
1998
+
1999
+ case WOLFSSL_DEBUG_MEMORY_INIT:
2000
+ printf("Creating memory bucket of size : %d\n", bucketSz);
2001
+ break;
2002
+ }
2003
+ }
2004
+ #endif
2005
+
2006
+
2007
+
2008
+ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
2009
+ {
2010
+ SOCKET_T sockfd = WOLFSSL_SOCKET_INVALID;
2011
+
2012
+ wolfSSL_method_func method = NULL;
2013
+ WOLFSSL_CTX* ctx = NULL;
2014
+ WOLFSSL* ssl = NULL;
2015
+
2016
+ #ifdef WOLFSSL_WOLFSENTRY_HOOKS
2017
+ wolfsentry_errcode_t wolfsentry_ret;
2018
+ #endif
2019
+
2020
+ WOLFSSL* sslResume = NULL;
2021
+ WOLFSSL_SESSION* session = NULL;
2022
+ #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
2023
+ defined(HAVE_EXT_CACHE))
2024
+ byte* flatSession = NULL;
2025
+ int flatSessionSz = 0;
2026
+ #endif
2027
+
2028
+ char msg[CLI_MSG_SZ];
2029
+ int msgSz = 0;
2030
+ char reply[CLI_REPLY_SZ];
2031
+
2032
+ word16 port = wolfSSLPort;
2033
+ char* host = (char*)wolfSSLIP;
2034
+ const char* domain = "localhost"; /* can't default to www.wolfssl.com
2035
+ because can't tell if we're really
2036
+ going there to detect old chacha-poly
2037
+ */
2038
+ #ifndef WOLFSSL_VXWORKS
2039
+ int ch;
2040
+ static const struct mygetopt_long_config long_options[] = {
2041
+ #if defined(WOLFSSL_WOLFSENTRY_HOOKS) && !defined(NO_FILESYSTEM) && \
2042
+ !defined(WOLFSENTRY_NO_JSON)
2043
+ { "wolfsentry-config", 1, 256 },
2044
+ #endif
2045
+ { "help", 0, 257 },
2046
+ #ifndef NO_MULTIBYTE_PRINT
2047
+ { "ヘルプ", 0, 258 },
2048
+ #endif
2049
+ #if defined(HAVE_PQC)
2050
+ { "pqc", 1, 259 },
2051
+ #endif
2052
+ #ifdef WOLFSSL_SRTP
2053
+ { "srtp", 2, 260 }, /* optional argument */
2054
+ #endif
2055
+ #ifdef WOLFSSL_DTLS13
2056
+ /* allow waitTicket option even when HAVE_SESSION_TICKET is 0. Otherwise
2057
+ * tests that use this option will ignore the options following
2058
+ * --waitTicket in the command line and fail */
2059
+ {"waitTicket", 0, 261},
2060
+ #endif /* WOLFSSL_DTLS13 */
2061
+ #ifdef WOLFSSL_DTLS_CID
2062
+ {"cid", 2, 262},
2063
+ #endif /* WOLFSSL_DTLS_CID */
2064
+ #ifdef WOLFSSL_SYS_CA_CERTS
2065
+ { "sys-ca-certs", 0, 263 },
2066
+ #endif
2067
+ #ifdef HAVE_SUPPORTED_CURVES
2068
+ { "onlyPskDheKe", 0, 264 },
2069
+ #endif
2070
+ #ifndef NO_PSK
2071
+ { "openssl-psk", 0, 265 },
2072
+ #endif
2073
+ { "quieter", 0, 266 },
2074
+ #ifdef HAVE_RPK
2075
+ { "rpk", 0, 267 },
2076
+ #endif /* HAVE_RPK */
2077
+ { "files-are-der", 0, 268 },
2078
+ #if defined(WOLFSSL_SYS_CRYPTO_POLICY)
2079
+ { "crypto-policy", 1, 269 },
2080
+ #endif /* WOLFSSL_SYS_CRYPTO_POLICY */
2081
+ { 0, 0, 0 }
2082
+ };
2083
+ #endif
2084
+ int version = CLIENT_INVALID_VERSION;
2085
+ int minVersion = CLIENT_INVALID_VERSION;
2086
+ int usePsk = 0;
2087
+ int opensslPsk = 0;
2088
+ int useAnon = 0;
2089
+ int sendGET = 0;
2090
+ int benchmark = 0;
2091
+ int block = TEST_BUFFER_SIZE;
2092
+ size_t throughput = 0;
2093
+ int doDTLS = 0;
2094
+ int dtlsUDP = 0;
2095
+ #if (defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)) && \
2096
+ defined(WOLFSSL_DTLS)
2097
+ int dtlsMTU = 0;
2098
+ #endif
2099
+ int dtlsSCTP = 0;
2100
+ int doMcast = 0;
2101
+ int matchName = 0;
2102
+ int doPeerCheck = 1;
2103
+ int nonBlocking = 0;
2104
+ int simulateWantWrite = 0;
2105
+ int resumeSession = 0;
2106
+ int wc_shutdown = 0;
2107
+ int disableCRL = 0;
2108
+ int externalTest = 0;
2109
+ int ret;
2110
+ int err = 0;
2111
+ int scr = 0; /* allow secure renegotiation */
2112
+ int forceScr = 0; /* force client initiated scr */
2113
+ int scrAppData = 0;
2114
+ int resumeScr = 0; /* use resumption for renegotiation */
2115
+ #ifndef WOLFSSL_NO_CLIENT_AUTH
2116
+ int useClientCert = 1;
2117
+ #else
2118
+ int useClientCert = 0;
2119
+ #endif
2120
+ int fewerPackets = 0;
2121
+ int atomicUser = 0;
2122
+ #ifdef HAVE_PK_CALLBACKS
2123
+ int pkCallbacks = 0;
2124
+ PkCbInfo pkCbInfo;
2125
+ #endif
2126
+ int minDhKeyBits = DEFAULT_MIN_DHKEY_BITS;
2127
+ char* alpnList = NULL;
2128
+ unsigned char alpn_opt = 0;
2129
+ char* cipherList = NULL;
2130
+ int useDefCipherList = 0;
2131
+ int customVerifyCert = 0;
2132
+ const char* verifyCert;
2133
+ const char* ourCert;
2134
+ const char* ourKey;
2135
+
2136
+ int doSTARTTLS = 0;
2137
+ char* starttlsProt = NULL;
2138
+ int useVerifyCb = 0;
2139
+ int useSupCurve = 0;
2140
+
2141
+ #ifdef WOLFSSL_TRUST_PEER_CERT
2142
+ const char* trustCert = NULL;
2143
+ #endif
2144
+
2145
+ #ifdef HAVE_SNI
2146
+ char* sniHostName = NULL;
2147
+ #endif
2148
+ #ifdef HAVE_TRUSTED_CA
2149
+ int trustedCaKeyId = 0;
2150
+ #endif
2151
+ #ifdef HAVE_MAX_FRAGMENT
2152
+ byte maxFragment = 0;
2153
+ #endif
2154
+ #ifdef HAVE_TRUNCATED_HMAC
2155
+ byte truncatedHMAC = 0;
2156
+ #endif
2157
+ #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
2158
+ || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
2159
+ byte statusRequest = 0;
2160
+ byte mustStaple = 0;
2161
+ #endif
2162
+ #ifdef HAVE_EXTENDED_MASTER
2163
+ byte disableExtMasterSecret = 0;
2164
+ #endif
2165
+ int helloRetry = 0;
2166
+ int onlyKeyShare = 0;
2167
+ #ifdef WOLFSSL_TLS13
2168
+ int noPskDheKe = 0;
2169
+ #ifdef HAVE_SUPPORTED_CURVES
2170
+ int onlyPskDheKe = 0;
2171
+ #endif
2172
+ int postHandAuth = 0;
2173
+ #endif
2174
+ int updateKeysIVs = 0;
2175
+ int earlyData = 0;
2176
+ #ifdef WOLFSSL_MULTICAST
2177
+ byte mcastID = 0;
2178
+ #endif
2179
+ #if !defined(NO_DH) && !defined(HAVE_FIPS) && \
2180
+ !defined(HAVE_SELFTEST) && !defined(WOLFSSL_OLD_PRIME_CHECK)
2181
+ int doDhKeyCheck = 1;
2182
+ #endif
2183
+
2184
+ #ifdef HAVE_OCSP
2185
+ int useOcsp = 0;
2186
+ char* ocspUrl = NULL;
2187
+ #endif
2188
+ int useX25519 = 0;
2189
+ int useX448 = 0;
2190
+ int usePqc = 0;
2191
+ char* pqcAlg = NULL;
2192
+ int exitWithRet = 0;
2193
+ int loadCertKeyIntoSSLObj = 0;
2194
+ #ifdef WOLFSSL_SYS_CA_CERTS
2195
+ byte loadSysCaCerts = 0;
2196
+ #endif
2197
+
2198
+ #ifdef HAVE_ENCRYPT_THEN_MAC
2199
+ int disallowETM = 0;
2200
+ #endif
2201
+
2202
+ #ifdef HAVE_WNR
2203
+ const char* wnrConfigFile = wnrConfig;
2204
+ #endif
2205
+ #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
2206
+ (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
2207
+ !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
2208
+ int useCertFolder = 0;
2209
+ #endif
2210
+ #ifdef WOLFSSL_SRTP
2211
+ const char* dtlsSrtpProfiles = NULL;
2212
+ #endif
2213
+
2214
+ #ifdef HAVE_SESSION_TICKET
2215
+ int waitTicket = 0;
2216
+ #endif /* HAVE_SESSION_TICKET */
2217
+ #ifdef WOLFSSL_DTLS_CID
2218
+ int useDtlsCID = 0;
2219
+ char dtlsCID[DTLS_CID_BUFFER_SIZE] = { 0 };
2220
+ #endif /* WOLFSSL_DTLS_CID */
2221
+ #ifdef HAVE_RPK
2222
+ int useRPK = 0;
2223
+ #endif /* HAVE_RPK */
2224
+ #ifdef WOLFSSL_PEM_TO_DER
2225
+ int fileFormat = WOLFSSL_FILETYPE_PEM;
2226
+ #else
2227
+ int fileFormat = WOLFSSL_FILETYPE_ASN1;
2228
+ #endif
2229
+ #if defined(WOLFSSL_SYS_CRYPTO_POLICY)
2230
+ const char * policy = NULL;
2231
+ #endif /* WOLFSSL_SYS_CRYPTO_POLICY */
2232
+
2233
+
2234
+ char buffer[WOLFSSL_MAX_ERROR_SZ];
2235
+
2236
+ int argc = ((func_args*)args)->argc;
2237
+ char** argv = ((func_args*)args)->argv;
2238
+
2239
+
2240
+ #ifdef WOLFSSL_STATIC_MEMORY
2241
+ #if (defined(HAVE_ECC) && !defined(ALT_ECC_SIZE)) \
2242
+ || defined(SESSION_CERTS)
2243
+ /* big enough to handle most cases including session certs */
2244
+ byte memory[320000];
2245
+ #else
2246
+ byte memory[80000];
2247
+ #endif
2248
+ byte memoryIO[34500]; /* max for IO buffer (TLS packet can be 16k) */
2249
+ #if !defined(WOLFSSL_STATIC_MEMORY_LEAN)
2250
+ WOLFSSL_MEM_CONN_STATS ssl_stats;
2251
+ #if defined(DEBUG_WOLFSSL)
2252
+ WOLFSSL_MEM_STATS mem_stats;
2253
+ #endif
2254
+ #endif
2255
+ WOLFSSL_HEAP_HINT *heap = NULL;
2256
+ #endif
2257
+
2258
+ #ifdef WOLFSSL_DUAL_ALG_CERTS
2259
+ /* Set our preference for verification to be for both the native and
2260
+ * alternative chains. Ultimately, its the server's choice. This will be
2261
+ * used in the call to wolfSSL_UseCKS(). */
2262
+ byte cks_order[3] = {
2263
+ WOLFSSL_CKS_SIGSPEC_BOTH,
2264
+ WOLFSSL_CKS_SIGSPEC_ALTERNATIVE,
2265
+ WOLFSSL_CKS_SIGSPEC_NATIVE,
2266
+ };
2267
+ #endif /* WOLFSSL_DUAL_ALG_CERTS */
2268
+
2269
+ ((func_args*)args)->return_code = -1; /* error state */
2270
+
2271
+ #ifndef NO_RSA
2272
+ verifyCert = caCertFile;
2273
+ ourCert = cliCertFile;
2274
+ ourKey = cliKeyFile;
2275
+ #else
2276
+ #ifdef HAVE_ECC
2277
+ verifyCert = caEccCertFile;
2278
+ ourCert = cliEccCertFile;
2279
+ ourKey = cliEccKeyFile;
2280
+ #elif defined(HAVE_ED25519)
2281
+ verifyCert = caEdCertFile;
2282
+ ourCert = cliEdCertFile;
2283
+ ourKey = cliEdKeyFile;
2284
+ #elif defined(HAVE_ED448)
2285
+ verifyCert = caEd448CertFile;
2286
+ ourCert = cliEd448CertFile;
2287
+ ourKey = cliEd448KeyFile;
2288
+ #else
2289
+ verifyCert = NULL;
2290
+ ourCert = NULL;
2291
+ ourKey = NULL;
2292
+ #endif
2293
+ #endif
2294
+
2295
+ (void)session;
2296
+ (void)sslResume;
2297
+ (void)atomicUser;
2298
+ (void)scr;
2299
+ (void)forceScr;
2300
+ (void)scrAppData;
2301
+ (void)resumeScr;
2302
+ (void)ourKey;
2303
+ (void)ourCert;
2304
+ (void)verifyCert;
2305
+ (void)useClientCert;
2306
+ (void)disableCRL;
2307
+ (void)minDhKeyBits;
2308
+ (void)alpnList;
2309
+ (void)alpn_opt;
2310
+ (void)updateKeysIVs;
2311
+ (void)earlyData;
2312
+ (void)useX25519;
2313
+ (void)useX448;
2314
+ (void)helloRetry;
2315
+ (void)onlyKeyShare;
2316
+ (void)useSupCurve;
2317
+ (void)loadCertKeyIntoSSLObj;
2318
+ (void)usePqc;
2319
+ (void)pqcAlg;
2320
+ (void)opensslPsk;
2321
+ (void)fileFormat;
2322
+ StackTrap();
2323
+
2324
+ /* Reinitialize the global myVerifyAction. */
2325
+ myVerifyAction = VERIFY_OVERRIDE_ERROR;
2326
+
2327
+ #ifndef WOLFSSL_VXWORKS
2328
+ /* Not used: All used */
2329
+ while ((ch = mygetopt_long(argc, argv, "?:"
2330
+ "ab:c:defgh:i;jk:l:mnop:q:rstu;v:wxyz"
2331
+ "A:B:CDE:F:GH:IJKL:M:NO:PQRS:TUVW:XYZ:"
2332
+ "01:23:4567:89"
2333
+ "@#", long_options, 0)) != -1) {
2334
+ switch (ch) {
2335
+ case '?' :
2336
+ if(myoptarg!=NULL) {
2337
+ lng_index = atoi(myoptarg);
2338
+ if(lng_index<0||lng_index>1){
2339
+ lng_index = 0;
2340
+ }
2341
+ }
2342
+ Usage();
2343
+ XEXIT_T(EXIT_SUCCESS);
2344
+
2345
+ case 257 :
2346
+ lng_index = 0;
2347
+ Usage();
2348
+ XEXIT_T(EXIT_SUCCESS);
2349
+
2350
+ case 258 :
2351
+ lng_index = 1;
2352
+ Usage();
2353
+ XEXIT_T(EXIT_SUCCESS);
2354
+
2355
+ case 'g' :
2356
+ sendGET = 1;
2357
+ break;
2358
+
2359
+ case 'd' :
2360
+ doPeerCheck = 0;
2361
+ break;
2362
+
2363
+ case 'e' :
2364
+ ShowCiphers();
2365
+ XEXIT_T(EXIT_SUCCESS);
2366
+
2367
+ case 'D' :
2368
+ myVerifyAction = VERIFY_OVERRIDE_DATE_ERR;
2369
+ break;
2370
+
2371
+ case 'C' :
2372
+ #ifdef HAVE_CRL
2373
+ disableCRL = 1;
2374
+ #endif
2375
+ break;
2376
+
2377
+ case 'u' :
2378
+ doDTLS = 1;
2379
+ dtlsUDP = 1;
2380
+ #if (defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)) && \
2381
+ defined(WOLFSSL_DTLS)
2382
+ dtlsMTU = atoi(myoptarg);
2383
+ #endif
2384
+ break;
2385
+
2386
+ #ifdef WOLFSSL_SRTP
2387
+ case 260:
2388
+ doDTLS = 1;
2389
+ dtlsUDP = 1;
2390
+ dtlsSrtpProfiles = myoptarg != NULL ? myoptarg :
2391
+ "SRTP_AES128_CM_SHA1_80";
2392
+ printf("Using SRTP Profile(s): %s\n", dtlsSrtpProfiles);
2393
+ break;
2394
+ #endif
2395
+
2396
+ #ifdef WOLFSSL_DTLS13
2397
+ case 261:
2398
+ #ifdef HAVE_SESSION_TICKET
2399
+ waitTicket = 1;
2400
+ #endif /* HAVE_SESSION_TICKET */
2401
+ break;
2402
+ #endif /* WOLFSSL_DTLS13 */
2403
+ #ifdef WOLFSSL_DTLS_CID
2404
+ case 262:
2405
+ useDtlsCID = 1;
2406
+ if (myoptarg != NULL) {
2407
+ if (XSTRLEN(myoptarg) >= DTLS_CID_BUFFER_SIZE) {
2408
+ err_sys("provided connection ID is too big");
2409
+ }
2410
+ else {
2411
+ XSTRLCPY(dtlsCID, myoptarg, DTLS_CID_BUFFER_SIZE);
2412
+ }
2413
+ }
2414
+ break;
2415
+ #endif /* WOLFSSL_CID */
2416
+ case 'G' :
2417
+ #ifdef WOLFSSL_SCTP
2418
+ doDTLS = 1;
2419
+ dtlsUDP = 1;
2420
+ dtlsSCTP = 1;
2421
+ #endif
2422
+ break;
2423
+
2424
+ case 's' :
2425
+ usePsk = 1;
2426
+ break;
2427
+
2428
+ #ifdef WOLFSSL_TRUST_PEER_CERT
2429
+ case 'E' :
2430
+ trustCert = myoptarg;
2431
+ break;
2432
+ #endif
2433
+
2434
+ case 'm' :
2435
+ matchName = 1;
2436
+ break;
2437
+
2438
+ case 'x' :
2439
+ useClientCert = 0;
2440
+ break;
2441
+
2442
+ case 'X' :
2443
+ externalTest = 1;
2444
+ break;
2445
+
2446
+ case 'f' :
2447
+ fewerPackets = 1;
2448
+ break;
2449
+
2450
+ case 'U' :
2451
+ #if defined(ATOMIC_USER) && !defined(WOLFSSL_AEAD_ONLY)
2452
+ atomicUser = 1;
2453
+ #endif
2454
+ break;
2455
+
2456
+ case 'P' :
2457
+ #ifdef HAVE_PK_CALLBACKS
2458
+ pkCallbacks = 1;
2459
+ #endif
2460
+ break;
2461
+
2462
+ case 'h' :
2463
+ host = myoptarg;
2464
+ domain = myoptarg;
2465
+ break;
2466
+
2467
+ case 'p' :
2468
+ port = (word16)atoi(myoptarg);
2469
+ #if !defined(NO_MAIN_DRIVER) || defined(USE_WINDOWS_API)
2470
+ if (port == 0)
2471
+ err_sys("port number cannot be 0");
2472
+ #endif
2473
+ break;
2474
+
2475
+ case 'v' :
2476
+ if (myoptarg[0] == 'd') {
2477
+ version = CLIENT_DOWNGRADE_VERSION;
2478
+ break;
2479
+ }
2480
+ #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
2481
+ else if (myoptarg[0] == 'e') {
2482
+ version = EITHER_DOWNGRADE_VERSION;
2483
+ #ifndef NO_CERTS
2484
+ loadCertKeyIntoSSLObj = 1;
2485
+ #endif
2486
+ break;
2487
+ }
2488
+ #endif
2489
+ version = atoi(myoptarg);
2490
+ if (version < 0 || version > 4) {
2491
+ Usage();
2492
+ XEXIT_T(MY_EX_USAGE);
2493
+ }
2494
+ break;
2495
+
2496
+ case 'V' :
2497
+ ShowVersions();
2498
+ XEXIT_T(EXIT_SUCCESS);
2499
+
2500
+ case 'l' :
2501
+ cipherList = myoptarg;
2502
+ break;
2503
+
2504
+ case 'H' :
2505
+ if (XSTRCMP(myoptarg, "defCipherList") == 0) {
2506
+ printf("Using default cipher list for testing\n");
2507
+ useDefCipherList = 1;
2508
+ }
2509
+ else if (XSTRCMP(myoptarg, "exitWithRet") == 0) {
2510
+ printf("Skip exit() for testing\n");
2511
+ exitWithRet = 1;
2512
+ }
2513
+ else if (XSTRCMP(myoptarg, "verifyFail") == 0) {
2514
+ printf("Verify should fail\n");
2515
+ myVerifyAction = VERIFY_FORCE_FAIL;
2516
+ }
2517
+ else if (XSTRCMP(myoptarg, "verifyInfo") == 0) {
2518
+ printf("Verify should not override error\n");
2519
+ myVerifyAction = VERIFY_USE_PREVERIFY;
2520
+ }
2521
+ else if (XSTRCMP(myoptarg, "useSupCurve") == 0) {
2522
+ printf("Attempting to test use supported curve\n");
2523
+ #if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
2524
+ useSupCurve = 1;
2525
+ #else
2526
+ printf("Supported curves not compiled in!\n");
2527
+ #endif
2528
+ }
2529
+ else if (XSTRCMP(myoptarg, "loadSSL") == 0) {
2530
+ printf("Load cert/key into wolfSSL object\n");
2531
+ #ifndef NO_CERTS
2532
+ loadCertKeyIntoSSLObj = 1;
2533
+ #else
2534
+ printf("Certs turned off with NO_CERTS!\n");
2535
+ #endif
2536
+ }
2537
+ else if (XSTRCMP(myoptarg, "disallowETM") == 0) {
2538
+ printf("Disallow Encrypt-Then-MAC\n");
2539
+ #ifdef HAVE_ENCRYPT_THEN_MAC
2540
+ disallowETM = 1;
2541
+ #endif
2542
+ }
2543
+ else {
2544
+ Usage();
2545
+ XEXIT_T(MY_EX_USAGE);
2546
+ }
2547
+ break;
2548
+
2549
+ case 'A' :
2550
+ customVerifyCert = 1;
2551
+ verifyCert = myoptarg;
2552
+ break;
2553
+
2554
+ case 'c' :
2555
+ ourCert = myoptarg;
2556
+ break;
2557
+
2558
+ case 'k' :
2559
+ ourKey = myoptarg;
2560
+ break;
2561
+
2562
+ case 'Z' :
2563
+ #ifndef NO_DH
2564
+ minDhKeyBits = atoi(myoptarg);
2565
+ if (minDhKeyBits <= 0 || minDhKeyBits > 16000) {
2566
+ Usage();
2567
+ XEXIT_T(MY_EX_USAGE);
2568
+ }
2569
+ #endif
2570
+ break;
2571
+
2572
+ case 'b' :
2573
+ benchmark = atoi(myoptarg);
2574
+ if (benchmark < 0 || benchmark > 1000000) {
2575
+ Usage();
2576
+ XEXIT_T(MY_EX_USAGE);
2577
+ }
2578
+ break;
2579
+
2580
+ case 'B' :
2581
+ throughput = (size_t)atol(myoptarg);
2582
+ for (; *myoptarg != '\0'; myoptarg++) {
2583
+ if (*myoptarg == ',') {
2584
+ block = atoi(myoptarg + 1);
2585
+ break;
2586
+ }
2587
+ }
2588
+ if (throughput == 0 || block <= 0) {
2589
+ Usage();
2590
+ XEXIT_T(MY_EX_USAGE);
2591
+ }
2592
+ break;
2593
+
2594
+ case 'N' :
2595
+ nonBlocking = 1;
2596
+ break;
2597
+
2598
+ case 'r' :
2599
+ resumeSession = 1;
2600
+ break;
2601
+
2602
+ case 'w' :
2603
+ wc_shutdown = 1;
2604
+ break;
2605
+
2606
+ case 'R' :
2607
+ #ifdef HAVE_SECURE_RENEGOTIATION
2608
+ scr = 1;
2609
+ #endif
2610
+ break;
2611
+
2612
+ case 'i' :
2613
+ #ifdef HAVE_SECURE_RENEGOTIATION
2614
+ scr = 1;
2615
+ forceScr = 1;
2616
+ if (XSTRCMP(myoptarg, "scr-app-data") == 0) {
2617
+ scrAppData = 1;
2618
+ }
2619
+ #endif
2620
+ break;
2621
+
2622
+ case 'z' :
2623
+ #ifndef WOLFSSL_LEANPSK
2624
+ wolfSSL_GetObjectSize();
2625
+ #endif
2626
+ break;
2627
+
2628
+ case 'S' :
2629
+ if (XSTRCMP(myoptarg, "check") == 0) {
2630
+ #ifdef HAVE_SNI
2631
+ printf("SNI is: ON\n");
2632
+ #else
2633
+ printf("SNI is: OFF\n");
2634
+ #endif
2635
+ XEXIT_T(EXIT_SUCCESS);
2636
+ }
2637
+ #ifdef HAVE_SNI
2638
+ sniHostName = myoptarg;
2639
+ #endif
2640
+ break;
2641
+
2642
+ case 'F' :
2643
+ #ifdef HAVE_MAX_FRAGMENT
2644
+ maxFragment = (byte)atoi(myoptarg);
2645
+ if (maxFragment < WOLFSSL_MFL_MIN ||
2646
+ maxFragment > WOLFSSL_MFL_MAX) {
2647
+ Usage();
2648
+ XEXIT_T(MY_EX_USAGE);
2649
+ }
2650
+ #endif
2651
+ break;
2652
+
2653
+ case 'T' :
2654
+ #ifdef HAVE_TRUNCATED_HMAC
2655
+ truncatedHMAC = 1;
2656
+ #endif
2657
+ break;
2658
+
2659
+ case 'n' :
2660
+ #ifdef HAVE_EXTENDED_MASTER
2661
+ disableExtMasterSecret = 1;
2662
+ #endif
2663
+ break;
2664
+
2665
+ case 'W' :
2666
+ #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
2667
+ || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
2668
+ {
2669
+ word32 myoptargSz;
2670
+
2671
+ statusRequest = (byte)atoi(myoptarg);
2672
+ if (statusRequest > OCSP_STAPLING_OPT_MAX) {
2673
+ Usage();
2674
+ XEXIT_T(MY_EX_USAGE);
2675
+ }
2676
+
2677
+ myoptargSz = (word32)XSTRLEN(myoptarg);
2678
+ if (myoptargSz > 0 &&
2679
+ XTOUPPER((unsigned char)myoptarg[myoptargSz-1]) == 'M') {
2680
+ mustStaple = 1;
2681
+ }
2682
+ }
2683
+ #endif
2684
+ break;
2685
+
2686
+ case 'o' :
2687
+ #ifdef HAVE_OCSP
2688
+ useOcsp = 1;
2689
+ #endif
2690
+ break;
2691
+
2692
+ case 'O' :
2693
+ #ifdef HAVE_OCSP
2694
+ useOcsp = 1;
2695
+ ocspUrl = myoptarg;
2696
+ #endif
2697
+ break;
2698
+
2699
+ case 'a' :
2700
+ #ifdef HAVE_ANON
2701
+ useAnon = 1;
2702
+ #endif
2703
+ break;
2704
+
2705
+ case 'L' :
2706
+ #ifdef HAVE_ALPN
2707
+ alpnList = myoptarg;
2708
+
2709
+ if (alpnList[0] == 'C' && alpnList[1] == ':')
2710
+ alpn_opt = WOLFSSL_ALPN_CONTINUE_ON_MISMATCH;
2711
+ else if (alpnList[0] == 'F' && alpnList[1] == ':')
2712
+ alpn_opt = WOLFSSL_ALPN_FAILED_ON_MISMATCH;
2713
+ else {
2714
+ Usage();
2715
+ XEXIT_T(MY_EX_USAGE);
2716
+ }
2717
+
2718
+ alpnList += 2;
2719
+
2720
+ #endif
2721
+ break;
2722
+
2723
+ case 'M' :
2724
+ doSTARTTLS = 1;
2725
+ starttlsProt = myoptarg;
2726
+
2727
+ if (XSTRCMP(starttlsProt, "smtp") != 0) {
2728
+ Usage();
2729
+ XEXIT_T(MY_EX_USAGE);
2730
+ }
2731
+
2732
+ break;
2733
+
2734
+ case 'q' :
2735
+ #ifdef HAVE_WNR
2736
+ wnrConfigFile = myoptarg;
2737
+ #endif
2738
+ break;
2739
+
2740
+ case 'J' :
2741
+ #ifdef WOLFSSL_TLS13
2742
+ helloRetry = 1;
2743
+ #endif
2744
+ break;
2745
+
2746
+ case 'K' :
2747
+ #ifdef WOLFSSL_TLS13
2748
+ noPskDheKe = 1;
2749
+ #endif
2750
+ break;
2751
+
2752
+ case 'I' :
2753
+ #ifdef WOLFSSL_TLS13
2754
+ updateKeysIVs = 1;
2755
+ #endif
2756
+ break;
2757
+
2758
+ case 'y' :
2759
+ #if defined(WOLFSSL_TLS13) && \
2760
+ defined(HAVE_SUPPORTED_CURVES) && !defined(NO_DH)
2761
+ onlyKeyShare = 1;
2762
+ #endif
2763
+ break;
2764
+
2765
+ case 'Y' :
2766
+ #if defined(WOLFSSL_TLS13) && \
2767
+ defined(HAVE_SUPPORTED_CURVES) && defined(HAVE_ECC)
2768
+ onlyKeyShare = 2;
2769
+ #endif
2770
+ break;
2771
+
2772
+ case 'j' :
2773
+ useVerifyCb = 1;
2774
+ break;
2775
+
2776
+ case 't' :
2777
+ #ifdef HAVE_CURVE25519
2778
+ useX25519 = 1;
2779
+ #ifdef HAVE_ECC
2780
+ useSupCurve = 1;
2781
+ #if defined(WOLFSSL_TLS13) && \
2782
+ defined(HAVE_SUPPORTED_CURVES)
2783
+ onlyKeyShare = 2;
2784
+ #endif
2785
+ #endif
2786
+ #endif
2787
+ break;
2788
+
2789
+ case 'Q' :
2790
+ #if defined(WOLFSSL_TLS13) && \
2791
+ defined(WOLFSSL_POST_HANDSHAKE_AUTH)
2792
+ postHandAuth = 1;
2793
+ #endif
2794
+ break;
2795
+
2796
+ case '0' :
2797
+ #ifdef WOLFSSL_EARLY_DATA
2798
+ earlyData = 1;
2799
+ #endif
2800
+ break;
2801
+
2802
+ case '1' :
2803
+ lng_index = atoi(myoptarg);
2804
+ if(lng_index<0||lng_index>1){
2805
+ lng_index = 0;
2806
+ }
2807
+ break;
2808
+
2809
+ case '2' :
2810
+ #if !defined(NO_DH) && !defined(HAVE_FIPS) && \
2811
+ !defined(HAVE_SELFTEST) && !defined(WOLFSSL_OLD_PRIME_CHECK)
2812
+ doDhKeyCheck = 0;
2813
+ #endif
2814
+ break;
2815
+
2816
+ case '3' :
2817
+ #ifdef WOLFSSL_MULTICAST
2818
+ doMcast = 1;
2819
+ mcastID = (byte)(atoi(myoptarg) & 0xFF);
2820
+ #endif
2821
+ break;
2822
+
2823
+ case '4' :
2824
+ #ifdef HAVE_SECURE_RENEGOTIATION
2825
+ scr = 1;
2826
+ forceScr = 1;
2827
+ resumeScr = 1;
2828
+ #endif
2829
+ break;
2830
+
2831
+ case '5' :
2832
+ #ifdef HAVE_TRUSTED_CA
2833
+ trustedCaKeyId = 1;
2834
+ #endif /* HAVE_TRUSTED_CA */
2835
+ break;
2836
+
2837
+ case '6' :
2838
+ #ifdef WOLFSSL_ASYNC_IO
2839
+ nonBlocking = 1;
2840
+ simulateWantWrite = 1;
2841
+ #else
2842
+ LOG_ERROR("Ignoring -6 since async I/O support not "
2843
+ "compiled in.\n");
2844
+ #endif
2845
+ break;
2846
+
2847
+ case '7' :
2848
+ minVersion = atoi(myoptarg);
2849
+ if (minVersion < 0 || minVersion > 4) {
2850
+ Usage();
2851
+ XEXIT_T(MY_EX_USAGE);
2852
+ }
2853
+ break;
2854
+
2855
+ case '8' :
2856
+ #ifdef HAVE_CURVE448
2857
+ useX448 = 1;
2858
+ #ifdef HAVE_ECC
2859
+ useSupCurve = 1;
2860
+ #if defined(WOLFSSL_TLS13) && \
2861
+ defined(HAVE_SUPPORTED_CURVES)
2862
+ onlyKeyShare = 2;
2863
+ #endif
2864
+ #endif
2865
+ #endif
2866
+ break;
2867
+ case '9' :
2868
+ #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
2869
+ (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
2870
+ !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
2871
+ useCertFolder = 1;
2872
+ #endif
2873
+ break;
2874
+ case '@' :
2875
+ {
2876
+ #ifdef HAVE_WC_INTROSPECTION
2877
+ const char *conf_args = wolfSSL_configure_args();
2878
+ if (conf_args) {
2879
+ puts(conf_args);
2880
+ XEXIT_T(EXIT_SUCCESS);
2881
+ } else {
2882
+ fputs("configure args not compiled in.\n",stderr);
2883
+ XEXIT_T(MY_EX_USAGE);
2884
+ }
2885
+ #else
2886
+ fputs("compiled without BUILD_INTROSPECTION.\n",stderr);
2887
+ XEXIT_T(MY_EX_USAGE);
2888
+ #endif
2889
+ }
2890
+
2891
+ case '#' :
2892
+ {
2893
+ #ifdef HAVE_WC_INTROSPECTION
2894
+ const char *cflags = wolfSSL_global_cflags();
2895
+ if (cflags) {
2896
+ puts(cflags);
2897
+ XEXIT_T(EXIT_SUCCESS);
2898
+ } else {
2899
+ fputs("CFLAGS not compiled in.\n",stderr);
2900
+ XEXIT_T(MY_EX_USAGE);
2901
+ }
2902
+ #else
2903
+ fputs("compiled without BUILD_INTROSPECTION.\n",stderr);
2904
+ XEXIT_T(MY_EX_USAGE);
2905
+ #endif
2906
+ }
2907
+
2908
+ #ifdef WOLFSSL_WOLFSENTRY_HOOKS
2909
+ case 256:
2910
+ #if !defined(NO_FILESYSTEM) && !defined(WOLFSENTRY_NO_JSON)
2911
+ wolfsentry_config_path = myoptarg;
2912
+ #endif
2913
+ break;
2914
+ #endif
2915
+
2916
+ #if defined(HAVE_PQC)
2917
+ case 259:
2918
+ {
2919
+ usePqc = 1;
2920
+ #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
2921
+ onlyKeyShare = 3;
2922
+ #endif
2923
+ pqcAlg = myoptarg;
2924
+ }
2925
+ break;
2926
+ #endif
2927
+ #ifdef WOLFSSL_SYS_CA_CERTS
2928
+ case 263:
2929
+ loadSysCaCerts = 1;
2930
+ break;
2931
+ #endif
2932
+ case 264:
2933
+ #ifdef HAVE_SUPPORTED_CURVES
2934
+ #ifdef WOLFSSL_TLS13
2935
+ onlyPskDheKe = 1;
2936
+ #endif
2937
+ #endif
2938
+ break;
2939
+ case 265:
2940
+ #ifndef NO_PSK
2941
+ opensslPsk = 1;
2942
+ #endif
2943
+ break;
2944
+ case 266:
2945
+ quieter = 1;
2946
+ break;
2947
+ case 267:
2948
+ #ifdef HAVE_RPK
2949
+ useRPK = 1;
2950
+ #endif /* HAVE_RPK */
2951
+ break;
2952
+ case 268:
2953
+ #ifndef NO_CERTS
2954
+ fileFormat = WOLFSSL_FILETYPE_ASN1;
2955
+ #endif
2956
+ break;
2957
+ case 269:
2958
+ #if defined(WOLFSSL_SYS_CRYPTO_POLICY)
2959
+ policy = myoptarg;
2960
+ #endif /* WOLFSSL_SYS_CRYPTO_POLICY */
2961
+ break;
2962
+
2963
+ default:
2964
+ Usage();
2965
+ XEXIT_T(MY_EX_USAGE);
2966
+ }
2967
+ }
2968
+
2969
+ myoptind = 0; /* reset for test cases */
2970
+ #endif /* !WOLFSSL_VXWORKS */
2971
+
2972
+ if (externalTest) {
2973
+ /* detect build cases that wouldn't allow test against wolfssl.com */
2974
+ int done = 0;
2975
+
2976
+ #ifdef NO_RSA
2977
+ done += 1; /* require RSA for external tests */
2978
+ #endif
2979
+
2980
+ if (!XSTRCMP(domain, "www.globalsign.com")) {
2981
+ /* www.globalsign.com does not respond to ipv6 ocsp requests */
2982
+ #if defined(TEST_IPV6) && defined(HAVE_OCSP)
2983
+ done += 1;
2984
+ #endif
2985
+
2986
+ /* www.globalsign.com has limited supported cipher suites */
2987
+ #if defined(NO_AES) && defined(HAVE_OCSP)
2988
+ done += 1;
2989
+ #endif
2990
+
2991
+ /* www.globalsign.com only supports static RSA or ECDHE with AES */
2992
+ /* We cannot expect users to have on static RSA so test for ECC only
2993
+ * as some users will most likely be on 32-bit systems where ECC
2994
+ * is not enabled by default */
2995
+ #if defined(HAVE_OCSP) && !defined(HAVE_ECC)
2996
+ done += 1;
2997
+ #endif
2998
+ }
2999
+
3000
+ #ifndef NO_PSK
3001
+ if (usePsk) {
3002
+ done += 1; /* don't perform external tests if PSK is enabled */
3003
+ }
3004
+ #endif
3005
+
3006
+ #ifdef NO_SHA
3007
+ done += 1; /* external cert chain most likely has SHA */
3008
+ #endif
3009
+
3010
+ #if !defined(HAVE_ECC) && !defined(WOLFSSL_STATIC_RSA) \
3011
+ || ( defined(HAVE_ECC) && !defined(HAVE_SUPPORTED_CURVES) \
3012
+ && !defined(WOLFSSL_STATIC_RSA) )
3013
+ /* google needs ECDHE+Supported Curves or static RSA */
3014
+ if (!XSTRCASECMP(domain, "www.google.com"))
3015
+ done += 1;
3016
+ #endif
3017
+
3018
+ #if !defined(HAVE_ECC) && !defined(WOLFSSL_STATIC_RSA)
3019
+ /* wolfssl needs ECDHE or static RSA */
3020
+ if (!XSTRCASECMP(domain, "www.wolfssl.com"))
3021
+ done += 1;
3022
+ #endif
3023
+
3024
+ #if !defined(WOLFSSL_SHA384)
3025
+ if (!XSTRCASECMP(domain, "www.wolfssl.com")) {
3026
+ /* wolfssl need sha384 for cert chain verify */
3027
+ done += 1;
3028
+ }
3029
+ #endif
3030
+
3031
+ #if !defined(HAVE_AESGCM) && defined(NO_AES) && \
3032
+ !(defined(HAVE_CHACHA) && defined(HAVE_POLY1305))
3033
+ /* need at least one of these for external tests */
3034
+ done += 1;
3035
+ #endif
3036
+
3037
+ /* For the external test, if we disable AES, GoDaddy will reject the
3038
+ * connection. They only currently support AES suites, RC4 and 3DES
3039
+ * suites. With AES disabled we only offer PolyChacha suites. */
3040
+ #if defined(NO_AES) && !defined(HAVE_AESGCM)
3041
+ if (!XSTRCASECMP(domain, "www.wolfssl.com")) {
3042
+ done += 1;
3043
+ }
3044
+ #endif
3045
+
3046
+ if (done) {
3047
+ LOG_ERROR("external test can't be run in this mode\n");
3048
+
3049
+ ((func_args*)args)->return_code = 0;
3050
+ XEXIT_T(EXIT_SUCCESS);
3051
+ }
3052
+ }
3053
+
3054
+ /* sort out DTLS versus TLS versions */
3055
+ if (version == CLIENT_INVALID_VERSION) {
3056
+ if (doDTLS)
3057
+ version = CLIENT_DTLS_DEFAULT_VERSION;
3058
+ else
3059
+ version = CLIENT_DEFAULT_VERSION;
3060
+ }
3061
+ else {
3062
+ if (doDTLS) {
3063
+ if (version == 3) {
3064
+ version = -2;
3065
+ }
3066
+ #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
3067
+ else if (version == EITHER_DOWNGRADE_VERSION) {
3068
+ version = -3;
3069
+ }
3070
+ #endif
3071
+ else if (version == 4) {
3072
+ #ifdef WOLFSSL_DTLS13
3073
+ version = -4;
3074
+ #else
3075
+ err_sys("Bad DTLS version");
3076
+ #endif /* WOLFSSL_DTLS13 */
3077
+ }
3078
+ else if (version == 2)
3079
+ version = -1;
3080
+ }
3081
+ }
3082
+
3083
+ #ifndef HAVE_SESSION_TICKET
3084
+ if ((version >= 4) && resumeSession) {
3085
+ LOG_ERROR("Can't do TLS 1.3 resumption; need session tickets!\n");
3086
+ }
3087
+ #endif
3088
+
3089
+ #ifdef HAVE_WNR
3090
+ if (wc_InitNetRandom(wnrConfigFile, NULL, 5000) != 0)
3091
+ err_sys("can't load whitewood net random config file");
3092
+ #endif
3093
+
3094
+ #ifdef HAVE_PQC
3095
+ if (usePqc) {
3096
+ if (version == CLIENT_DOWNGRADE_VERSION ||
3097
+ version == EITHER_DOWNGRADE_VERSION)
3098
+ LOG_ERROR(
3099
+ "WARNING: If a TLS 1.3 connection is not negotiated, you "
3100
+ "will not be using a post-quantum group.\n");
3101
+ else if (version != 4 && version != -4)
3102
+ err_sys("can only use post-quantum groups with TLS 1.3 or DTLS 1.3");
3103
+ }
3104
+ #endif
3105
+
3106
+ switch (version) {
3107
+ #ifndef NO_OLD_TLS
3108
+ #ifdef WOLFSSL_ALLOW_SSLV3
3109
+ case 0:
3110
+ method = wolfSSLv3_client_method_ex;
3111
+ break;
3112
+ #endif
3113
+
3114
+ #ifndef NO_TLS
3115
+ #ifdef WOLFSSL_ALLOW_TLSV10
3116
+ case 1:
3117
+ method = wolfTLSv1_client_method_ex;
3118
+ break;
3119
+ #endif
3120
+
3121
+ case 2:
3122
+ method = wolfTLSv1_1_client_method_ex;
3123
+ break;
3124
+ #endif /* !NO_TLS */
3125
+ #endif /* !NO_OLD_TLS */
3126
+
3127
+ #ifndef NO_TLS
3128
+ #ifndef WOLFSSL_NO_TLS12
3129
+ case 3:
3130
+ method = wolfTLSv1_2_client_method_ex;
3131
+ break;
3132
+ #endif
3133
+
3134
+ #ifdef WOLFSSL_TLS13
3135
+ case 4:
3136
+ method = wolfTLSv1_3_client_method_ex;
3137
+ break;
3138
+ #endif
3139
+
3140
+ case CLIENT_DOWNGRADE_VERSION:
3141
+ if (!doDTLS) {
3142
+ method = wolfSSLv23_client_method_ex;
3143
+ }
3144
+ else {
3145
+ #ifdef WOLFSSL_DTLS
3146
+ method = wolfDTLS_client_method_ex;
3147
+ #else
3148
+ err_sys("version not supported");
3149
+ #endif /* WOLFSSL_DTLS */
3150
+ }
3151
+ break;
3152
+ #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
3153
+ case EITHER_DOWNGRADE_VERSION:
3154
+ method = wolfSSLv23_method_ex;
3155
+ break;
3156
+ #endif
3157
+ #endif /* NO_TLS */
3158
+
3159
+ #ifdef WOLFSSL_DTLS
3160
+ #ifndef NO_OLD_TLS
3161
+ case -1:
3162
+ method = wolfDTLSv1_client_method_ex;
3163
+ break;
3164
+ #endif
3165
+
3166
+ #ifndef WOLFSSL_NO_TLS12
3167
+ case -2:
3168
+ method = wolfDTLSv1_2_client_method_ex;
3169
+ break;
3170
+ #endif
3171
+ #ifdef WOLFSSL_DTLS13
3172
+ case -4:
3173
+ method = wolfDTLSv1_3_client_method_ex;
3174
+ break;
3175
+ #endif /* WOLFSSL_DTLS13 */
3176
+ #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
3177
+ case -3:
3178
+ method = wolfDTLSv1_2_method_ex;
3179
+ break;
3180
+ #endif
3181
+ #endif
3182
+
3183
+ default:
3184
+ err_sys("Bad SSL version");
3185
+ }
3186
+
3187
+ if (method == NULL)
3188
+ err_sys("unable to get method");
3189
+
3190
+ #if defined(WOLFSSL_SYS_CRYPTO_POLICY)
3191
+ if (policy != NULL) {
3192
+ if (wolfSSL_crypto_policy_enable(policy) != WOLFSSL_SUCCESS) {
3193
+ err_sys("wolfSSL_crypto_policy_enable failed");
3194
+ }
3195
+ }
3196
+ #endif /* WOLFSSL_SYS_CRYPTO_POLICY */
3197
+
3198
+ #ifdef WOLFSSL_STATIC_MEMORY
3199
+ #if defined(DEBUG_WOLFSSL) && !defined(WOLFSSL_STATIC_MEMORY_LEAN)
3200
+ /* print off helper buffer sizes for use with static memory
3201
+ * printing to stderr in case of debug mode turned on */
3202
+ LOG_ERROR("static memory management size = %d\n",
3203
+ wolfSSL_MemoryPaddingSz());
3204
+ LOG_ERROR("calculated optimum general buffer size = %d\n",
3205
+ wolfSSL_StaticBufferSz(memory, sizeof(memory), 0));
3206
+ LOG_ERROR("calculated optimum IO buffer size = %d\n",
3207
+ wolfSSL_StaticBufferSz(memoryIO, sizeof(memoryIO),
3208
+ WOLFMEM_IO_POOL_FIXED));
3209
+ #endif /* DEBUG_WOLFSSL */
3210
+
3211
+ if (wc_LoadStaticMemory(&heap, memory, sizeof(memory), WOLFMEM_GENERAL, 1)
3212
+ != 0) {
3213
+ err_sys("unable to load static memory");
3214
+ }
3215
+
3216
+ #if defined(WOLFSSL_STATIC_MEMORY) && \
3217
+ defined(WOLFSSL_STATIC_MEMORY_DEBUG_CALLBACK)
3218
+ wolfSSL_SetDebugMemoryCb(ExampleDebugMemoryCb);
3219
+ #endif
3220
+ ctx = wolfSSL_CTX_new_ex(method(heap), heap);
3221
+ if (ctx == NULL)
3222
+ err_sys("unable to get ctx");
3223
+ #ifdef WOLFSSL_CALLBACKS
3224
+ wolfSSL_CTX_set_msg_callback(ctx, msgDebugCb);
3225
+ #endif
3226
+
3227
+ if (wolfSSL_CTX_load_static_memory(&ctx, NULL, memoryIO, sizeof(memoryIO),
3228
+ WOLFMEM_IO_POOL_FIXED | WOLFMEM_TRACK_STATS, 1) != WOLFSSL_SUCCESS) {
3229
+ err_sys("unable to load static memory");
3230
+ }
3231
+ #else
3232
+ if (method != NULL) {
3233
+ ctx = wolfSSL_CTX_new(method(NULL));
3234
+ if (ctx == NULL)
3235
+ err_sys("unable to get ctx");
3236
+ }
3237
+ #endif
3238
+
3239
+ #ifdef WOLFSSL_SYS_CA_CERTS
3240
+ if (loadSysCaCerts &&
3241
+ wolfSSL_CTX_load_system_CA_certs(ctx) != WOLFSSL_SUCCESS) {
3242
+ err_sys("wolfSSL_CTX_load_system_CA_certs failed");
3243
+ }
3244
+ #endif /* WOLFSSL_SYS_CA_CERTS */
3245
+
3246
+ if (minVersion != CLIENT_INVALID_VERSION) {
3247
+ #ifdef WOLFSSL_DTLS
3248
+ if (doDTLS) {
3249
+ switch (minVersion) {
3250
+ case 4:
3251
+ #ifdef WOLFSSL_DTLS13
3252
+ minVersion = WOLFSSL_DTLSV1_3;
3253
+ break;
3254
+ #else
3255
+ err_sys("invalid minimum downgrade version");
3256
+ #endif /* WOLFSSL_DTLS13 */
3257
+ case 3:
3258
+ minVersion = WOLFSSL_DTLSV1_2;
3259
+ break;
3260
+ case 2:
3261
+ minVersion = WOLFSSL_DTLSV1;
3262
+ break;
3263
+ }
3264
+ }
3265
+ #endif /* WOLFSSL_DTLS */
3266
+ if (wolfSSL_CTX_SetMinVersion(ctx, minVersion) != WOLFSSL_SUCCESS)
3267
+ err_sys("can't set minimum downgrade version");
3268
+ }
3269
+ if (simulateWantWrite) {
3270
+ #ifdef USE_WOLFSSL_IO
3271
+ wolfSSL_CTX_SetIOSend(ctx, SimulateWantWriteIOSendCb);
3272
+ #endif
3273
+ }
3274
+
3275
+ #ifdef SINGLE_THREADED
3276
+ if (wolfSSL_CTX_new_rng(ctx) != WOLFSSL_SUCCESS) {
3277
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3278
+ err_sys("Single Threaded new rng at CTX failed");
3279
+ }
3280
+ #endif
3281
+
3282
+ #ifdef OPENSSL_COMPATIBLE_DEFAULTS
3283
+ /* Restore wolfSSL verify defaults */
3284
+ if (ctx) {
3285
+ wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_DEFAULT, NULL);
3286
+ }
3287
+ #endif
3288
+
3289
+ #ifdef WOLFSSL_SRTP
3290
+ if (dtlsSrtpProfiles != NULL) {
3291
+ if (wolfSSL_CTX_set_tlsext_use_srtp(ctx, dtlsSrtpProfiles)
3292
+ != 0) {
3293
+ err_sys("unable to set DTLS SRTP profile");
3294
+ }
3295
+ }
3296
+ #endif
3297
+
3298
+ #ifdef WOLFSSL_WOLFSENTRY_HOOKS
3299
+ if (wolfsentry_setup(&wolfsentry, wolfsentry_config_path,
3300
+ WOLFSENTRY_ROUTE_FLAG_DIRECTION_OUT) < 0) {
3301
+ err_sys("unable to initialize wolfSentry");
3302
+ }
3303
+
3304
+ if (wolfSSL_CTX_set_ConnectFilter(
3305
+ ctx,
3306
+ (NetworkFilterCallback_t)wolfSentry_NetworkFilterCallback,
3307
+ wolfsentry) < 0) {
3308
+ err_sys("unable to install wolfSentry_NetworkFilterCallback");
3309
+ }
3310
+ #endif
3311
+
3312
+ if (cipherList && !useDefCipherList) {
3313
+ if (wolfSSL_CTX_set_cipher_list(ctx, cipherList) != WOLFSSL_SUCCESS) {
3314
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3315
+ err_sys("client can't set cipher list 1");
3316
+ }
3317
+ }
3318
+
3319
+ #ifdef WOLFSSL_LEANPSK
3320
+ if (!usePsk) {
3321
+ usePsk = 1;
3322
+ }
3323
+ #endif
3324
+
3325
+ #if defined(NO_RSA) && !defined(HAVE_ECC) && !defined(HAVE_ED25519) && \
3326
+ !defined(HAVE_ED448)
3327
+ if (!usePsk) {
3328
+ usePsk = 1;
3329
+ }
3330
+ #endif
3331
+
3332
+ if (fewerPackets)
3333
+ wolfSSL_CTX_set_group_messages(ctx);
3334
+ #if (defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)) && \
3335
+ defined(WOLFSSL_DTLS)
3336
+ if (dtlsMTU)
3337
+ wolfSSL_CTX_dtls_set_mtu(ctx, (unsigned short)dtlsMTU);
3338
+ #endif
3339
+
3340
+ #ifndef NO_DH
3341
+ if (wolfSSL_CTX_SetMinDhKey_Sz(ctx, (word16)minDhKeyBits)
3342
+ != WOLFSSL_SUCCESS) {
3343
+ err_sys("Error setting minimum DH key size");
3344
+ }
3345
+ #endif
3346
+
3347
+ #ifdef HAVE_RPK
3348
+ if (useRPK) {
3349
+ char ctype[] = {WOLFSSL_CERT_TYPE_RPK};
3350
+ char stype[] = {WOLFSSL_CERT_TYPE_RPK};
3351
+
3352
+ wolfSSL_CTX_set_client_cert_type(ctx, ctype, sizeof(ctype)/sizeof(ctype[0]));
3353
+ wolfSSL_CTX_set_server_cert_type(ctx, stype, sizeof(stype)/sizeof(stype[0]));
3354
+ usePsk = 0;
3355
+ #ifdef HAVE_CRL
3356
+ disableCRL = 1;
3357
+ #endif
3358
+ doPeerCheck = 0;
3359
+ }
3360
+ #endif /* HAVE_RPK */
3361
+
3362
+ if (usePsk) {
3363
+ #ifndef NO_PSK
3364
+ const char *defaultCipherList = cipherList;
3365
+
3366
+ wolfSSL_CTX_set_psk_client_callback(ctx, my_psk_client_cb);
3367
+ #ifdef WOLFSSL_TLS13
3368
+ #if !defined(WOLFSSL_PSK_TLS13_CB) && !defined(WOLFSSL_PSK_ONE_ID)
3369
+ if (!opensslPsk) {
3370
+ wolfSSL_CTX_set_psk_client_cs_callback(ctx, my_psk_client_cs_cb);
3371
+ }
3372
+ else
3373
+ #endif
3374
+ {
3375
+ wolfSSL_CTX_set_psk_client_tls13_callback(ctx,
3376
+ my_psk_client_tls13_cb);
3377
+ }
3378
+ #endif
3379
+ if (defaultCipherList == NULL) {
3380
+ #if defined(HAVE_AESGCM) && !defined(NO_DH)
3381
+ #ifdef WOLFSSL_TLS13
3382
+ defaultCipherList = "TLS13-AES128-GCM-SHA256"
3383
+ #ifndef WOLFSSL_NO_TLS12
3384
+ ":DHE-PSK-AES128-GCM-SHA256"
3385
+ #endif
3386
+ ;
3387
+ #else
3388
+ defaultCipherList = "DHE-PSK-AES128-GCM-SHA256";
3389
+ #endif
3390
+ #elif defined(HAVE_AESGCM) && defined(WOLFSSL_TLS13)
3391
+ defaultCipherList = "TLS13-AES128-GCM-SHA256"
3392
+ #ifndef WOLFSSL_NO_TLS12
3393
+ ":PSK-AES128-GCM-SHA256"
3394
+ #endif
3395
+ ;
3396
+ #elif defined(HAVE_NULL_CIPHER)
3397
+ defaultCipherList = "PSK-NULL-SHA256";
3398
+ #elif !defined(NO_AES_CBC)
3399
+ defaultCipherList = "PSK-AES128-CBC-SHA256";
3400
+ #else
3401
+ defaultCipherList = "PSK-AES128-GCM-SHA256";
3402
+ #endif
3403
+ if (wolfSSL_CTX_set_cipher_list(ctx, defaultCipherList)
3404
+ !=WOLFSSL_SUCCESS) {
3405
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3406
+ err_sys("client can't set cipher list 2");
3407
+ }
3408
+ }
3409
+ wolfSSL_CTX_set_psk_callback_ctx(ctx, (void*)defaultCipherList);
3410
+ #endif
3411
+ if (useClientCert) {
3412
+ useClientCert = 0;
3413
+ }
3414
+ }
3415
+
3416
+ if (useAnon) {
3417
+ #ifdef HAVE_ANON
3418
+ if (cipherList == NULL || (cipherList && useDefCipherList)) {
3419
+ const char* defaultCipherList;
3420
+ wolfSSL_CTX_allow_anon_cipher(ctx);
3421
+ defaultCipherList = "ADH-AES256-GCM-SHA384:"
3422
+ "ADH-AES128-SHA";
3423
+ if (wolfSSL_CTX_set_cipher_list(ctx,defaultCipherList)
3424
+ != WOLFSSL_SUCCESS) {
3425
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3426
+ err_sys("client can't set cipher list 4");
3427
+ }
3428
+ }
3429
+ #endif
3430
+ if (useClientCert) {
3431
+ useClientCert = 0;
3432
+ }
3433
+ }
3434
+
3435
+ #ifdef WOLFSSL_SCTP
3436
+ if (dtlsSCTP)
3437
+ wolfSSL_CTX_dtls_set_sctp(ctx);
3438
+ #endif
3439
+
3440
+ #ifdef WOLFSSL_ENCRYPTED_KEYS
3441
+ wolfSSL_CTX_set_default_passwd_cb(ctx, PasswordCallBack);
3442
+ #endif
3443
+
3444
+ #ifdef WOLFSSL_SNIFFER
3445
+ if (cipherList == NULL && version < 4) {
3446
+ /* static RSA or ECC cipher suites */
3447
+ const char* staticCipherList = "AES128-SHA:ECDH-ECDSA-AES128-SHA";
3448
+ if (wolfSSL_CTX_set_cipher_list(ctx, staticCipherList) != WOLFSSL_SUCCESS) {
3449
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3450
+ err_sys("client can't set cipher list 3");
3451
+ }
3452
+ }
3453
+ #endif
3454
+
3455
+ #ifdef HAVE_OCSP
3456
+ if (useOcsp) {
3457
+ #if defined(HAVE_IO_TIMEOUT) && defined(HAVE_HTTP_CLIENT)
3458
+ wolfIO_SetTimeout(DEFAULT_TIMEOUT_SEC);
3459
+ #endif
3460
+
3461
+ if (ocspUrl != NULL) {
3462
+ wolfSSL_CTX_SetOCSP_OverrideURL(ctx, ocspUrl);
3463
+ wolfSSL_CTX_EnableOCSP(ctx, WOLFSSL_OCSP_NO_NONCE
3464
+ | WOLFSSL_OCSP_URL_OVERRIDE);
3465
+ }
3466
+ else {
3467
+ wolfSSL_CTX_EnableOCSP(ctx, WOLFSSL_OCSP_CHECKALL);
3468
+ }
3469
+
3470
+ #ifdef WOLFSSL_NONBLOCK_OCSP
3471
+ wolfSSL_CTX_SetOCSP_Cb(ctx, OCSPIOCb, OCSPRespFreeCb, NULL);
3472
+ #endif
3473
+ }
3474
+ #endif
3475
+
3476
+ #ifdef USER_CA_CB
3477
+ wolfSSL_CTX_SetCACb(ctx, CaCb);
3478
+ #endif
3479
+
3480
+ #if defined(HAVE_EXT_CACHE) && !defined(NO_SESSION_CACHE)
3481
+ wolfSSL_CTX_sess_set_get_cb(ctx, mySessGetCb);
3482
+ wolfSSL_CTX_sess_set_new_cb(ctx, mySessNewCb);
3483
+ wolfSSL_CTX_sess_set_remove_cb(ctx, mySessRemCb);
3484
+ #endif
3485
+
3486
+ #ifndef NO_CERTS
3487
+ if (useClientCert && !loadCertKeyIntoSSLObj){
3488
+ #if defined(NO_FILESYSTEM) && defined(USE_CERT_BUFFERS_2048)
3489
+ if (wolfSSL_CTX_use_certificate_chain_buffer_format(ctx,
3490
+ client_cert_der_2048, sizeof_client_cert_der_2048,
3491
+ WOLFSSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS)
3492
+ err_sys("can't load client cert buffer");
3493
+ #elif !defined(TEST_LOAD_BUFFER)
3494
+ if (wolfSSL_CTX_use_certificate_chain_file_format(ctx, ourCert, fileFormat)
3495
+ != WOLFSSL_SUCCESS) {
3496
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3497
+ err_sys("can't load client cert file, check file and run from"
3498
+ " wolfSSL home dir");
3499
+ }
3500
+ #else
3501
+ load_buffer(ctx, ourCert, WOLFSSL_CERT_CHAIN);
3502
+ #endif
3503
+ }
3504
+
3505
+ #ifdef HAVE_PK_CALLBACKS
3506
+ pkCbInfo.ourKey = ourKey;
3507
+ #endif
3508
+ if (useClientCert && !loadCertKeyIntoSSLObj
3509
+ #if defined(HAVE_PK_CALLBACKS) && defined(TEST_PK_PRIVKEY)
3510
+ && !pkCallbacks
3511
+ #endif
3512
+ ) {
3513
+ #ifdef NO_FILESYSTEM
3514
+ if (wolfSSL_CTX_use_PrivateKey_buffer(ctx, client_key_der_2048,
3515
+ sizeof_client_key_der_2048, SSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS)
3516
+ err_sys("can't load client private key buffer");
3517
+ #elif !defined(TEST_LOAD_BUFFER)
3518
+ if (wolfSSL_CTX_use_PrivateKey_file(ctx, ourKey, fileFormat)
3519
+ != WOLFSSL_SUCCESS) {
3520
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3521
+ err_sys("can't load client private key file, check file and run "
3522
+ "from wolfSSL home dir");
3523
+ }
3524
+ #else
3525
+ load_buffer(ctx, ourKey, WOLFSSL_KEY);
3526
+ #endif
3527
+ }
3528
+
3529
+ if (!usePsk && !useAnon && !useVerifyCb && myVerifyAction != VERIFY_FORCE_FAIL) {
3530
+ #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
3531
+ (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
3532
+ !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
3533
+ if (useCertFolder) {
3534
+ WOLFSSL_X509_STORE *store;
3535
+ WOLFSSL_X509_LOOKUP *lookup;
3536
+
3537
+ store = wolfSSL_CTX_get_cert_store(ctx);
3538
+ if (store == NULL) {
3539
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3540
+ err_sys("can't get WOLFSSL_X509_STORE");
3541
+ }
3542
+ lookup = wolfSSL_X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir());
3543
+ if (lookup == NULL) {
3544
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3545
+ err_sys("can't add lookup");
3546
+ }
3547
+ if (wolfSSL_X509_LOOKUP_ctrl(lookup, WOLFSSL_X509_L_ADD_DIR, caCertFolder,
3548
+ X509_FILETYPE_PEM, NULL) != WOLFSSL_SUCCESS) {
3549
+ err_sys("X509_LOOKUP_ctrl w/ L_ADD_DIR failed");
3550
+ }
3551
+ } else {
3552
+ #endif
3553
+ #ifdef NO_FILESYSTEM
3554
+ if (wolfSSL_CTX_load_verify_buffer(ctx, ca_cert_der_2048,
3555
+ sizeof_ca_cert_der_2048, SSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) {
3556
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3557
+ err_sys("can't load ca buffer, Please run from wolfSSL home dir");
3558
+ }
3559
+ #elif !defined(TEST_LOAD_BUFFER)
3560
+ unsigned int verify_flags = 0;
3561
+ #ifdef TEST_BEFORE_DATE
3562
+ verify_flags |= WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY;
3563
+ #endif
3564
+ if (doPeerCheck != 0 &&
3565
+ wolfSSL_CTX_load_verify_locations_ex(ctx, verifyCert, 0, verify_flags)
3566
+ != WOLFSSL_SUCCESS) {
3567
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3568
+ err_sys("can't load ca file, Please run from wolfSSL home dir");
3569
+ }
3570
+ #else
3571
+ load_buffer(ctx, verifyCert, WOLFSSL_CA);
3572
+ #endif /* !NO_FILESYSTEM */
3573
+
3574
+ #ifdef HAVE_ECC
3575
+ /* load ecc verify too, echoserver uses it by default w/ ecc */
3576
+ #ifdef NO_FILESYSTEM
3577
+ if (doPeerCheck != 0 &&
3578
+ wolfSSL_CTX_load_verify_buffer(ctx, ca_ecc_cert_der_256,
3579
+ sizeof_ca_ecc_cert_der_256, SSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) {
3580
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3581
+ err_sys("can't load ecc ca buffer");
3582
+ }
3583
+ #elif !defined(TEST_LOAD_BUFFER)
3584
+ if (doPeerCheck != 0 && !customVerifyCert &&
3585
+ wolfSSL_CTX_load_verify_locations_ex(ctx, eccCertFile, 0, verify_flags)
3586
+ != WOLFSSL_SUCCESS) {
3587
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3588
+ err_sys("can't load ecc ca file, Please run from wolfSSL home dir");
3589
+ }
3590
+ #else
3591
+ load_buffer(ctx, eccCertFile, WOLFSSL_CA);
3592
+ #endif /* !TEST_LOAD_BUFFER */
3593
+ #endif /* HAVE_ECC */
3594
+ #if defined(WOLFSSL_TRUST_PEER_CERT) && !defined(NO_FILESYSTEM)
3595
+ if (trustCert) {
3596
+ if (wolfSSL_CTX_trust_peer_cert(ctx, trustCert,
3597
+ WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) {
3598
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3599
+ err_sys("can't load trusted peer cert file");
3600
+ }
3601
+ }
3602
+ #endif /* WOLFSSL_TRUST_PEER_CERT && !NO_FILESYSTEM */
3603
+ #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
3604
+ (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
3605
+ !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
3606
+ }
3607
+ #endif
3608
+ }
3609
+ if (useVerifyCb || myVerifyAction == VERIFY_FORCE_FAIL ||
3610
+ myVerifyAction == VERIFY_USE_PREVERIFY) {
3611
+ wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, myVerify);
3612
+ }
3613
+ else if (!usePsk && !useAnon && doPeerCheck == 0) {
3614
+ wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_NONE, NULL);
3615
+ }
3616
+ else if (!usePsk && !useAnon && myVerifyAction == VERIFY_OVERRIDE_DATE_ERR) {
3617
+ wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, myVerify);
3618
+ }
3619
+ #endif /* !NO_CERTS */
3620
+
3621
+ #ifdef WOLFSSL_ASYNC_CRYPT
3622
+ ret = wolfAsync_DevOpen(&devId);
3623
+ if (ret < 0) {
3624
+ LOG_ERROR("Async device open failed\nRunning without async\n");
3625
+ }
3626
+ wolfSSL_CTX_SetDevId(ctx, devId);
3627
+ #endif /* WOLFSSL_ASYNC_CRYPT */
3628
+
3629
+ #ifdef HAVE_SNI
3630
+ if (sniHostName) {
3631
+ if (wolfSSL_CTX_UseSNI(ctx, WOLFSSL_SNI_HOST_NAME, sniHostName,
3632
+ (word16) XSTRLEN(sniHostName)) != WOLFSSL_SUCCESS) {
3633
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3634
+ err_sys("UseSNI failed");
3635
+ }
3636
+ }
3637
+ #endif
3638
+ #ifdef HAVE_MAX_FRAGMENT
3639
+ if (maxFragment)
3640
+ if (wolfSSL_CTX_UseMaxFragment(ctx, maxFragment) != WOLFSSL_SUCCESS) {
3641
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3642
+ err_sys("UseMaxFragment failed");
3643
+ }
3644
+ #endif
3645
+ #ifdef HAVE_TRUNCATED_HMAC
3646
+ if (truncatedHMAC)
3647
+ if (wolfSSL_CTX_UseTruncatedHMAC(ctx) != WOLFSSL_SUCCESS) {
3648
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3649
+ err_sys("UseTruncatedHMAC failed");
3650
+ }
3651
+ #endif
3652
+ #ifdef HAVE_SESSION_TICKET
3653
+ if (wolfSSL_CTX_UseSessionTicket(ctx) != WOLFSSL_SUCCESS) {
3654
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3655
+ err_sys("UseSessionTicket failed");
3656
+ }
3657
+ #endif
3658
+ #ifdef HAVE_EXTENDED_MASTER
3659
+ if (disableExtMasterSecret)
3660
+ if (wolfSSL_CTX_DisableExtendedMasterSecret(ctx) != WOLFSSL_SUCCESS) {
3661
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3662
+ err_sys("DisableExtendedMasterSecret failed");
3663
+ }
3664
+ #endif
3665
+ #if defined(HAVE_SUPPORTED_CURVES)
3666
+ #if defined(HAVE_CURVE25519)
3667
+ if (useX25519) {
3668
+ if (wolfSSL_CTX_UseSupportedCurve(ctx, WOLFSSL_ECC_X25519)
3669
+ != WOLFSSL_SUCCESS) {
3670
+ err_sys("unable to support X25519");
3671
+ }
3672
+ }
3673
+ #endif /* HAVE_CURVE25519 */
3674
+ #if defined(HAVE_CURVE448)
3675
+ if (useX448) {
3676
+ if (wolfSSL_CTX_UseSupportedCurve(ctx, WOLFSSL_ECC_X448)
3677
+ != WOLFSSL_SUCCESS) {
3678
+ err_sys("unable to support X448");
3679
+ }
3680
+ }
3681
+ #endif /* HAVE_CURVE448 */
3682
+ #ifdef HAVE_ECC
3683
+ if (useSupCurve) {
3684
+ #if !defined(NO_ECC_SECP) && \
3685
+ (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES))
3686
+ if (wolfSSL_CTX_UseSupportedCurve(ctx, WOLFSSL_ECC_SECP384R1)
3687
+ != WOLFSSL_SUCCESS) {
3688
+ err_sys("unable to support secp384r1");
3689
+ }
3690
+ #endif
3691
+ #if !defined(NO_ECC_SECP) && \
3692
+ (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES))
3693
+ if (wolfSSL_CTX_UseSupportedCurve(ctx, WOLFSSL_ECC_SECP256R1)
3694
+ != WOLFSSL_SUCCESS) {
3695
+ err_sys("unable to support secp256r1");
3696
+ }
3697
+ #endif
3698
+ }
3699
+ #endif /* HAVE_ECC */
3700
+ #ifdef HAVE_FFDHE_2048
3701
+ if (useSupCurve) {
3702
+ if (wolfSSL_CTX_UseSupportedCurve(ctx, WOLFSSL_FFDHE_2048)
3703
+ != WOLFSSL_SUCCESS) {
3704
+ err_sys("unable to support FFDHE 2048");
3705
+ }
3706
+ }
3707
+ #endif
3708
+ #endif /* HAVE_SUPPORTED_CURVES */
3709
+
3710
+ #ifdef WOLFSSL_TLS13
3711
+ if (noPskDheKe)
3712
+ wolfSSL_CTX_no_dhe_psk(ctx);
3713
+ #ifdef HAVE_SUPPORTED_CURVES
3714
+ if (onlyPskDheKe)
3715
+ wolfSSL_CTX_only_dhe_psk(ctx);
3716
+ #endif
3717
+ #endif
3718
+ #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
3719
+ if (postHandAuth) {
3720
+ if (wolfSSL_CTX_allow_post_handshake_auth(ctx) != 0) {
3721
+ err_sys("unable to support post handshake auth");
3722
+ }
3723
+ }
3724
+ #endif
3725
+
3726
+ if (benchmark) {
3727
+ ((func_args*)args)->return_code =
3728
+ ClientBenchmarkConnections(ctx, host, port, dtlsUDP, dtlsSCTP,
3729
+ benchmark, resumeSession, useX25519,
3730
+ useX448, usePqc, pqcAlg, helloRetry,
3731
+ onlyKeyShare, version, earlyData);
3732
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3733
+ XEXIT_T(EXIT_SUCCESS);
3734
+ }
3735
+
3736
+ if (throughput) {
3737
+ ((func_args*)args)->return_code =
3738
+ ClientBenchmarkThroughput(ctx, host, port, dtlsUDP, dtlsSCTP,
3739
+ block, throughput, useX25519, useX448,
3740
+ usePqc, pqcAlg, exitWithRet, version,
3741
+ onlyKeyShare);
3742
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3743
+ if (((func_args*)args)->return_code != EXIT_SUCCESS && !exitWithRet)
3744
+ XEXIT_T(EXIT_SUCCESS);
3745
+ else
3746
+ goto exit;
3747
+ }
3748
+
3749
+ #if defined(WOLFSSL_MDK_ARM)
3750
+ wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_NONE, NULL);
3751
+ #endif
3752
+
3753
+ #if defined(OPENSSL_EXTRA)
3754
+ if (wolfSSL_CTX_get_read_ahead(ctx) != 0) {
3755
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3756
+ err_sys("bad read ahead default value");
3757
+ }
3758
+ if (wolfSSL_CTX_set_read_ahead(ctx, 1) != WOLFSSL_SUCCESS) {
3759
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3760
+ err_sys("error setting read ahead value");
3761
+ }
3762
+ #endif
3763
+
3764
+ #if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL) && \
3765
+ !defined(WOLFSSL_STATIC_MEMORY_LEAN)
3766
+ LOG_ERROR("Before creating SSL\n");
3767
+ if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) != 1)
3768
+ err_sys("ctx not using static memory");
3769
+ if (wolfSSL_PrintStats(&mem_stats) != 1) /* function in test.h */
3770
+ err_sys("error printing out memory stats");
3771
+ #endif
3772
+
3773
+ if (doMcast) {
3774
+ #ifdef WOLFSSL_MULTICAST
3775
+ wolfSSL_CTX_mcast_set_member_id(ctx, mcastID);
3776
+ if (wolfSSL_CTX_set_cipher_list(ctx, "WDM-NULL-SHA256")
3777
+ != WOLFSSL_SUCCESS) {
3778
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3779
+ err_sys("Couldn't set multicast cipher list.");
3780
+ }
3781
+ #endif
3782
+ }
3783
+
3784
+ #ifdef HAVE_PK_CALLBACKS
3785
+ if (pkCallbacks)
3786
+ SetupPkCallbacks(ctx);
3787
+ #endif
3788
+
3789
+ ssl = wolfSSL_new(ctx);
3790
+ if (ssl == NULL) {
3791
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3792
+ err_sys("unable to get SSL object");
3793
+ }
3794
+
3795
+ #ifdef WOLFSSL_DUAL_ALG_CERTS
3796
+ if (!wolfSSL_UseCKS(ssl, cks_order, sizeof(cks_order))) {
3797
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3798
+ err_sys("unable to set the CKS order.");
3799
+ }
3800
+ #endif /* WOLFSSL_DUAL_ALG_CERTS */
3801
+
3802
+ #ifndef NO_PSK
3803
+ if (usePsk) {
3804
+ #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_TLS13) && \
3805
+ defined(TEST_PSK_USE_SESSION)
3806
+ SSL_set_psk_use_session_callback(ssl, my_psk_use_session_cb);
3807
+ #endif
3808
+ }
3809
+ #endif
3810
+
3811
+ #ifndef NO_CERTS
3812
+ if (useClientCert && loadCertKeyIntoSSLObj){
3813
+ #ifdef NO_FILESYSTEM
3814
+ if (wolfSSL_use_certificate_buffer(ssl, client_cert_der_2048,
3815
+ sizeof_client_cert_der_2048, SSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) {
3816
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3817
+ err_sys("can't load client cert buffer");
3818
+ }
3819
+ #elif !defined(TEST_LOAD_BUFFER)
3820
+ if (wolfSSL_use_certificate_chain_file_format(ssl, ourCert, fileFormat)
3821
+ != WOLFSSL_SUCCESS) {
3822
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3823
+ err_sys("can't load client cert file, check file and run from"
3824
+ " wolfSSL home dir");
3825
+ }
3826
+ #else
3827
+ load_ssl_buffer(ssl, ourCert, WOLFSSL_CERT_CHAIN);
3828
+ #endif
3829
+ }
3830
+
3831
+ if (loadCertKeyIntoSSLObj
3832
+ #if defined(HAVE_PK_CALLBACKS) && defined(TEST_PK_PRIVKEY)
3833
+ && !pkCallbacks
3834
+ #endif
3835
+ ) {
3836
+ #ifdef NO_FILESYSTEM
3837
+ if (wolfSSL_CTX_use_PrivateKey_buffer(ctx, client_key_der_2048,
3838
+ sizeof_client_key_der_2048, SSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS)
3839
+ err_sys("can't load client private key buffer");
3840
+ #elif !defined(TEST_LOAD_BUFFER)
3841
+ if (wolfSSL_use_PrivateKey_file(ssl, ourKey, fileFormat)
3842
+ != WOLFSSL_SUCCESS) {
3843
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3844
+ err_sys("can't load client private key file, check file and run "
3845
+ "from wolfSSL home dir");
3846
+ }
3847
+ #else
3848
+ load_ssl_buffer(ssl, ourKey, WOLFSSL_KEY);
3849
+ #endif
3850
+ }
3851
+ #endif /* !NO_CERTS */
3852
+
3853
+ #if defined(OPENSSL_EXTRA) || defined(HAVE_SECRET_CALLBACK)
3854
+ wolfSSL_KeepArrays(ssl);
3855
+ #endif
3856
+
3857
+ #ifdef HAVE_PK_CALLBACKS
3858
+ /* This must be before SetKeyShare */
3859
+ if (pkCallbacks) {
3860
+ SetupPkCallbackContexts(ssl, &pkCbInfo);
3861
+ }
3862
+ #endif
3863
+
3864
+ #if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL) && \
3865
+ !defined(WOLFSSL_STATIC_MEMORY_LEAN)
3866
+ LOG_ERROR("After creating SSL\n");
3867
+ if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) != 1)
3868
+ err_sys("ctx not using static memory");
3869
+ if (wolfSSL_PrintStats(&mem_stats) != 1) /* function in test.h */
3870
+ err_sys("error printing out memory stats");
3871
+ #endif
3872
+
3873
+ #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
3874
+ if (!helloRetry && (version >= 4 || version <= -4)) {
3875
+ SetKeyShare(ssl, onlyKeyShare, useX25519, useX448, usePqc,
3876
+ pqcAlg, 0);
3877
+ }
3878
+ else {
3879
+ wolfSSL_NoKeyShares(ssl);
3880
+ }
3881
+ #endif
3882
+
3883
+ if (doMcast) {
3884
+ #ifdef WOLFSSL_MULTICAST
3885
+ /* DTLS multicast secret for testing only */
3886
+ #define CLI_SRV_RANDOM_SZ 32 /* RAN_LEN (see internal.h) */
3887
+ #define PMS_SZ 512 /* ENCRYPT_LEN (see internal.h) */
3888
+ byte pms[PMS_SZ]; /* pre master secret */
3889
+ byte cr[CLI_SRV_RANDOM_SZ]; /* client random */
3890
+ byte sr[CLI_SRV_RANDOM_SZ]; /* server random */
3891
+ const byte suite[2] = {0, 0xfe}; /* WDM_WITH_NULL_SHA256 */
3892
+
3893
+ XMEMSET(pms, 0x23, sizeof(pms));
3894
+ XMEMSET(cr, 0xA5, sizeof(cr));
3895
+ XMEMSET(sr, 0x5A, sizeof(sr));
3896
+
3897
+ if (wolfSSL_set_secret(ssl, 1, pms, sizeof(pms), cr, sr, suite)
3898
+ != WOLFSSL_SUCCESS) {
3899
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3900
+ err_sys("unable to set mcast secret");
3901
+ }
3902
+ #endif
3903
+ }
3904
+
3905
+ #ifdef HAVE_SESSION_TICKET
3906
+ wolfSSL_set_SessionTicket_cb(ssl, sessionTicketCB, (void*)"initial session");
3907
+ #endif
3908
+
3909
+ #ifdef HAVE_TRUSTED_CA
3910
+ if (trustedCaKeyId) {
3911
+ if (wolfSSL_UseTrustedCA(ssl, WOLFSSL_TRUSTED_CA_PRE_AGREED,
3912
+ NULL, 0) != WOLFSSL_SUCCESS) {
3913
+ err_sys("UseTrustedCA failed");
3914
+ }
3915
+ }
3916
+ #endif
3917
+ #ifdef HAVE_ALPN
3918
+ if (alpnList != NULL) {
3919
+ printf("ALPN accepted protocols list : %s\n", alpnList);
3920
+ wolfSSL_UseALPN(ssl, alpnList, (word32)XSTRLEN(alpnList), alpn_opt);
3921
+ }
3922
+ #endif
3923
+
3924
+ #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
3925
+ defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
3926
+ if (statusRequest) {
3927
+ if (version == 4 &&
3928
+ (statusRequest == OCSP_STAPLINGV2 || \
3929
+ statusRequest == OCSP_STAPLINGV2_MULTI)) {
3930
+ err_sys("Cannot use OCSP Stapling V2 with TLSv1.3");
3931
+ }
3932
+
3933
+ if (wolfSSL_CTX_EnableOCSPStapling(ctx) != WOLFSSL_SUCCESS)
3934
+ err_sys("can't enable OCSP Stapling Certificate Manager");
3935
+ if (mustStaple) {
3936
+ if (wolfSSL_CTX_EnableOCSPMustStaple(ctx) != WOLFSSL_SUCCESS)
3937
+ err_sys("can't enable OCSP Must Staple");
3938
+ }
3939
+
3940
+ switch (statusRequest) {
3941
+ #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
3942
+ case OCSP_STAPLING:
3943
+ if (wolfSSL_UseOCSPStapling(ssl, WOLFSSL_CSR_OCSP,
3944
+ WOLFSSL_CSR_OCSP_USE_NONCE) != WOLFSSL_SUCCESS) {
3945
+ wolfSSL_free(ssl); ssl = NULL;
3946
+ CloseSocket(sockfd);
3947
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3948
+ err_sys("UseCertificateStatusRequest failed");
3949
+ }
3950
+ break;
3951
+ #endif
3952
+ #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
3953
+ case OCSP_STAPLINGV2:
3954
+ if (wolfSSL_UseOCSPStaplingV2(ssl,
3955
+ WOLFSSL_CSR2_OCSP, WOLFSSL_CSR2_OCSP_USE_NONCE)
3956
+ != WOLFSSL_SUCCESS) {
3957
+ wolfSSL_free(ssl); ssl = NULL;
3958
+ CloseSocket(sockfd);
3959
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3960
+ err_sys("UseCertificateStatusRequest failed");
3961
+ }
3962
+ break;
3963
+ case OCSP_STAPLINGV2_MULTI:
3964
+ if (wolfSSL_UseOCSPStaplingV2(ssl,
3965
+ WOLFSSL_CSR2_OCSP_MULTI, 0)
3966
+ != WOLFSSL_SUCCESS) {
3967
+ wolfSSL_free(ssl); ssl = NULL;
3968
+ CloseSocket(sockfd);
3969
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3970
+ err_sys("UseCertificateStatusRequest failed");
3971
+ }
3972
+ break;
3973
+ #endif
3974
+ default:
3975
+ err_sys("Invalid OCSP Stapling option");
3976
+ }
3977
+
3978
+ wolfSSL_CTX_EnableOCSP(ctx, 0);
3979
+ }
3980
+ #endif
3981
+
3982
+ #if !defined(NO_DH) && !defined(WOLFSSL_OLD_PRIME_CHECK) && \
3983
+ !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
3984
+ if (!doDhKeyCheck)
3985
+ wolfSSL_SetEnableDhKeyTest(ssl, 0);
3986
+ #endif
3987
+
3988
+ #ifdef HAVE_ENCRYPT_THEN_MAC
3989
+ if (disallowETM)
3990
+ wolfSSL_AllowEncryptThenMac(ssl, 0);
3991
+ #endif
3992
+
3993
+
3994
+ tcp_connect(&sockfd, host, port, dtlsUDP, dtlsSCTP, ssl);
3995
+ if (wolfSSL_set_fd(ssl, sockfd) != WOLFSSL_SUCCESS) {
3996
+ wolfSSL_free(ssl); ssl = NULL;
3997
+ CloseSocket(sockfd);
3998
+ wolfSSL_CTX_free(ctx); ctx = NULL;
3999
+ err_sys("error in setting fd");
4000
+ }
4001
+
4002
+ if (simulateWantWrite) {
4003
+ if (dtlsUDP) {
4004
+ wolfSSL_SetIOWriteCtx(ssl, (void*)&sockfd);
4005
+ udp_connect(&sockfd, host, port);
4006
+ }
4007
+ }
4008
+
4009
+ /* STARTTLS */
4010
+ if (doSTARTTLS) {
4011
+ if (StartTLS_Init(&sockfd) != WOLFSSL_SUCCESS) {
4012
+ wolfSSL_free(ssl); ssl = NULL;
4013
+ CloseSocket(sockfd);
4014
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4015
+ err_sys("error during STARTTLS protocol");
4016
+ }
4017
+ }
4018
+
4019
+ #if defined(HAVE_CRL) && !defined(NO_FILESYSTEM)
4020
+ if (disableCRL == 0 && !useVerifyCb) {
4021
+ #if defined(HAVE_IO_TIMEOUT) && defined(HAVE_HTTP_CLIENT)
4022
+ wolfIO_SetTimeout(DEFAULT_TIMEOUT_SEC);
4023
+ #endif
4024
+
4025
+ if (wolfSSL_EnableCRL(ssl, WOLFSSL_CRL_CHECKALL) != WOLFSSL_SUCCESS) {
4026
+ wolfSSL_free(ssl); ssl = NULL;
4027
+ CloseSocket(sockfd);
4028
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4029
+ err_sys("can't enable crl check");
4030
+ }
4031
+ if (wolfSSL_LoadCRL(ssl, crlPemDir, WOLFSSL_FILETYPE_PEM, 0)
4032
+ != WOLFSSL_SUCCESS) {
4033
+ wolfSSL_free(ssl); ssl = NULL;
4034
+ CloseSocket(sockfd);
4035
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4036
+ err_sys("can't load crl, check crlfile and date validity");
4037
+ }
4038
+ if (wolfSSL_SetCRL_Cb(ssl, CRL_CallBack) != WOLFSSL_SUCCESS) {
4039
+ wolfSSL_free(ssl); ssl = NULL;
4040
+ CloseSocket(sockfd);
4041
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4042
+ err_sys("can't set crl callback");
4043
+ }
4044
+ }
4045
+ #endif
4046
+ #ifdef HAVE_SECURE_RENEGOTIATION
4047
+ if (scr) {
4048
+ if (wolfSSL_UseSecureRenegotiation(ssl) != WOLFSSL_SUCCESS) {
4049
+ wolfSSL_free(ssl); ssl = NULL;
4050
+ CloseSocket(sockfd);
4051
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4052
+ err_sys("can't enable secure renegotiation");
4053
+ }
4054
+ }
4055
+ #endif
4056
+ #if defined(ATOMIC_USER) && !defined(WOLFSSL_AEAD_ONLY)
4057
+ if (atomicUser)
4058
+ SetupAtomicUser(ctx, ssl);
4059
+ #endif
4060
+
4061
+ #ifdef WOLFSSL_DTLS_CID
4062
+ if (useDtlsCID) {
4063
+ ret = wolfSSL_dtls_cid_use(ssl);
4064
+ if (ret != WOLFSSL_SUCCESS)
4065
+ err_sys("Can't enable DTLS ConnectionID");
4066
+ ret = wolfSSL_dtls_cid_set(ssl, (unsigned char*)dtlsCID,
4067
+ (word32)XSTRLEN(dtlsCID));
4068
+ if (ret != WOLFSSL_SUCCESS)
4069
+ err_sys("Can't set DTLS ConnectionID");
4070
+ }
4071
+ #endif /* WOLFSSL_DTLS_CID */
4072
+
4073
+ if (matchName && doPeerCheck)
4074
+ wolfSSL_check_domain_name(ssl, domain);
4075
+ #ifndef WOLFSSL_CALLBACKS
4076
+ if (nonBlocking) {
4077
+ #ifdef WOLFSSL_DTLS
4078
+ if (doDTLS) {
4079
+ wolfSSL_dtls_set_using_nonblock(ssl, 1);
4080
+ }
4081
+ #endif
4082
+ tcp_set_nonblocking(&sockfd);
4083
+ ret = NonBlockingSSL_Connect(ssl);
4084
+ }
4085
+ else {
4086
+ #ifdef WOLFSSL_EARLY_DATA
4087
+ if (usePsk && earlyData)
4088
+ EarlyData(ctx, ssl, kEarlyMsg, sizeof(kEarlyMsg)-1, buffer);
4089
+ #endif
4090
+ WOLFSSL_ASYNC_WHILE_PENDING(ret = wolfSSL_connect(ssl),
4091
+ ret != WOLFSSL_SUCCESS);
4092
+ }
4093
+ #else
4094
+ timeoutConnect.tv_sec = DEFAULT_TIMEOUT_SEC;
4095
+ timeoutConnect.tv_usec = 0;
4096
+ ret = NonBlockingSSL_Connect(ssl); /* will keep retrying on timeout */
4097
+ #endif
4098
+ if (ret != WOLFSSL_SUCCESS) {
4099
+ err = wolfSSL_get_error(ssl, 0);
4100
+ LOG_ERROR("wolfSSL_connect error %d, %s\n", err,
4101
+ wolfSSL_ERR_error_string((unsigned long)err, buffer));
4102
+
4103
+ /* cleanup */
4104
+ wolfSSL_free(ssl); ssl = NULL;
4105
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4106
+ CloseSocket(sockfd);
4107
+
4108
+ if (!exitWithRet)
4109
+ err_sys("wolfSSL_connect failed");
4110
+ /* see note at top of README */
4111
+ /* if you're getting an error here */
4112
+
4113
+ ((func_args*)args)->return_code = err;
4114
+ goto exit;
4115
+ }
4116
+
4117
+ showPeerEx(ssl, lng_index);
4118
+ showPeerPEM(ssl);
4119
+
4120
+ /* if the caller requested a particular cipher, check here that either
4121
+ * a canonical name of the established cipher matches the requested
4122
+ * cipher name, or the requested cipher name is marked as an alias
4123
+ * that matches the established cipher.
4124
+ */
4125
+ if (cipherList && !useDefCipherList && (! XSTRSTR(cipherList, ":"))) {
4126
+ WOLFSSL_CIPHER* established_cipher = wolfSSL_get_current_cipher(ssl);
4127
+ byte requested_cipherSuite0, requested_cipherSuite;
4128
+ int requested_cipherFlags;
4129
+ if (established_cipher &&
4130
+ /* don't test for pseudo-ciphers like "ALL" and "DEFAULT". */
4131
+ (wolfSSL_get_cipher_suite_from_name(cipherList,
4132
+ &requested_cipherSuite0,
4133
+ &requested_cipherSuite,
4134
+ &requested_cipherFlags) == 0)) {
4135
+ word32 established_cipher_id =
4136
+ wolfSSL_CIPHER_get_id(established_cipher);
4137
+ byte established_cipherSuite0 = (established_cipher_id >> 8) & 0xff;
4138
+ byte established_cipherSuite = established_cipher_id & 0xff;
4139
+ const char *established_cipher_name =
4140
+ wolfSSL_get_cipher_name_from_suite(established_cipherSuite0,
4141
+ established_cipherSuite);
4142
+ const char *established_cipher_name_iana =
4143
+ wolfSSL_get_cipher_name_iana_from_suite(established_cipherSuite0,
4144
+ established_cipherSuite);
4145
+
4146
+ if (established_cipher_name == NULL)
4147
+ err_sys("error looking up name of established cipher");
4148
+
4149
+ if (strcmp(cipherList, established_cipher_name) &&
4150
+ ((established_cipher_name_iana == NULL) ||
4151
+ strcmp(cipherList, established_cipher_name_iana))) {
4152
+ if (! (requested_cipherFlags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
4153
+ err_sys("Unexpected mismatch between names of requested and established ciphers.");
4154
+ else if ((requested_cipherSuite0 != established_cipherSuite0) ||
4155
+ (requested_cipherSuite != established_cipherSuite))
4156
+ err_sys("Mismatch between IDs of requested and established ciphers.");
4157
+ }
4158
+ }
4159
+ }
4160
+
4161
+ #if defined(HAVE_OCSP) && !defined(NO_ASN_TIME)
4162
+ #ifdef HAVE_STRFTIME
4163
+ {
4164
+ struct tm tm;
4165
+ char date[32];
4166
+ ret = wolfSSL_get_ocsp_producedDate_tm(ssl, &tm);
4167
+ if ((ret == 0) && (strftime(date, sizeof date, "%Y-%m-%d %H:%M:%S %z", &tm) > 0))
4168
+ printf("OCSP response timestamp: %s\n", date);
4169
+ }
4170
+ #else
4171
+ {
4172
+ byte date[MAX_DATE_SIZE];
4173
+ int asn_date_format;
4174
+ ret = wolfSSL_get_ocsp_producedDate(ssl, date, sizeof date, &asn_date_format);
4175
+ if (ret == 0)
4176
+ printf("OCSP response timestamp: %s (ASN.1 type %d)\n", (char *)date, asn_date_format);
4177
+ }
4178
+ #endif
4179
+ #endif
4180
+
4181
+ #if defined(OPENSSL_EXTRA) || defined(HAVE_SECRET_CALLBACK)
4182
+ printf("Session timeout set to %ld seconds\n", wolfSSL_get_timeout(ssl));
4183
+ {
4184
+ byte* rnd;
4185
+ byte* pt;
4186
+ size_t size;
4187
+
4188
+ /* get size of buffer then print */
4189
+ size = wolfSSL_get_client_random(NULL, NULL, 0);
4190
+ if (size == 0) {
4191
+ wolfSSL_free(ssl); ssl = NULL;
4192
+ CloseSocket(sockfd);
4193
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4194
+ err_sys("error getting client random buffer size");
4195
+ }
4196
+
4197
+ rnd = (byte*)XMALLOC(size, NULL, DYNAMIC_TYPE_TMP_BUFFER);
4198
+ if (rnd == NULL) {
4199
+ wolfSSL_free(ssl); ssl = NULL;
4200
+ CloseSocket(sockfd);
4201
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4202
+ err_sys("error creating client random buffer");
4203
+ }
4204
+
4205
+ size = wolfSSL_get_client_random(ssl, rnd, size);
4206
+ if (size == 0) {
4207
+ XFREE(rnd, NULL, DYNAMIC_TYPE_TMP_BUFFER);
4208
+ wolfSSL_free(ssl); ssl = NULL;
4209
+ CloseSocket(sockfd);
4210
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4211
+ err_sys("error getting client random buffer");
4212
+ }
4213
+
4214
+ printf("Client Random : ");
4215
+ for (pt = rnd; pt < rnd + size; pt++) printf("%02X", *pt);
4216
+ printf("\n");
4217
+ XFREE(rnd, NULL, DYNAMIC_TYPE_TMP_BUFFER);
4218
+
4219
+ }
4220
+ #endif
4221
+
4222
+ #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
4223
+ defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
4224
+ defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
4225
+ #if !defined(NO_SESSION_CACHE) && \
4226
+ (defined(HAVE_SESSION_TICKET) || defined(SESSION_CERTS)) && \
4227
+ !defined(NO_FILESYSTEM)
4228
+ #ifndef NO_BIO
4229
+ /* print out session to stdout */
4230
+ {
4231
+ WOLFSSL_BIO* bio = wolfSSL_BIO_new_fp(stdout, BIO_NOCLOSE);
4232
+ if (bio != NULL) {
4233
+ if (wolfSSL_SESSION_print(bio, wolfSSL_get_session(ssl)) !=
4234
+ WOLFSSL_SUCCESS) {
4235
+ wolfSSL_BIO_printf(bio, "BIO error printing session\n");
4236
+ }
4237
+ }
4238
+ wolfSSL_BIO_free(bio);
4239
+ }
4240
+ #endif /* !NO_BIO */
4241
+ #endif
4242
+ #endif
4243
+
4244
+ if (doSTARTTLS && starttlsProt != NULL) {
4245
+ if (XSTRCMP(starttlsProt, "smtp") == 0) {
4246
+ if (SMTP_Shutdown(ssl, wc_shutdown) != WOLFSSL_SUCCESS) {
4247
+ wolfSSL_free(ssl); ssl = NULL;
4248
+ CloseSocket(sockfd);
4249
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4250
+ err_sys("error closing STARTTLS connection");
4251
+ }
4252
+ }
4253
+
4254
+ wolfSSL_free(ssl); ssl = NULL;
4255
+ CloseSocket(sockfd);
4256
+
4257
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4258
+
4259
+ ((func_args*)args)->return_code = 0;
4260
+ WOLFSSL_RETURN_FROM_THREAD(0);
4261
+ }
4262
+
4263
+ #ifdef HAVE_ALPN
4264
+ if (alpnList != NULL) {
4265
+ char *protocol_name = NULL;
4266
+ word16 protocol_nameSz = 0;
4267
+
4268
+ err = wolfSSL_ALPN_GetProtocol(ssl, &protocol_name, &protocol_nameSz);
4269
+ if (err == WOLFSSL_SUCCESS)
4270
+ printf("Received ALPN protocol : %s (%d)\n",
4271
+ protocol_name, protocol_nameSz);
4272
+ else if (err == WC_NO_ERR_TRACE(WOLFSSL_ALPN_NOT_FOUND))
4273
+ printf("No ALPN response received (no match with server)\n");
4274
+ else
4275
+ printf("Getting ALPN protocol name failed\n");
4276
+ }
4277
+ #endif
4278
+
4279
+ #ifdef WOLFSSL_DTLS_CID
4280
+ if (useDtlsCID && wolfSSL_dtls_cid_is_enabled(ssl)) {
4281
+ unsigned char receivedCID[DTLS_CID_BUFFER_SIZE];
4282
+ unsigned int receivedCIDSz;
4283
+
4284
+ printf("CID extension was negotiated\n");
4285
+ ret = wolfSSL_dtls_cid_get_tx_size(ssl, &receivedCIDSz);
4286
+ if (ret == WOLFSSL_SUCCESS && receivedCIDSz > 0) {
4287
+ ret = wolfSSL_dtls_cid_get_tx(ssl, receivedCID,
4288
+ DTLS_CID_BUFFER_SIZE - 1);
4289
+ if (ret != WOLFSSL_SUCCESS)
4290
+ err_sys("Can't get negotiated DTLS CID\n");
4291
+
4292
+ printf("Sending CID is ");
4293
+ printBuffer(receivedCID, receivedCIDSz);
4294
+ printf("\n");
4295
+ }
4296
+ else {
4297
+ printf("other peer provided empty CID\n");
4298
+ }
4299
+ }
4300
+ #endif /* WOLFSSL_DTLS_CID */
4301
+
4302
+ #ifdef HAVE_SECURE_RENEGOTIATION
4303
+ if (scr && forceScr) {
4304
+ if (nonBlocking) {
4305
+ if (!resumeScr) {
4306
+ if (wolfSSL_Rehandshake(ssl) != WOLFSSL_SUCCESS) {
4307
+ err = wolfSSL_get_error(ssl, 0);
4308
+ if (err == WOLFSSL_ERROR_WANT_READ ||
4309
+ err == WOLFSSL_ERROR_WANT_WRITE) {
4310
+ if (scrAppData) {
4311
+ ret = ClientWrite(ssl,
4312
+ "msg sent during renegotiation",
4313
+ sizeof("msg sent during renegotiation") - 1,
4314
+ "", 1);
4315
+ }
4316
+ else {
4317
+ ret = 0;
4318
+ }
4319
+ if (ret != 0) {
4320
+ ret = WOLFSSL_FAILURE;
4321
+ }
4322
+ else {
4323
+ do {
4324
+ #ifdef WOLFSSL_ASYNC_CRYPT
4325
+ if (err == WC_NO_ERR_TRACE(WC_PENDING_E)) {
4326
+ ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
4327
+ if (ret < 0) break;
4328
+ }
4329
+ #endif
4330
+ if (err == WC_NO_ERR_TRACE(APP_DATA_READY)) {
4331
+ if (wolfSSL_read(ssl, reply,
4332
+ sizeof(reply)-1) < 0) {
4333
+ err_sys("APP DATA should be present "
4334
+ "but error returned");
4335
+ }
4336
+ printf("Received message during "
4337
+ "renegotiation: %s\n", reply);
4338
+ }
4339
+ err = 0;
4340
+ if ((ret = wolfSSL_connect(ssl))
4341
+ != WOLFSSL_SUCCESS) {
4342
+ err = wolfSSL_get_error(ssl, ret);
4343
+ }
4344
+ } while (ret != WOLFSSL_SUCCESS &&
4345
+ (err == WOLFSSL_ERROR_WANT_READ ||
4346
+ err == WOLFSSL_ERROR_WANT_WRITE ||
4347
+ err == WC_NO_ERR_TRACE(APP_DATA_READY) ||
4348
+ err == WC_NO_ERR_TRACE(WC_PENDING_E)));
4349
+ }
4350
+
4351
+ if (ret == WOLFSSL_SUCCESS) {
4352
+ printf("NON-BLOCKING RENEGOTIATION SUCCESSFUL\n");
4353
+ }
4354
+ }
4355
+ if (ret != WOLFSSL_SUCCESS) {
4356
+ err = wolfSSL_get_error(ssl, 0);
4357
+ LOG_ERROR("wolfSSL_Rehandshake error %d, %s\n", err,
4358
+ wolfSSL_ERR_error_string(err, buffer));
4359
+ wolfSSL_free(ssl); ssl = NULL;
4360
+ CloseSocket(sockfd);
4361
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4362
+ err_sys("non-blocking wolfSSL_Rehandshake failed");
4363
+ }
4364
+ }
4365
+ }
4366
+ else {
4367
+ LOG_ERROR("not doing secure resumption with non-blocking");
4368
+ }
4369
+ } else {
4370
+ if (!resumeScr) {
4371
+ printf("Beginning secure renegotiation.\n");
4372
+ if ((ret = wolfSSL_Rehandshake(ssl)) != WOLFSSL_SUCCESS) {
4373
+ err = wolfSSL_get_error(ssl, 0);
4374
+ #ifdef WOLFSSL_ASYNC_CRYPT
4375
+ while (err == WC_NO_ERR_TRACE(WC_PENDING_E)) {
4376
+ err = 0;
4377
+ ret = wolfSSL_negotiate(ssl);
4378
+ if (ret != WOLFSSL_SUCCESS) {
4379
+ err = wolfSSL_get_error(ssl, 0);
4380
+ if (err == WC_NO_ERR_TRACE(WC_PENDING_E)) {
4381
+ ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
4382
+ if (ret < 0) break;
4383
+ }
4384
+ }
4385
+ }
4386
+ #endif
4387
+ if (ret != WOLFSSL_SUCCESS) {
4388
+ printf("err = %d, %s\n", err,
4389
+ wolfSSL_ERR_error_string(err, buffer));
4390
+ wolfSSL_free(ssl); ssl = NULL;
4391
+ CloseSocket(sockfd);
4392
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4393
+ err_sys("wolfSSL_Rehandshake failed");
4394
+ }
4395
+ }
4396
+ else {
4397
+ printf("RENEGOTIATION SUCCESSFUL\n");
4398
+ }
4399
+ }
4400
+ else {
4401
+ printf("Beginning secure resumption.\n");
4402
+ if ((ret = wolfSSL_SecureResume(ssl)) != WOLFSSL_SUCCESS) {
4403
+ err = wolfSSL_get_error(ssl, 0);
4404
+ #ifdef WOLFSSL_ASYNC_CRYPT
4405
+ while (err == WC_NO_ERR_TRACE(WC_PENDING_E)) {
4406
+ err = 0;
4407
+ ret = wolfSSL_negotiate(ssl);
4408
+ if (ret != WOLFSSL_SUCCESS) {
4409
+ err = wolfSSL_get_error(ssl, 0);
4410
+ if (err == WC_NO_ERR_TRACE(WC_PENDING_E)) {
4411
+ ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
4412
+ if (ret < 0) break;
4413
+ }
4414
+ }
4415
+ }
4416
+ #endif
4417
+ if (ret != WOLFSSL_SUCCESS) {
4418
+ printf("err = %d, %s\n", err,
4419
+ wolfSSL_ERR_error_string(err, buffer));
4420
+ wolfSSL_free(ssl); ssl = NULL;
4421
+ CloseSocket(sockfd);
4422
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4423
+ err_sys("wolfSSL_SecureResume failed");
4424
+ }
4425
+ }
4426
+ else {
4427
+ printf("SECURE RESUMPTION SUCCESSFUL\n");
4428
+ }
4429
+ }
4430
+ }
4431
+ }
4432
+ #endif /* HAVE_SECURE_RENEGOTIATION */
4433
+
4434
+ XMEMSET(msg, 0, sizeof(msg));
4435
+ if (sendGET) {
4436
+ printf("SSL connect ok, sending GET...\n");
4437
+
4438
+ msgSz = (int)XSTRLEN(kHttpGetMsg);
4439
+ XMEMCPY(msg, kHttpGetMsg, (size_t)msgSz);
4440
+ }
4441
+ else {
4442
+ msgSz = (int)XSTRLEN(kHelloMsg);
4443
+ XMEMCPY(msg, kHelloMsg, (size_t)msgSz);
4444
+ }
4445
+
4446
+ /* allow some time for exporting the session */
4447
+ #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
4448
+ TEST_DELAY();
4449
+ #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
4450
+
4451
+ #ifdef WOLFSSL_SRTP
4452
+ if (dtlsSrtpProfiles != NULL) {
4453
+ err = client_srtp_test(ssl, (func_args*)args);
4454
+ if (err != 0) {
4455
+ if (exitWithRet) {
4456
+ ((func_args*)args)->return_code = err;
4457
+ wolfSSL_free(ssl); ssl = NULL;
4458
+ CloseSocket(sockfd);
4459
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4460
+ goto exit;
4461
+ }
4462
+ /* else */
4463
+ err_sys("SRTP check failed");
4464
+ }
4465
+ }
4466
+ #endif /* WOLFSSL_SRTP */
4467
+
4468
+ #ifdef WOLFSSL_TLS13
4469
+ if (updateKeysIVs)
4470
+ wolfSSL_update_keys(ssl);
4471
+ #endif
4472
+
4473
+ err = ClientWriteRead(ssl, msg, msgSz, reply, sizeof(reply)-1, 1, "",
4474
+ exitWithRet);
4475
+ if (exitWithRet && (err != 0)) {
4476
+ ((func_args*)args)->return_code = err;
4477
+ wolfSSL_free(ssl); ssl = NULL;
4478
+ CloseSocket(sockfd);
4479
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4480
+ goto exit;
4481
+ }
4482
+
4483
+ #if defined(WOLFSSL_TLS13)
4484
+ if (updateKeysIVs || postHandAuth)
4485
+ (void)ClientWrite(ssl, msg, msgSz, "", 0);
4486
+ #endif
4487
+
4488
+ #if defined(HAVE_SESSION_TICKET)
4489
+ while (waitTicket == 1) {
4490
+ unsigned char ticketBuf[SESSION_TICKET_LEN];
4491
+ int zeroReturn = 0;
4492
+ word32 size;
4493
+
4494
+ (void)zeroReturn;
4495
+ size = sizeof(ticketBuf);
4496
+ err = wolfSSL_get_SessionTicket(ssl, ticketBuf, &size);
4497
+ if (err < 0)
4498
+ err_sys("wolfSSL_get_SessionTicket failed");
4499
+
4500
+ if (size == 0) {
4501
+ err = process_handshake_messages(ssl, !nonBlocking, &zeroReturn);
4502
+ if (err < 0)
4503
+ err_sys("error waiting for session ticket ");
4504
+ }
4505
+ else {
4506
+ waitTicket = 0;
4507
+ }
4508
+ }
4509
+ #endif
4510
+
4511
+ #ifndef NO_SESSION_CACHE
4512
+ if (resumeSession) {
4513
+ session = wolfSSL_get1_session(ssl);
4514
+ }
4515
+ #endif
4516
+
4517
+ #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
4518
+ defined(HAVE_EXT_CACHE))
4519
+ if (session != NULL && resumeSession) {
4520
+ flatSessionSz = wolfSSL_i2d_SSL_SESSION(session, NULL);
4521
+ if (flatSessionSz != 0) {
4522
+ int checkSz = wolfSSL_i2d_SSL_SESSION(session, &flatSession);
4523
+ if (flatSession == NULL)
4524
+ err_sys("error creating flattened session buffer");
4525
+ if (checkSz != flatSessionSz) {
4526
+ XFREE(flatSession, NULL, DYNAMIC_TYPE_TMP_BUFFER);
4527
+ err_sys("flat session size check failure");
4528
+ }
4529
+ /* using heap based flat session, free original session */
4530
+ wolfSSL_SESSION_free(session);
4531
+ session = NULL;
4532
+ }
4533
+ }
4534
+ #endif
4535
+
4536
+ ret = wolfSSL_shutdown(ssl);
4537
+ if (wc_shutdown && ret == WOLFSSL_SHUTDOWN_NOT_DONE) {
4538
+ while (tcp_select(wolfSSL_get_fd(ssl), DEFAULT_TIMEOUT_SEC) ==
4539
+ TEST_RECV_READY) {
4540
+ ret = wolfSSL_shutdown(ssl); /* bidirectional shutdown */
4541
+ if (ret == WOLFSSL_SUCCESS) {
4542
+ printf("Bidirectional shutdown complete\n");
4543
+ break;
4544
+ }
4545
+ else if (ret != WOLFSSL_SHUTDOWN_NOT_DONE) {
4546
+ LOG_ERROR("Bidirectional shutdown failed\n");
4547
+ break;
4548
+ }
4549
+ }
4550
+ if (ret != WOLFSSL_SUCCESS)
4551
+ LOG_ERROR("Bidirectional shutdown failed\n");
4552
+ }
4553
+ #if defined(ATOMIC_USER) && !defined(WOLFSSL_AEAD_ONLY)
4554
+ if (atomicUser)
4555
+ FreeAtomicUser(ssl);
4556
+ #endif
4557
+
4558
+ /* display collected statistics */
4559
+ #if defined(WOLFSSL_STATIC_MEMORY) && !defined(WOLFSSL_STATIC_MEMORY_LEAN)
4560
+ if (wolfSSL_is_static_memory(ssl, &ssl_stats) != 1)
4561
+ err_sys("static memory was not used with ssl");
4562
+
4563
+ LOG_ERROR("\nprint off SSL memory stats\n");
4564
+ LOG_ERROR("*** This is memory state before wolfSSL_free is called\n");
4565
+ wolfSSL_PrintStatsConn(&ssl_stats);
4566
+ #endif
4567
+
4568
+ wolfSSL_free(ssl); ssl = NULL;
4569
+ CloseSocket(sockfd);
4570
+
4571
+ #ifndef NO_SESSION_CACHE
4572
+ if (resumeSession) {
4573
+ sslResume = wolfSSL_new(ctx);
4574
+ if (sslResume == NULL) {
4575
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4576
+ err_sys("unable to get SSL object");
4577
+ }
4578
+
4579
+ #if !defined(NO_DH) && !defined(WOLFSSL_OLD_PRIME_CHECK) && \
4580
+ !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
4581
+ if (!doDhKeyCheck)
4582
+ wolfSSL_SetEnableDhKeyTest(sslResume, 0);
4583
+ #endif
4584
+ #ifdef HAVE_PK_CALLBACKS
4585
+ if (pkCallbacks) {
4586
+ SetupPkCallbackContexts(sslResume, &pkCbInfo);
4587
+ }
4588
+ #endif
4589
+
4590
+ if (dtlsUDP) {
4591
+ TEST_DELAY();
4592
+ }
4593
+ tcp_connect(&sockfd, host, port, dtlsUDP, dtlsSCTP, sslResume);
4594
+ if (wolfSSL_set_fd(sslResume, sockfd) != WOLFSSL_SUCCESS) {
4595
+ wolfSSL_free(sslResume); sslResume = NULL;
4596
+ CloseSocket(sockfd);
4597
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4598
+ err_sys("error in setting fd");
4599
+ }
4600
+ if (simulateWantWrite) {
4601
+ if (dtlsUDP) {
4602
+ wolfSSL_SetIOWriteCtx(ssl, (void*)&sockfd);
4603
+ udp_connect(&sockfd, host, port);
4604
+ }
4605
+ }
4606
+ #ifdef HAVE_ALPN
4607
+ if (alpnList != NULL) {
4608
+ printf("ALPN accepted protocols list : %s\n", alpnList);
4609
+ wolfSSL_UseALPN(sslResume, alpnList, (word32)XSTRLEN(alpnList),
4610
+ alpn_opt);
4611
+ }
4612
+ #endif
4613
+ #ifdef HAVE_SECURE_RENEGOTIATION
4614
+ if (scr) {
4615
+ if (wolfSSL_UseSecureRenegotiation(sslResume) != WOLFSSL_SUCCESS) {
4616
+ wolfSSL_free(sslResume); sslResume = NULL;
4617
+ CloseSocket(sockfd);
4618
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4619
+ err_sys("can't enable secure renegotiation");
4620
+ }
4621
+ }
4622
+ #endif
4623
+
4624
+ #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
4625
+ defined(HAVE_EXT_CACHE))
4626
+ if (flatSession) {
4627
+ const byte* constFlatSession = flatSession;
4628
+ session = wolfSSL_d2i_SSL_SESSION(NULL,
4629
+ &constFlatSession, flatSessionSz);
4630
+ }
4631
+ #endif
4632
+
4633
+ wolfSSL_set_session(sslResume, session);
4634
+
4635
+ #if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
4636
+ defined(HAVE_EXT_CACHE))
4637
+ XFREE(flatSession, NULL, DYNAMIC_TYPE_TMP_BUFFER);
4638
+ #endif
4639
+ wolfSSL_SESSION_free(session);
4640
+ session = NULL;
4641
+
4642
+ #ifdef HAVE_SESSION_TICKET
4643
+ wolfSSL_set_SessionTicket_cb(sslResume, sessionTicketCB,
4644
+ (void*)"resumed session");
4645
+ #endif
4646
+
4647
+ #ifndef WOLFSSL_CALLBACKS
4648
+ if (nonBlocking) {
4649
+ #ifdef WOLFSSL_DTLS
4650
+ if (doDTLS) {
4651
+ wolfSSL_dtls_set_using_nonblock(sslResume, 1);
4652
+ }
4653
+ #endif
4654
+ tcp_set_nonblocking(&sockfd);
4655
+ ret = NonBlockingSSL_Connect(sslResume);
4656
+ }
4657
+ else {
4658
+ #ifdef WOLFSSL_EARLY_DATA
4659
+ #ifndef HAVE_SESSION_TICKET
4660
+ if (!usePsk) {
4661
+ }
4662
+ else
4663
+ #endif
4664
+ if (earlyData) {
4665
+ EarlyData(ctx, sslResume, kEarlyMsg, sizeof(kEarlyMsg)-1, buffer);
4666
+ }
4667
+ #endif
4668
+ do {
4669
+ err = 0; /* reset error */
4670
+ ret = wolfSSL_connect(sslResume);
4671
+ if (ret != WOLFSSL_SUCCESS) {
4672
+ err = wolfSSL_get_error(sslResume, 0);
4673
+ #ifdef WOLFSSL_ASYNC_CRYPT
4674
+ if (err == WC_NO_ERR_TRACE(WC_PENDING_E)) {
4675
+ ret = wolfSSL_AsyncPoll(sslResume,
4676
+ WOLF_POLL_FLAG_CHECK_HW);
4677
+ if (ret < 0) break;
4678
+ }
4679
+ #endif
4680
+ }
4681
+ } while (err == WC_NO_ERR_TRACE(WC_PENDING_E));
4682
+ }
4683
+ #else
4684
+ timeoutConnect.tv_sec = DEFAULT_TIMEOUT_SEC;
4685
+ timeoutConnect.tv_usec = 0;
4686
+ ret = NonBlockingSSL_Connect(sslResume); /* will keep retrying on timeout */
4687
+ #endif
4688
+ if (ret != WOLFSSL_SUCCESS) {
4689
+ LOG_ERROR("wolfSSL_connect resume error %d, %s\n", err,
4690
+ wolfSSL_ERR_error_string((unsigned long)err, buffer));
4691
+ wolfSSL_free(sslResume); sslResume = NULL;
4692
+ CloseSocket(sockfd);
4693
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4694
+ err_sys("wolfSSL_connect resume failed");
4695
+ }
4696
+
4697
+ showPeerEx(sslResume, lng_index);
4698
+ showPeerPEM(sslResume);
4699
+
4700
+ if (wolfSSL_session_reused(sslResume))
4701
+ printf("reused session id\n");
4702
+ else
4703
+ LOG_ERROR("didn't reuse session id!!!\n");
4704
+
4705
+ #ifdef HAVE_ALPN
4706
+ if (alpnList != NULL) {
4707
+ char *protocol_name = NULL;
4708
+ word16 protocol_nameSz = 0;
4709
+
4710
+ printf("Sending ALPN accepted list : %s\n", alpnList);
4711
+ err = wolfSSL_ALPN_GetProtocol(sslResume, &protocol_name,
4712
+ &protocol_nameSz);
4713
+ if (err == WOLFSSL_SUCCESS)
4714
+ printf("Received ALPN protocol : %s (%d)\n",
4715
+ protocol_name, protocol_nameSz);
4716
+ else if (err == WC_NO_ERR_TRACE(WOLFSSL_ALPN_NOT_FOUND))
4717
+ printf("Not received ALPN response (no match with server)\n");
4718
+ else
4719
+ printf("Getting ALPN protocol name failed\n");
4720
+ }
4721
+ #endif
4722
+
4723
+ /* allow some time for exporting the session */
4724
+ #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
4725
+ TEST_DELAY();
4726
+ #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
4727
+
4728
+ #ifdef HAVE_SECURE_RENEGOTIATION
4729
+ if (scr && forceScr) {
4730
+ if (nonBlocking) {
4731
+ printf("not doing secure renegotiation on example with"
4732
+ " nonblocking yet\n");
4733
+ } else {
4734
+ if (!resumeScr) {
4735
+ printf("Beginning secure renegotiation.\n");
4736
+ if (wolfSSL_Rehandshake(sslResume) != WOLFSSL_SUCCESS) {
4737
+ err = wolfSSL_get_error(sslResume, 0);
4738
+ LOG_ERROR("err = %d, %s\n", err,
4739
+ wolfSSL_ERR_error_string(err, buffer));
4740
+ wolfSSL_free(sslResume); sslResume = NULL;
4741
+ CloseSocket(sockfd);
4742
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4743
+ err_sys("wolfSSL_Rehandshake failed");
4744
+ }
4745
+ else {
4746
+ printf("RENEGOTIATION SUCCESSFUL\n");
4747
+ }
4748
+ }
4749
+ else {
4750
+ printf("Beginning secure resumption.\n");
4751
+ if (wolfSSL_SecureResume(sslResume) != WOLFSSL_SUCCESS) {
4752
+ err = wolfSSL_get_error(sslResume, 0);
4753
+ LOG_ERROR("err = %d, %s\n", err,
4754
+ wolfSSL_ERR_error_string(err, buffer));
4755
+ wolfSSL_free(sslResume); sslResume = NULL;
4756
+ CloseSocket(sockfd);
4757
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4758
+ err_sys("wolfSSL_SecureResume failed");
4759
+ }
4760
+ else {
4761
+ printf("SECURE RESUMPTION SUCCESSFUL\n");
4762
+ }
4763
+ }
4764
+ }
4765
+ }
4766
+ #endif /* HAVE_SECURE_RENEGOTIATION */
4767
+
4768
+ XMEMSET(msg, 0, sizeof(msg));
4769
+ if (sendGET) {
4770
+ msgSz = (int)XSTRLEN(kHttpGetMsg);
4771
+ XMEMCPY(msg, kHttpGetMsg, (size_t)msgSz);
4772
+ }
4773
+ else {
4774
+ msgSz = (int)XSTRLEN(kResumeMsg);
4775
+ XMEMCPY(msg, kResumeMsg, (size_t)msgSz);
4776
+ }
4777
+
4778
+ (void)ClientWriteRead(sslResume, msg, msgSz, reply, sizeof(reply)-1,
4779
+ sendGET, " resume", 0);
4780
+
4781
+ ret = wolfSSL_shutdown(sslResume);
4782
+ if (wc_shutdown && ret == WOLFSSL_SHUTDOWN_NOT_DONE)
4783
+ wolfSSL_shutdown(sslResume); /* bidirectional shutdown */
4784
+
4785
+ /* display collected statistics */
4786
+ #if defined(WOLFSSL_STATIC_MEMORY) && !defined(WOLFSSL_STATIC_MEMORY_LEAN)
4787
+ if (wolfSSL_is_static_memory(sslResume, &ssl_stats) != 1)
4788
+ err_sys("static memory was not used with ssl");
4789
+
4790
+ LOG_ERROR("\nprint off SSLresume memory stats\n");
4791
+ LOG_ERROR("*** This is memory state before wolfSSL_free is called\n");
4792
+ wolfSSL_PrintStatsConn(&ssl_stats);
4793
+ #endif
4794
+
4795
+ wolfSSL_free(sslResume); sslResume = NULL;
4796
+ CloseSocket(sockfd);
4797
+ }
4798
+ #endif /* !NO_SESSION_CACHE */
4799
+
4800
+ wolfSSL_CTX_free(ctx); ctx = NULL;
4801
+
4802
+ ((func_args*)args)->return_code = 0;
4803
+
4804
+ exit:
4805
+
4806
+ #ifdef WOLFSSL_WOLFSENTRY_HOOKS
4807
+ wolfsentry_ret =
4808
+ wolfsentry_shutdown(WOLFSENTRY_CONTEXT_ARGS_OUT_EX4(&wolfsentry, NULL));
4809
+ if (wolfsentry_ret < 0) {
4810
+ LOG_ERROR(
4811
+ "wolfsentry_shutdown() returned " WOLFSENTRY_ERROR_FMT "\n",
4812
+ WOLFSENTRY_ERROR_FMT_ARGS(wolfsentry_ret));
4813
+ }
4814
+ #endif
4815
+
4816
+ #ifdef WOLFSSL_ASYNC_CRYPT
4817
+ wolfAsync_DevClose(&devId);
4818
+ #endif
4819
+
4820
+ #if defined(HAVE_ECC) && defined(FP_ECC) && defined(HAVE_THREAD_LS) \
4821
+ && defined(HAVE_STACK_SIZE)
4822
+ wc_ecc_fp_free(); /* free per thread cache */
4823
+ #endif
4824
+
4825
+ /* There are use cases when these assignments are not read. To avoid
4826
+ * potential confusion those warnings have been handled here.
4827
+ */
4828
+ (void) useClientCert;
4829
+ (void) verifyCert;
4830
+ (void) ourCert;
4831
+ (void) ourKey;
4832
+ (void) useVerifyCb;
4833
+ (void) customVerifyCert;
4834
+
4835
+ WOLFSSL_RETURN_FROM_THREAD(0);
4836
+ }
4837
+
4838
+ #endif /* !NO_WOLFSSL_CLIENT && !NO_TLS */
4839
+
4840
+
4841
+ /* so overall tests can pull in test function */
4842
+ #ifndef NO_MAIN_DRIVER
4843
+
4844
+ int main(int argc, char** argv)
4845
+ {
4846
+ func_args args;
4847
+
4848
+ StartTCP();
4849
+
4850
+ #if defined(WOLFSSL_SRTP) && defined(WOLFSSL_COND)
4851
+ args.srtp_helper = NULL;
4852
+ #endif
4853
+ args.argc = argc;
4854
+ args.argv = argv;
4855
+ args.return_code = 0;
4856
+
4857
+ #if defined(DEBUG_WOLFSSL) && !defined(WOLFSSL_MDK_SHELL) && !defined(STACK_TRAP)
4858
+ wolfSSL_Debugging_ON();
4859
+ #endif
4860
+ wolfSSL_Init();
4861
+ ChangeToWolfRoot();
4862
+
4863
+ #if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_TLS)
4864
+ #ifdef HAVE_STACK_SIZE
4865
+ StackSizeCheck(&args, client_test);
4866
+ #else
4867
+ client_test(&args);
4868
+ #endif
4869
+ #else
4870
+ fprintf(stderr, "Client not compiled in!\n");
4871
+ #endif
4872
+ wolfSSL_Cleanup();
4873
+
4874
+ #ifdef HAVE_WNR
4875
+ if (wc_FreeNetRandom() < 0)
4876
+ err_sys("Failed to free netRandom context");
4877
+ #endif /* HAVE_WNR */
4878
+
4879
+ return args.return_code;
4880
+ }
4881
+
4882
+ int myoptind = 0;
4883
+ char* myoptarg = NULL;
4884
+
4885
+ #endif /* NO_MAIN_DRIVER */