In perl.git, the branch blead has been updated <http://perl5.git.perl.org/perl.git/commitdiff/c6d5e1277b100f85c402b2be89d89710cdffb4b8?hp=85a0f84fd4faa2d4ab48b9c1da88b72c1ab72d33>
- Log ----------------------------------------------------------------- commit c6d5e1277b100f85c402b2be89d89710cdffb4b8 Author: Chris 'BinGOs' Williams <[email protected]> Date: Sun Jun 1 11:30:21 2014 +0100 Update Socket to CPAN version 2.014 [DELTA] 2.014 2014/06/01 00:09:13 [BUGFIXES] * Make sure to (UV)-cast arguments sprintf'ed with UVf * Use STRUCT_OFFSET() instead of plain C99 offsetof() (RT96036) * Fix the regexp used to filter for numeric IP addresses in fake_getaddrinfo() (RT95758) * Protect against getprotobyname() not being available (RT90217) M Porting/Maintainers.pl M cpan/Socket/Socket.pm M cpan/Socket/Socket.xs M cpan/Socket/t/getaddrinfo.t commit 207902b174bce23e6a15fc8e1c84389928c3db35 Author: Chris 'BinGOs' Williams <[email protected]> Date: Sun Jun 1 11:29:00 2014 +0100 Update Digest-SHA to CPAN version 5.92 [DELTA] 5.92 Sun Jun 1 00:15:44 MST 2014 - fixed reserved-word clash when compiling with C++ -- use 'classname' instead of 'class' -- ref. SHA.xs (rt.cpan.org #96090) - silenced MSC compiler warning about signed/unsigned comparison -- ref. SHA.xs (rt.cpan.org #95830) 5.91 Fri May 16 10:21:44 MST 2014 - restored original 'addfile' for use on opened file handles -- allows callbacks in place of actual files -- ref. IO::Callback (rt.cpan.org #95643) - re-established inheritance from Digest::base -- to pick up future Digest enhancements automatically - cleaned up documentation 5.90 Wed May 7 07:57:08 MST 2014 - consolidated all dynamic memory allocation into XSUBs -- streamlines referencing of SHA objects -- simplifies DESTROYing of objects - enhanced Makefile.PL to allow 'use warnings' -- automatically reverts to $^W for early Perls - scrubbed C and Perl code to remove all compiler warnings 5.89 Sat Apr 19 05:14:48 MST 2014 - added universal newlines mode ("U") to addfile and shasum -- based on Python Universal Newlines concept -- newlines identical across MacOS, DOS, and UNIX -- will deprecate portable mode ("p") in future -- "U" mode is cleaner and more efficient - enhanced performance -- reduced number of dynamic memory allocations -- sped up addfile method with use of C code -- ref. SHA.xs (_addfilebin and _addfileuniv) - eliminated experimental -M option in favor of new -R option -- reverses order of digest module preference -- undocumented: for test and development use only - sealed memory leak in SHA.xs -- arose only with SvPVbyte exceptions during eval - patched inheritence bug (ref: rt.cpan.org #94830) -- use sv_isobject/sv_derived_from instead of sv_isa - added 'allocated' flag to SHA structure (ref. src/sha.h) -- to guard against Perl double frees M MANIFEST M Porting/Maintainers.pl M cpan/Digest-SHA/Makefile.PL M cpan/Digest-SHA/SHA.xs M cpan/Digest-SHA/lib/Digest/SHA.pm M cpan/Digest-SHA/shasum M cpan/Digest-SHA/src/sha.c M cpan/Digest-SHA/src/sha.h M cpan/Digest-SHA/src/sha64bit.c M cpan/Digest-SHA/src/sha64bit.h A cpan/Digest-SHA/t/inheritance.t M cpan/Digest-SHA/t/methods.t M cpan/Digest-SHA/t/woodbury.t M cpan/Digest-SHA/typemap commit d5e64588cb11db6bd730a216490fb0402b21eb07 Author: Chris 'BinGOs' Williams <[email protected]> Date: Sun Jun 1 11:26:30 2014 +0100 Regen META files after CPAN-Meta update M META.json M META.yml commit b2b38e002648236af6529d77025a25ef7812aef0 Author: Chris 'BinGOs' Williams <[email protected]> Date: Sun Jun 1 11:22:45 2014 +0100 Update CPAN-Meta to CPAN version 2.141520 [DELTA] 2.141520 2014-05-31 23:41:13-04:00 America/New_York [DOCUMENTED] - Clarified use of 'file' for the 'provides' field in the Spec M Porting/Maintainers.pl M cpan/CPAN-Meta/lib/CPAN/Meta.pm M cpan/CPAN-Meta/lib/CPAN/Meta/Converter.pm M cpan/CPAN-Meta/lib/CPAN/Meta/Feature.pm M cpan/CPAN-Meta/lib/CPAN/Meta/History.pm M cpan/CPAN-Meta/lib/CPAN/Meta/Prereqs.pm M cpan/CPAN-Meta/lib/CPAN/Meta/Spec.pm M cpan/CPAN-Meta/lib/CPAN/Meta/Validator.pm ----------------------------------------------------------------------- Summary of changes: MANIFEST | 1 + META.json | 2 +- META.yml | 2 +- Porting/Maintainers.pl | 6 +- cpan/CPAN-Meta/lib/CPAN/Meta.pm | 4 +- cpan/CPAN-Meta/lib/CPAN/Meta/Converter.pm | 4 +- cpan/CPAN-Meta/lib/CPAN/Meta/Feature.pm | 4 +- cpan/CPAN-Meta/lib/CPAN/Meta/History.pm | 4 +- cpan/CPAN-Meta/lib/CPAN/Meta/Prereqs.pm | 4 +- cpan/CPAN-Meta/lib/CPAN/Meta/Spec.pm | 7 +- cpan/CPAN-Meta/lib/CPAN/Meta/Validator.pm | 4 +- cpan/Digest-SHA/Makefile.PL | 59 +++++-- cpan/Digest-SHA/SHA.xs | 270 +++++++++++++++++++++--------- cpan/Digest-SHA/lib/Digest/SHA.pm | 179 +++++++++----------- cpan/Digest-SHA/shasum | 66 ++++---- cpan/Digest-SHA/src/sha.c | 154 ++++++----------- cpan/Digest-SHA/src/sha.h | 18 +- cpan/Digest-SHA/src/sha64bit.c | 16 +- cpan/Digest-SHA/src/sha64bit.h | 5 +- cpan/Digest-SHA/t/inheritance.t | 31 ++++ cpan/Digest-SHA/t/methods.t | 13 +- cpan/Digest-SHA/t/woodbury.t | 16 +- cpan/Digest-SHA/typemap | 9 +- cpan/Socket/Socket.pm | 8 +- cpan/Socket/Socket.xs | 13 +- cpan/Socket/t/getaddrinfo.t | 9 +- 26 files changed, 519 insertions(+), 389 deletions(-) create mode 100644 cpan/Digest-SHA/t/inheritance.t diff --git a/MANIFEST b/MANIFEST index b112d2b..e6004bd 100644 --- a/MANIFEST +++ b/MANIFEST @@ -706,6 +706,7 @@ cpan/Digest-SHA/t/fips198.t See if Digest::SHA works cpan/Digest-SHA/t/gglong.t See if Digest::SHA works cpan/Digest-SHA/t/gg.t See if Digest::SHA works cpan/Digest-SHA/t/hmacsha.t See if Digest::SHA works +cpan/Digest-SHA/t/inheritance.t cpan/Digest-SHA/t/ireland.t See if Digest::SHA works cpan/Digest-SHA/t/methods.t See if Digest::SHA works cpan/Digest-SHA/t/nistbit.t See if Digest::SHA works diff --git a/META.json b/META.json index 9c6699a..2d45bd9 100644 --- a/META.json +++ b/META.json @@ -4,7 +4,7 @@ "[email protected]" ], "dynamic_config" : 1, - "generated_by" : "CPAN::Meta version 2.141170", + "generated_by" : "CPAN::Meta version 2.141520", "license" : [ "perl_5" ], diff --git a/META.yml b/META.yml index 7a80b80..3763fe5 100644 --- a/META.yml +++ b/META.yml @@ -4,7 +4,7 @@ author: - [email protected] build_requires: {} dynamic_config: 1 -generated_by: 'CPAN::Meta version 2.141170, CPAN::Meta::Converter version 2.141170' +generated_by: 'CPAN::Meta version 2.141520, CPAN::Meta::Converter version 2.141520' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl index 761bc3f..b3a17ca 100755 --- a/Porting/Maintainers.pl +++ b/Porting/Maintainers.pl @@ -279,7 +279,7 @@ use File::Glob qw(:case); # Note: When updating CPAN-Meta the META.* files will need to be regenerated # perl -Icpan/CPAN-Meta/lib Porting/makemeta 'CPAN::Meta' => { - 'DISTRIBUTION' => 'DAGOLDEN/CPAN-Meta-2.141170.tar.gz', + 'DISTRIBUTION' => 'DAGOLDEN/CPAN-Meta-2.141520.tar.gz', 'FILES' => q[cpan/CPAN-Meta], 'EXCLUDED' => [ qw[t/00-report-prereqs.t], @@ -359,7 +359,7 @@ use File::Glob qw(:case); }, 'Digest::SHA' => { - 'DISTRIBUTION' => 'MSHELOR/Digest-SHA-5.88.tar.gz', + 'DISTRIBUTION' => 'MSHELOR/Digest-SHA-5.92.tar.gz', 'FILES' => q[cpan/Digest-SHA], 'EXCLUDED' => [ qw( t/pod.t @@ -956,7 +956,7 @@ use File::Glob qw(:case); }, 'Socket' => { - 'DISTRIBUTION' => 'PEVANS/Socket-2.013.tar.gz', + 'DISTRIBUTION' => 'PEVANS/Socket-2.014.tar.gz', 'FILES' => q[cpan/Socket], }, diff --git a/cpan/CPAN-Meta/lib/CPAN/Meta.pm b/cpan/CPAN-Meta/lib/CPAN/Meta.pm index 17c74f6..1b6723f 100644 --- a/cpan/CPAN-Meta/lib/CPAN/Meta.pm +++ b/cpan/CPAN-Meta/lib/CPAN/Meta.pm @@ -2,7 +2,7 @@ use 5.006; use strict; use warnings; package CPAN::Meta; -our $VERSION = '2.141170'; # VERSION +our $VERSION = '2.141520'; # VERSION #pod =head1 SYNOPSIS #pod @@ -641,7 +641,7 @@ CPAN::Meta - the distribution metadata for a CPAN dist =head1 VERSION -version 2.141170 +version 2.141520 =head1 SYNOPSIS diff --git a/cpan/CPAN-Meta/lib/CPAN/Meta/Converter.pm b/cpan/CPAN-Meta/lib/CPAN/Meta/Converter.pm index 4917753..0b2d83c 100644 --- a/cpan/CPAN-Meta/lib/CPAN/Meta/Converter.pm +++ b/cpan/CPAN-Meta/lib/CPAN/Meta/Converter.pm @@ -2,7 +2,7 @@ use 5.006; use strict; use warnings; package CPAN::Meta::Converter; -our $VERSION = '2.141170'; # VERSION +our $VERSION = '2.141520'; # VERSION #pod =head1 SYNOPSIS #pod @@ -1475,7 +1475,7 @@ CPAN::Meta::Converter - Convert CPAN distribution metadata structures =head1 VERSION -version 2.141170 +version 2.141520 =head1 SYNOPSIS diff --git a/cpan/CPAN-Meta/lib/CPAN/Meta/Feature.pm b/cpan/CPAN-Meta/lib/CPAN/Meta/Feature.pm index 2014f86..52e3e93 100644 --- a/cpan/CPAN-Meta/lib/CPAN/Meta/Feature.pm +++ b/cpan/CPAN-Meta/lib/CPAN/Meta/Feature.pm @@ -2,7 +2,7 @@ use 5.006; use strict; use warnings; package CPAN::Meta::Feature; -our $VERSION = '2.141170'; # VERSION +our $VERSION = '2.141520'; # VERSION use CPAN::Meta::Prereqs; @@ -78,7 +78,7 @@ CPAN::Meta::Feature - an optional feature provided by a CPAN distribution =head1 VERSION -version 2.141170 +version 2.141520 =head1 DESCRIPTION diff --git a/cpan/CPAN-Meta/lib/CPAN/Meta/History.pm b/cpan/CPAN-Meta/lib/CPAN/Meta/History.pm index 33acc0a..c28273a 100644 --- a/cpan/CPAN-Meta/lib/CPAN/Meta/History.pm +++ b/cpan/CPAN-Meta/lib/CPAN/Meta/History.pm @@ -3,7 +3,7 @@ use 5.006; use strict; use warnings; package CPAN::Meta::History; -our $VERSION = '2.141170'; # VERSION +our $VERSION = '2.141520'; # VERSION 1; @@ -21,7 +21,7 @@ CPAN::Meta::History - history of CPAN Meta Spec changes =head1 VERSION -version 2.141170 +version 2.141520 =head1 DESCRIPTION diff --git a/cpan/CPAN-Meta/lib/CPAN/Meta/Prereqs.pm b/cpan/CPAN-Meta/lib/CPAN/Meta/Prereqs.pm index fe369fe..0535f74 100644 --- a/cpan/CPAN-Meta/lib/CPAN/Meta/Prereqs.pm +++ b/cpan/CPAN-Meta/lib/CPAN/Meta/Prereqs.pm @@ -2,7 +2,7 @@ use 5.006; use strict; use warnings; package CPAN::Meta::Prereqs; -our $VERSION = '2.141170'; # VERSION +our $VERSION = '2.141520'; # VERSION #pod =head1 DESCRIPTION #pod @@ -286,7 +286,7 @@ CPAN::Meta::Prereqs - a set of distribution prerequisites by phase and type =head1 VERSION -version 2.141170 +version 2.141520 =head1 DESCRIPTION diff --git a/cpan/CPAN-Meta/lib/CPAN/Meta/Spec.pm b/cpan/CPAN-Meta/lib/CPAN/Meta/Spec.pm index 1739de8..ce5eafb 100644 --- a/cpan/CPAN-Meta/lib/CPAN/Meta/Spec.pm +++ b/cpan/CPAN-Meta/lib/CPAN/Meta/Spec.pm @@ -7,7 +7,7 @@ use 5.006; use strict; use warnings; package CPAN::Meta::Spec; -our $VERSION = '2.141170'; # VERSION +our $VERSION = '2.141520'; # VERSION 1; @@ -28,7 +28,7 @@ CPAN::Meta::Spec - specification for CPAN distribution metadata =head1 VERSION -version 2.141170 +version 2.141520 =head1 SYNOPSIS @@ -696,7 +696,8 @@ have a Map with the following valid subkeys: This field is required. It must contain a Unix-style relative file path from the root of the distribution directory to a file that contains or -generates the package. +generates the package. It may be given as C<META.yml> or C<META.json> +to claim a package for indexing without needing a C<*.pm>. =item version diff --git a/cpan/CPAN-Meta/lib/CPAN/Meta/Validator.pm b/cpan/CPAN-Meta/lib/CPAN/Meta/Validator.pm index 748d1c6..21cf295 100644 --- a/cpan/CPAN-Meta/lib/CPAN/Meta/Validator.pm +++ b/cpan/CPAN-Meta/lib/CPAN/Meta/Validator.pm @@ -2,7 +2,7 @@ use 5.006; use strict; use warnings; package CPAN::Meta::Validator; -our $VERSION = '2.141170'; # VERSION +our $VERSION = '2.141520'; # VERSION #pod =head1 SYNOPSIS #pod @@ -997,7 +997,7 @@ CPAN::Meta::Validator - validate CPAN distribution metadata structures =head1 VERSION -version 2.141170 +version 2.141520 =head1 SYNOPSIS diff --git a/cpan/Digest-SHA/Makefile.PL b/cpan/Digest-SHA/Makefile.PL index 3d83865..8e882ca 100644 --- a/cpan/Digest-SHA/Makefile.PL +++ b/cpan/Digest-SHA/Makefile.PL @@ -5,14 +5,51 @@ use ExtUtils::MakeMaker; use Getopt::Std; use Config qw(%Config); +use vars qw($opt_t $opt_w $opt_x); + my $PM = 'lib/Digest/SHA.pm'; +my $SHASUM = 'shasum'; + + # 'use warnings' if possible, but stay portable -my %opts; -getopts('tx', \%opts); # -t is no longer used, but allow it anyway +my($use_warnings, @EDITs); +my $warn_1 = 'BEGIN { $^W = 1 }'; +my $warn_0 = 'BEGIN { $^W = 0 }'; +{ + eval "require warnings; import warnings"; + $use_warnings = $@ ? 0 : 1; + + local(@ARGV) = ($PM, $SHASUM); + while (<>) { + if ( + (!$use_warnings && /^(use|no) warnings\b/) || + ( $use_warnings && /^\Q$warn_1\E # use warnings\b/) || + ( $use_warnings && /^\Q$warn_0\E # no warnings\b/)) { + push @EDITs, $ARGV; + close ARGV; + } + } +} + +if (@EDITs) { + local($^I, @ARGV) = ('', @EDITs); + while (<>) { + if ($use_warnings) { + s/^\Q$warn_1\E # (.*)$/$1/; + s/^\Q$warn_0\E # (.*)$/$1/; + } + else { + s/^(use warnings\b.*)$/$warn_1 # $1/; + s/^(no warnings\b.*)$/$warn_0 # $1/; + } + print; + } +} + +getopts('twx'); # -t is no longer used, but allow it anyway my @defines; -push(@defines, '-DSHA_PerlIO') if $] >= 5.004; -push(@defines, '-DNO_SHA_384_512') if $opts{'x'}; +push(@defines, '-DNO_SHA_384_512') if $opt_x; my $define = join(' ', @defines); # Workaround for DEC compiler bug, adapted from Digest::MD5 @@ -21,7 +58,7 @@ my @extra = (); if ($^O eq 'VMS') { if (defined($Config{ccname})) { if (grep(/VMS_VAX/, @INC) && ($Config{ccname} eq 'DEC')) { - # VAX compiler optimizer even up to v6.4 gets stuck + # VAX optimizer, even up to v6.4, gets stuck push(@extra, OPTIMIZE => "/Optimize=(NODISJOINT)"); } } @@ -33,18 +70,20 @@ if ($Config{archname} =~ /^i[3456]86/ && $Config{ccname} eq 'gcc') { push(@extra, OPTIMIZE => '-O1 -fomit-frame-pointer'); } -my %att = ( +push(@extra, CCFLAGS => '-W -Wall ' . $Config{ccflags}) if $opt_w; + +my %attr = ( 'NAME' => 'Digest::SHA', 'VERSION_FROM' => $PM, 'LIBS' => [''], 'DEFINE' => $define, 'INC' => '-I.', - 'EXE_FILES' => [ 'shasum' ], + 'EXE_FILES' => [ $SHASUM ], 'INSTALLDIRS' => ($] >= 5.010 and $] < 5.011) ? 'perl' : 'site', @extra, ); -my $MMversion = $ExtUtils::MakeMaker::VERSION || 0; -$att{NO_META} = 1 unless $MMversion < 6.10_03; +my $MMversion = $ExtUtils::MakeMaker::VERSION || '0.00_00'; +$attr{NO_META} = 1 if $MMversion ge '6.10_03'; -WriteMakefile(%att); +WriteMakefile(%attr); diff --git a/cpan/Digest-SHA/SHA.xs b/cpan/Digest-SHA/SHA.xs index c38fcc4..c7a7f34 100644 --- a/cpan/Digest-SHA/SHA.xs +++ b/cpan/Digest-SHA/SHA.xs @@ -12,37 +12,47 @@ #define SvPVbyte SvPV #endif +#ifndef PerlIO + #define PerlIO FILE + #define PerlIO_read(f, buf, count) fread(buf, 1, count, f) +#endif + +#ifndef sv_derived_from + #include "src/sdf.c" +#endif + +#ifndef Newx + #define Newx(ptr, num, type) New(0, ptr, num, type) + #define Newxz(ptr, num, type) Newz(0, ptr, num, type) +#endif + #include "src/sha.c" static int ix2alg[] = {1,1,1,224,224,224,256,256,256,384,384,384,512,512,512, 512224,512224,512224,512256,512256,512256}; -MODULE = Digest::SHA PACKAGE = Digest::SHA - -PROTOTYPES: ENABLE - #ifndef INT2PTR #define INT2PTR(p, i) (p) (i) #endif #define MAX_WRITE_SIZE 16384 +#define IO_BUFFER_SIZE 4096 -int -shaclose(s) - SHA * s -CODE: - RETVAL = shaclose(s); - sv_setiv(SvRV(ST(0)), 0); -OUTPUT: - RETVAL +static SHA *getSHA(SV *self) +{ + if (!sv_isobject(self) || !sv_derived_from(self, "Digest::SHA")) + return(NULL); + return INT2PTR(SHA *, SvIV(SvRV(self))); +} -SHA * -shadup(s) - SHA * s +MODULE = Digest::SHA PACKAGE = Digest::SHA + +PROTOTYPES: ENABLE -SHA * -shaopen(alg) +int +shainit(s, alg) + SHA * s int alg void @@ -55,7 +65,48 @@ shawrite(bitstr, bitcnt, s) unsigned long bitcnt SHA * s +SV * +newSHA(classname, alg) + char * classname + int alg +PREINIT: + SHA *state; +CODE: + Newxz(state, 1, SHA); + if (!shainit(state, alg)) { + Safefree(state); + XSRETURN_UNDEF; + } + RETVAL = newSV(0); + sv_setref_pv(RETVAL, classname, (void *) state); + SvREADONLY_on(SvRV(RETVAL)); +OUTPUT: + RETVAL + +SV * +clone(self) + SV * self +PREINIT: + SHA *state; + SHA *clone; +CODE: + if ((state = getSHA(self)) == NULL) + XSRETURN_UNDEF; + Newx(clone, 1, SHA); + RETVAL = newSV(0); + sv_setref_pv(RETVAL, sv_reftype(SvRV(self), 1), (void *) clone); + SvREADONLY_on(SvRV(RETVAL)); + Copy(state, clone, 1, SHA); +OUTPUT: + RETVAL + void +DESTROY(s) + SHA * s +CODE: + Safefree(s); + +SV * sha1(...) ALIAS: Digest::SHA::sha1 = 0 @@ -83,35 +134,35 @@ PREINIT: int i; UCHR *data; STRLEN len; - SHA *state; + SHA sha; char *result; -PPCODE: - if ((state = shaopen(ix2alg[ix])) == NULL) +CODE: + if (!shainit(&sha, ix2alg[ix])) XSRETURN_UNDEF; for (i = 0; i < items; i++) { data = (UCHR *) (SvPVbyte(ST(i), len)); while (len > MAX_WRITE_SIZE) { - shawrite(data, MAX_WRITE_SIZE << 3, state); + shawrite(data, MAX_WRITE_SIZE << 3, &sha); data += MAX_WRITE_SIZE; len -= MAX_WRITE_SIZE; } - shawrite(data, len << 3, state); + shawrite(data, len << 3, &sha); } - shafinish(state); + shafinish(&sha); len = 0; if (ix % 3 == 0) { - result = (char *) digcpy(state); - len = state->digestlen; + result = (char *) shadigest(&sha); + len = sha.digestlen; } else if (ix % 3 == 1) - result = shahex(state); + result = shahex(&sha); else - result = shabase64(state); - ST(0) = sv_2mortal(newSVpv(result, len)); - shaclose(state); - XSRETURN(1); + result = shabase64(&sha); + RETVAL = newSVpv(result, len); +OUTPUT: + RETVAL -void +SV * hmac_sha1(...) ALIAS: Digest::SHA::hmac_sha1 = 0 @@ -137,39 +188,41 @@ ALIAS: Digest::SHA::hmac_sha512256_base64 = 20 PREINIT: int i; - UCHR *key; + UCHR *key = (UCHR *) ""; UCHR *data; - STRLEN len; - HMAC *state; + STRLEN len = 0; + HMAC hmac; char *result; -PPCODE: - key = (UCHR *) (SvPVbyte(ST(items-1), len)); - if ((state = hmacopen(ix2alg[ix], key, len)) == NULL) +CODE: + if (items > 0) { + key = (UCHR *) (SvPVbyte(ST(items-1), len)); + } + if (hmacinit(&hmac, ix2alg[ix], key, len) == NULL) XSRETURN_UNDEF; for (i = 0; i < items - 1; i++) { data = (UCHR *) (SvPVbyte(ST(i), len)); while (len > MAX_WRITE_SIZE) { - hmacwrite(data, MAX_WRITE_SIZE << 3, state); + hmacwrite(data, MAX_WRITE_SIZE << 3, &hmac); data += MAX_WRITE_SIZE; len -= MAX_WRITE_SIZE; } - hmacwrite(data, len << 3, state); + hmacwrite(data, len << 3, &hmac); } - hmacfinish(state); + hmacfinish(&hmac); len = 0; if (ix % 3 == 0) { - result = (char *) digcpy(state->osha); - len = state->osha->digestlen; + result = (char *) hmacdigest(&hmac); + len = hmac.digestlen; } else if (ix % 3 == 1) - result = hmachex(state); + result = hmachex(&hmac); else - result = hmacbase64(state); - ST(0) = sv_2mortal(newSVpv(result, len)); - hmacclose(state); - XSRETURN(1); + result = hmacbase64(&hmac); + RETVAL = newSVpv(result, len); +OUTPUT: + RETVAL -void +int hashsize(self) SV * self ALIAS: @@ -177,14 +230,12 @@ ALIAS: Digest::SHA::algorithm = 1 PREINIT: SHA *state; - int result; -PPCODE: - if (!sv_isa(self, "Digest::SHA")) +CODE: + if ((state = getSHA(self)) == NULL) XSRETURN_UNDEF; - state = INT2PTR(SHA *, SvIV(SvRV(SvRV(self)))); - result = ix ? state->alg : state->digestlen << 3; - ST(0) = sv_2mortal(newSViv(result)); - XSRETURN(1); + RETVAL = ix ? state->alg : state->digestlen << 3; +OUTPUT: + RETVAL void add(self, ...) @@ -195,9 +246,8 @@ PREINIT: STRLEN len; SHA *state; PPCODE: - if (!sv_isa(self, "Digest::SHA")) + if ((state = getSHA(self)) == NULL) XSRETURN_UNDEF; - state = INT2PTR(SHA *, SvIV(SvRV(SvRV(self)))); for (i = 1; i < items; i++) { data = (UCHR *) (SvPVbyte(ST(i), len)); while (len > MAX_WRITE_SIZE) { @@ -209,78 +259,78 @@ PPCODE: } XSRETURN(1); -void +SV * digest(self) SV * self ALIAS: Digest::SHA::digest = 0 - Digest::SHA::Hexdigest = 1 - Digest::SHA::B64digest = 2 + Digest::SHA::hexdigest = 1 + Digest::SHA::b64digest = 2 PREINIT: STRLEN len; SHA *state; char *result; -PPCODE: - if (!sv_isa(self, "Digest::SHA")) +CODE: + if ((state = getSHA(self)) == NULL) XSRETURN_UNDEF; - state = INT2PTR(SHA *, SvIV(SvRV(SvRV(self)))); shafinish(state); len = 0; if (ix == 0) { - result = (char *) digcpy(state); + result = (char *) shadigest(state); len = state->digestlen; } else if (ix == 1) result = shahex(state); else result = shabase64(state); - ST(0) = sv_2mortal(newSVpv(result, len)); + RETVAL = newSVpv(result, len); sharewind(state); - XSRETURN(1); +OUTPUT: + RETVAL -void +SV * _getstate(self) SV * self PREINIT: SHA *state; UCHR buf[256]; UCHR *ptr = buf; -PPCODE: - if (!sv_isa(self, "Digest::SHA")) +CODE: + if ((state = getSHA(self)) == NULL) XSRETURN_UNDEF; - state = INT2PTR(SHA *, SvIV(SvRV(SvRV(self)))); - memcpy(ptr, digcpy(state), state->alg <= SHA256 ? 32 : 64); + Copy(digcpy(state), ptr, state->alg <= SHA256 ? 32 : 64, UCHR); ptr += state->alg <= SHA256 ? 32 : 64; - memcpy(ptr, state->block, state->alg <= SHA256 ? 64 : 128); + Copy(state->block, ptr, state->alg <= SHA256 ? 64 : 128, UCHR); ptr += state->alg <= SHA256 ? 64 : 128; ptr = w32mem(ptr, state->blockcnt); ptr = w32mem(ptr, state->lenhh); ptr = w32mem(ptr, state->lenhl); ptr = w32mem(ptr, state->lenlh); ptr = w32mem(ptr, state->lenll); - ST(0) = sv_2mortal(newSVpv((char *) buf, ptr - buf)); - XSRETURN(1); + RETVAL = newSVpv((char *) buf, ptr - buf); +OUTPUT: + RETVAL void -_putstate(self, ...) +_putstate(self, packed_state) SV * self + SV * packed_state PREINIT: UINT bc; STRLEN len; SHA *state; UCHR *data; PPCODE: - if (!sv_isa(self, "Digest::SHA")) + if ((state = getSHA(self)) == NULL) XSRETURN_UNDEF; - state = INT2PTR(SHA *, SvIV(SvRV(SvRV(self)))); - data = (UCHR *) SvPV(ST(1), len); + data = (UCHR *) SvPV(packed_state, len); if (len != (state->alg <= SHA256 ? 116 : 212)) XSRETURN_UNDEF; data = statecpy(state, data); - memcpy(state->block, data, state->blocksize >> 3); + Copy(data, state->block, state->blocksize >> 3, UCHR); data += (state->blocksize >> 3); bc = memw32(data), data += 4; - if (bc >= (state->alg <= SHA256 ? 512 : 1024)) + if (bc >= (state->alg <= SHA256 ? 512U : 1024U)) XSRETURN_UNDEF; state->blockcnt = bc; state->lenhh = memw32(data), data += 4; @@ -288,3 +338,63 @@ PPCODE: state->lenlh = memw32(data), data += 4; state->lenll = memw32(data); XSRETURN(1); + +void +_addfilebin(self, f) + SV * self + PerlIO * f +PREINIT: + SHA *state; + int n; + UCHR in[IO_BUFFER_SIZE]; +PPCODE: + if (!f || (state = getSHA(self)) == NULL) + XSRETURN_UNDEF; + while ((n = PerlIO_read(f, in, sizeof(in))) > 0) + shawrite(in, n << 3, state); + XSRETURN(1); + +void +_addfileuniv(self, f) + SV * self + PerlIO * f +PREINIT: + char c; + int n; + int cr = 0; + UCHR *src, *dst; + UCHR in[IO_BUFFER_SIZE+1]; + SHA *state; +PPCODE: + if (!f || (state = getSHA(self)) == NULL) + XSRETURN_UNDEF; + while ((n = PerlIO_read(f, in+1, IO_BUFFER_SIZE)) > 0) { + for (dst = in, src = in + 1; n; n--) { + c = *src++; + if (!cr) { + if (c == '\015') + cr = 1; + else + *dst++ = c; + } + else { + if (c == '\015') + *dst++ = '\012'; + else if (c == '\012') { + *dst++ = '\012'; + cr = 0; + } + else { + *dst++ = '\012'; + *dst++ = c; + cr = 0; + } + } + } + shawrite(in, (dst - in) << 3, state); + } + if (cr) { + in[0] = '\012'; + shawrite(in, 1 << 3, state); + } + XSRETURN(1); diff --git a/cpan/Digest-SHA/lib/Digest/SHA.pm b/cpan/Digest-SHA/lib/Digest/SHA.pm index 57f0bd6..755ec0b 100644 --- a/cpan/Digest-SHA/lib/Digest/SHA.pm +++ b/cpan/Digest-SHA/lib/Digest/SHA.pm @@ -3,11 +3,12 @@ package Digest::SHA; require 5.003000; use strict; +use warnings; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); use Fcntl; use integer; -$VERSION = '5.88'; +$VERSION = '5.92'; require Exporter; require DynaLoader; @@ -28,52 +29,30 @@ require DynaLoader; sha512224 sha512224_base64 sha512224_hex sha512256 sha512256_base64 sha512256_hex); -# If possible, inherit from Digest::base +# Inherit from Digest::base if possible eval { require Digest::base; push(@ISA, 'Digest::base'); }; -*addfile = \&Addfile; -*hexdigest = \&Hexdigest; -*b64digest = \&B64digest; - # The following routines aren't time-critical, so they can be left in Perl sub new { my($class, $alg) = @_; $alg =~ s/\D+//g if defined $alg; if (ref($class)) { # instance method - unless (defined($alg) && ($alg != $class->algorithm)) { - sharewind($$class); + if (!defined($alg) || ($alg == $class->algorithm)) { + sharewind($class); return($class); } - if ($$class) { shaclose($$class); $$class = undef } - return unless $$class = shaopen($alg); - return($class); + return shainit($class, $alg) ? $class : undef; } $alg = 1 unless defined $alg; - my $state = shaopen($alg) || return; - my $self = \$state; - bless($self, $class); - return($self); -} - -sub DESTROY { - my $self = shift; - if ($$self) { shaclose($$self); $$self = undef } -} - -sub clone { - my $self = shift; - my $state = shadup($$self) || return; - my $copy = \$state; - bless($copy, ref($self)); - return($copy); + return $class->newSHA($alg); } -*reset = \&new; +BEGIN { *reset = \&new } sub add_bits { my($self, $data, $nbits) = @_; @@ -82,7 +61,7 @@ sub add_bits { $data = pack("B*", $data); } $nbits = length($data) * 8 if $nbits > length($data) * 8; - shawrite($data, $nbits, $$self); + shawrite($data, $nbits, $self); return($self); } @@ -90,48 +69,53 @@ sub _bail { my $msg = shift; $msg .= ": $!"; - require Carp; - Carp::croak($msg); + require Carp; + Carp::croak($msg); } -sub _addfile { # this is "addfile" from Digest::base 1.00 - my ($self, $handle) = @_; - - my $n; - my $buf = ""; +{ + my $_can_T_filehandle; - while (($n = read($handle, $buf, 4096))) { - $self->add($buf); - } - _bail("Read failed") unless defined $n; + sub _istext { + local *FH = shift; + my $file = shift; - $self; + if (! defined $_can_T_filehandle) { + local $^W = 0; + my $istext = eval { -T FH }; + $_can_T_filehandle = $@ ? 0 : 1; + return $_can_T_filehandle ? $istext : -T $file; + } + return $_can_T_filehandle ? -T FH : -T $file; + } } -my $_can_T_filehandle; +sub _addfile { + my ($self, $handle) = @_; -sub _istext { - local *FH = shift; - my $file = shift; + my $n; + my $buf = ""; - if (! defined $_can_T_filehandle) { - local $^W = 0; - eval { -T FH }; - $_can_T_filehandle = $@ ? 0 : 1; + while (($n = read($handle, $buf, 4096))) { + $self->add($buf); } - return $_can_T_filehandle ? -T FH : -T $file; + _bail("Read failed") unless defined $n; + + $self; } -sub Addfile { +sub addfile { my ($self, $file, $mode) = @_; return(_addfile($self, $file)) unless ref(\$file) eq 'SCALAR'; $mode = defined($mode) ? $mode : ""; - my ($binary, $portable, $BITS) = map { $_ eq $mode } ("b", "p", "0"); + my ($binary, $UNIVERSAL, $BITS, $portable) = + map { $_ eq $mode } ("b", "U", "0", "p"); ## Always interpret "-" to mean STDIN; otherwise use ## sysopen to handle full range of POSIX file names + local *FH; $file eq '-' and open(FH, '< -') or sysopen(FH, $file, O_RDONLY) @@ -148,18 +132,18 @@ sub Addfile { return($self); } - binmode(FH) if $binary || $portable; - unless ($portable && _istext(*FH, $file)) { - $self->_addfile(*FH); - close(FH); - return($self); + binmode(FH) if $binary || $portable || $UNIVERSAL; + if ($UNIVERSAL && _istext(*FH, $file)) { + $self->_addfileuniv(*FH); } - - while (<FH>) { - s/\015?\015\012/\012/g; # DOS/Windows - s/\015/\012/g; # early MacOS - $self->add($_); + elsif ($portable && _istext(*FH, $file)) { + while (<FH>) { + s/\015?\015\012/\012/g; + s/\015/\012/g; + $self->add($_); + } } + else { $self->_addfilebin(*FH) } close(FH); $self; @@ -192,8 +176,7 @@ sub getstate { } sub putstate { - my $class = shift; - my $state = shift; + my($class, $state) = @_; my %s = (); for (split(/\n/, $state)) { @@ -218,27 +201,17 @@ sub putstate { $s{'blockcnt'} < ($s{'alg'} <= 256 ? 512 : 1024) or return; } - my $state_packed = ( + my $packed_state = ( pack("H*", $s{'H'}) . pack("H*", $s{'block'}) . - pack("N", $s{'blockcnt'}) . - pack("N", $s{'lenhh'}) . - pack("N", $s{'lenhl'}) . - pack("N", $s{'lenlh'}) . - pack("N", $s{'lenll'}) + pack("N", $s{'blockcnt'}) . + pack("N", $s{'lenhh'}) . + pack("N", $s{'lenhl'}) . + pack("N", $s{'lenlh'}) . + pack("N", $s{'lenll'}) ); - if (ref($class)) { # instance method - if ($$class) { shaclose($$class); $$class = undef } - return unless $$class = shaopen($s{'alg'}); - return $class->_putstate($state_packed); - } - else { - my $sha = shaopen($s{'alg'}) or return; - my $self = \$sha; - bless($self, $class); - return $self->_putstate($state_packed); - } + return $class->new($s{'alg'})->_putstate($packed_state); } sub dump { @@ -555,10 +528,10 @@ common string representations of the algorithm (e.g. "sha256", "SHA-384"). If the argument is missing, SHA-1 will be used by default. -Invoking I<new> as an instance method will not create a new object; -instead, it will simply reset the object to the initial state -associated with I<$alg>. If the argument is missing, the object -will continue using the same algorithm that was selected at creation. +Invoking I<new> as an instance method will reset the object to the +initial state associated with I<$alg>. If the argument is missing, +the object will continue using the same algorithm that was selected +at creation. =item B<reset($alg)> @@ -631,22 +604,31 @@ argument to one of the following values: "b" read file in binary mode - "p" use portable mode + "U" use universal newlines "0" use BITS mode -The "p" mode ensures that the digest value of I<$filename> will be the -same when computed on different operating systems. It accomplishes -this by internally translating all newlines in text files to UNIX format -before calculating the digest. Binary files are read in raw mode with -no translation whatsoever. + "p" use portable mode (to be deprecated) + +The "U" mode is modeled on Python's "Universal Newlines" concept, whereby +DOS and Mac OS line terminators are converted internally to UNIX newlines +before processing. This ensures consistent digest values when working +simultaneously across multiple file systems. B<The "U" mode influences +only text files>, namely those passing Perl's I<-T> test; binary files +are processed with no translation whatsoever. + +The "p" mode differs from "U" only in that it treats "\r\r\n" as a single +newline, a quirky feature designed to accommodate legacy applications that +occasionally added an extra carriage return before DOS line terminators. +The "p" mode will be phased out eventually in favor of the cleaner and +more well-established Universal Newlines concept. The BITS mode ("0") interprets the contents of I<$filename> as a logical stream of bits, where each ASCII '0' or '1' character represents a 0 or 1 bit, respectively. All other characters are ignored. This provides -a convenient way to calculate the digest values of partial-byte data by -using files, rather than having to write programs using the I<add_bits> -method. +a convenient way to calculate the digest values of partial-byte data +by using files, rather than having to write separate programs employing +the I<add_bits> method. =item B<getstate> @@ -691,9 +673,6 @@ Like I<digest>, this method is a read-once operation. Call I<$sha-E<gt>clone-E<gt>hexdigest> if it's necessary to preserve the original digest state. -This method is inherited if L<Digest::base> is installed on your -system. Otherwise, a functionally equivalent substitute is used. - =item B<b64digest> Returns the digest encoded as a Base64 string. @@ -702,9 +681,6 @@ Like I<digest>, this method is a read-once operation. Call I<$sha-E<gt>clone-E<gt>b64digest> if it's necessary to preserve the original digest state. -This method is inherited if L<Digest::base> is installed on your -system. Otherwise, a functionally equivalent substitute is used. - It's important to note that the resulting string does B<not> contain the padding characters typical of Base64 encodings. This omission is deliberate, and is done to maintain compatibility with the family of @@ -811,6 +787,7 @@ The author is particularly grateful to Robert Gilmour Brian Gladman Adam Kennedy + Mark Lawrence Andy Lester Alex Muntada Steve Peters diff --git a/cpan/Digest-SHA/shasum b/cpan/Digest-SHA/shasum index 32b7173..79f5874 100644 --- a/cpan/Digest-SHA/shasum +++ b/cpan/Digest-SHA/shasum @@ -1,16 +1,22 @@ -#!perl -w +#!perl ## shasum: filter for computing SHA digests (ref. sha1sum/md5sum) ## ## Copyright (C) 2003-2014 Mark Shelor, All Rights Reserved ## - ## Version: 5.88 - ## Mon Mar 17 08:46:10 MST 2014 + ## Version: 5.92 + ## Sun Jun 1 00:15:44 MST 2014 - ## shasum SYNOPSIS adapted from GNU Coreutils sha1sum. - ## Add an "-a" option for algorithm selection, a "-p" - ## option for portable digest computation, and a "-0" - ## option for reading bit strings. + ## shasum SYNOPSIS adapted from GNU Coreutils sha1sum. Add + ## "-a" option for algorithm selection, + ## "-U" option for Universal Newlines support, + ## "-0" option for reading bit strings, and + ## "-p" option for portable digests (to be deprecated). + +use strict; +use warnings; +use Fcntl; +use Getopt::Long; my $POD = <<'END_OF_POD'; @@ -28,12 +34,13 @@ shasum - Print or Check SHA Checksums -b, --binary read in binary mode -c, --check read SHA sums from the FILEs and check them -t, --text read in text mode (default) - -p, --portable read in portable mode + -U, --UNIVERSAL read in Universal Newlines mode produces same digest on Windows/Unix/Mac -0, --01 read in BITS mode ASCII '0' interpreted as 0-bit, ASCII '1' interpreted as 1-bit, all other characters ignored + -p, --portable read in portable mode (to be deprecated) The following two options are useful only when verifying checksums: -s, --status don't output anything, status code shows success @@ -50,8 +57,8 @@ shasum - Print or Check SHA Checksums The sums are computed as described in FIPS PUB 180-4. When checking, the input should be a former output of this program. The default mode is to print a line with checksum, a character indicating type - (`*' for binary, ` ' for text, `?' for portable, `^' for BITS), - and name for each FILE. + (`*' for binary, ` ' for text, `U' for UNIVERSAL, `^' for BITS, `?' + for portable), and name for each FILE. Report shasum bugs to [email protected] @@ -94,11 +101,7 @@ L<Digest::SHA::PurePerl>. END_OF_POD -use strict; -use Fcntl; -use Getopt::Long; - -my $VERSION = "5.88"; +my $VERSION = "5.92"; sub usage { my($err, $msg) = @_; @@ -126,7 +129,7 @@ select((select(STDERR), $| = 1)[0]); ## Collect options from command line my ($alg, $binary, $check, $text, $status, $warn, $help, $version); -my ($portable, $BITS, $modules, $versions); +my ($portable, $BITS, $reverse, $UNIVERSAL, $versions); eval { Getopt::Long::Configure ("bundling") }; GetOptions( @@ -136,7 +139,8 @@ GetOptions( 'h|help' => \$help, 'v|version' => \$version, 'p|portable' => \$portable, '0|01' => \$BITS, - 'M|MODULES=s' => \$modules, + 'R|REVERSE' => \$reverse, + 'U|UNIVERSAL' => \$UNIVERSAL, 'V|VERSIONS' => \$versions, ) or usage(1, ""); @@ -146,7 +150,8 @@ GetOptions( usage(0) if $help; usage(1, "shasum: Ambiguous file mode\n") - if scalar(grep {defined $_} ($binary, $portable, $text, $BITS)) > 1; + if scalar(grep {defined $_} + ($binary, $portable, $text, $BITS, $UNIVERSAL)) > 1; usage(1, "shasum: --warn option used only when verifying checksums\n") if $warn && !$check; usage(1, "shasum: --status option used only when verifying checksums\n") @@ -156,12 +161,11 @@ usage(1, "shasum: --status option used only when verifying checksums\n") ## Try to use Digest::SHA. If not installed, use the slower ## but functionally equivalent Digest::SHA::PurePerl instead. - ## If option -M "Mod::Num1 Mod::Num2 ..." is invoked, try - ## those modules instead, in the order indicated. + ## If option -R is invoked, reverse the module preference, + ## i.e. try Digest::SHA::PurePerl first, then Digest::SHA. -my @MODS = defined $modules - ? split(" ", $modules) - : qw(Digest::SHA Digest::SHA::PurePerl); +my @MODS = qw(Digest::SHA Digest::SHA::PurePerl); +@MODS[0, 1] = @MODS[1, 0] if $reverse; my $module; for (@MODS) { @@ -200,12 +204,13 @@ if ($versions) { ## Try to figure out if the OS is DOS-like. If it is, ## default to binary mode when reading files, unless ## explicitly overridden by command line "--text" or - ## "--portable" options. + ## "--UNIVERSAL" or "--portable" options. my $isDOSish = ($^O =~ /^(MSWin\d\d|os2|dos|mint|cygwin)$/); -if ($isDOSish) { $binary = 1 unless $text || $portable } +if ($isDOSish) { $binary = 1 unless $text || $UNIVERSAL || $portable } -my $modesym = $binary ? '*' : ($portable ? '?' : ($BITS ? '^' : ' ')); +my $modesym = $binary ? '*' : ($UNIVERSAL ? 'U' : + ($BITS ? '^' : ($portable ? '?' : ' '))); ## Read from STDIN (-) if no files listed on command line @@ -218,7 +223,8 @@ my $modesym = $binary ? '*' : ($portable ? '?' : ($BITS ? '^' : ' ')); sub sumfile { my $file = shift; - my $mode = $portable ? 'p' : ($binary ? 'b' : ($BITS ? '0' : '')); + my $mode = $binary ? 'b' : ($UNIVERSAL ? 'U' : + ($BITS ? '0' : ($portable ? 'p' : ''))); my $digest = eval { $module->new($alg)->addfile($file, $mode) }; if ($@) { warn "shasum: $file: $!\n"; return } $digest->hexdigest; @@ -261,7 +267,7 @@ sub verify { next if /^#/; s/\n$//; s/^[ \t]+//; $num_lines++; $bslash = s/^\\//; ($sum, $modesym, $fname) = - /^([\da-fA-F]+)[ \t]([ *?^])([^\0]*)/; + /^([\da-fA-F]+)[ \t]([ *?^U])([^\0]*)/; $alg = defined $sum ? $len2alg{length($sum)} : undef; $fname = unescape($fname) if defined $fname && $bslash; if (grep { ! defined $_ } ($alg, $sum, $modesym, $fname)) { @@ -273,8 +279,8 @@ sub verify { } $fname =~ s/\r$// unless -e $fname; $rsp = "$fname: "; $num_files++; - ($binary, $portable, $text, $BITS) = - map { $_ eq $modesym } ('*', '?', ' ', '^'); + ($binary, $text, $UNIVERSAL, $BITS, $portable) = + map { $_ eq $modesym } ('*', ' ', 'U', '^', 'p'); unless ($digest = sumfile($fname)) { $rsp .= "FAILED open or read\n"; $err = 1; $read_errs++; diff --git a/cpan/Digest-SHA/src/sha.c b/cpan/Digest-SHA/src/sha.c index 70ee233..8a638ce 100644 --- a/cpan/Digest-SHA/src/sha.c +++ b/cpan/Digest-SHA/src/sha.c @@ -5,8 +5,8 @@ * * Copyright (C) 2003-2014 Mark Shelor, All Rights Reserved * - * Version: 5.88 - * Mon Mar 17 08:46:10 MST 2014 + * Version: 5.92 + * Sun Jun 1 00:15:44 MST 2014 * */ @@ -273,59 +273,44 @@ static UCHR *statecpy(SHA *s, UCHR *buf) *p32++ = memw32(buf); else for (i = 0; i < 8; i++, buf += 8) - *p64++ = ((W64) memw32(buf) << 32) + + *p64++ = (((W64)memw32(buf) << 16) << 16) + memw32(buf+4); return(buf); } -#define SHA_INIT(algo, transform) \ +#define SHA_INIT(s, algo, transform) \ do { \ - memset(s, 0, sizeof(SHA)); \ + Zero(s, 1, SHA); \ s->alg = algo; s->sha = sha ## transform; \ - memcpy(s->H, H0 ## algo, sizeof(H0 ## algo)); \ + Copy(H0 ## algo, s->H, sizeof(H0 ## algo), char); \ s->blocksize = SHA ## algo ## _BLOCK_BITS; \ s->digestlen = SHA ## algo ## _DIGEST_BITS >> 3; \ } while (0) -/* sharewind: re-initializes the digest object */ +/* sharewind: resets digest object */ static void sharewind(SHA *s) { - if (s->alg == SHA1) SHA_INIT(1, 1); - else if (s->alg == SHA224) SHA_INIT(224, 256); - else if (s->alg == SHA256) SHA_INIT(256, 256); - else if (s->alg == SHA384) SHA_INIT(384, 512); - else if (s->alg == SHA512) SHA_INIT(512, 512); - else if (s->alg == SHA512224) SHA_INIT(512224, 512); - else if (s->alg == SHA512256) SHA_INIT(512256, 512); + if (s->alg == SHA1) SHA_INIT(s, 1, 1); + else if (s->alg == SHA224) SHA_INIT(s, 224, 256); + else if (s->alg == SHA256) SHA_INIT(s, 256, 256); + else if (s->alg == SHA384) SHA_INIT(s, 384, 512); + else if (s->alg == SHA512) SHA_INIT(s, 512, 512); + else if (s->alg == SHA512224) SHA_INIT(s, 512224, 512); + else if (s->alg == SHA512256) SHA_INIT(s, 512256, 512); } -/* shaopen: creates a new digest object */ -static SHA *shaopen(int alg) +/* shainit: initializes digest object */ +static int shainit(SHA *s, int alg) { - SHA *s = NULL; - + if (alg >= SHA384 && !sha_384_512) + return 0; if (alg != SHA1 && alg != SHA224 && alg != SHA256 && alg != SHA384 && alg != SHA512 && alg != SHA512224 && alg != SHA512256) - return(NULL); - if (alg >= SHA384 && !sha_384_512) - return(NULL); - SHA_newz(0, s, 1, SHA); - if (s == NULL) - return(NULL); + return 0; s->alg = alg; sharewind(s); - return(s); -} - -/* shaclose: de-allocates digest object */ -static int shaclose(SHA *s) -{ - if (s != NULL) { - memset(s, 0, sizeof(SHA)); - SHA_free(s); - } - return(0); + return 1; } /* shadirect: updates state directly (w/o going through s->block) */ @@ -339,13 +324,13 @@ static ULNG shadirect(UCHR *bitstr, ULNG bitcnt, SHA *s) bitcnt -= s->blocksize; } if (bitcnt > 0) { - memcpy(s->block, bitstr, NBYTES(bitcnt)); + Copy(bitstr, s->block, NBYTES(bitcnt), char); s->blockcnt = bitcnt; } return(savecnt); } -/* shabytes: updates state for byte-aligned input data */ +/* shabytes: updates state for byte-aligned data in s->block */ static ULNG shabytes(UCHR *bitstr, ULNG bitcnt, SHA *s) { UINT offset; @@ -355,20 +340,20 @@ static ULNG shabytes(UCHR *bitstr, ULNG bitcnt, SHA *s) offset = s->blockcnt >> 3; if (s->blockcnt + bitcnt >= s->blocksize) { nbits = s->blocksize - s->blockcnt; - memcpy(s->block+offset, bitstr, nbits>>3); + Copy(bitstr, s->block+offset, nbits>>3, char); bitcnt -= nbits; bitstr += (nbits >> 3); s->sha(s, s->block), s->blockcnt = 0; shadirect(bitstr, bitcnt, s); } else { - memcpy(s->block+offset, bitstr, NBYTES(bitcnt)); + Copy(bitstr, s->block+offset, NBYTES(bitcnt), char); s->blockcnt += bitcnt; } return(savecnt); } -/* shabits: updates state for bit-aligned input data */ +/* shabits: updates state for bit-aligned data in s->block */ static ULNG shabits(UCHR *bitstr, ULNG bitcnt, SHA *s) { UINT i; @@ -446,6 +431,8 @@ static void shafinish(SHA *s) s->sha(s, s->block); } +#define shadigest(state) digcpy(state) + /* xmap: translation map for hexadecimal encoding */ static char xmap[] = "0123456789abcdef"; @@ -481,7 +468,7 @@ static void encbase64(UCHR *in, int n, char *out) out[0] = '\0'; if (n < 1 || n > 3) return; - memcpy(byte, in, n); + Copy(in, byte, n, UCHR); out[0] = bmap[byte[0] >> 2]; out[1] = bmap[((byte[0] & 0x03) << 4) | (byte[1] >> 4)]; out[2] = bmap[((byte[1] & 0x0f) << 2) | (byte[2] >> 6)]; @@ -509,94 +496,61 @@ static char *shabase64(SHA *s) return(s->base64); } -/* shadup: duplicates current digest object */ -static SHA *shadup(SHA *s) -{ - SHA *p; - - SHA_new(0, p, 1, SHA); - if (p == NULL) - return(NULL); - memcpy(p, s, sizeof(SHA)); - return(p); -} - -/* hmacopen: creates a new HMAC-SHA digest object */ -static HMAC *hmacopen(int alg, UCHR *key, UINT keylen) +/* hmacinit: initializes HMAC-SHA digest object */ +static HMAC *hmacinit(HMAC *h, int alg, UCHR *key, UINT keylen) { UINT i; - HMAC *h; + SHA ksha; - SHA_newz(0, h, 1, HMAC); - if (h == NULL) + Zero(h, 1, HMAC); + if (!shainit(&h->isha, alg)) return(NULL); - if ((h->isha = shaopen(alg)) == NULL) { - SHA_free(h); + if (!shainit(&h->osha, alg)) return(NULL); - } - if ((h->osha = shaopen(alg)) == NULL) { - shaclose(h->isha); - SHA_free(h); - return(NULL); - } - if (keylen <= h->osha->blocksize / 8) - memcpy(h->key, key, keylen); + if (keylen <= h->osha.blocksize / 8) + Copy(key, h->key, keylen, char); else { - if ((h->ksha = shaopen(alg)) == NULL) { - shaclose(h->isha); - shaclose(h->osha); - SHA_free(h); + if (!shainit(&ksha, alg)) return(NULL); - } - shawrite(key, keylen * 8, h->ksha); - shafinish(h->ksha); - memcpy(h->key, digcpy(h->ksha), h->ksha->digestlen); - shaclose(h->ksha); + shawrite(key, keylen * 8, &ksha); + shafinish(&ksha); + Copy(digcpy(&ksha), h->key, ksha.digestlen, char); } - for (i = 0; i < h->osha->blocksize / 8; i++) + h->digestlen = h->osha.digestlen; + for (i = 0; i < h->osha.blocksize / 8; i++) h->key[i] ^= 0x5c; - shawrite(h->key, h->osha->blocksize, h->osha); - for (i = 0; i < h->isha->blocksize / 8; i++) + shawrite(h->key, h->osha.blocksize, &h->osha); + for (i = 0; i < h->isha.blocksize / 8; i++) h->key[i] ^= (0x5c ^ 0x36); - shawrite(h->key, h->isha->blocksize, h->isha); - memset(h->key, 0, sizeof(h->key)); + shawrite(h->key, h->isha.blocksize, &h->isha); + Zero(h->key, sizeof(h->key), char); return(h); } /* hmacwrite: triggers a state update using data in bitstr/bitcnt */ static ULNG hmacwrite(UCHR *bitstr, ULNG bitcnt, HMAC *h) { - return(shawrite(bitstr, bitcnt, h->isha)); + return(shawrite(bitstr, bitcnt, &h->isha)); } /* hmacfinish: computes final digest state */ static void hmacfinish(HMAC *h) { - shafinish(h->isha); - shawrite(digcpy(h->isha), h->isha->digestlen * 8, h->osha); - shaclose(h->isha); - shafinish(h->osha); + shafinish(&h->isha); + shawrite(digcpy(&h->isha), h->isha.digestlen * 8, &h->osha); + shafinish(&h->osha); } +#define hmacdigest(h) digcpy(&(h)->osha) + /* hmachex: returns pointer to digest (hexadecimal) */ static char *hmachex(HMAC *h) { - return(shahex(h->osha)); + return(shahex(&h->osha)); } /* hmacbase64: returns pointer to digest (Base 64) */ static char *hmacbase64(HMAC *h) { - return(shabase64(h->osha)); -} - -/* hmacclose: de-allocates digest object */ -static int hmacclose(HMAC *h) -{ - if (h != NULL) { - shaclose(h->osha); - memset(h, 0, sizeof(HMAC)); - SHA_free(h); - } - return(0); + return(shabase64(&h->osha)); } diff --git a/cpan/Digest-SHA/src/sha.h b/cpan/Digest-SHA/src/sha.h index b9f1e70..f1ed54e 100644 --- a/cpan/Digest-SHA/src/sha.h +++ b/cpan/Digest-SHA/src/sha.h @@ -5,8 +5,8 @@ * * Copyright (C) 2003-2014 Mark Shelor, All Rights Reserved * - * Version: 5.88 - * Mon Mar 17 08:46:10 MST 2014 + * Version: 5.92 + * Sun Jun 1 00:15:44 MST 2014 * */ @@ -79,10 +79,10 @@ #if defined(BYTEORDER) && (BYTEORDER & 0xffff) == 0x4321 #if defined(SHA32_ALIGNED) - #define SHA32_SCHED(W, b) memcpy(W, b, 64) + #define SHA32_SCHED(W, b) Copy(b, W, 64, char) #endif #if defined(SHA64) && defined(SHA64_ALIGNED) - #define SHA64_SCHED(W, b) memcpy(W, b, 128) + #define SHA64_SCHED(W, b) Copy(b, W, 128, char) #endif #endif @@ -102,10 +102,6 @@ (SHA64) b[6] << 8 | (SHA64) b[7]; } #endif -#define SHA_new New -#define SHA_newz Newz -#define SHA_free Safefree - #define SHA1 1 #define SHA224 224 #define SHA256 256 @@ -156,9 +152,9 @@ typedef struct SHA { } SHA; typedef struct { - SHA *ksha; - SHA *isha; - SHA *osha; + SHA isha; + SHA osha; + int digestlen; unsigned char key[SHA_MAX_BLOCK_BITS/8]; } HMAC; diff --git a/cpan/Digest-SHA/src/sha64bit.c b/cpan/Digest-SHA/src/sha64bit.c index 71f9978..169b912 100644 --- a/cpan/Digest-SHA/src/sha64bit.c +++ b/cpan/Digest-SHA/src/sha64bit.c @@ -5,8 +5,8 @@ * * Copyright (C) 2003-2014 Mark Shelor, All Rights Reserved * - * Version: 5.88 - * Mon Mar 17 08:46:10 MST 2014 + * Version: 5.92 + * Sun Jun 1 00:15:44 MST 2014 * */ @@ -14,7 +14,6 @@ #undef sha_384_512 #undef W64 -#undef strto64 #undef sha512 #undef H0384 #undef H0512 @@ -93,17 +92,6 @@ C64(0x963877195940eabd), C64(0x96283ee2a88effe3), C64(0xbe5e1e2553863992), C64(0x2b0199fc2c85b8aa), C64(0x0eb72ddc81c52ca2) }; -/* strto64: converts hex string to a 64-bit word */ -static W64 strto64(char *s) -{ - char str[2] = {0, 0}; - W64 u = C64(0); - - while (isxdigit(str[0] = *s++)) - u = (u << 4) + strtoul(str, NULL, 16); - return(u); -} - static void sha512(SHA *s, unsigned char *block) /* SHA-384/512 transform */ { W64 a, b, c, d, e, f, g, h, T1, T2; diff --git a/cpan/Digest-SHA/src/sha64bit.h b/cpan/Digest-SHA/src/sha64bit.h index bdd7b1c..0eb8a3d 100644 --- a/cpan/Digest-SHA/src/sha64bit.h +++ b/cpan/Digest-SHA/src/sha64bit.h @@ -5,8 +5,8 @@ * * Copyright (C) 2003-2014 Mark Shelor, All Rights Reserved * - * Version: 5.88 - * Mon Mar 17 08:46:10 MST 2014 + * Version: 5.92 + * Sun Jun 1 00:15:44 MST 2014 * * The following macros supply placeholder values that enable the * sha.c module to successfully compile when 64-bit integer types @@ -19,7 +19,6 @@ #define sha_384_512 0 #define W64 unsigned long -#define strto64(p) 0 #define sha512 NULL #define H0384 H01 #define H0512 H01 diff --git a/cpan/Digest-SHA/t/inheritance.t b/cpan/Digest-SHA/t/inheritance.t new file mode 100644 index 0000000..d94c23a --- /dev/null +++ b/cpan/Digest-SHA/t/inheritance.t @@ -0,0 +1,31 @@ +# Adapted from script by Mark Lawrence (ref. rt.cpan.org #94830) + +use strict; + +my $MODULE; + +BEGIN { + $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl"; + eval "require $MODULE" || die $@; + $MODULE->import(qw(sha1)); +} + +BEGIN { + if ($ENV{PERL_CORE}) { + chdir 't' if -d 't'; + @INC = '../lib'; + } +} + +package P1; +use vars qw(@ISA); +@ISA = ($MODULE); + +package main; + +print "1..1\n"; + +my $data = 'a'; +my $d = P1->new; +print "not " unless $d->add($data)->digest eq sha1($data); +print "ok 1\n"; diff --git a/cpan/Digest-SHA/t/methods.t b/cpan/Digest-SHA/t/methods.t index f7cecd2..7bbc706 100644 --- a/cpan/Digest-SHA/t/methods.t +++ b/cpan/Digest-SHA/t/methods.t @@ -21,7 +21,7 @@ my @out = ( "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1", ); -my $numtests = 8 + scalar @out; +my $numtests = 9 + scalar @out; print "1..$numtests\n"; # attempt to use an invalid algorithm, and check for failure @@ -101,6 +101,17 @@ print "not " unless $sha->new(1)->addfile($tempfile, "p")->hexdigest eq "d449e19c1b0b0c191294c8dc9fa2e4a6ff77fc51"; print "ok ", $testnum++, "\n"; + # test addfile "universal newlines" mode + +$fh = FileHandle->new($tempfile, "w"); +binmode($fh); +print $fh "MacOS\r" . "MSDOS\r\n" . "UNIX\n" . "Quirky\r\r\n"; +$fh->close; + +print "not " unless $sha->new(1)->addfile($tempfile, "U")->hexdigest eq + "f4c6855783c737c7e224873c90e80a9df5c2bc97"; # per Python 3 +print "ok ", $testnum++, "\n"; + # test addfile BITS mode $fh = FileHandle->new($tempfile, "w"); diff --git a/cpan/Digest-SHA/t/woodbury.t b/cpan/Digest-SHA/t/woodbury.t index 35f4e6a..afcb731 100644 --- a/cpan/Digest-SHA/t/woodbury.t +++ b/cpan/Digest-SHA/t/woodbury.t @@ -9,7 +9,7 @@ my $MODULE; BEGIN { $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl"; eval "require $MODULE" || die $@; - $MODULE->import(qw(hmac_sha256_hex hmac_sha384_hex hmac_sha512_hex)); + $MODULE->import(qw(hmac_sha256 hmac_sha384 hmac_sha512)); } BEGIN { @@ -44,12 +44,12 @@ my $testnum = 1; while (@data_bs512) { print "not " unless - hmac_sha256_hex(shift @data_bs512, shift @keys_bs512) - eq shift @hmac256rsp; + hmac_sha256(shift @data_bs512, shift @keys_bs512) + eq pack("H*", shift @hmac256rsp); print "ok ", $testnum++, "\n"; } -my $skip = hmac_sha384_hex("", "") ? 0 : 1; +my $skip = hmac_sha384("", "") ? 0 : 1; while (@data_bs1024) { if ($skip) { @@ -59,8 +59,8 @@ while (@data_bs1024) { next; } print "not " unless - hmac_sha384_hex(shift @data_bs1024, shift @keys_bs1024) - eq shift @hmac384rsp; + hmac_sha384(shift @data_bs1024, shift @keys_bs1024) + eq pack("H*", shift @hmac384rsp); print "ok ", $testnum++, "\n"; } @@ -72,8 +72,8 @@ while (@dat2_bs1024) { next; } print "not " unless - hmac_sha512_hex(shift @dat2_bs1024, shift @key2_bs1024) - eq shift @hmac512rsp; + hmac_sha512(shift @dat2_bs1024, shift @key2_bs1024) + eq pack("H*", shift @hmac512rsp); print "ok ", $testnum++, "\n"; } diff --git a/cpan/Digest-SHA/typemap b/cpan/Digest-SHA/typemap index 70c4dc1..b881a1d 100644 --- a/cpan/Digest-SHA/typemap +++ b/cpan/Digest-SHA/typemap @@ -1,2 +1,7 @@ -SHA * T_PTROBJ -HMAC * T_PTROBJ +TYPEMAP +SHA * T_SHA +PerlIO * T_IN + +INPUT +T_SHA + $var = getSHA($arg) diff --git a/cpan/Socket/Socket.pm b/cpan/Socket/Socket.pm index 438f11a..b1c78cc 100644 --- a/cpan/Socket/Socket.pm +++ b/cpan/Socket/Socket.pm @@ -3,7 +3,7 @@ package Socket; use strict; { use 5.006001; } -our $VERSION = '2.013'; +our $VERSION = '2.014'; =head1 NAME @@ -935,7 +935,7 @@ if( defined &getaddrinfo ) { # family # Borrowed from Regexp::Common::net -my $REGEXP_IPv4_DECIMAL = qr/25[0-5]|2[0-4][0-9]|1?[0-9][0-9]{1,2}/; +my $REGEXP_IPv4_DECIMAL = qr/25[0-5]|2[0-4][0-9]|1?[0-9]{1,2}/; my $REGEXP_IPv4_DOTTEDQUAD = qr/$REGEXP_IPv4_DECIMAL\.$REGEXP_IPv4_DECIMAL\.$REGEXP_IPv4_DECIMAL\.$REGEXP_IPv4_DECIMAL/; sub fake_makeerr @@ -998,7 +998,7 @@ sub fake_getaddrinfo my @ports; # Actually ARRAYrefs of [ socktype, protocol, port ] my $protname = ""; if( $protocol ) { - $protname = getprotobynumber( $protocol ); + $protname = eval { getprotobynumber( $protocol ) }; } if( $service ne "" and $service !~ m/^\d+$/ ) { @@ -1029,7 +1029,7 @@ sub fake_getaddrinfo $port = 0; } - push @ports, [ $this_socktype, scalar getprotobyname( $this_protname ) || 0, $port ]; + push @ports, [ $this_socktype, eval { scalar getprotobyname( $this_protname ) } || 0, $port ]; } my @ret; diff --git a/cpan/Socket/Socket.xs b/cpan/Socket/Socket.xs index fe99664..31571bf 100644 --- a/cpan/Socket/Socket.xs +++ b/cpan/Socket/Socket.xs @@ -336,6 +336,11 @@ my_inet_aton(register const char *cp, struct in_addr *addr) */ #undef interface +/* STRUCT_OFFSET should have come from from perl.h, but if not, + * roll our own (not using offsetof() since that is C99). */ +#ifndef STRUCT_OFFSET +# define STRUCT_OFFSET(s,m) (Size_t)(&(((s *)0)->m)) +#endif static int not_here(const char *s) @@ -643,10 +648,10 @@ sockaddr_family(sockaddr) STRLEN sockaddr_len; char *sockaddr_pv = SvPVbyte(sockaddr, sockaddr_len); CODE: - if (sockaddr_len < offsetof(struct sockaddr, sa_data)) + if (sockaddr_len < STRUCT_OFFSET(struct sockaddr, sa_data)) croak("Bad arg length for %s, length is %"UVuf", should be at least %"UVuf, "Socket::sockaddr_family", (UV)sockaddr_len, - (UV)offsetof(struct sockaddr, sa_data)); + (UV)STRUCT_OFFSET(struct sockaddr, sa_data)); ST(0) = sv_2mortal(newSViv(((struct sockaddr*)sockaddr_pv)->sa_family)); void @@ -757,7 +762,7 @@ unpack_sockaddr_un(sun_sv) { # if defined(HAS_SOCKADDR_SA_LEN) /* On *BSD sun_path not always ends with a '\0' */ - int maxlen = addr.sun_len - 2; /* should use offsetof(struct sockaddr_un, sun_path) instead of 2 */ + int maxlen = addr.sun_len - 2; /* should use STRUCT_OFFSET(struct sockaddr_un, sun_path) instead of 2 */ if (maxlen > (int)sizeof(addr.sun_path)) maxlen = (int)sizeof(addr.sun_path); # else @@ -817,7 +822,7 @@ unpack_sockaddr_in(sin_sv) char * sin = SvPVbyte(sin_sv,sockaddrlen); if (sockaddrlen != sizeof(addr)) { croak("Bad arg length for %s, length is %"UVuf", should be %"UVuf, - "Socket::unpack_sockaddr_in", sockaddrlen, sizeof(addr)); + "Socket::unpack_sockaddr_in", (UV)sockaddrlen, (UV)sizeof(addr)); } Copy(sin, &addr, sizeof(addr), char); if (addr.sin_family != AF_INET) { diff --git a/cpan/Socket/t/getaddrinfo.t b/cpan/Socket/t/getaddrinfo.t index b1b1911..24f154c 100644 --- a/cpan/Socket/t/getaddrinfo.t +++ b/cpan/Socket/t/getaddrinfo.t @@ -1,6 +1,6 @@ use strict; use warnings; -use Test::More tests => 30; +use Test::More tests => 31; use Socket qw(:addrinfo AF_INET SOCK_STREAM IPPROTO_TCP unpack_sockaddr_in inet_aton); @@ -100,6 +100,13 @@ SKIP: { } } +# Numeric addresses with AI_NUMERICHOST should pass (RT95758) +{ + ( $err, @res ) = getaddrinfo( "127.0.0.1", 80, { flags => AI_NUMERICHOST } ); + ok( $err == 0, "\$err == 0 for 127.0.0.1/80/flags=AI_NUMERICHOST" ) or + diag( "\$err is $err" ); +} + # Now check that names with AI_NUMERICHOST fail SKIP: { -- Perl5 Master Repository
