From 6f320ac12e3ba97949f0c7bba81a137721acc855 Mon Sep 17 00:00:00 2001 From: Kaimi Date: Sat, 5 Sep 2015 23:03:05 +0300 Subject: [PATCH] Switch from ported hash algo to generic MD5 library --- src/YaHash.pm | 311 -------------------------------------------------- src/ya.pl | 7 +- 2 files changed, 3 insertions(+), 315 deletions(-) delete mode 100755 src/YaHash.pm diff --git a/src/YaHash.pm b/src/YaHash.pm deleted file mode 100755 index 7af88d6..0000000 --- a/src/YaHash.pm +++ /dev/null @@ -1,311 +0,0 @@ -package YaHash; - -use strict; -use warnings; - -require Exporter; -use base qw/Exporter/; - -our @EXPORT = qw/hash/; - -sub M -{ - my ($c, $b) = @_; - return ($c << $b) | ($c >> (32 - $b)); #>>> -} - -sub L -{ - my ($x, $c) = @_; - - my ($G, $b, $k, $F, $d); - - $k = ($x & 2147483648); - $F = ($c & 2147483648); - $G = ($x & 1073741824); - $b = ($c & 1073741824); - $d = ($x & 1073741823) + ($c & 1073741823); - - if ($G & $b) - { - return ($d ^ 2147483648 ^ $k ^ $F) - } - - if ($G | $b) - { - if ($d & 1073741824) - { - return ($d ^ 3221225472 ^ $k ^ $F) - } - else - { - return ($d ^ 1073741824 ^ $k ^ $F) - } - } - else - { - return ($d ^ $k ^ $F); - } -} - -sub r -{ - my ($b, $d, $c) = @_; - - return ($b & $d) | ((~$b) & $c); -} - -sub qz -{ - my ($b, $d, $c) = @_; - - return ($b & $c) | ($d & (~$c)); -} - -sub p -{ - my ($b, $d, $c) = @_; - - return ($b ^ $d ^ $c); -} - -sub n -{ - my ($b, $d, $c) = @_; - - return ($d ^ ($b | (~$c))) -} - -sub u -{ - my ($G, $F, $ab, $aa, $k, $H, $I) = @_; - - $G = L($G, L(L(r($F, $ab, $aa), $k), $I)); - return L(M($G, $H), $F); -} - -sub f -{ - my ($G, $F, $ab, $aa, $k, $H, $I) = @_; - - $G = L($G, L(L(qz($F, $ab, $aa), $k), $I)); - return L(M($G, $H), $F); -} - -sub E -{ - my ($G, $F, $ab, $aa, $k, $H, $I) = @_; - - $G = L($G, L(L(p($F, $ab, $aa), $k), $I)); - return L(M($G, $H), $F); -} - -sub t -{ - my ($G, $F, $ab, $aa, $k, $H, $I) = @_; - - $G = L($G, L(L(n($F, $ab, $aa), $k), $I)); - return L(M($G, $H), $F); -} - -sub e -{ - my $x = shift; - my $H; - my $k = length $x; - my $d = $k + 8; - my $c = ($d - ($d % 64)) / 64; - my $G = ($c + 1) * 16; - my @I = split //, (0 x ($G - 1)); - my $b = 0; - my $F = 0; - - - while ($F < $k) - { - $H = ($F - ($F % 4)) / 4; - $b = ($F % 4) * 8; - $I[$H] = ($I[$H] | (ord(substr $x, $F, 1) << $b)); - $F++ - } - - $H = ($F - ($F % 4)) / 4; - $b = ($F % 4) * 8; - $I[$H] = $I[$H] | (128 << $b); - $I[$G - 2] = $k << 3; - $I[$G - 1] = $k >> 29; #>>> - - return @I; -} - -sub C -{ - my $d = shift; - - my $c = ""; - my $k = ""; - my ($x, $b); - - for (my $b = 0; $b <= 3; $b++) - { - $x = ($d >> ($b * 8)) & 255; #>>> - $k = sprintf("%02X", $x); - $c = $c . substr($k, (length($k) - 2), 2); - } - - return $c; -} - -sub z -{ - return chr(shift); -} - -sub K -{ - my $d = shift; - - $d =~ s/\r\n/\n/g; - - $d = z(498608 / 5666) . z(39523855 / 556674) . z(47450778 / 578668) . z(82156899 / 760712) . z(5026300 / 76156) . z(26011178 / 298979) . z(28319886 / 496840) . z(23477867 / 335398) . z(21650560 / 246029) . z(22521465 / 208532) . z(16067393 / 159083) . z(94458862 / 882793) . z(67654429 / 656839) . z(82331283 / 840115) . z(11508494 / 143856) . z(30221073 / 265097) . z(18712908 / 228206) . z(21423113 / 297543) . z(65168784 / 556998) . z(48924535 / 589452) . z(61018985 / 581133) . z(10644616 / 163763) . $d; - - my $b = ""; - for (my $x = 0; $x < length $d; $x++) - { - my $k = ord(substr $d, $x, 1); - if ($k < 128) - { - $b .= z($k); - } - else - { - if (($k > 127) && ($k < 2048)) - { - $b += z(($k >> 6) | 192); - $b += z(($k & 63) | 128) - } - else - { - $b += z(($k >> 12) | 224); - $b += z((($k >> 6) & 63) | 128); - $b += z(($k & 63) | 128) - } - } - } - - return $b; -} - -sub hash -{ - my $s = shift; - - - my @D; - my ($Q, $h, $J, $v, $g, $Z, $Y, $X, $W); - - my $T = 7; - my $R = 12; - my $O = 17; - my $N = 22; - my $B = 5; - my $A = 9; - my $y = 14; - my $w = 20; - my $o = 4; - my $m = 11; - my $l = 16; - my $j = 23; - my $V = 6; - my $U = 10; - my $S = 15; - my $P = 21; - - $s = K($s); - @D = e($s); - $Z = 1732584193; - $Y = 4023233417; - $X = 2562383102; - $W = 271733878; - for ($Q = 0; $Q < scalar @D; $Q += 16) - { - $h = $Z; - $J = $Y; - $v = $X; - $g = $W; - $Z = u($Z, $Y, $X, $W, $D[$Q + 0], $T, 3614090360); - $W = u($W, $Z, $Y, $X, $D[$Q + 1], $R, 3905402710); - $X = u($X, $W, $Z, $Y, $D[$Q + 2], $O, 606105819); - $Y = u($Y, $X, $W, $Z, $D[$Q + 3], $N, 3250441966); - $Z = u($Z, $Y, $X, $W, $D[$Q + 4], $T, 4118548399); - $W = u($W, $Z, $Y, $X, $D[$Q + 5], $R, 1200080426); - $X = u($X, $W, $Z, $Y, $D[$Q + 6], $O, 2821735955); - $Y = u($Y, $X, $W, $Z, $D[$Q + 7], $N, 4249261313); - $Z = u($Z, $Y, $X, $W, $D[$Q + 8], $T, 1770035416); - $W = u($W, $Z, $Y, $X, $D[$Q + 9], $R, 2336552879); - $X = u($X, $W, $Z, $Y, $D[$Q + 10], $O, 4294925233); - $Y = u($Y, $X, $W, $Z, $D[$Q + 11], $N, 2304563134); - $Z = u($Z, $Y, $X, $W, $D[$Q + 12], $T, 1804603682); - $W = u($W, $Z, $Y, $X, $D[$Q + 13], $R, 4254626195); - $X = u($X, $W, $Z, $Y, $D[$Q + 14], $O, 2792965006); - $Y = u($Y, $X, $W, $Z, $D[$Q + 15], $N, 1236535329); - $Z = f($Z, $Y, $X, $W, $D[$Q + 1], $B, 4129170786); - $W = f($W, $Z, $Y, $X, $D[$Q + 6], $A, 3225465664); - $X = f($X, $W, $Z, $Y, $D[$Q + 11], $y, 643717713); - $Y = f($Y, $X, $W, $Z, $D[$Q + 0], $w, 3921069994); - $Z = f($Z, $Y, $X, $W, $D[$Q + 5], $B, 3593408605); - $W = f($W, $Z, $Y, $X, $D[$Q + 10], $A, 38016083); - $X = f($X, $W, $Z, $Y, $D[$Q + 15], $y, 3634488961); - $Y = f($Y, $X, $W, $Z, $D[$Q + 4], $w, 3889429448); - $Z = f($Z, $Y, $X, $W, $D[$Q + 9], $B, 568446438); - $W = f($W, $Z, $Y, $X, $D[$Q + 14], $A, 3275163606); - $X = f($X, $W, $Z, $Y, $D[$Q + 3], $y, 4107603335); - $Y = f($Y, $X, $W, $Z, $D[$Q + 8], $w, 1163531501); - $Z = f($Z, $Y, $X, $W, $D[$Q + 13], $B, 2850285829); - $W = f($W, $Z, $Y, $X, $D[$Q + 2], $A, 4243563512); - $X = f($X, $W, $Z, $Y, $D[$Q + 7], $y, 1735328473); - $Y = f($Y, $X, $W, $Z, $D[$Q + 12], $w, 2368359562); - $Z = E($Z, $Y, $X, $W, $D[$Q + 5], $o, 4294588738); - $W = E($W, $Z, $Y, $X, $D[$Q + 8], $m, 2272392833); - $X = E($X, $W, $Z, $Y, $D[$Q + 11], $l, 1839030562); - $Y = E($Y, $X, $W, $Z, $D[$Q + 14], $j, 4259657740); - $Z = E($Z, $Y, $X, $W, $D[$Q + 1], $o, 2763975236); - $W = E($W, $Z, $Y, $X, $D[$Q + 4], $m, 1272893353); - $X = E($X, $W, $Z, $Y, $D[$Q + 7], $l, 4139469664); - $Y = E($Y, $X, $W, $Z, $D[$Q + 10], $j, 3200236656); - $Z = E($Z, $Y, $X, $W, $D[$Q + 13], $o, 681279174); - $W = E($W, $Z, $Y, $X, $D[$Q + 0], $m, 3936430074); - $X = E($X, $W, $Z, $Y, $D[$Q + 3], $l, 3572445317); - $Y = E($Y, $X, $W, $Z, $D[$Q + 6], $j, 76029189); - $Z = E($Z, $Y, $X, $W, $D[$Q + 9], $o, 3654602809); - $W = E($W, $Z, $Y, $X, $D[$Q + 12], $m, 3873151461); - $X = E($X, $W, $Z, $Y, $D[$Q + 15], $l, 530742520); - $Y = E($Y, $X, $W, $Z, $D[$Q + 2], $j, 3299628645); - $Z = t($Z, $Y, $X, $W, $D[$Q + 0], $V, 4096336452); - $W = t($W, $Z, $Y, $X, $D[$Q + 7], $U, 1126891415); - $X = t($X, $W, $Z, $Y, $D[$Q + 14], $S, 2878612391); - $Y = t($Y, $X, $W, $Z, $D[$Q + 5], $P, 4237533241); - $Z = t($Z, $Y, $X, $W, $D[$Q + 12], $V, 1700485571); - $W = t($W, $Z, $Y, $X, $D[$Q + 3], $U, 2399980690); - $X = t($X, $W, $Z, $Y, $D[$Q + 10], $S, 4293915773); - $Y = t($Y, $X, $W, $Z, $D[$Q + 1], $P, 2240044497); - $Z = t($Z, $Y, $X, $W, $D[$Q + 8], $V, 1873313359); - $W = t($W, $Z, $Y, $X, $D[$Q + 15], $U, 4264355552); - $X = t($X, $W, $Z, $Y, $D[$Q + 6], $S, 2734768916); - $Y = t($Y, $X, $W, $Z, $D[$Q + 13], $P, 1309151649); - $Z = t($Z, $Y, $X, $W, $D[$Q + 4], $V, 4149444226); - $W = t($W, $Z, $Y, $X, $D[$Q + 11], $U, 3174756917); - $X = t($X, $W, $Z, $Y, $D[$Q + 2], $S, 718787259); - $Y = t($Y, $X, $W, $Z, $D[$Q + 9], $P, 3951481745); - $Z = L($Z, $h); - $Y = L($Y, $J); - $X = L($X, $v); - $W = L($W, $g) - } - - my $i = C($Z) . C($Y) . C($X) . C($W); - - return lc $i; -} - -1; diff --git a/src/ya.pl b/src/ya.pl index 87ff902..04380ea 100755 --- a/src/ya.pl +++ b/src/ya.pl @@ -5,7 +5,6 @@ use Encode qw/from_to decode/; use Encode::Guess; use File::Basename; use POSIX qw/strftime/; -use YaHash; use constant IS_WIN => $^O eq 'MSWin32'; use constant @@ -15,6 +14,7 @@ use constant TIMEOUT => 5, AGENT => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0', YANDEX_BASE => 'https://music.yandex.ru', + MD5_SALT => 'XGRlBW9FXlekgbPrRHuSiA', MUSIC_INFO_REGEX => qr/var\s+Mu\s+=\s+(.+?);\s+<\/script>/is, DOWNLOAD_INFO_MASK => '/api/v1.5/handlers/api-jsonp.jsx?requestId=2&nc=%d&action=getTrackSrc&p=download-info/%s/2.mp3', DOWNLOAD_PATH_MASK => 'http://%s/get-mp3/%s/%s?track-id=%s&from=service-10-track&similarities-experiment=default', @@ -48,7 +48,7 @@ my %req_modules = ( NIX => [], WIN => [ qw/Win32::Console::ANSI Win32API::File/ ], - ALL => [ qw/File::Copy File::Temp MP3::Tag JSON::PP Getopt::Long::Descriptive Term::ANSIColor LWP::UserAgent HTTP::Cookies HTML::Entities/ ] + ALL => [ qw/Digest::MD5 File::Copy File::Temp MP3::Tag JSON::PP Getopt::Long::Descriptive Term::ANSIColor LWP::UserAgent HTTP::Cookies HTML::Entities/ ] ); $\ = NL; @@ -340,8 +340,7 @@ sub get_track_url s => $json->{s} ); - my $hash = hash(substr($fields{path}, 1) . $fields{s}); - + my $hash = Digest::MD5::md5_hex(MD5_SALT . substr($fields{path}, 1) . $fields{s}); my $url = sprintf(DOWNLOAD_PATH_MASK, $fields{host}, $hash, $fields{ts}.$fields{path}, (split /\./, $storage_dir)[1]); info(DEBUG, 'Track url: ' . $url);