read mifare cards
authorDobrica Pavlinusic <dpavlin@rot13.org>
Sun, 2 Feb 2014 12:44:43 +0000 (07:44 -0500)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Sun, 2 Feb 2014 12:45:05 +0000 (07:45 -0500)
lib/Biblio/RFID/Reader/librfid.pm
scripts/mifare_keys.pl.example [new file with mode: 0644]

index e4136cc..ebb45b9 100644 (file)
@@ -42,44 +42,80 @@ sub _grep_tool {
 
        warn "# _grep_tool $bin $param\n";
        open(my $s, '-|', "$bin $param") || die $!;
+
+       my $sid;
+       my $iso;
+
        while(<$s>) {
                chomp;
                warn "## $_\n";
 
-               my $sid;
-               if ( m/success.+:\s+(.+)/ ) {
-                       $sid = $1;
+               if ( m/Layer 2 success.+\(([^\)]+)\).*:\s+(.+)/ ) {
+                       ( $sid, $iso ) = ( $2, $1 );
                        $sid =~ s/\s*'\s*//g;
-                       $sid = uc join('', reverse split(/\s+/, $sid));
+                       my @sid = split(/\s+/, $sid);
+                       @sid = reverse @sid if $iso =~ m/15693/;
+                       $sid = uc join('', @sid);
+                       warn "## sid=[$sid] iso=[$iso]\n";
                }
-
-               $coderef->( $sid );
+               $coderef->( $sid, $iso );
        }
 
 
 }
 
+my $sid_iso;
+
 sub inventory {
 
        my @tags; 
        _grep_tool 'librfid-tool', '--scan' => sub {
-               my $sid = shift;
-               push @tags, $sid if $sid;
+               my ( $sid, $iso ) = @_;
+               if ( $sid ) {
+                       push @tags, $sid unless defined $sid_iso->{$sid};
+                       $sid_iso->{$sid} = $iso;
+               }
        };
        warn "# invetory ",dump(@tags);
        return @tags;
 }
 
+our $mifare_keys;
+sub read_mifare_keys {
+       my $key_path = $0;
+       $key_path =~ s{/[^/]+$}{/};
+       $key_path .= "mifare_keys.pl";
+       warn "# $key_path";
+       if ( -e $key_path ) {
+               require $key_path;
+               warn "# mifare keys for sectors ", join(' ', keys %$mifare_keys), " loaded\n";
+       }
+}
+
 sub read_blocks {
+       my ( $self, $sid ) = @_;
 
-       my $sid;
+       my $iso = $sid_iso->{$sid};
        my $blocks;
-       _grep_tool 'librfid-tool', '--read -1' => sub {
-               $sid ||= shift;
-               $blocks->{$sid}->[$1] = hex2bytes($2)
-               if m/block\[\s*(\d+):.+data.+:\s*(.+)/;
 
-       };
+       if ( $iso =~ m/15693/ ) {
+               _grep_tool 'librfid-tool', '--read -1' => sub {
+                       $sid ||= shift;
+                       $blocks->{$sid}->[$1] = hex2bytes($2)
+                       if m/block\[\s*(\d+):.+data.+:\s*(.+)/;
+
+               };
+       } else {
+               read_mifare_keys unless $mifare_keys;
+
+               foreach my $sector ( keys %$mifare_keys ) {
+                       my $key = lc $mifare_keys->{$sector};
+                       _grep_tool 'mifare-tool', "-k $key -r $sector" => sub {
+                               $blocks->{$sid}->[$sector] = hex2bytes($1)
+                               if m/data=\s*(.+)/;
+                       };
+               }
+       }
        warn "# read_blocks ",dump($blocks);
        return $blocks;
 }
diff --git a/scripts/mifare_keys.pl.example b/scripts/mifare_keys.pl.example
new file mode 100644 (file)
index 0000000..d252cba
--- /dev/null
@@ -0,0 +1,6 @@
+$mifare_keys = {
+       0 => 'a0a1a2a3a4a5',
+       1 => 'a0a1a2a3a4a5',
+       2 => 'a0a1a2a3a4a5',
+};
+1;