[hashcash] Re: updating Digest::Hashcash? (Re: Re: Digest::Hashcash)

  • From: Justin <justin-hashcash@xxxxxxxx>
  • To: hashcash@xxxxxxxxxxxxx
  • Date: Fri, 3 Jun 2005 14:23:23 +0000

This seems to accurately verify version 0 and version 1 stamps, and
return proper timestamps and resource values (so long as the resource
doesn't contain escaped colons - I don't remember whether that's allowed
or not).

It perhaps ought to return 0 for bits, and null strings for
timestamp/resource values, for those that don't exist or are invalid.

diff -dur Digest-Hashcash-0.03-o/Hashcash.pm Digest-Hashcash-0.03/Hashcash.pm
--- Digest-Hashcash-0.03-o/Hashcash.pm  2005-03-03 17:24:10.000000000 +0000
+++ Digest-Hashcash-0.03/Hashcash.pm    2005-06-03 14:19:49.318948480 +0000
@@ -29,7 +29,7 @@
 
 no warnings;
 
-$VERSION = 0.03;
+$VERSION = 0.031;
 
 XSLoader::load Digest::Hashcash, $VERSION;
 
@@ -110,12 +110,11 @@
 Any additional parameters are interpreted the same way as arguments to
 C<new>.
 
-=item $prefix = $cipher->verify ($token [, param => value...]))
+=item $prefix = $cipher->verify ($token)
 
-Checks the given token and returns true if the token has the minimum
-number of prefix bits, or false otherwise.  The value returned is actually
-the number of collisions, so to find the number of collisions bits specify
-C<< collisions => 0 >>.
+Version 0: Checks the given token and returns the number of collision bits
+Version 1: Returns 0 if stated value is more than the computed collision value,
+           otherwise returns the stated stamp value.
 
 Any additional parameters are interpreted the same way as arguments to
 C<new>.
@@ -148,32 +147,45 @@
 
 sub verify {
    my ($self, $token) = (shift, shift);
-   my %arg = (%$self, @_);
 
    my $prefix = &_prefixlen($token);
 
-   $prefix < $arg{size}
-      ? undef
-      : $prefix;
+   if ($token =~ /^0:/) {
+      ($ver, $ts, $res, $rand) = split(':', $token, 4);
+      return $prefix >= 0 ? $prefix : 0;
+   } elsif ($token =~ /^1:/) {
+      ($ver, $bits, $ts, $res, $junk) = split(':', $token, 5);
+      return $prefix >= $bits ? $bits : 0;
+   }
+   else { return undef; }
 }
 
 sub resource {
    my ($self, $token) = @_;
 
-   $token =~ /^\d+:\d*:(.*):/
-      or return undef;
-
-   return $1;
+   if ($token =~ /^0:/) {
+      ($ver, $ts, $res, $rand) = split(':', $token, 4);
+   }
+   elsif ($token =~ /^1:/) {
+      ($ver, $bits, $ts, $res, $junk) = split(':', $token, 5);
+   }
+   else { return undef; }
+   return $res;
 }
 
 sub timestamp {
    my ($self, $token) = @_;
 
-   $token =~ /^\d+:(\d*):.*:/
-      or return undef;
+   if ($token =~ /^0:/) {
+      ($ver, $ts, $res, $rand) = split(':', $token, 4);
+   }
+   elsif ($token =~ /^1:/) {
+      ($ver, $bits, $ts, $res, $junk) = split(':', $token, 5);
+   }
+   else { return undef; }
 
    my ($y, $m, $d, $H, $M, $S);
-   local $_ = $1;
+   local $_ = $ts;
    $y = /\G(\d\d)/gc ? $1 : return undef;
    $m = /\G(\d\d)/gc ? $1 : 1;
    $d = /\G(\d\d)/gc ? $1 : 1;

Other related posts: