]>
git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/bio/b_dump.c
2 * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the OpenSSL license (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
11 * Stolen from tjh's ssl/ssl_trc.c stuff.
18 #define DUMP_WIDTH_LESS_INDENT(i) (DUMP_WIDTH - ((i - (i > 6 ? 6 : i) + 3) / 4))
20 #define SPACE(buf, pos, n) (sizeof(buf) - (pos) > (n))
22 int BIO_dump_cb(int (*cb
) (const void *data
, size_t len
, void *u
),
23 void *u
, const char *s
, int len
)
25 return BIO_dump_indent_cb(cb
, u
, s
, len
, 0);
28 int BIO_dump_indent_cb(int (*cb
) (const void *data
, size_t len
, void *u
),
29 void *u
, const char *s
, int len
, int indent
)
39 else if (indent
> 128)
42 dump_width
= DUMP_WIDTH_LESS_INDENT(indent
);
43 rows
= len
/ dump_width
;
44 if ((rows
* dump_width
) < len
)
46 for (i
= 0; i
< rows
; i
++) {
47 n
= BIO_snprintf(buf
, sizeof(buf
), "%*s%04x - ", indent
, "",
49 for (j
= 0; j
< dump_width
; j
++) {
50 if (SPACE(buf
, n
, 3)) {
51 if (((i
* dump_width
) + j
) >= len
) {
54 ch
= ((unsigned char)*(s
+ i
* dump_width
+ j
)) & 0xff;
55 BIO_snprintf(buf
+ n
, 4, "%02x%c", ch
,
61 if (SPACE(buf
, n
, 2)) {
65 for (j
= 0; j
< dump_width
; j
++) {
66 if (((i
* dump_width
) + j
) >= len
)
68 if (SPACE(buf
, n
, 1)) {
69 ch
= ((unsigned char)*(s
+ i
* dump_width
+ j
)) & 0xff;
70 #ifndef CHARSET_EBCDIC
71 buf
[n
++] = ((ch
>= ' ') && (ch
<= '~')) ? ch
: '.';
73 buf
[n
++] = ((ch
>= os_toascii
[' ']) && (ch
<= os_toascii
['~']))
80 if (SPACE(buf
, n
, 1)) {
85 * if this is the last call then update the ddt_dump thing so that we
86 * will move the selection point in the debug window
88 ret
+= cb((void *)buf
, n
, u
);
93 #ifndef OPENSSL_NO_STDIO
94 static int write_fp(const void *data
, size_t len
, void *fp
)
96 return UP_fwrite(data
, len
, 1, fp
);
99 int BIO_dump_fp(FILE *fp
, const char *s
, int len
)
101 return BIO_dump_cb(write_fp
, fp
, s
, len
);
104 int BIO_dump_indent_fp(FILE *fp
, const char *s
, int len
, int indent
)
106 return BIO_dump_indent_cb(write_fp
, fp
, s
, len
, indent
);
110 static int write_bio(const void *data
, size_t len
, void *bp
)
112 return BIO_write((BIO
*)bp
, (const char *)data
, len
);
115 int BIO_dump(BIO
*bp
, const char *s
, int len
)
117 return BIO_dump_cb(write_bio
, bp
, s
, len
);
120 int BIO_dump_indent(BIO
*bp
, const char *s
, int len
, int indent
)
122 return BIO_dump_indent_cb(write_bio
, bp
, s
, len
, indent
);
125 int BIO_hex_string(BIO
*out
, int indent
, int width
, unsigned char *data
,
133 for (i
= 0; i
< datalen
- 1; i
++) {
135 BIO_printf(out
, "%*s", indent
, "");
137 BIO_printf(out
, "%02X:", data
[i
]);
141 BIO_printf(out
, "\n");
145 BIO_printf(out
, "%*s", indent
, "");
146 BIO_printf(out
, "%02X", data
[datalen
- 1]);