]>
Commit | Line | Data |
---|---|---|
b1322259 | 1 | /* |
6738bf14 | 2 | * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. |
0f113f3e | 3 | * |
09abbca1 | 4 | * Licensed under the Apache License 2.0 (the "License"). You may not use |
b1322259 RS |
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 | |
d02b48c6 RE |
8 | */ |
9 | ||
0f113f3e | 10 | /* |
d02b48c6 RE |
11 | * Stolen from tjh's ssl/ssl_trc.c stuff. |
12 | */ | |
13 | ||
14 | #include <stdio.h> | |
ea1b02db | 15 | #include "bio_lcl.h" |
d02b48c6 | 16 | |
0f113f3e | 17 | #define DUMP_WIDTH 16 |
59e539e6 P |
18 | #define DUMP_WIDTH_LESS_INDENT(i) (DUMP_WIDTH - ((i - (i > 6 ? 6 : i) + 3) / 4)) |
19 | ||
20 | #define SPACE(buf, pos, n) (sizeof(buf) - (pos) > (n)) | |
d02b48c6 | 21 | |
0f113f3e | 22 | int BIO_dump_cb(int (*cb) (const void *data, size_t len, void *u), |
807989df | 23 | void *u, const void *s, int len) |
0f113f3e MC |
24 | { |
25 | return BIO_dump_indent_cb(cb, u, s, len, 0); | |
26 | } | |
ca1e465f | 27 | |
0f113f3e | 28 | int BIO_dump_indent_cb(int (*cb) (const void *data, size_t len, void *u), |
807989df | 29 | void *u, const void *v, int len, int indent) |
0f113f3e | 30 | { |
807989df | 31 | const unsigned char *s = v; |
0f113f3e | 32 | int ret = 0; |
59e539e6 | 33 | char buf[288 + 1]; |
ada22597 | 34 | int i, j, rows, n; |
0f113f3e MC |
35 | unsigned char ch; |
36 | int dump_width; | |
bb1a915c | 37 | |
0f113f3e MC |
38 | if (indent < 0) |
39 | indent = 0; | |
a6105ef4 KR |
40 | else if (indent > 64) |
41 | indent = 64; | |
0f113f3e MC |
42 | |
43 | dump_width = DUMP_WIDTH_LESS_INDENT(indent); | |
59e539e6 | 44 | rows = len / dump_width; |
0f113f3e MC |
45 | if ((rows * dump_width) < len) |
46 | rows++; | |
47 | for (i = 0; i < rows; i++) { | |
59e539e6 P |
48 | n = BIO_snprintf(buf, sizeof(buf), "%*s%04x - ", indent, "", |
49 | i * dump_width); | |
0f113f3e | 50 | for (j = 0; j < dump_width; j++) { |
59e539e6 P |
51 | if (SPACE(buf, n, 3)) { |
52 | if (((i * dump_width) + j) >= len) { | |
53 | strcpy(buf + n, " "); | |
54 | } else { | |
807989df | 55 | ch = *(s + i * dump_width + j) & 0xff; |
59e539e6 P |
56 | BIO_snprintf(buf + n, 4, "%02x%c", ch, |
57 | j == 7 ? '-' : ' '); | |
58 | } | |
59 | n += 3; | |
0f113f3e MC |
60 | } |
61 | } | |
59e539e6 P |
62 | if (SPACE(buf, n, 2)) { |
63 | strcpy(buf + n, " "); | |
64 | n += 2; | |
65 | } | |
0f113f3e MC |
66 | for (j = 0; j < dump_width; j++) { |
67 | if (((i * dump_width) + j) >= len) | |
68 | break; | |
59e539e6 | 69 | if (SPACE(buf, n, 1)) { |
807989df | 70 | ch = *(s + i * dump_width + j) & 0xff; |
a53955d8 | 71 | #ifndef CHARSET_EBCDIC |
59e539e6 | 72 | buf[n++] = ((ch >= ' ') && (ch <= '~')) ? ch : '.'; |
a53955d8 | 73 | #else |
59e539e6 P |
74 | buf[n++] = ((ch >= os_toascii[' ']) && (ch <= os_toascii['~'])) |
75 | ? os_toebcdic[ch] | |
76 | : '.'; | |
a53955d8 | 77 | #endif |
59e539e6 P |
78 | buf[n] = '\0'; |
79 | } | |
80 | } | |
81 | if (SPACE(buf, n, 1)) { | |
82 | buf[n++] = '\n'; | |
83 | buf[n] = '\0'; | |
0f113f3e | 84 | } |
0f113f3e MC |
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 | */ | |
59e539e6 | 89 | ret += cb((void *)buf, n, u); |
0f113f3e | 90 | } |
59e539e6 | 91 | return ret; |
0f113f3e | 92 | } |
bb1a915c | 93 | |
4b618848 | 94 | #ifndef OPENSSL_NO_STDIO |
bb1a915c | 95 | static int write_fp(const void *data, size_t len, void *fp) |
0f113f3e MC |
96 | { |
97 | return UP_fwrite(data, len, 1, fp); | |
98 | } | |
99 | ||
807989df | 100 | int BIO_dump_fp(FILE *fp, const void *s, int len) |
0f113f3e MC |
101 | { |
102 | return BIO_dump_cb(write_fp, fp, s, len); | |
103 | } | |
104 | ||
807989df | 105 | int BIO_dump_indent_fp(FILE *fp, const void *s, int len, int indent) |
0f113f3e MC |
106 | { |
107 | return BIO_dump_indent_cb(write_fp, fp, s, len, indent); | |
108 | } | |
bb1a915c RL |
109 | #endif |
110 | ||
111 | static int write_bio(const void *data, size_t len, void *bp) | |
0f113f3e MC |
112 | { |
113 | return BIO_write((BIO *)bp, (const char *)data, len); | |
114 | } | |
115 | ||
807989df | 116 | int BIO_dump(BIO *bp, const void *s, int len) |
0f113f3e MC |
117 | { |
118 | return BIO_dump_cb(write_bio, bp, s, len); | |
119 | } | |
120 | ||
807989df | 121 | int BIO_dump_indent(BIO *bp, const void *s, int len, int indent) |
0f113f3e MC |
122 | { |
123 | return BIO_dump_indent_cb(write_bio, bp, s, len, indent); | |
124 | } | |
bb1a915c | 125 | |
807989df | 126 | int BIO_hex_string(BIO *out, int indent, int width, const void *data, |
0f113f3e MC |
127 | int datalen) |
128 | { | |
807989df | 129 | const unsigned char *d = data; |
0f113f3e | 130 | int i, j = 0; |
b263f212 | 131 | |
0f113f3e MC |
132 | if (datalen < 1) |
133 | return 1; | |
b263f212 | 134 | |
0f113f3e MC |
135 | for (i = 0; i < datalen - 1; i++) { |
136 | if (i && !j) | |
137 | BIO_printf(out, "%*s", indent, ""); | |
b263f212 | 138 | |
807989df | 139 | BIO_printf(out, "%02X:", d[i]); |
b263f212 | 140 | |
0f113f3e MC |
141 | j = (j + 1) % width; |
142 | if (!j) | |
143 | BIO_printf(out, "\n"); | |
144 | } | |
b263f212 | 145 | |
0f113f3e MC |
146 | if (i && !j) |
147 | BIO_printf(out, "%*s", indent, ""); | |
807989df | 148 | BIO_printf(out, "%02X", d[datalen - 1]); |
0f113f3e MC |
149 | return 1; |
150 | } |