Skip to content

Instantly share code, notes, and snippets.

@DrI-T
Last active April 2, 2024 16:00
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DrI-T/752512f0b20e037993c35765893ff3bb to your computer and use it in GitHub Desktop.
Save DrI-T/752512f0b20e037993c35765893ff3bb to your computer and use it in GitHub Desktop.
lliptic Curve Digital Signature and perl

Elliptic Curve Digital Signature and perl

The easier way to manipulate ECC key-pairs and signatures is via the perl module Crypt::PK::ECC.

Below is a simple example of code for

  1. creating the key pair (secp256k1) : eckeygen.pl
  2. signing and verifying a message : signature.pl

note : for RFC7518 signatures, use hash_name = 'SHA256'

MODULE INSTALLATION

sudo cpan install Crypt::PK::ECC


-- 
note: I tried to use Crypt::Perl::ECDSA, however it took too long to install

#!/usr/bin/perl
use Crypt::PK::ECC;
use YAML::Syck qw(Dump);
#Key generation
my $pk = Crypt::PK::ECC->new();
$pk->generate_key('secp256k1');
my $private_der = $pk->export_key_der('private');
my $public_der = $pk->export_key_der('public');
my $private_pem = $pk->export_key_pem('private');
my $private_raw = $pk->export_key_raw('private');
my $public_pem = $pk->export_key_pem('public');
my $public_raw = $pk->export_key_raw('public');
local *PK;
open PK,'>','eckey-priv.der'; binmode(PK);
print PK $private_der;
close
open PK,'>','eckey-pub.der'; binmode(PK);
print PK $public_der;
close PK;
open PK,'>','eckey.yml';
print PK "--- # eckey\n";
printf PK "pk: %s\n",Dump($pk->key2hash);
printf PK "---\n";
printf PK "pkey-raw: %s\n",unpack'H*',$public_raw;
printf PK "skey-raw: %s\n",unpack'H*',$private_raw;
printf PK "skey-der: %s\n",unpack'H*',$private_der;
printf PK "pkey-der: %s\n",unpack'H*',$public_der;
printf PK "...\n";
close PK;
open PK,'>','eckey-priv.pem';
print PK $private_pem;
close PK;
open PK,'>','eckey-pub.pem';
print PK $public_pem;
close PK;
exit $?;
#
perl eckeygen.pl
perl signature.pl
exit $?;
true
#!/usr/bin/perl
my $message = 'Hi Bob, how are you doing ?';
use Crypt::PK::ECC;
my $priv = Crypt::PK::ECC->new('eckey-priv.der');
my $sig = $priv->sign_message_rfc7518($message,'SHA256');
printf "sig: %s\n",unpack'H*',$sig;
my $pub = Crypt::PK::ECC->new('eckey-pub.pem');
my $valid = $pub->verify_message_rfc7518($sig,$message, 'SHA256');
printf "valid: %s\n",$valid;
exit $?;
1;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment