package Net::DAAP::Client::Auth::Protocol::v3;
use strict;
use warnings;
use Digest::MD5::M4p;
use base qw( Net::DAAP::Client::Auth::Protocol );

# this is a translation of the GenerateHash function in hasher.c of
# libopendaap http://crazney.net/programs/itunes/authentication.html

my @seeds;
sub _md5_thingy {
    my $self = shift;
    my ($url, $select, $sequence) = @_;
    unless (@seeds) {
        for my $i (0..255) {
            my $ctx = Digest::MD5::M4p->new;

            $ctx->add( $i & 0x40 ? "eqwsdxcqwesdc"      : "op[;lm,piojkmn" );
            $ctx->add( $i & 0x20 ? "876trfvb 34rtgbvc"  :  "=-0ol.,m3ewrdfv" );
            $ctx->add( $i & 0x10 ? "87654323e4rgbv "
                                 : "1535753690868867974342659792" );
            $ctx->add( $i & 0x08 ? "Song Name"          : "DAAP-CLIENT-ID:" );
            $ctx->add( $i & 0x04 ? "111222333444555"    : "4089961010" );
            $ctx->add( $i & 0x02 ? "playlist-item-spec" : "revision-number" );
            $ctx->add( $i & 0x01 ? "session-id"         : "content-codes" );
            $ctx->add( $i & 0x80 ? "IUYHGFDCXWEDFGHN"   : "iuytgfdxwerfghjm" );
            push @seeds, uc $ctx->hexdigest;
        }
    }

    my $ctx = Digest::MD5::M4p->new;
    $ctx->add( $url );
    $ctx->add( "Copyright 2003 Apple Computer, Inc." );
    $ctx->add( $seeds[ $select ]);
    $ctx->add( $sequence ) if $sequence;
    return uc $ctx->hexdigest;
}

sub _get_song {
    my $self = shift;
    ++$self->{REQUEST_ID};
    return $self->SUPER::_get_song( @_ );
}


1;
__END__
