Last active
November 12, 2015 11:30
-
-
Save alem0lars/e40e216374901b0b2fd2 to your computer and use it in GitHub Desktop.
Verify if secp128r1 signature is valid
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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