1817466cbSJens Wiklander /*
2817466cbSJens Wiklander * Debugging routines
3817466cbSJens Wiklander *
47901324dSJerome Forissier * Copyright The Mbed TLS Contributors
5*b0563631STom Van Eyck * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6817466cbSJens Wiklander */
7817466cbSJens Wiklander
87901324dSJerome Forissier #include "common.h"
9817466cbSJens Wiklander
10817466cbSJens Wiklander #if defined(MBEDTLS_DEBUG_C)
11817466cbSJens Wiklander
12817466cbSJens Wiklander #include "mbedtls/platform.h"
13817466cbSJens Wiklander
14*b0563631STom Van Eyck #include "debug_internal.h"
1511fa71b9SJerome Forissier #include "mbedtls/error.h"
16817466cbSJens Wiklander
17817466cbSJens Wiklander #include <stdarg.h>
18817466cbSJens Wiklander #include <stdio.h>
19817466cbSJens Wiklander #include <string.h>
20817466cbSJens Wiklander
21*b0563631STom Van Eyck /* DEBUG_BUF_SIZE must be at least 2 */
22817466cbSJens Wiklander #define DEBUG_BUF_SIZE 512
23817466cbSJens Wiklander
24817466cbSJens Wiklander static int debug_threshold = 0;
25817466cbSJens Wiklander
mbedtls_debug_set_threshold(int threshold)26817466cbSJens Wiklander void mbedtls_debug_set_threshold(int threshold)
27817466cbSJens Wiklander {
28817466cbSJens Wiklander debug_threshold = threshold;
29817466cbSJens Wiklander }
30817466cbSJens Wiklander
31817466cbSJens Wiklander /*
32817466cbSJens Wiklander * All calls to f_dbg must be made via this function
33817466cbSJens Wiklander */
debug_send_line(const mbedtls_ssl_context * ssl,int level,const char * file,int line,const char * str)34817466cbSJens Wiklander static inline void debug_send_line(const mbedtls_ssl_context *ssl, int level,
35817466cbSJens Wiklander const char *file, int line,
36817466cbSJens Wiklander const char *str)
37817466cbSJens Wiklander {
38817466cbSJens Wiklander /*
39817466cbSJens Wiklander * If in a threaded environment, we need a thread identifier.
40817466cbSJens Wiklander * Since there is no portable way to get one, use the address of the ssl
41817466cbSJens Wiklander * context instead, as it shouldn't be shared between threads.
42817466cbSJens Wiklander */
43817466cbSJens Wiklander #if defined(MBEDTLS_THREADING_C)
44817466cbSJens Wiklander char idstr[20 + DEBUG_BUF_SIZE]; /* 0x + 16 nibbles + ': ' */
45817466cbSJens Wiklander mbedtls_snprintf(idstr, sizeof(idstr), "%p: %s", (void *) ssl, str);
46817466cbSJens Wiklander ssl->conf->f_dbg(ssl->conf->p_dbg, level, file, line, idstr);
47817466cbSJens Wiklander #else
48817466cbSJens Wiklander ssl->conf->f_dbg(ssl->conf->p_dbg, level, file, line, str);
49817466cbSJens Wiklander #endif
50817466cbSJens Wiklander }
51817466cbSJens Wiklander
527901324dSJerome Forissier MBEDTLS_PRINTF_ATTRIBUTE(5, 6)
mbedtls_debug_print_msg(const mbedtls_ssl_context * ssl,int level,const char * file,int line,const char * format,...)53817466cbSJens Wiklander void mbedtls_debug_print_msg(const mbedtls_ssl_context *ssl, int level,
54817466cbSJens Wiklander const char *file, int line,
55817466cbSJens Wiklander const char *format, ...)
56817466cbSJens Wiklander {
57817466cbSJens Wiklander va_list argp;
58817466cbSJens Wiklander char str[DEBUG_BUF_SIZE];
5911fa71b9SJerome Forissier int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
60817466cbSJens Wiklander
61*b0563631STom Van Eyck MBEDTLS_STATIC_ASSERT(DEBUG_BUF_SIZE >= 2, "DEBUG_BUF_SIZE too small");
62*b0563631STom Van Eyck
635b25c76aSJerome Forissier if (NULL == ssl ||
645b25c76aSJerome Forissier NULL == ssl->conf ||
655b25c76aSJerome Forissier NULL == ssl->conf->f_dbg ||
6632b31808SJens Wiklander level > debug_threshold) {
67817466cbSJens Wiklander return;
685b25c76aSJerome Forissier }
69817466cbSJens Wiklander
70817466cbSJens Wiklander va_start(argp, format);
7111fa71b9SJerome Forissier ret = mbedtls_vsnprintf(str, DEBUG_BUF_SIZE, format, argp);
72817466cbSJens Wiklander va_end(argp);
73817466cbSJens Wiklander
74*b0563631STom Van Eyck if (ret < 0) {
75*b0563631STom Van Eyck ret = 0;
76*b0563631STom Van Eyck } else {
77*b0563631STom Van Eyck if (ret >= DEBUG_BUF_SIZE - 1) {
78*b0563631STom Van Eyck ret = DEBUG_BUF_SIZE - 2;
79*b0563631STom Van Eyck }
80*b0563631STom Van Eyck }
81817466cbSJens Wiklander str[ret] = '\n';
82817466cbSJens Wiklander str[ret + 1] = '\0';
83817466cbSJens Wiklander
84817466cbSJens Wiklander debug_send_line(ssl, level, file, line, str);
85817466cbSJens Wiklander }
86817466cbSJens Wiklander
mbedtls_debug_print_ret(const mbedtls_ssl_context * ssl,int level,const char * file,int line,const char * text,int ret)87817466cbSJens Wiklander void mbedtls_debug_print_ret(const mbedtls_ssl_context *ssl, int level,
88817466cbSJens Wiklander const char *file, int line,
89817466cbSJens Wiklander const char *text, int ret)
90817466cbSJens Wiklander {
91817466cbSJens Wiklander char str[DEBUG_BUF_SIZE];
92817466cbSJens Wiklander
935b25c76aSJerome Forissier if (NULL == ssl ||
945b25c76aSJerome Forissier NULL == ssl->conf ||
955b25c76aSJerome Forissier NULL == ssl->conf->f_dbg ||
9632b31808SJens Wiklander level > debug_threshold) {
97817466cbSJens Wiklander return;
985b25c76aSJerome Forissier }
99817466cbSJens Wiklander
100817466cbSJens Wiklander /*
101817466cbSJens Wiklander * With non-blocking I/O and examples that just retry immediately,
102817466cbSJens Wiklander * the logs would be quickly flooded with WANT_READ, so ignore that.
10332b31808SJens Wiklander * Don't ignore WANT_WRITE however, since it is usually rare.
104817466cbSJens Wiklander */
10532b31808SJens Wiklander if (ret == MBEDTLS_ERR_SSL_WANT_READ) {
106817466cbSJens Wiklander return;
10732b31808SJens Wiklander }
108817466cbSJens Wiklander
109817466cbSJens Wiklander mbedtls_snprintf(str, sizeof(str), "%s() returned %d (-0x%04x)\n",
1107901324dSJerome Forissier text, ret, (unsigned int) -ret);
111817466cbSJens Wiklander
112817466cbSJens Wiklander debug_send_line(ssl, level, file, line, str);
113817466cbSJens Wiklander }
114817466cbSJens Wiklander
mbedtls_debug_print_buf(const mbedtls_ssl_context * ssl,int level,const char * file,int line,const char * text,const unsigned char * buf,size_t len)115817466cbSJens Wiklander void mbedtls_debug_print_buf(const mbedtls_ssl_context *ssl, int level,
116817466cbSJens Wiklander const char *file, int line, const char *text,
117817466cbSJens Wiklander const unsigned char *buf, size_t len)
118817466cbSJens Wiklander {
119817466cbSJens Wiklander char str[DEBUG_BUF_SIZE];
120817466cbSJens Wiklander char txt[17];
121817466cbSJens Wiklander size_t i, idx = 0;
122817466cbSJens Wiklander
1235b25c76aSJerome Forissier if (NULL == ssl ||
1245b25c76aSJerome Forissier NULL == ssl->conf ||
1255b25c76aSJerome Forissier NULL == ssl->conf->f_dbg ||
12632b31808SJens Wiklander level > debug_threshold) {
127817466cbSJens Wiklander return;
1285b25c76aSJerome Forissier }
129817466cbSJens Wiklander
130817466cbSJens Wiklander mbedtls_snprintf(str + idx, sizeof(str) - idx, "dumping '%s' (%u bytes)\n",
131817466cbSJens Wiklander text, (unsigned int) len);
132817466cbSJens Wiklander
133817466cbSJens Wiklander debug_send_line(ssl, level, file, line, str);
134817466cbSJens Wiklander
135817466cbSJens Wiklander memset(txt, 0, sizeof(txt));
13632b31808SJens Wiklander for (i = 0; i < len; i++) {
13732b31808SJens Wiklander if (i >= 4096) {
138817466cbSJens Wiklander break;
13932b31808SJens Wiklander }
140817466cbSJens Wiklander
14132b31808SJens Wiklander if (i % 16 == 0) {
14232b31808SJens Wiklander if (i > 0) {
143817466cbSJens Wiklander mbedtls_snprintf(str + idx, sizeof(str) - idx, " %s\n", txt);
144817466cbSJens Wiklander debug_send_line(ssl, level, file, line, str);
145817466cbSJens Wiklander
146817466cbSJens Wiklander idx = 0;
147817466cbSJens Wiklander memset(txt, 0, sizeof(txt));
148817466cbSJens Wiklander }
149817466cbSJens Wiklander
150817466cbSJens Wiklander idx += mbedtls_snprintf(str + idx, sizeof(str) - idx, "%04x: ",
151817466cbSJens Wiklander (unsigned int) i);
152817466cbSJens Wiklander
153817466cbSJens Wiklander }
154817466cbSJens Wiklander
155817466cbSJens Wiklander idx += mbedtls_snprintf(str + idx, sizeof(str) - idx, " %02x",
156817466cbSJens Wiklander (unsigned int) buf[i]);
157817466cbSJens Wiklander txt[i % 16] = (buf[i] > 31 && buf[i] < 127) ? buf[i] : '.';
158817466cbSJens Wiklander }
159817466cbSJens Wiklander
16032b31808SJens Wiklander if (len > 0) {
16132b31808SJens Wiklander for (/* i = i */; i % 16 != 0; i++) {
162817466cbSJens Wiklander idx += mbedtls_snprintf(str + idx, sizeof(str) - idx, " ");
16332b31808SJens Wiklander }
164817466cbSJens Wiklander
165817466cbSJens Wiklander mbedtls_snprintf(str + idx, sizeof(str) - idx, " %s\n", txt);
166817466cbSJens Wiklander debug_send_line(ssl, level, file, line, str);
167817466cbSJens Wiklander }
168817466cbSJens Wiklander }
169817466cbSJens Wiklander
170*b0563631STom Van Eyck #if defined(MBEDTLS_ECP_LIGHT)
mbedtls_debug_print_ecp(const mbedtls_ssl_context * ssl,int level,const char * file,int line,const char * text,const mbedtls_ecp_point * X)171817466cbSJens Wiklander void mbedtls_debug_print_ecp(const mbedtls_ssl_context *ssl, int level,
172817466cbSJens Wiklander const char *file, int line,
173817466cbSJens Wiklander const char *text, const mbedtls_ecp_point *X)
174817466cbSJens Wiklander {
175817466cbSJens Wiklander char str[DEBUG_BUF_SIZE];
176817466cbSJens Wiklander
1775b25c76aSJerome Forissier if (NULL == ssl ||
1785b25c76aSJerome Forissier NULL == ssl->conf ||
1795b25c76aSJerome Forissier NULL == ssl->conf->f_dbg ||
18032b31808SJens Wiklander level > debug_threshold) {
181817466cbSJens Wiklander return;
1825b25c76aSJerome Forissier }
183817466cbSJens Wiklander
184817466cbSJens Wiklander mbedtls_snprintf(str, sizeof(str), "%s(X)", text);
185817466cbSJens Wiklander mbedtls_debug_print_mpi(ssl, level, file, line, str, &X->X);
186817466cbSJens Wiklander
187817466cbSJens Wiklander mbedtls_snprintf(str, sizeof(str), "%s(Y)", text);
188817466cbSJens Wiklander mbedtls_debug_print_mpi(ssl, level, file, line, str, &X->Y);
189817466cbSJens Wiklander }
190*b0563631STom Van Eyck #endif /* MBEDTLS_ECP_LIGHT */
191*b0563631STom Van Eyck
192*b0563631STom Van Eyck #if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
mbedtls_debug_print_ec_coord(const mbedtls_ssl_context * ssl,int level,const char * file,int line,const char * text,const unsigned char * buf,size_t len)193*b0563631STom Van Eyck static void mbedtls_debug_print_ec_coord(const mbedtls_ssl_context *ssl, int level,
194*b0563631STom Van Eyck const char *file, int line, const char *text,
195*b0563631STom Van Eyck const unsigned char *buf, size_t len)
196*b0563631STom Van Eyck {
197*b0563631STom Van Eyck char str[DEBUG_BUF_SIZE];
198*b0563631STom Van Eyck size_t i, idx = 0;
199*b0563631STom Van Eyck
200*b0563631STom Van Eyck mbedtls_snprintf(str + idx, sizeof(str) - idx, "value of '%s' (%u bits) is:\n",
201*b0563631STom Van Eyck text, (unsigned int) len * 8);
202*b0563631STom Van Eyck
203*b0563631STom Van Eyck debug_send_line(ssl, level, file, line, str);
204*b0563631STom Van Eyck
205*b0563631STom Van Eyck for (i = 0; i < len; i++) {
206*b0563631STom Van Eyck if (i >= 4096) {
207*b0563631STom Van Eyck break;
208*b0563631STom Van Eyck }
209*b0563631STom Van Eyck
210*b0563631STom Van Eyck if (i % 16 == 0) {
211*b0563631STom Van Eyck if (i > 0) {
212*b0563631STom Van Eyck mbedtls_snprintf(str + idx, sizeof(str) - idx, "\n");
213*b0563631STom Van Eyck debug_send_line(ssl, level, file, line, str);
214*b0563631STom Van Eyck
215*b0563631STom Van Eyck idx = 0;
216*b0563631STom Van Eyck }
217*b0563631STom Van Eyck }
218*b0563631STom Van Eyck
219*b0563631STom Van Eyck idx += mbedtls_snprintf(str + idx, sizeof(str) - idx, " %02x",
220*b0563631STom Van Eyck (unsigned int) buf[i]);
221*b0563631STom Van Eyck }
222*b0563631STom Van Eyck
223*b0563631STom Van Eyck if (len > 0) {
224*b0563631STom Van Eyck for (/* i = i */; i % 16 != 0; i++) {
225*b0563631STom Van Eyck idx += mbedtls_snprintf(str + idx, sizeof(str) - idx, " ");
226*b0563631STom Van Eyck }
227*b0563631STom Van Eyck
228*b0563631STom Van Eyck mbedtls_snprintf(str + idx, sizeof(str) - idx, "\n");
229*b0563631STom Van Eyck debug_send_line(ssl, level, file, line, str);
230*b0563631STom Van Eyck }
231*b0563631STom Van Eyck }
232*b0563631STom Van Eyck
mbedtls_debug_print_psa_ec(const mbedtls_ssl_context * ssl,int level,const char * file,int line,const char * text,const mbedtls_pk_context * pk)233*b0563631STom Van Eyck void mbedtls_debug_print_psa_ec(const mbedtls_ssl_context *ssl, int level,
234*b0563631STom Van Eyck const char *file, int line,
235*b0563631STom Van Eyck const char *text, const mbedtls_pk_context *pk)
236*b0563631STom Van Eyck {
237*b0563631STom Van Eyck char str[DEBUG_BUF_SIZE];
238*b0563631STom Van Eyck const uint8_t *coord_start;
239*b0563631STom Van Eyck size_t coord_len;
240*b0563631STom Van Eyck
241*b0563631STom Van Eyck if (NULL == ssl ||
242*b0563631STom Van Eyck NULL == ssl->conf ||
243*b0563631STom Van Eyck NULL == ssl->conf->f_dbg ||
244*b0563631STom Van Eyck level > debug_threshold) {
245*b0563631STom Van Eyck return;
246*b0563631STom Van Eyck }
247*b0563631STom Van Eyck
248*b0563631STom Van Eyck /* For the description of pk->pk_raw content please refer to the description
249*b0563631STom Van Eyck * psa_export_public_key() function. */
250*b0563631STom Van Eyck coord_len = (pk->pub_raw_len - 1)/2;
251*b0563631STom Van Eyck
252*b0563631STom Van Eyck /* X coordinate */
253*b0563631STom Van Eyck coord_start = pk->pub_raw + 1;
254*b0563631STom Van Eyck mbedtls_snprintf(str, sizeof(str), "%s(X)", text);
255*b0563631STom Van Eyck mbedtls_debug_print_ec_coord(ssl, level, file, line, str, coord_start, coord_len);
256*b0563631STom Van Eyck
257*b0563631STom Van Eyck /* Y coordinate */
258*b0563631STom Van Eyck coord_start = coord_start + coord_len;
259*b0563631STom Van Eyck mbedtls_snprintf(str, sizeof(str), "%s(Y)", text);
260*b0563631STom Van Eyck mbedtls_debug_print_ec_coord(ssl, level, file, line, str, coord_start, coord_len);
261*b0563631STom Van Eyck }
262*b0563631STom Van Eyck #endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
263817466cbSJens Wiklander
264817466cbSJens Wiklander #if defined(MBEDTLS_BIGNUM_C)
mbedtls_debug_print_mpi(const mbedtls_ssl_context * ssl,int level,const char * file,int line,const char * text,const mbedtls_mpi * X)265817466cbSJens Wiklander void mbedtls_debug_print_mpi(const mbedtls_ssl_context *ssl, int level,
266817466cbSJens Wiklander const char *file, int line,
267817466cbSJens Wiklander const char *text, const mbedtls_mpi *X)
268817466cbSJens Wiklander {
269817466cbSJens Wiklander char str[DEBUG_BUF_SIZE];
2707901324dSJerome Forissier size_t bitlen;
2717901324dSJerome Forissier size_t idx = 0;
272817466cbSJens Wiklander
2735b25c76aSJerome Forissier if (NULL == ssl ||
2745b25c76aSJerome Forissier NULL == ssl->conf ||
2755b25c76aSJerome Forissier NULL == ssl->conf->f_dbg ||
2765b25c76aSJerome Forissier NULL == X ||
27732b31808SJens Wiklander level > debug_threshold) {
278817466cbSJens Wiklander return;
2795b25c76aSJerome Forissier }
280817466cbSJens Wiklander
2817901324dSJerome Forissier bitlen = mbedtls_mpi_bitlen(X);
282817466cbSJens Wiklander
2837901324dSJerome Forissier mbedtls_snprintf(str, sizeof(str), "value of '%s' (%u bits) is:\n",
2847901324dSJerome Forissier text, (unsigned) bitlen);
285817466cbSJens Wiklander debug_send_line(ssl, level, file, line, str);
286817466cbSJens Wiklander
28732b31808SJens Wiklander if (bitlen == 0) {
2887901324dSJerome Forissier str[0] = ' '; str[1] = '0'; str[2] = '0';
2897901324dSJerome Forissier idx = 3;
29032b31808SJens Wiklander } else {
2917901324dSJerome Forissier int n;
29232b31808SJens Wiklander for (n = (int) ((bitlen - 1) / 8); n >= 0; n--) {
2937901324dSJerome Forissier size_t limb_offset = n / sizeof(mbedtls_mpi_uint);
2947901324dSJerome Forissier size_t offset_in_limb = n % sizeof(mbedtls_mpi_uint);
2957901324dSJerome Forissier unsigned char octet =
2967901324dSJerome Forissier (X->p[limb_offset] >> (offset_in_limb * 8)) & 0xff;
2977901324dSJerome Forissier mbedtls_snprintf(str + idx, sizeof(str) - idx, " %02x", octet);
2987901324dSJerome Forissier idx += 3;
2997901324dSJerome Forissier /* Wrap lines after 16 octets that each take 3 columns */
30032b31808SJens Wiklander if (idx >= 3 * 16) {
301817466cbSJens Wiklander mbedtls_snprintf(str + idx, sizeof(str) - idx, "\n");
302817466cbSJens Wiklander debug_send_line(ssl, level, file, line, str);
303817466cbSJens Wiklander idx = 0;
304817466cbSJens Wiklander }
305817466cbSJens Wiklander }
306817466cbSJens Wiklander }
307817466cbSJens Wiklander
30832b31808SJens Wiklander if (idx != 0) {
309817466cbSJens Wiklander mbedtls_snprintf(str + idx, sizeof(str) - idx, "\n");
310817466cbSJens Wiklander debug_send_line(ssl, level, file, line, str);
311817466cbSJens Wiklander }
3127901324dSJerome Forissier }
313817466cbSJens Wiklander #endif /* MBEDTLS_BIGNUM_C */
314817466cbSJens Wiklander
31532b31808SJens Wiklander #if defined(MBEDTLS_X509_CRT_PARSE_C) && !defined(MBEDTLS_X509_REMOVE_INFO)
debug_print_pk(const mbedtls_ssl_context * ssl,int level,const char * file,int line,const char * text,const mbedtls_pk_context * pk)316817466cbSJens Wiklander static void debug_print_pk(const mbedtls_ssl_context *ssl, int level,
317817466cbSJens Wiklander const char *file, int line,
318817466cbSJens Wiklander const char *text, const mbedtls_pk_context *pk)
319817466cbSJens Wiklander {
320817466cbSJens Wiklander size_t i;
321817466cbSJens Wiklander mbedtls_pk_debug_item items[MBEDTLS_PK_DEBUG_MAX_ITEMS];
322817466cbSJens Wiklander char name[16];
323817466cbSJens Wiklander
324817466cbSJens Wiklander memset(items, 0, sizeof(items));
325817466cbSJens Wiklander
32632b31808SJens Wiklander if (mbedtls_pk_debug(pk, items) != 0) {
327817466cbSJens Wiklander debug_send_line(ssl, level, file, line,
328817466cbSJens Wiklander "invalid PK context\n");
329817466cbSJens Wiklander return;
330817466cbSJens Wiklander }
331817466cbSJens Wiklander
33232b31808SJens Wiklander for (i = 0; i < MBEDTLS_PK_DEBUG_MAX_ITEMS; i++) {
33332b31808SJens Wiklander if (items[i].type == MBEDTLS_PK_DEBUG_NONE) {
334817466cbSJens Wiklander return;
33532b31808SJens Wiklander }
336817466cbSJens Wiklander
337817466cbSJens Wiklander mbedtls_snprintf(name, sizeof(name), "%s%s", text, items[i].name);
338817466cbSJens Wiklander name[sizeof(name) - 1] = '\0';
339817466cbSJens Wiklander
340*b0563631STom Van Eyck #if defined(MBEDTLS_RSA_C)
34132b31808SJens Wiklander if (items[i].type == MBEDTLS_PK_DEBUG_MPI) {
342817466cbSJens Wiklander mbedtls_debug_print_mpi(ssl, level, file, line, name, items[i].value);
34332b31808SJens Wiklander } else
344*b0563631STom Van Eyck #endif /* MBEDTLS_RSA_C */
345*b0563631STom Van Eyck #if defined(MBEDTLS_ECP_LIGHT)
34632b31808SJens Wiklander if (items[i].type == MBEDTLS_PK_DEBUG_ECP) {
347817466cbSJens Wiklander mbedtls_debug_print_ecp(ssl, level, file, line, name, items[i].value);
34832b31808SJens Wiklander } else
349*b0563631STom Van Eyck #endif /* MBEDTLS_ECP_LIGHT */
350*b0563631STom Van Eyck #if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
351*b0563631STom Van Eyck if (items[i].type == MBEDTLS_PK_DEBUG_PSA_EC) {
352*b0563631STom Van Eyck mbedtls_debug_print_psa_ec(ssl, level, file, line, name, items[i].value);
353*b0563631STom Van Eyck } else
354*b0563631STom Van Eyck #endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
35532b31808SJens Wiklander { debug_send_line(ssl, level, file, line,
35632b31808SJens Wiklander "should not happen\n"); }
357817466cbSJens Wiklander }
358817466cbSJens Wiklander }
359817466cbSJens Wiklander
debug_print_line_by_line(const mbedtls_ssl_context * ssl,int level,const char * file,int line,const char * text)360817466cbSJens Wiklander static void debug_print_line_by_line(const mbedtls_ssl_context *ssl, int level,
361817466cbSJens Wiklander const char *file, int line, const char *text)
362817466cbSJens Wiklander {
363817466cbSJens Wiklander char str[DEBUG_BUF_SIZE];
364817466cbSJens Wiklander const char *start, *cur;
365817466cbSJens Wiklander
366817466cbSJens Wiklander start = text;
36732b31808SJens Wiklander for (cur = text; *cur != '\0'; cur++) {
36832b31808SJens Wiklander if (*cur == '\n') {
369*b0563631STom Van Eyck size_t len = (size_t) (cur - start) + 1;
37032b31808SJens Wiklander if (len > DEBUG_BUF_SIZE - 1) {
371817466cbSJens Wiklander len = DEBUG_BUF_SIZE - 1;
37232b31808SJens Wiklander }
373817466cbSJens Wiklander
374817466cbSJens Wiklander memcpy(str, start, len);
375817466cbSJens Wiklander str[len] = '\0';
376817466cbSJens Wiklander
377817466cbSJens Wiklander debug_send_line(ssl, level, file, line, str);
378817466cbSJens Wiklander
379817466cbSJens Wiklander start = cur + 1;
380817466cbSJens Wiklander }
381817466cbSJens Wiklander }
382817466cbSJens Wiklander }
383817466cbSJens Wiklander
mbedtls_debug_print_crt(const mbedtls_ssl_context * ssl,int level,const char * file,int line,const char * text,const mbedtls_x509_crt * crt)384817466cbSJens Wiklander void mbedtls_debug_print_crt(const mbedtls_ssl_context *ssl, int level,
385817466cbSJens Wiklander const char *file, int line,
386817466cbSJens Wiklander const char *text, const mbedtls_x509_crt *crt)
387817466cbSJens Wiklander {
388817466cbSJens Wiklander char str[DEBUG_BUF_SIZE];
389817466cbSJens Wiklander int i = 0;
390817466cbSJens Wiklander
3915b25c76aSJerome Forissier if (NULL == ssl ||
3925b25c76aSJerome Forissier NULL == ssl->conf ||
3935b25c76aSJerome Forissier NULL == ssl->conf->f_dbg ||
3945b25c76aSJerome Forissier NULL == crt ||
39532b31808SJens Wiklander level > debug_threshold) {
396817466cbSJens Wiklander return;
3975b25c76aSJerome Forissier }
398817466cbSJens Wiklander
39932b31808SJens Wiklander while (crt != NULL) {
400817466cbSJens Wiklander char buf[1024];
401817466cbSJens Wiklander
402817466cbSJens Wiklander mbedtls_snprintf(str, sizeof(str), "%s #%d:\n", text, ++i);
403817466cbSJens Wiklander debug_send_line(ssl, level, file, line, str);
404817466cbSJens Wiklander
405817466cbSJens Wiklander mbedtls_x509_crt_info(buf, sizeof(buf) - 1, "", crt);
406817466cbSJens Wiklander debug_print_line_by_line(ssl, level, file, line, buf);
407817466cbSJens Wiklander
408817466cbSJens Wiklander debug_print_pk(ssl, level, file, line, "crt->", &crt->pk);
409817466cbSJens Wiklander
410817466cbSJens Wiklander crt = crt->next;
411817466cbSJens Wiklander }
412817466cbSJens Wiklander }
41332b31808SJens Wiklander #endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_X509_REMOVE_INFO */
414817466cbSJens Wiklander
415*b0563631STom Van Eyck #if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_ANY_ENABLED) && \
416*b0563631STom Van Eyck defined(MBEDTLS_ECDH_C)
mbedtls_debug_printf_ecdh_internal(const mbedtls_ssl_context * ssl,int level,const char * file,int line,const mbedtls_ecdh_context * ecdh,mbedtls_debug_ecdh_attr attr)4173d3b0591SJens Wiklander static void mbedtls_debug_printf_ecdh_internal(const mbedtls_ssl_context *ssl,
4183d3b0591SJens Wiklander int level, const char *file,
4193d3b0591SJens Wiklander int line,
4203d3b0591SJens Wiklander const mbedtls_ecdh_context *ecdh,
4213d3b0591SJens Wiklander mbedtls_debug_ecdh_attr attr)
4223d3b0591SJens Wiklander {
4233d3b0591SJens Wiklander #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT)
4243d3b0591SJens Wiklander const mbedtls_ecdh_context *ctx = ecdh;
4253d3b0591SJens Wiklander #else
4263d3b0591SJens Wiklander const mbedtls_ecdh_context_mbed *ctx = &ecdh->ctx.mbed_ecdh;
4273d3b0591SJens Wiklander #endif
4283d3b0591SJens Wiklander
42932b31808SJens Wiklander switch (attr) {
4303d3b0591SJens Wiklander case MBEDTLS_DEBUG_ECDH_Q:
4313d3b0591SJens Wiklander mbedtls_debug_print_ecp(ssl, level, file, line, "ECDH: Q",
4323d3b0591SJens Wiklander &ctx->Q);
4333d3b0591SJens Wiklander break;
4343d3b0591SJens Wiklander case MBEDTLS_DEBUG_ECDH_QP:
4353d3b0591SJens Wiklander mbedtls_debug_print_ecp(ssl, level, file, line, "ECDH: Qp",
4363d3b0591SJens Wiklander &ctx->Qp);
4373d3b0591SJens Wiklander break;
4383d3b0591SJens Wiklander case MBEDTLS_DEBUG_ECDH_Z:
4393d3b0591SJens Wiklander mbedtls_debug_print_mpi(ssl, level, file, line, "ECDH: z",
4403d3b0591SJens Wiklander &ctx->z);
4413d3b0591SJens Wiklander break;
4423d3b0591SJens Wiklander default:
4433d3b0591SJens Wiklander break;
4443d3b0591SJens Wiklander }
4453d3b0591SJens Wiklander }
4463d3b0591SJens Wiklander
mbedtls_debug_printf_ecdh(const mbedtls_ssl_context * ssl,int level,const char * file,int line,const mbedtls_ecdh_context * ecdh,mbedtls_debug_ecdh_attr attr)4473d3b0591SJens Wiklander void mbedtls_debug_printf_ecdh(const mbedtls_ssl_context *ssl, int level,
4483d3b0591SJens Wiklander const char *file, int line,
4493d3b0591SJens Wiklander const mbedtls_ecdh_context *ecdh,
4503d3b0591SJens Wiklander mbedtls_debug_ecdh_attr attr)
4513d3b0591SJens Wiklander {
4523d3b0591SJens Wiklander #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT)
4533d3b0591SJens Wiklander mbedtls_debug_printf_ecdh_internal(ssl, level, file, line, ecdh, attr);
4543d3b0591SJens Wiklander #else
45532b31808SJens Wiklander switch (ecdh->var) {
4563d3b0591SJens Wiklander default:
4573d3b0591SJens Wiklander mbedtls_debug_printf_ecdh_internal(ssl, level, file, line, ecdh,
4583d3b0591SJens Wiklander attr);
4593d3b0591SJens Wiklander }
4603d3b0591SJens Wiklander #endif
4613d3b0591SJens Wiklander }
462*b0563631STom Van Eyck #endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_ANY_ENABLED &&
463*b0563631STom Van Eyck MBEDTLS_ECDH_C */
4643d3b0591SJens Wiklander
465817466cbSJens Wiklander #endif /* MBEDTLS_DEBUG_C */
466