Crypt-HashCash
view release on metacpan or search on metacpan
bin/hashcash.pl view on Meta::CPAN
gr => [qw(0008 0408)],
hi => [qw(0039 0439)],
it => [qw(0010 0410 0810)],
ja => [qw(0011 0411)],
kr => [qw(0012 0412)],
ru => [qw(0019 0819 0419)],
zh => [qw(0004 7804 0804 1004 7c04 0c04 1404 0404)]
);
require Win32::API;
Win32::API->Import('kernel32', 'int GetUserDefaultLCID()');
my $langid = GetUserDefaultLCID();
for my $l (keys %winlang) {
$lang = $l, last if grep { sprintf("%04x",$langid) eq $_ } @{$winlang{$l}};
}
# print STDERR "$lang\n";
}
else {
$lang = $ENV{LC_ALL} || $ENV{LANG};
}
$lang = 'en' unless defined $lang;
$lang = 'en' if $lang =~ /^C|POSIX/;
$lang = substr($lang, 0, 2) || 'en';
return ($lang, %lang);
lib/Crypt/HashCash/Client.pm view on Meta::CPAN
return unless ref $coin eq 'Crypt::HashCash::Coin';
$self->_diag ("coin: $coin->{Z}\nX: $coin->{X}\nD: $coin->{D}\n");
my $signer = $self->sigscheme eq 'RSA' ? $self->rsab : $self->ecdsab;
$signer->verify(Key => $self->mintkeys->{$coin->{D}}, Signature => $coin->{Z}, Message => $coin->{X});
}
sub turingimg { # Get turing image
my $self = shift;
my $res = $self->msgvault('hi');
return undef if !$res or $res =~ /^-ERR/;
my ($turingid, $turing) = split / /, $res;
$self->turingid($turingid);
my $turingimage = pack('H*',$turing);
}
sub cancelturing {
my $self = shift;
$self->msgvault('dt ' . $self->turingid);
}
sub getaddress {
my ($self, %arg) = @_;
my $res = $self->msgvault('id ' . $self->turingid . " $arg{Turing} $arg{Amt} $arg{Numcoins}");
return undef if !$res or $res =~ /^-ERR/;
return $res;
}
sub initbuy { # Initializa a buy
my ($self, %arg) = @_;
my $res = $self->msgvault("id $arg{Address} $arg{Amt} $arg{Numcoins}");
return undef if !$res or $res =~ /^-ERR/;
return $res if $res =~ /^-E/;
my $inits = [ split / /, $res ]
lib/Crypt/HashCash/Client.pm view on Meta::CPAN
}
sub _diag {
my $self = shift;
print STDERR @_ if $self->debug;
}
sub AUTOLOAD {
my $self = shift; (my $auto = $AUTOLOAD) =~ s/.*:://;
return if $auto eq 'DESTROY';
if ($auto =~ /^(vaultconf|vaultkey|mintkeys|xsize|debug|version|hash|rsab|ecdsab|denoms|keydb|sigscheme|turingid|frame|offline)$/x) {
$self->{"\U$auto"} = shift if (defined $_[0]);
return $self->{"\U$auto"};
}
else {
die "Could not AUTOLOAD method $auto.";
}
}
1; # End of Crypt::HashCash::Client
lib/Crypt/HashCash/Vault/Bitcoin.pm view on Meta::CPAN
type TEXT,
amount INTEGER NOT NULL,
reqid INTEGER UNIQUE,
timestamp INTEGER NOT NULL,
fee INT
);');
}
@tables = $bizbtc->db->tables('%','%','turingtests','TABLE');
unless ($tables[0]) {
return undef unless $bizbtc->db->do('CREATE TABLE turingtests (
turingid INTEGER UNIQUE,
string TEXT
);');
}
@tables = $bizbtc->db->tables('%','%','exchanges','TABLE');
unless ($tables[0]) {
return undef unless $bizbtc->db->do('CREATE TABLE exchanges (
init TEXT UNIQUE,
params TEXT
);');
}
lib/Crypt/HashCash/Vault/Bitcoin.pm view on Meta::CPAN
$keydb->{vaultsec} = unpack('H*',$sk);
$keydb->{vaultpub} = $vaultcfg->{vaultpub} = unpack('H*',$pk);
$keydb->{id} = $vaultcfg->{id} = "$vaultid";
$keydb->{fees} = $vaultcfg->{fees} = $arg{Fees};
$keydb->commit; $vaultcfg->commit;
}
sub turingimg {
my $self = shift;
my $turing = new Authen::TuringImage; my ($img, $string) = $turing->challenge;
my $turingid = makerandom( Size => 32, Strength => 0 );
$self->_diag("INSERT INTO turingtests values ('$turingid', '$string');");
unless ($self->bizbtc->db->do("INSERT INTO turingtests values ($turingid, '$string');")) {
$self->_diag("INSERT INTO turingtests values ('$turingid', '$string');");
# TODO: log an error and tx details
}
return ($turingid, $img);
}
sub predeposit {
my ($self, %arg) = @_;
my $query = "SELECT string from turingtests WHERE turingid='$arg{TuringID}';";
return '-ENOTURING' unless my ($string) = $self->bizbtc->db->selectrow_array($query);
$self->bizbtc->db->do("DELETE FROM turingtests WHERE turingid='$arg{TuringID}';");
return '-ETURINGMISMATCH' unless $string eq $arg{TuringString};
my $btcreq = $self->bizbtc->request(Amount => $arg{Amount});
return $btcreq->address;
}
sub initdeposit {
my ($self, %arg) = @_;
return '-ENOADDRESS' unless $arg{Address};
return '-EADDRESS' unless my $btcreq = $self->bizbtc->findreq(Address => $arg{Address});
return '-EVERIFY' unless ($arg{Offline} ? $btcreq->verify_serial : $btcreq->verify);
lib/Crypt/HashCash/Vault/Bitcoin.pm view on Meta::CPAN
return $ret;
}
sub process_request { # Hande a request from a client
my ($self, $ret, $preret, $sendto, $sendamt) = (shift);
$_ = shift; my $offline = shift;
if (/^ping$/) { # Ping
$ret = 'pong';
}
elsif (/^hi$/) { # Handshake to begin Deposit ( BTC > [#] ) - Send Turing Image
my ($turingid, $turingimg) = $self->turingimg;
$ret = $turingid . ' ' . (unpack 'H*',$turingimg->png);
}
elsif (/^dt (\d+)$/) {
$ret = $self->predeposit(TuringID => $1, TuringString => '');
}
elsif (/^id (\d+) (\S+) (\d+) (\d+)$/) { # Pre-Init Deposit ( BTC > [#] ) - Check Turing string, send BTC address
$ret = $self->predeposit(TuringID => $1, TuringString => $2, Amount => $3, NumCoins => $4);
}
elsif (/^id (\S+) (\d+) (\d+)$/) { # Initialise Deposit - Check deposit, send init vectors
if (my $inits = $self->initdeposit(Address => $1, Amount => $2, NumCoins => $3, Offline => $offline)) {
$ret = $inits =~ /^-E/ ? $inits : "@$inits";
( run in 2.929 seconds using v1.01-cache-2.11-cpan-acf6aa7dc9e )