Skip to content

Instantly share code, notes, and snippets.

@alem0lars
Last active November 12, 2015 11:30
Show Gist options
  • Save alem0lars/e40e216374901b0b2fd2 to your computer and use it in GitHub Desktop.
Save alem0lars/e40e216374901b0b2fd2 to your computer and use it in GitHub Desktop.
Verify if secp128r1 signature is valid
#!/usr/bin/env ruby
#
# Verify if a secp128r1 signature is valid.
#
# Dependencies:
# * ECDSA (gem install ecdsa)
#
# Authors:
# Alessandro Molari (alem0lars) <molari.alessandro@gmail.com>
# Luca Molari (LMolr) <molari.luca@gmail.com>
#
# License Apache 2.0
#
require "optparse"
require "ostruct"
require "ecdsa"
def create_signature(sig_str)
r = sig_str[0..31].to_i(16)
s = sig_str[32..63].to_i(16)
ECDSA::Signature.new(r, s)
end
def create_point(pubk_str)
pubk_str = pubk_str[2..-1] # Skip first 2 chars ('04')
x = pubk_str[0..31].to_i(16)
y = pubk_str[32..63].to_i(16)
ECDSA::Group::Secp128r1.new_point([x, y])
end
def parse(args)
options = OpenStruct.new
options.pubk = nil
options.digest = nil
options.signature = nil
parser = OptionParser.new do |opts|
opts.banner = "Usage: verify_sig [options]"
opts.separator ""
opts.separator "Specific options:"
opts.on("-k", "--public-key PUBKEY", "The public key") do |pubk|
options.pubk = pubk
end
opts.on("-d", "--digest DIGEST", "The digest") do |digest|
options.digest = digest
end
opts.on("-s", "--signature SIGNATURE", "The signature") do |signature|
options.signature = signature
end
opts.separator ""
opts.separator "Common options:"
opts.on_tail("-h", "--help", "Show this message") do
puts opts
exit
end
end
parser.parse!(args)
[parser, options]
end
def main
parser, options = parse ARGV
unless options.pubk =~ /^04[a-zA-Z0-9]{64}$/
puts "Invalid public key\n"
puts parser.help
exit(-1)
end
unless options.digest =~ /^[a-zA-Z0-9]{14}$/
puts "Invalid digest\n"
puts parser.help
exit(-1)
end
unless options.signature =~ /^[a-zA-Z0-9]{64}$/
puts "Invalid signature\n"
puts parser.help
exit(-1)
end
pubk = create_point options.pubk
digest = options.digest.to_i(16)
signature = create_signature options.signature
puts "--> PubKey ".ljust(50, "-")
puts "X: #{pubk.x}"
puts "Y: #{pubk.y}"
puts "Valid: #{ECDSA::Group::Secp128r1.valid_public_key?(pubk)}"
puts "--> Digest ".ljust(50, "-")
puts "Value: #{digest}"
puts "--> Signature ".ljust(50, "-")
puts "R: #{signature.r}"
puts "S: #{signature.s}"
puts "Valid: #{ECDSA.valid_signature?(pubk, digest, signature)}"
end
main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment