NAME

Crypt::Rhash - Compute hash sums and magnet links

SYNOPSIS

use Crypt::Rhash;
my $msg = "a message text";
print "MD5 = " . Crypt::Rhash::msg(RHASH_MD5, $msg) . "\n";

use Crypt::Rhash;
my $filepath = "/tmp/file.txt";
# Calculate two hash functions simultaneously
my $r = Crypt::Rhash->new(RHASH_SHA1, RHASH_SHA512);
$res = $r->update_file($filepath);
defined($res) or die "failed to read $filepath: $!";
print "SHA1   = " . $r->hash(RHASH_SHA1) . "\n";
print "SHA512 = " . $r->hash(RHASH_SHA512) . "\n";

DESCRIPTION

Crypt::Rhash module is an object-oriented interface to LibRHash library, allowing simultaneous calculation of several hash functions for a file or a text message.

Resulting hash digest can be obtained in hexadecimal, BASE32, BASE64, raw binary format or as a magnet link.

SUPPORTED ALGORITHMS

The module supports the following hashing algorithms: CRC32, CRC32C, MD4, MD5, SHA1, SHA256, SHA512, SHA3, AICH, ED2K, Tiger, DC++ TTH, GOST R 34.11-94, GOST R 34.11-2012, BitTorrent BTIH, RIPEMD-160, HAS-160, EDON-R 256/512, Whirlpool and Snefru-128/256.

CONSTRUCTOR

Creates and returns new Crypt::Rhash object.

my $r = Crypt::Rhash->new($hash_id1, $hash_id2, ...);
my $p = new Crypt::Rhash($hash_id1, ...); # alternative way to call the constructor

Constructor accepts the following constants as arguments:

RHASH_CRC32,
RHASH_CRC32C,
RHASH_MD4,
RHASH_MD5,
RHASH_SHA1,
RHASH_TIGER,
RHASH_TTH,
RHASH_BTIH,
RHASH_ED2K,
RHASH_AICH,
RHASH_WHIRLPOOL,
RHASH_RIPEMD160,
RHASH_GOST94,
RHASH_GOST94_CRYPTOPRO,
RHASH_GOST12_256,
RHASH_GOST12_512
RHASH_HAS160,
RHASH_SHA224,
RHASH_SHA256,
RHASH_SHA384,
RHASH_SHA512,
RHASH_SHA3_224,
RHASH_SHA3_256,
RHASH_SHA3_384,
RHASH_SHA3_512,
RHASH_EDONR256,
RHASH_EDONR512,
RHASH_SNEFRU128,
RHASH_SNEFRU256,
RHASH_ALL

The RHASH_ALL bit mask is bitwise union of all listed above bit-flags. An object created as Crypt::Rhash->new(RHASH_ALL) calculates all supported hash functions for the same data.

COMPUTING HASHES

$rhash->update( $msg )

Calculates hashes of the $msg string. The method can be called repeatedly with chunks of the message to be hashed. It returns the $rhash object itself allowing the following construction:

$rhash = Crypt::Rhash->new(RHASH_MD5)->update( $chunk1 )->update( $chunk2 );
$rhash->update_file( $file_path, $start, $size )
$rhash->update_fd( $fd, $start, $size )

Calculate a hash of the file (or its part) specified by $file_path or a file descriptor $fd. The update_fd method doesn't close the $fd, leaving the file position after the hashed block. The optional $start and $size specify the block of the file to hash. If $start is undefined, then the size is read from the start. If $size is undefined, then the file is read till the end. No error is reported if the $size is greater than the number of the unread bytes left in the file.

Returns the number of characters actually read, 0 at end of file, or undef if there was an error (in the latter case $! is also set).

use Crypt::Rhash;
my $r = new Crypt::Rhash(RHASH_SHA1);
open(my $fd, "<", "input.txt") or die "cannot open < input.txt: $!";
while ((my $n = $r->update_fd($fd, undef, 1024) != 0)) {
    print "$n bytes hashed. The SHA1 hash is " . $r->final()->hash() . "\n";
    $r->reset();
}
defined($n) or die "read error for input.txt: $!";
close($fd);
$rhash->final()

Finishes calculation for all data buffered by updating methods and stops hash calculation. The function is called automatically by any of the $rhash->hash*() methods if the final() call was skipped.

$rhash->reset()

Resets the $rhash object to the initial state.

$rhash->hashed_length()

Returns the total length of the hashed message.

$rhash->hash_id()

Returns the hash mask, the $rhash object was constructed with.

FORMATTING HASH VALUE

Computed hash can be formatted as a hexadecimal string (in the forward or reverse byte order), a base32/base64-encoded string or as raw binary data.

$rhash->hash( $hash_id )

Returns the hash string in the default format, which can be hexadecimal or base32. Actually the method is equivalent of

(Crypt::Rhash::is_base32($hash_id) ? $rhash->hash_base32($hash_id) :
  $rhash->hash_hex($hash_id))

If the optional $hash_id parameter is omitted or zero, then the method returns the hash for the algorithm contained in $rhash with the lowest identifier.

$rhash->hash_hex( $hash_id )

Returns the specified hash in the hexadecimal format.

use Crypt::Rhash;
my $msg = "abc";
print "MD5 = " . Crypt::Rhash->new(RHASH_MD5)->update($msg)->hash_hex() . "\n";
$rhash->hash_rhex( $hash_id )

Returns the specified hash in the hexadecimal format with reversed order of bytes. Some programs prefer to output the GOST R 34.11-94 hash in this format.

$rhash->hash_base32( $hash_id )

Returns the specified hash in the base32 format.

$rhash->hash_base64( $hash_id )

Returns the specified hash in the base64 format.

$rhash->magnet_link( $filename, $hash_mask )

Returns the magnet link containing the computed hashes, filesize, and, optionaly, $filename. The $filename (if specified) is URL-encoded, by converting special characters into the %<hexadecimal-code> form. The optional parameter $hash_mask can limit which hash values to put into the link.

STATIC METHODS

Crypt::Rhash::count()

Returns the number of supported hash algorithms

Crypt::Rhash::is_base32($hash_id)

Returns nonzero if default output format is Base32 for the hash function specified by $hash_id. Returns zero if default format is hexadecimal.

Crypt::Rhash::get_digest_size($hash_id)

Returns the size in bytes of raw binary hash of the specified hash algorithm.

Crypt::Rhash::get_hash_length($hash_id)

Returns the length of a hash string in default output format for the specified hash algorithm.

Crypt::Rhash::get_name($hash_id)

Returns the name of the specified hash algorithm.

ALTERNATIVE WAY TO COMPUTE HASH

Crypt::Rhash::msg($hash_id, $message)

Computes and returns a single hash (in its default format) of the $message by the selected hash algorithm.

use Crypt::Rhash;
print "SHA1( 'abc' ) = " . Crypt::Rhash::msg(RHASH_SHA1, "abc") . "\n";

LICENSE

BSD Zero Clause License

Copyright (c) 2011, Aleksey Kravchenko

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.