← Index
NYTProf Performance Profile   « line view »
For rbm/rbm
  Run on Wed Feb 12 03:38:15 2020
Reported on Wed Feb 12 04:56:36 2020

Filename/usr/lib/x86_64-linux-gnu/perl5/5.28/Digest/SHA.pm
StatementsExecuted 28 statements in 3.58ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
802031185s185sDigest::SHA::::sha256_hexDigest::SHA::sha256_hex (xsub)
111438µs440µsDigest::SHA::::BEGIN@9Digest::SHA::BEGIN@9
11116µs19µsDigest::SHA::::BEGIN@5Digest::SHA::BEGIN@5
11110µs12µsDigest::SHA::::BEGIN@192Digest::SHA::BEGIN@192
1118µs40µsDigest::SHA::::BEGIN@8Digest::SHA::BEGIN@8
1117µs58µsDigest::SHA::::BEGIN@7Digest::SHA::BEGIN@7
1116µs26µsDigest::SHA::::BEGIN@6Digest::SHA::BEGIN@6
1114µs4µsDigest::SHA::::BEGIN@55Digest::SHA::BEGIN@55
0000s0sDigest::SHA::::_addfileDigest::SHA::_addfile
0000s0sDigest::SHA::::_bailDigest::SHA::_bail
0000s0sDigest::SHA::::_istextDigest::SHA::_istext
0000s0sDigest::SHA::::add_bitsDigest::SHA::add_bits
0000s0sDigest::SHA::::addfileDigest::SHA::addfile
0000s0sDigest::SHA::::dumpDigest::SHA::dump
0000s0sDigest::SHA::::getstateDigest::SHA::getstate
0000s0sDigest::SHA::::loadDigest::SHA::load
0000s0sDigest::SHA::::newDigest::SHA::new
0000s0sDigest::SHA::::putstateDigest::SHA::putstate
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Digest::SHA;
2
3115µsrequire 5.003000;
4
5223µs222µs
# spent 19µs (16+3) within Digest::SHA::BEGIN@5 which was called: # once (16µs+3µs) by RBM::BEGIN@21 at line 5
use strict;
# spent 19µs making 1 call to Digest::SHA::BEGIN@5 # spent 3µs making 1 call to strict::import
6224µs247µs
# spent 26µs (6+20) within Digest::SHA::BEGIN@6 which was called: # once (6µs+20µs) by RBM::BEGIN@21 at line 6
use warnings;
# spent 26µs making 1 call to Digest::SHA::BEGIN@6 # spent 20µs making 1 call to warnings::import
7228µs2109µs
# spent 58µs (7+51) within Digest::SHA::BEGIN@7 which was called: # once (7µs+51µs) by RBM::BEGIN@21 at line 7
use vars qw($VERSION @ISA @EXPORT_OK $errmsg);
# spent 58µs making 1 call to Digest::SHA::BEGIN@7 # spent 51µs making 1 call to vars::import
8224µs272µs
# spent 40µs (8+32) within Digest::SHA::BEGIN@8 which was called: # once (8µs+32µs) by RBM::BEGIN@21 at line 8
use Fcntl qw(O_RDONLY O_RDWR);
# spent 40µs making 1 call to Digest::SHA::BEGIN@8 # spent 32µs making 1 call to Exporter::import
92604µs2442µs
# spent 440µs (438+2) within Digest::SHA::BEGIN@9 which was called: # once (438µs+2µs) by RBM::BEGIN@21 at line 9
use integer;
# spent 440µs making 1 call to Digest::SHA::BEGIN@9 # spent 2µs making 1 call to integer::import
10
111300ns$VERSION = '6.02';
12
131400nsrequire Exporter;
1416µs@ISA = qw(Exporter);
1514µs@EXPORT_OK = qw(
16 $errmsg
17 hmac_sha1 hmac_sha1_base64 hmac_sha1_hex
18 hmac_sha224 hmac_sha224_base64 hmac_sha224_hex
19 hmac_sha256 hmac_sha256_base64 hmac_sha256_hex
20 hmac_sha384 hmac_sha384_base64 hmac_sha384_hex
21 hmac_sha512 hmac_sha512_base64 hmac_sha512_hex
22 hmac_sha512224 hmac_sha512224_base64 hmac_sha512224_hex
23 hmac_sha512256 hmac_sha512256_base64 hmac_sha512256_hex
24 sha1 sha1_base64 sha1_hex
25 sha224 sha224_base64 sha224_hex
26 sha256 sha256_base64 sha256_hex
27 sha384 sha384_base64 sha384_hex
28 sha512 sha512_base64 sha512_hex
29 sha512224 sha512224_base64 sha512224_hex
30 sha512256 sha512256_base64 sha512256_hex);
31
32# Inherit from Digest::base if possible
33
341400nseval {
3511.05ms require Digest::base;
3619µs push(@ISA, 'Digest::base');
37};
38
39# The following routines aren't time-critical, so they can be left in Perl
40
41sub new {
42 my($class, $alg) = @_;
43 $alg =~ s/\D+//g if defined $alg;
44 if (ref($class)) { # instance method
45 if (!defined($alg) || ($alg == $class->algorithm)) {
46 sharewind($class);
47 return($class);
48 }
49 return shainit($class, $alg) ? $class : undef;
50 }
51 $alg = 1 unless defined $alg;
52 return $class->newSHA($alg);
53}
54
551821µs14µs
# spent 4µs within Digest::SHA::BEGIN@55 which was called: # once (4µs+0s) by RBM::BEGIN@21 at line 55
BEGIN { *reset = \&new }
# spent 4µs making 1 call to Digest::SHA::BEGIN@55
56
57sub add_bits {
58 my($self, $data, $nbits) = @_;
59 unless (defined $nbits) {
60 $nbits = length($data);
61 $data = pack("B*", $data);
62 }
63 $nbits = length($data) * 8 if $nbits > length($data) * 8;
64 shawrite($data, $nbits, $self);
65 return($self);
66}
67
68sub _bail {
69 my $msg = shift;
70
71 $errmsg = $!;
72 $msg .= ": $!";
73 require Carp;
74 Carp::croak($msg);
75}
76
77{
781300ns my $_can_T_filehandle;
79
80 sub _istext {
81 local *FH = shift;
82 my $file = shift;
83
84 if (! defined $_can_T_filehandle) {
85 local $^W = 0;
86 my $istext = eval { -T FH };
87 $_can_T_filehandle = $@ ? 0 : 1;
88 return $_can_T_filehandle ? $istext : -T $file;
89 }
90 return $_can_T_filehandle ? -T FH : -T $file;
91 }
92}
93
941200nssub _addfile {
95 my ($self, $handle) = @_;
96
97 my $n;
98 my $buf = "";
99
100 while (($n = read($handle, $buf, 4096))) {
101 $self->add($buf);
102 }
103 _bail("Read failed") unless defined $n;
104
105 $self;
106}
107
108sub addfile {
109 my ($self, $file, $mode) = @_;
110
111 return(_addfile($self, $file)) unless ref(\$file) eq 'SCALAR';
112
113 $mode = defined($mode) ? $mode : "";
114 my ($binary, $UNIVERSAL, $BITS) =
115 map { $_ eq $mode } ("b", "U", "0");
116
117 ## Always interpret "-" to mean STDIN; otherwise use
118 ## sysopen to handle full range of POSIX file names.
119 ## If $file is a directory, force an EISDIR error
120 ## by attempting to open with mode O_RDWR
121
122 local *FH;
123 $file eq '-' and open(FH, '< -')
124 or sysopen(FH, $file, -d $file ? O_RDWR : O_RDONLY)
125 or _bail('Open failed');
126
127 if ($BITS) {
128 my ($n, $buf) = (0, "");
129 while (($n = read(FH, $buf, 4096))) {
130 $buf =~ tr/01//cd;
131 $self->add_bits($buf);
132 }
133 _bail("Read failed") unless defined $n;
134 close(FH);
135 return($self);
136 }
137
138 binmode(FH) if $binary || $UNIVERSAL;
139 if ($UNIVERSAL && _istext(*FH, $file)) {
140 $self->_addfileuniv(*FH);
141 }
142 else { $self->_addfilebin(*FH) }
143 close(FH);
144
145 $self;
146}
147
148sub getstate {
149 my $self = shift;
150
151 my $alg = $self->algorithm or return;
152 my $state = $self->_getstate or return;
153 my $nD = $alg <= 256 ? 8 : 16;
154 my $nH = $alg <= 256 ? 32 : 64;
155 my $nB = $alg <= 256 ? 64 : 128;
156 my($H, $block, $blockcnt, $lenhh, $lenhl, $lenlh, $lenll) =
157 $state =~ /^(.{$nH})(.{$nB})(.{4})(.{4})(.{4})(.{4})(.{4})$/s;
158 for ($alg, $H, $block, $blockcnt, $lenhh, $lenhl, $lenlh, $lenll) {
159 return unless defined $_;
160 }
161
162 my @s = ();
163 push(@s, "alg:" . $alg);
164 push(@s, "H:" . join(":", unpack("H*", $H) =~ /.{$nD}/g));
165 push(@s, "block:" . join(":", unpack("H*", $block) =~ /.{2}/g));
166 push(@s, "blockcnt:" . unpack("N", $blockcnt));
167 push(@s, "lenhh:" . unpack("N", $lenhh));
168 push(@s, "lenhl:" . unpack("N", $lenhl));
169 push(@s, "lenlh:" . unpack("N", $lenlh));
170 push(@s, "lenll:" . unpack("N", $lenll));
171 join("\n", @s) . "\n";
172}
173
174sub putstate {
175 my($class, $state) = @_;
176
177 my %s = ();
178 for (split(/\n/, $state)) {
179 s/^\s+//;
180 s/\s+$//;
181 next if (/^(#|$)/);
182 my @f = split(/[:\s]+/);
183 my $tag = shift(@f);
184 $s{$tag} = join('', @f);
185 }
186
187 # H and block may contain arbitrary values, but check everything else
188 grep { $_ == $s{'alg'} } (1,224,256,384,512,512224,512256) or return;
189 length($s{'H'}) == ($s{'alg'} <= 256 ? 64 : 128) or return;
190 length($s{'block'}) == ($s{'alg'} <= 256 ? 128 : 256) or return;
191 {
1922334µs214µs
# spent 12µs (10+2) within Digest::SHA::BEGIN@192 which was called: # once (10µs+2µs) by RBM::BEGIN@21 at line 192
no integer;
# spent 12µs making 1 call to Digest::SHA::BEGIN@192 # spent 2µs making 1 call to integer::unimport
193 for (qw(blockcnt lenhh lenhl lenlh lenll)) {
194 0 <= $s{$_} or return;
195 $s{$_} <= 4294967295 or return;
196 }
197 $s{'blockcnt'} < ($s{'alg'} <= 256 ? 512 : 1024) or return;
198 }
199
200 my $packed_state = (
201 pack("H*", $s{'H'}) .
202 pack("H*", $s{'block'}) .
203 pack("N", $s{'blockcnt'}) .
204 pack("N", $s{'lenhh'}) .
205 pack("N", $s{'lenhl'}) .
206 pack("N", $s{'lenlh'}) .
207 pack("N", $s{'lenll'})
208 );
209
210 return $class->new($s{'alg'})->_putstate($packed_state);
211}
212
213sub dump {
214 my $self = shift;
215 my $file = shift;
216
217 my $state = $self->getstate or return;
218 $file = "-" if (!defined($file) || $file eq "");
219
220 local *FH;
221 open(FH, "> $file") or return;
222 print FH $state;
223 close(FH);
224
225 return($self);
226}
227
228sub load {
229 my $class = shift;
230 my $file = shift;
231
232 $file = "-" if (!defined($file) || $file eq "");
233
234 local *FH;
235 open(FH, "< $file") or return;
236 my $str = join('', <FH>);
237 close(FH);
238
239 $class->putstate($str);
240}
241
242eval {
2431700ns require XSLoader;
2441627µs1619µs XSLoader::load('Digest::SHA', $VERSION);
# spent 619µs making 1 call to XSLoader::load
2451600ns 1;
2461700ns} or do {
247 require DynaLoader;
248 push @ISA, 'DynaLoader';
249 Digest::SHA->bootstrap($VERSION);
250};
251
252112µs1;
253__END__
 
# spent 185s within Digest::SHA::sha256_hex which was called 8020 times, avg 23.1ms/call: # 4038 times (76.9ms+0s) by RBM::__ANON__[rbm/lib/RBM.pm:655] at line 654 of /root/tor-browser-build/rbm/lib/RBM.pm, avg 19µs/call # 1992 times (185s+0s) by RBM::input_file_need_dl at line 718 of /root/tor-browser-build/rbm/lib/RBM.pm, avg 93.0ms/call # 1990 times (17.6ms+0s) by RBM::input_files at line 964 of /root/tor-browser-build/rbm/lib/RBM.pm, avg 9µs/call
sub Digest::SHA::sha256_hex; # xsub