grpc
third_party
boringssl-with-bazel
src
crypto
bio
hexdump.c
Go to the documentation of this file.
1
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2
* All rights reserved.
3
*
4
* This package is an SSL implementation written
5
* by Eric Young (eay@cryptsoft.com).
6
* The implementation was written so as to conform with Netscapes SSL.
7
*
8
* This library is free for commercial and non-commercial use as long as
9
* the following conditions are aheared to. The following conditions
10
* apply to all code found in this distribution, be it the RC4, RSA,
11
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
12
* included with this distribution is covered by the same copyright terms
13
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
14
*
15
* Copyright remains Eric Young's, and as such any Copyright notices in
16
* the code are not to be removed.
17
* If this package is used in a product, Eric Young should be given attribution
18
* as the author of the parts of the library used.
19
* This can be in the form of a textual message at program startup or
20
* in documentation (online or textual) provided with the package.
21
*
22
* Redistribution and use in source and binary forms, with or without
23
* modification, are permitted provided that the following conditions
24
* are met:
25
* 1. Redistributions of source code must retain the copyright
26
* notice, this list of conditions and the following disclaimer.
27
* 2. Redistributions in binary form must reproduce the above copyright
28
* notice, this list of conditions and the following disclaimer in the
29
* documentation and/or other materials provided with the distribution.
30
* 3. All advertising materials mentioning features or use of this software
31
* must display the following acknowledgement:
32
* "This product includes cryptographic software written by
33
* Eric Young (eay@cryptsoft.com)"
34
* The word 'cryptographic' can be left out if the rouines from the library
35
* being used are not cryptographic related :-).
36
* 4. If you include any Windows specific code (or a derivative thereof) from
37
* the apps directory (application code) you must include an acknowledgement:
38
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39
*
40
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50
* SUCH DAMAGE.
51
*
52
* The licence and distribution terms for any publically available version or
53
* derivative of this code cannot be changed. i.e. this code cannot simply be
54
* copied and put under another distribution licence
55
* [including the GNU Public Licence.] */
56
57
#include <
openssl/bio.h
>
58
59
#include <limits.h>
60
#include <
string.h
>
61
62
#include "../internal.h"
63
64
65
// hexdump_ctx contains the state of a hexdump.
66
struct
hexdump_ctx
{
67
BIO
*
bio
;
68
char
right_chars
[18];
// the contents of the right-hand side, ASCII dump.
69
unsigned
used
;
// number of bytes in the current line.
70
size_t
n
;
// number of bytes total.
71
unsigned
indent
;
72
};
73
74
static
void
hexbyte
(
char
*
out
,
uint8_t
b
) {
75
static
const
char
hextable
[] =
"0123456789abcdef"
;
76
out
[0] =
hextable
[
b
>>4];
77
out
[1] =
hextable
[
b
&0x0f];
78
}
79
80
static
char
to_char
(
uint8_t
b
) {
81
if
(b < 32 || b > 126) {
82
return
'.'
;
83
}
84
return
b
;
85
}
86
87
// hexdump_write adds |len| bytes of |data| to the current hex dump described by
88
// |ctx|.
89
static
int
hexdump_write
(
struct
hexdump_ctx
*
ctx
,
const
uint8_t
*
data
,
90
size_t
len
) {
91
char
buf
[10];
92
unsigned
l
;
93
94
// Output lines look like:
95
// 00000010 2e 2f 30 31 32 33 34 35 36 37 38 ... 3c 3d // |./0123456789:;<=|
96
// ^ offset ^ extra space ^ ASCII of line
97
98
for
(
size_t
i
= 0;
i
<
len
;
i
++) {
99
if
(
ctx
->used == 0) {
100
// The beginning of a line.
101
BIO_indent
(
ctx
->bio,
ctx
->indent, UINT_MAX);
102
103
hexbyte
(&
buf
[0],
ctx
->n >> 24);
104
hexbyte
(&
buf
[2],
ctx
->n >> 16);
105
hexbyte
(&
buf
[4],
ctx
->n >> 8);
106
hexbyte
(&
buf
[6],
ctx
->n);
107
buf
[8] =
buf
[9] =
' '
;
108
if
(
BIO_write
(
ctx
->bio,
buf
, 10) < 0) {
109
return
0;
110
}
111
}
112
113
hexbyte
(
buf
,
data
[
i
]);
114
buf
[2] =
' '
;
115
l
= 3;
116
if
(
ctx
->used == 7) {
117
// There's an additional space after the 8th byte.
118
buf
[3] =
' '
;
119
l
= 4;
120
}
else
if
(
ctx
->used == 15) {
121
// At the end of the line there's an extra space and the bar for the
122
// right column.
123
buf
[3] =
' '
;
124
buf
[4] =
'|'
;
125
l
= 5;
126
}
127
128
if
(
BIO_write
(
ctx
->bio,
buf
,
l
) < 0) {
129
return
0;
130
}
131
ctx
->right_chars[
ctx
->used] =
to_char
(
data
[
i
]);
132
ctx
->used++;
133
ctx
->n++;
134
if
(
ctx
->used == 16) {
135
ctx
->right_chars[16] =
'|'
;
136
ctx
->right_chars[17] =
'\n'
;
137
if
(
BIO_write
(
ctx
->bio,
ctx
->right_chars,
sizeof
(
ctx
->right_chars)) < 0) {
138
return
0;
139
}
140
ctx
->used = 0;
141
}
142
}
143
144
return
1;
145
}
146
147
// finish flushes any buffered data in |ctx|.
148
static
int
finish
(
struct
hexdump_ctx
*
ctx
) {
149
// See the comments in |hexdump| for the details of this format.
150
const
unsigned
n_bytes =
ctx
->used;
151
unsigned
l
;
152
char
buf
[5];
153
154
if
(n_bytes == 0) {
155
return
1;
156
}
157
158
OPENSSL_memset
(
buf
,
' '
, 4);
159
buf
[4] =
'|'
;
160
161
for
(;
ctx
->used < 16;
ctx
->used++) {
162
l
= 3;
163
if
(
ctx
->used == 7) {
164
l
= 4;
165
}
else
if
(
ctx
->used == 15) {
166
l
= 5;
167
}
168
if
(
BIO_write
(
ctx
->bio,
buf
,
l
) < 0) {
169
return
0;
170
}
171
}
172
173
ctx
->right_chars[n_bytes] =
'|'
;
174
ctx
->right_chars[n_bytes + 1] =
'\n'
;
175
if
(
BIO_write
(
ctx
->bio,
ctx
->right_chars, n_bytes + 2) < 0) {
176
return
0;
177
}
178
return
1;
179
}
180
181
int
BIO_hexdump
(
BIO
*bio,
const
uint8_t
*
data
,
size_t
len
,
unsigned
indent
) {
182
struct
hexdump_ctx
ctx
;
183
OPENSSL_memset
(&
ctx
, 0,
sizeof
(
ctx
));
184
ctx
.bio =
bio
;
185
ctx
.indent =
indent
;
186
187
if
(!
hexdump_write
(&
ctx
,
data
,
len
) || !
finish
(&
ctx
)) {
188
return
0;
189
}
190
191
return
1;
192
}
hextable
static const char hextable[]
Definition:
boringssl-with-bazel/src/crypto/bn_extra/convert.c:77
gen_build_yaml.out
dictionary out
Definition:
src/benchmark/gen_build_yaml.py:24
hexdump_ctx::bio
BIO * bio
Definition:
hexdump.c:67
ctx
Definition:
benchmark-async.c:30
bio_st
Definition:
bio.h:822
finish
static int finish(struct hexdump_ctx *ctx)
Definition:
hexdump.c:148
bio.h
string.h
buf
voidpf void * buf
Definition:
bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
hexdump_ctx::right_chars
char right_chars[18]
Definition:
hexdump.c:68
BIO_write
#define BIO_write
Definition:
boringssl_prefix_symbols.h:870
python_utils.upload_rbe_results.indent
indent
Definition:
upload_rbe_results.py:183
to_char
static char to_char(uint8_t b)
Definition:
hexdump.c:80
uint8_t
unsigned char uint8_t
Definition:
stdint-msvc2008.h:78
OPENSSL_memset
static void * OPENSSL_memset(void *dst, int c, size_t n)
Definition:
third_party/boringssl-with-bazel/src/crypto/internal.h:835
hexdump_ctx::used
unsigned used
Definition:
hexdump.c:69
hexdump_ctx::n
size_t n
Definition:
hexdump.c:70
data
char data[kBufferLength]
Definition:
abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
b
uint64_t b
Definition:
abseil-cpp/absl/container/internal/layout_test.cc:53
hexdump_write
static int hexdump_write(struct hexdump_ctx *ctx, const uint8_t *data, size_t len)
Definition:
hexdump.c:89
hexdump_ctx
Definition:
hexdump.c:66
BIO_hexdump
int BIO_hexdump(BIO *bio, const uint8_t *data, size_t len, unsigned indent)
Definition:
hexdump.c:181
hexdump_ctx::indent
unsigned indent
Definition:
hexdump.c:71
len
int len
Definition:
abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
run_grpclb_interop_tests.l
dictionary l
Definition:
run_grpclb_interop_tests.py:410
hexbyte
static void hexbyte(char *out, uint8_t b)
Definition:
hexdump.c:74
BIO_indent
#define BIO_indent
Definition:
boringssl_prefix_symbols.h:801
i
uint64_t i
Definition:
abseil-cpp/absl/container/btree_benchmark.cc:230
grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:01