aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ssl/src/ssl_debug.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ssl/src/ssl_debug.erl')
-rw-r--r--lib/ssl/src/ssl_debug.erl99
1 files changed, 99 insertions, 0 deletions
diff --git a/lib/ssl/src/ssl_debug.erl b/lib/ssl/src/ssl_debug.erl
new file mode 100644
index 0000000000..625889c43b
--- /dev/null
+++ b/lib/ssl/src/ssl_debug.erl
@@ -0,0 +1,99 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%
+
+%%% Purpose : some debug utilities
+
+-module(ssl_debug).
+
+-export([unhex/1, hexd/1, hex_data/2, term_data/2, hex_data/4, term_data/4, make_binary/1]).
+
+%% external
+
+hex_data(Name, Data) ->
+ io:format("~s\n~s", [Name, hex(Data)]).
+
+term_data(Name, Term) ->
+ io:format("~s\n~p\n", [Name, Term]).
+
+hex_data(Name, Data, Mod, Line) ->
+ io:format("~w:~p ~s\n~s", [Mod, Line, Name, hex(Data)]).
+
+term_data(Name, Term, Mod, Line) ->
+ io:format("~w:~p ~s\n~p\n", [Mod, Line, Name, Term]).
+
+unhex(S) ->
+ Lines = string:tokens(S, "\n"),
+ H = [unhex(L, []) || L <- Lines],
+ list_to_binary(H).
+
+make_binary(Size) ->
+ crypto:rand_bytes(Size).
+
+%% internal
+
+is_hex_digit(C) when C >= $0, C =< $9 -> true;
+is_hex_digit(C) when C >= $A, C =< $F -> true;
+is_hex_digit(C) when C >= $a, C =< $f -> true;
+is_hex_digit(_) -> false.
+
+unhex([], Acc) ->
+ list_to_binary(lists:reverse(Acc));
+unhex([_], Acc) ->
+ unhex([], Acc);
+unhex([$ | Tl], Acc) ->
+ unhex(Tl, Acc);
+unhex([D1, D2 | Tl], Acc) ->
+ case {is_hex_digit(D1), is_hex_digit(D2)} of
+ {true, true} ->
+ unhex(Tl, [erlang:list_to_integer([D1, D2], 16) | Acc]);
+ _ ->
+ unhex([], Acc)
+ end.
+
+hexd(B) ->
+ io:format("~s\n", [hex(B)]).
+
+hex(B) -> hex(erlang:iolist_to_binary(B), []).
+
+hex_asc(B) ->
+ L = binary_to_list(B),
+ {hexify(L), asciify(L)}.
+
+hex(<<B:16/binary, Rest/binary>>, Acc) ->
+ {HS, AS} = hex_asc(B),
+ hex(Rest, ["\n", AS, " ", HS | Acc]);
+hex(<<>>, Acc) ->
+ lists:reverse(Acc);
+hex(B, Acc) ->
+ {HS, AS} = hex_asc(B),
+ L = erlang:iolist_size(HS),
+ lists:flatten(lists:reverse(Acc, [HS, lists:duplicate(3*16 - L, $ ), " ", AS, "\n"])).
+
+hexify(L) -> [[hex_byte(B), " "] || B <- L].
+
+hex_byte(B) when B < 16#10 -> ["0", erlang:integer_to_list(B, 16)];
+hex_byte(B) -> erlang:integer_to_list(B, 16).
+
+asciify(L) -> [ascii_byte(C) || C <- L].
+
+ascii_byte($") -> $.;
+ascii_byte(C) when C < 32; C >= 127 -> $.;
+ascii_byte(C) -> C.