/src/openssl30/crypto/bio/bio_dump.c
| Line | Count | Source (jump to first uncovered line) | 
| 1 |  | /* | 
| 2 |  |  * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. | 
| 3 |  |  * | 
| 4 |  |  * Licensed under the Apache License 2.0 (the "License").  You may not use | 
| 5 |  |  * this file except in compliance with the License.  You can obtain a copy | 
| 6 |  |  * in the file LICENSE in the source distribution or at | 
| 7 |  |  * https://www.openssl.org/source/license.html | 
| 8 |  |  */ | 
| 9 |  |  | 
| 10 |  | /* | 
| 11 |  |  * Stolen from tjh's ssl/ssl_trc.c stuff. | 
| 12 |  |  */ | 
| 13 |  |  | 
| 14 |  | #include <stdio.h> | 
| 15 |  | #include "bio_local.h" | 
| 16 |  |  | 
| 17 | 43.0k | #define DUMP_WIDTH      16 | 
| 18 | 43.0k | #define DUMP_WIDTH_LESS_INDENT(i) (DUMP_WIDTH - ((i - (i > 6 ? 6 : i) + 3) / 4)) | 
| 19 |  |  | 
| 20 | 182M | #define SPACE(buf, pos, n)   (sizeof(buf) - (pos) > (n)) | 
| 21 |  |  | 
| 22 |  | int BIO_dump_cb(int (*cb) (const void *data, size_t len, void *u), | 
| 23 |  |                 void *u, const void *s, int len) | 
| 24 | 3.64k | { | 
| 25 | 3.64k |     return BIO_dump_indent_cb(cb, u, s, len, 0); | 
| 26 | 3.64k | } | 
| 27 |  |  | 
| 28 |  | int BIO_dump_indent_cb(int (*cb) (const void *data, size_t len, void *u), | 
| 29 |  |                        void *u, const void *v, int len, int indent) | 
| 30 | 43.0k | { | 
| 31 | 43.0k |     const unsigned char *s = v; | 
| 32 | 43.0k |     int res, ret = 0; | 
| 33 | 43.0k |     char buf[288 + 1]; | 
| 34 | 43.0k |     int i, j, rows, n; | 
| 35 | 43.0k |     unsigned char ch; | 
| 36 | 43.0k |     int dump_width; | 
| 37 |  |  | 
| 38 | 43.0k |     if (indent < 0) | 
| 39 | 0 |         indent = 0; | 
| 40 | 43.0k |     else if (indent > 64) | 
| 41 | 17 |         indent = 64; | 
| 42 |  |  | 
| 43 | 43.0k |     dump_width = DUMP_WIDTH_LESS_INDENT(indent); | 
| 44 | 43.0k |     rows = len / dump_width; | 
| 45 | 43.0k |     if ((rows * dump_width) < len) | 
| 46 | 39.6k |         rows++; | 
| 47 | 5.68M |     for (i = 0; i < rows; i++) { | 
| 48 | 5.63M |         n = BIO_snprintf(buf, sizeof(buf), "%*s%04x - ", indent, "", | 
| 49 | 5.63M |                          i * dump_width); | 
| 50 | 91.4M |         for (j = 0; j < dump_width; j++) { | 
| 51 | 85.8M |             if (SPACE(buf, n, 3)) { | 
| 52 | 85.8M |                 if (((i * dump_width) + j) >= len) { | 
| 53 | 331k |                     strcpy(buf + n, "   "); | 
| 54 | 85.4M |                 } else { | 
| 55 | 85.4M |                     ch = *(s + i * dump_width + j) & 0xff; | 
| 56 | 85.4M |                     BIO_snprintf(buf + n, 4, "%02x%c", ch, | 
| 57 | 85.4M |                                  j == 7 ? '-' : ' '); | 
| 58 | 85.4M |                 } | 
| 59 | 85.8M |                 n += 3; | 
| 60 | 85.8M |             } | 
| 61 | 85.8M |         } | 
| 62 | 5.63M |         if (SPACE(buf, n, 2)) { | 
| 63 | 5.63M |             strcpy(buf + n, "  "); | 
| 64 | 5.63M |             n += 2; | 
| 65 | 5.63M |         } | 
| 66 | 91.1M |         for (j = 0; j < dump_width; j++) { | 
| 67 | 85.5M |             if (((i * dump_width) + j) >= len) | 
| 68 | 39.6k |                 break; | 
| 69 | 85.4M |             if (SPACE(buf, n, 1)) { | 
| 70 | 85.4M |                 ch = *(s + i * dump_width + j) & 0xff; | 
| 71 | 85.4M | #ifndef CHARSET_EBCDIC | 
| 72 | 85.4M |                 buf[n++] = ((ch >= ' ') && (ch <= '~')) ? ch : '.'; | 
| 73 |  | #else | 
| 74 |  |                 buf[n++] = ((ch >= os_toascii[' ']) && (ch <= os_toascii['~'])) | 
| 75 |  |                            ? os_toebcdic[ch] | 
| 76 |  |                            : '.'; | 
| 77 |  | #endif | 
| 78 | 85.4M |                 buf[n] = '\0'; | 
| 79 | 85.4M |             } | 
| 80 | 85.4M |         } | 
| 81 | 5.63M |         if (SPACE(buf, n, 1)) { | 
| 82 | 5.63M |             buf[n++] = '\n'; | 
| 83 | 5.63M |             buf[n] = '\0'; | 
| 84 | 5.63M |         } | 
| 85 |  |         /* | 
| 86 |  |          * if this is the last call then update the ddt_dump thing so that we | 
| 87 |  |          * will move the selection point in the debug window | 
| 88 |  |          */ | 
| 89 | 5.63M |         res = cb((void *)buf, n, u); | 
| 90 | 5.63M |         if (res < 0) | 
| 91 | 0 |             return res; | 
| 92 | 5.63M |         ret += res; | 
| 93 | 5.63M |     } | 
| 94 | 43.0k |     return ret; | 
| 95 | 43.0k | } | 
| 96 |  |  | 
| 97 |  | #ifndef OPENSSL_NO_STDIO | 
| 98 |  | static int write_fp(const void *data, size_t len, void *fp) | 
| 99 | 0 | { | 
| 100 | 0 |     return UP_fwrite(data, len, 1, fp); | 
| 101 | 0 | } | 
| 102 |  |  | 
| 103 |  | int BIO_dump_fp(FILE *fp, const void *s, int len) | 
| 104 | 0 | { | 
| 105 | 0 |     return BIO_dump_cb(write_fp, fp, s, len); | 
| 106 | 0 | } | 
| 107 |  |  | 
| 108 |  | int BIO_dump_indent_fp(FILE *fp, const void *s, int len, int indent) | 
| 109 | 0 | { | 
| 110 | 0 |     return BIO_dump_indent_cb(write_fp, fp, s, len, indent); | 
| 111 | 0 | } | 
| 112 |  | #endif | 
| 113 |  |  | 
| 114 |  | static int write_bio(const void *data, size_t len, void *bp) | 
| 115 | 5.63M | { | 
| 116 | 5.63M |     return BIO_write((BIO *)bp, (const char *)data, len); | 
| 117 | 5.63M | } | 
| 118 |  |  | 
| 119 |  | int BIO_dump(BIO *bp, const void *s, int len) | 
| 120 | 3.64k | { | 
| 121 | 3.64k |     return BIO_dump_cb(write_bio, bp, s, len); | 
| 122 | 3.64k | } | 
| 123 |  |  | 
| 124 |  | int BIO_dump_indent(BIO *bp, const void *s, int len, int indent) | 
| 125 | 51.0k | { | 
| 126 | 51.0k |     return BIO_dump_indent_cb(write_bio, bp, s, len, indent); | 
| 127 | 51.0k | } | 
| 128 |  |  | 
| 129 |  | int BIO_hex_string(BIO *out, int indent, int width, const void *data, | 
| 130 |  |                    int datalen) | 
| 131 | 499k | { | 
| 132 | 499k |     const unsigned char *d = data; | 
| 133 | 499k |     int i, j = 0; | 
| 134 |  |  | 
| 135 | 499k |     if (datalen < 1) | 
| 136 | 23.4k |         return 1; | 
| 137 |  |  | 
| 138 | 9.71M |     for (i = 0; i < datalen - 1; i++) { | 
| 139 | 9.23M |         if (i && !j) | 
| 140 | 515k |             BIO_printf(out, "%*s", indent, ""); | 
| 141 |  |  | 
| 142 | 9.23M |         BIO_printf(out, "%02X:", d[i]); | 
| 143 |  |  | 
| 144 | 9.23M |         j = (j + 1) % width; | 
| 145 | 9.23M |         if (!j) | 
| 146 | 519k |             BIO_printf(out, "\n"); | 
| 147 | 9.23M |     } | 
| 148 |  |  | 
| 149 | 476k |     if (i && !j) | 
| 150 | 4.43k |         BIO_printf(out, "%*s", indent, ""); | 
| 151 | 476k |     BIO_printf(out, "%02X", d[datalen - 1]); | 
| 152 | 476k |     return 1; | 
| 153 | 499k | } |