ssl_test_lib.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. /*
  2. * Common code for SSL test programs
  3. *
  4. * Copyright The Mbed TLS Contributors
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  8. * not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  15. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. */
  19. #ifndef MBEDTLS_PROGRAMS_SSL_SSL_TEST_LIB_H
  20. #define MBEDTLS_PROGRAMS_SSL_SSL_TEST_LIB_H
  21. #include "mbedtls/build_info.h"
  22. #include "mbedtls/platform.h"
  23. #undef HAVE_RNG
  24. #if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) && \
  25. (defined(MBEDTLS_USE_PSA_CRYPTO) || \
  26. defined(MBEDTLS_TEST_USE_PSA_CRYPTO_RNG))
  27. #define HAVE_RNG
  28. #elif defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_CTR_DRBG_C)
  29. #define HAVE_RNG
  30. #elif defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_HMAC_DRBG_C) && \
  31. (defined(MBEDTLS_SHA256_C) || defined(MBEDTLS_SHA512_C))
  32. #define HAVE_RNG
  33. #endif
  34. #if !defined(MBEDTLS_NET_C) || \
  35. !defined(MBEDTLS_SSL_TLS_C)
  36. #define MBEDTLS_SSL_TEST_IMPOSSIBLE \
  37. "MBEDTLS_NET_C and/or " \
  38. "MBEDTLS_SSL_TLS_C not defined."
  39. #elif !defined(HAVE_RNG)
  40. #define MBEDTLS_SSL_TEST_IMPOSSIBLE \
  41. "No random generator is available.\n"
  42. #else
  43. #undef MBEDTLS_SSL_TEST_IMPOSSIBLE
  44. #undef HAVE_RNG
  45. #include <stdio.h>
  46. #include <stdlib.h>
  47. #include <string.h>
  48. #include "mbedtls/net_sockets.h"
  49. #include "mbedtls/ssl.h"
  50. #include "mbedtls/ssl_ciphersuites.h"
  51. #include "mbedtls/entropy.h"
  52. #include "mbedtls/ctr_drbg.h"
  53. #include "mbedtls/hmac_drbg.h"
  54. #include "mbedtls/x509.h"
  55. #include "mbedtls/error.h"
  56. #include "mbedtls/debug.h"
  57. #include "mbedtls/timing.h"
  58. #include "mbedtls/base64.h"
  59. #include "test/certs.h"
  60. #if defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_TEST_USE_PSA_CRYPTO_RNG)
  61. #include "psa/crypto.h"
  62. #include "mbedtls/psa_util.h"
  63. #endif
  64. #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
  65. #include "mbedtls/memory_buffer_alloc.h"
  66. #endif
  67. #include <test/helpers.h>
  68. #include "../test/query_config.h"
  69. typedef struct eap_tls_keys {
  70. unsigned char master_secret[48];
  71. unsigned char randbytes[64];
  72. mbedtls_tls_prf_types tls_prf_type;
  73. } eap_tls_keys;
  74. #if defined(MBEDTLS_SSL_DTLS_SRTP)
  75. /* Supported SRTP mode needs a maximum of :
  76. * - 16 bytes for key (AES-128)
  77. * - 14 bytes SALT
  78. * One for sender, one for receiver context
  79. */
  80. #define MBEDTLS_TLS_SRTP_MAX_KEY_MATERIAL_LENGTH 60
  81. typedef struct dtls_srtp_keys {
  82. unsigned char master_secret[48];
  83. unsigned char randbytes[64];
  84. mbedtls_tls_prf_types tls_prf_type;
  85. } dtls_srtp_keys;
  86. #endif /* MBEDTLS_SSL_DTLS_SRTP */
  87. typedef struct {
  88. mbedtls_ssl_context *ssl;
  89. mbedtls_net_context *net;
  90. } io_ctx_t;
  91. void my_debug(void *ctx, int level,
  92. const char *file, int line,
  93. const char *str);
  94. #if defined(MBEDTLS_HAVE_TIME)
  95. mbedtls_time_t dummy_constant_time(mbedtls_time_t *time);
  96. #endif
  97. #if defined(MBEDTLS_USE_PSA_CRYPTO) && !defined(MBEDTLS_TEST_USE_PSA_CRYPTO_RNG)
  98. /* If MBEDTLS_TEST_USE_PSA_CRYPTO_RNG is defined, the SSL test programs will use
  99. * mbedtls_psa_get_random() rather than entropy+DRBG as a random generator.
  100. *
  101. * The constraints are:
  102. * - Without the entropy module, the PSA RNG is the only option.
  103. * - Without at least one of the DRBG modules, the PSA RNG is the only option.
  104. * - The PSA RNG does not support explicit seeding, so it is incompatible with
  105. * the reproducible mode used by test programs.
  106. * - For good overall test coverage, there should be at least one configuration
  107. * where the test programs use the PSA RNG while the PSA RNG is itself based
  108. * on entropy+DRBG, and at least one configuration where the test programs
  109. * do not use the PSA RNG even though it's there.
  110. *
  111. * A simple choice that meets the constraints is to use the PSA RNG whenever
  112. * MBEDTLS_USE_PSA_CRYPTO is enabled. There's no real technical reason the
  113. * choice to use the PSA RNG in the test programs and the choice to use
  114. * PSA crypto when TLS code needs crypto have to be tied together, but it
  115. * happens to be a good match. It's also a good match from an application
  116. * perspective: either PSA is preferred for TLS (both for crypto and for
  117. * random generation) or it isn't.
  118. */
  119. #define MBEDTLS_TEST_USE_PSA_CRYPTO_RNG
  120. #endif
  121. /** A context for random number generation (RNG).
  122. */
  123. typedef struct {
  124. #if defined(MBEDTLS_TEST_USE_PSA_CRYPTO_RNG)
  125. unsigned char dummy;
  126. #else /* MBEDTLS_TEST_USE_PSA_CRYPTO_RNG */
  127. mbedtls_entropy_context entropy;
  128. #if defined(MBEDTLS_CTR_DRBG_C)
  129. mbedtls_ctr_drbg_context drbg;
  130. #elif defined(MBEDTLS_HMAC_DRBG_C)
  131. mbedtls_hmac_drbg_context drbg;
  132. #else
  133. #error "No DRBG available"
  134. #endif
  135. #endif /* MBEDTLS_TEST_USE_PSA_CRYPTO_RNG */
  136. } rng_context_t;
  137. /** Initialize the RNG.
  138. *
  139. * This function only initializes the memory used by the RNG context.
  140. * Before using the RNG, it must be seeded with rng_seed().
  141. */
  142. void rng_init(rng_context_t *rng);
  143. /* Seed the random number generator.
  144. *
  145. * \param rng The RNG context to use. It must have been initialized
  146. * with rng_init().
  147. * \param reproducible If zero, seed the RNG from entropy.
  148. * If nonzero, use a fixed seed, so that the program
  149. * will produce the same sequence of random numbers
  150. * each time it is invoked.
  151. * \param pers A null-terminated string. Different values for this
  152. * string cause the RNG to emit different output for
  153. * the same seed.
  154. *
  155. * return 0 on success, a negative value on error.
  156. */
  157. int rng_seed(rng_context_t *rng, int reproducible, const char *pers);
  158. /** Deinitialize the RNG. Free any embedded resource.
  159. *
  160. * \param rng The RNG context to deinitialize. It must have been
  161. * initialized with rng_init().
  162. */
  163. void rng_free(rng_context_t *rng);
  164. /** Generate random data.
  165. *
  166. * This function is suitable for use as the \c f_rng argument to Mbed TLS
  167. * library functions.
  168. *
  169. * \param p_rng The random generator context. This must be a pointer to
  170. * a #rng_context_t structure.
  171. * \param output The buffer to fill.
  172. * \param output_len The length of the buffer in bytes.
  173. *
  174. * \return \c 0 on success.
  175. * \return An Mbed TLS error code on error.
  176. */
  177. int rng_get(void *p_rng, unsigned char *output, size_t output_len);
  178. /** Parse command-line option: key_opaque_algs
  179. *
  180. *
  181. * \param arg String value of key_opaque_algs
  182. * Coma-separated pair of values among the following:
  183. * - "rsa-sign-pkcs1"
  184. * - "rsa-sign-pss"
  185. * - "rsa-decrypt"
  186. * - "ecdsa-sign"
  187. * - "ecdh"
  188. * - "none" (only acceptable for the second value).
  189. * \param alg1 Address of pointer to alg #1
  190. * \param alg2 Address of pointer to alg #2
  191. *
  192. * \return \c 0 on success.
  193. * \return \c 1 on parse failure.
  194. */
  195. int key_opaque_alg_parse(const char *arg, const char **alg1, const char **alg2);
  196. #if defined(MBEDTLS_USE_PSA_CRYPTO)
  197. /** Parse given opaque key algorithms to obtain psa algs and usage
  198. * that will be passed to mbedtls_pk_wrap_as_opaque().
  199. *
  200. *
  201. * \param alg1 input string opaque key algorithm #1
  202. * \param alg2 input string opaque key algorithm #2
  203. * \param psa_alg1 output PSA algorithm #1
  204. * \param psa_alg2 output PSA algorithm #2
  205. * \param usage output key usage
  206. * \param key_type key type used to set default psa algorithm/usage
  207. * when alg1 in "none"
  208. *
  209. * \return \c 0 on success.
  210. * \return \c 1 on parse failure.
  211. */
  212. int key_opaque_set_alg_usage(const char *alg1, const char *alg2,
  213. psa_algorithm_t *psa_alg1,
  214. psa_algorithm_t *psa_alg2,
  215. psa_key_usage_t *usage,
  216. mbedtls_pk_type_t key_type);
  217. #endif /* MBEDTLS_USE_PSA_CRYPTO */
  218. #if defined(MBEDTLS_USE_PSA_CRYPTO) && defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG)
  219. /* The test implementation of the PSA external RNG is insecure. When
  220. * MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG is enabled, before using any PSA crypto
  221. * function that makes use of an RNG, you must call
  222. * mbedtls_test_enable_insecure_external_rng(). */
  223. #include <test/fake_external_rng_for_test.h>
  224. #endif
  225. #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
  226. int ca_callback(void *data, mbedtls_x509_crt const *child,
  227. mbedtls_x509_crt **candidates);
  228. #endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
  229. /*
  230. * Test recv/send functions that make sure each try returns
  231. * WANT_READ/WANT_WRITE at least once before succeeding
  232. */
  233. int delayed_recv(void *ctx, unsigned char *buf, size_t len);
  234. int delayed_send(void *ctx, const unsigned char *buf, size_t len);
  235. /*
  236. * Wait for an event from the underlying transport or the timer
  237. * (Used in event-driven IO mode).
  238. */
  239. int idle(mbedtls_net_context *fd,
  240. #if defined(MBEDTLS_TIMING_C)
  241. mbedtls_timing_delay_context *timer,
  242. #endif
  243. int idle_reason);
  244. #if defined(MBEDTLS_TEST_HOOKS)
  245. /** Initialize whatever test hooks are enabled by the compile-time
  246. * configuration and make sense for the TLS test programs. */
  247. void test_hooks_init(void);
  248. /** Check if any test hooks detected a problem.
  249. *
  250. * If a problem was detected, it's ok for the calling program to keep going,
  251. * but it should ultimately exit with an error status.
  252. *
  253. * \note When implementing a test hook that detects errors on its own
  254. * (as opposed to e.g. leaving the error for a memory sanitizer to
  255. * report), make sure to print a message to standard error either at
  256. * the time the problem is detected or during the execution of this
  257. * function. This function does not indicate what problem was detected,
  258. * so printing a message is the only way to provide feedback in the
  259. * logs of the calling program.
  260. *
  261. * \return Nonzero if a problem was detected.
  262. * \c 0 if no problem was detected.
  263. */
  264. int test_hooks_failure_detected(void);
  265. /** Free any resources allocated for the sake of test hooks.
  266. *
  267. * Call this at the end of the program so that resource leak analyzers
  268. * don't complain.
  269. */
  270. void test_hooks_free(void);
  271. #endif /* !MBEDTLS_TEST_HOOKS */
  272. #endif /* MBEDTLS_SSL_TEST_IMPOSSIBLE conditions: else */
  273. #endif /* MBEDTLS_PROGRAMS_SSL_SSL_TEST_LIB_H */