]>
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 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
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 void *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 void *v
, int len
, int indent
)
31 const unsigned char *s
= v
;
43 dump_width
= DUMP_WIDTH_LESS_INDENT(indent
);
44 rows
= len
/ dump_width
;
45 if ((rows
* dump_width
) < len
)
47 for (i
= 0; i
< rows
; i
++) {
48 n
= BIO_snprintf(buf
, sizeof(buf
), "%*s%04x - ", indent
, "",
50 for (j
= 0; j
< dump_width
; j
++) {
51 if (SPACE(buf
, n
, 3)) {
52 if (((i
* dump_width
) + j
) >= len
) {
55 ch
= *(s
+ i
* dump_width
+ j
) & 0xff;
56 BIO_snprintf(buf
+ n
, 4, "%02x%c", ch
,
62 if (SPACE(buf
, n
, 2)) {
66 for (j
= 0; j
< dump_width
; j
++) {
67 if (((i
* dump_width
) + j
) >= len
)
69 if (SPACE(buf
, n
, 1)) {
70 ch
= *(s
+ i
* dump_width
+ j
) & 0xff;
71 #ifndef CHARSET_EBCDIC
72 buf
[n
++] = ((ch
>= ' ') && (ch
<= '~')) ? ch
: '.';
74 buf
[n
++] = ((ch
>= os_toascii
[' ']) && (ch
<= os_toascii
['~']))
81 if (SPACE(buf
, n
, 1)) {
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
89 ret
+= cb((void *)buf
, n
, u
);
94 #ifndef OPENSSL_NO_STDIO
95 static int write_fp(const void *data
, size_t len
, void *fp
)
97 return UP_fwrite(data
, len
, 1, fp
);
100 int BIO_dump_fp(FILE *fp
, const void *s
, int len
)
102 return BIO_dump_cb(write_fp
, fp
, s
, len
);
105 int BIO_dump_indent_fp(FILE *fp
, const void *s
, int len
, int indent
)
107 return BIO_dump_indent_cb(write_fp
, fp
, s
, len
, indent
);
111 static int write_bio(const void *data
, size_t len
, void *bp
)
113 return BIO_write((BIO
*)bp
, (const char *)data
, len
);
116 int BIO_dump(BIO
*bp
, const void *s
, int len
)
118 return BIO_dump_cb(write_bio
, bp
, s
, len
);
121 int BIO_dump_indent(BIO
*bp
, const void *s
, int len
, int indent
)
123 return BIO_dump_indent_cb(write_bio
, bp
, s
, len
, indent
);
126 int BIO_hex_string(BIO
*out
, int indent
, int width
, const void *data
,
129 const unsigned char *d
= data
;
135 for (i
= 0; i
< datalen
- 1; i
++) {
137 BIO_printf(out
, "%*s", indent
, "");
139 BIO_printf(out
, "%02X:", d
[i
]);
143 BIO_printf(out
, "\n");
147 BIO_printf(out
, "%*s", indent
, "");
148 BIO_printf(out
, "%02X", d
[datalen
- 1]);