xref: /optee_os/lib/libmbedtls/mbedtls/library/debug.c (revision b0563631928755fe864b97785160fb3088e9efdc)
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