Elliptic Curve Digital Signature Algorithm: Difference between revisions
Content added Content deleted
(→{{header|Perl 6}}: Update: use another lib for SHA; try bigger data set ; borrow point on curve check routine from reference entries ; more verbose output ; get rid of pack , etc) |
m (→{{header|Perl 6}}: Thanks to Thundergnat for the advice ; use the correct lib ; remove unnecessary int/str round trip ; echo the Julia entry by showing a failure and suppress naughty hyper) |
||
Line 1,115: | Line 1,115: | ||
Reference: Many routines are translated from this [https://github.com/sblackstone/toy-ecdsa Ruby repository], by Stephen Blackstone. The rest are taken here and there from RC. |
Reference: Many routines are translated from this [https://github.com/sblackstone/toy-ecdsa Ruby repository], by Stephen Blackstone. The rest are taken here and there from RC. |
||
<lang perl6>#!/usr/bin/env perl6 |
<lang perl6>#!/usr/bin/env perl6 |
||
use Digest:: |
use Digest::SHA256::Native; |
||
# Following data taken from the C entry |
# Following data taken from the C entry |
||
Line 1,122: | Line 1,123: | ||
#`{ Following data taken from the Julia entry; 256-bit; tested |
#`{ Following data taken from the Julia entry; 256-bit; tested |
||
our (\A,\B,\P,\O,\Gx,\Gy) = (0, 7, # https://en.bitcoin.it/wiki/Secp256k1 |
our (\A,\B,\P,\O,\Gx,\Gy) = (0, 7, # https://en.bitcoin.it/wiki/Secp256k1 |
||
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F, |
|||
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141, |
|||
0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, |
|||
0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8); # } |
|||
role Horizon { method gist { 'EC Point at horizon' } } |
role Horizon { method gist { 'EC Point at horizon' } } |
||
Line 1,171: | Line 1,172: | ||
method generate_signature(Int \private_key, Str \msg) { |
method generate_signature(Int \private_key, Str \msg) { |
||
my \z = :16 |
my \z = :16(sha256-hex msg) % $.n; # self ref: Blob.list.fmt("%02X",'') |
||
loop (my $k = my $s = my $r = 0 ; $s == 0 ; ) { |
loop ( my $k = my $s = my $r = 0 ; $s == 0 ; ) { |
||
loop ($r = $s = 0 ; $r == 0 ; ) { |
loop ( $r = $s = 0 ; $r == 0 ; ) { |
||
$r = (( $k = (1..^$.n).roll ) ⊠ $.G).x % $.n; |
$r = (( $k = (1..^$.n).roll ) ⊠ $.G).x % $.n; |
||
} |
} |
||
Line 1,182: | Line 1,183: | ||
method verify_signature(\msg, \r, \s, \public_key) { |
method verify_signature(\msg, \r, \s, \public_key) { |
||
my \z = :16 |
my \z = :16(sha256-hex msg) % $.n; |
||
my \w = mult_inv s, :modulo($.n); |
my \w = mult_inv s, :modulo($.n); |
||
my (\u1,\u2) = (z*w, r*w) |
my (\u1,\u2) = (z*w, r*w).map: { $_ % $.n } |
||
my \p = (u1 ⊠ $.G ) ⊞ (u2 ⊠ public_key); |
my \p = (u1 ⊠ $.G ) ⊞ (u2 ⊠ public_key); |
||
return (p.x % $.n) == (r % $.n) |
return (p.x % $.n) == (r % $.n) |
||
Line 1,201: | Line 1,202: | ||
say "The public key Qa is : ", Qa; |
say "The public key Qa is : ", Qa; |
||
say "Is Qa ∈ E ? : ", Qa.isOn; |
say "Is Qa ∈ E ? : ", Qa.isOn; |
||
say "Is signature valid? : ", $ec.verify_signature(message, $r, $s, Qa) |
say "Is signature valid? : ", $ec.verify_signature(message, $r, $s, Qa); |
||
say "Message (Tampered) : ", my \altered = "Show me the money"; |
|||
</lang> |
|||
say "Is signature valid? : ", $ec.verify_signature(altered, $r, $s, Qa)</lang> |
|||
{{out}} |
{{out}} |
||
<pre>The Curve E is : 𝑦² = 𝑥³ + 355 𝑥 + 671 (mod 1073741789) |
<pre>The Curve E is : 𝑦² = 𝑥³ + 355 𝑥 + 671 (mod 1073741789) |
||
Line 1,209: | Line 1,211: | ||
Is G ∈ E ? : True |
Is G ∈ E ? : True |
||
Message : Show me the monKey |
Message : Show me the monKey |
||
The private key dA is : |
The private key dA is : 384652035 |
||
The public key Qa is : EC Point at x= |
The public key Qa is : EC Point at x=919494857, y=18030536 |
||
Is Qa ∈ E ? : True |
Is Qa ∈ E ? : True |
||
Is signature valid? : True |
Is signature valid? : True |
||
Message (Tampered) : Show me the money |
|||
Is signature valid? : False |
|||
</pre> |
</pre> |
||