Advertisement
Guest User

Untitled

a guest
Nov 12th, 2015
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.32 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2. #
  3. # Verify if a secp128r1 signature is valid.
  4. #
  5. # Dependencies:
  6. # * ECDSA (gem install ecdsa)
  7. #
  8. # Authors:
  9. # Alessandro Molari (alem0lars) <molari.alessandro@gmail.com>
  10. # Luca Molari (LMolr) <molari.luca@gmail.com>
  11. #
  12. # License Apache 2.0
  13. #
  14.  
  15. require "optparse"
  16. require "ostruct"
  17. require "ecdsa"
  18.  
  19.  
  20. def create_signature(sig_str)
  21. r = sig_str[0..31].to_i(16)
  22. s = sig_str[32..63].to_i(16)
  23. ECDSA::Signature.new(r, s)
  24. end
  25.  
  26. def create_point(pubk_str)
  27. pubk_str = pubk_str[2..-1] # Skip first 2 chars ('04')
  28. x = pubk_str[0..31].to_i(16)
  29. y = pubk_str[32..63].to_i(16)
  30. ECDSA::Group::Secp128r1.new_point([x, y])
  31. end
  32.  
  33.  
  34. def parse(args)
  35. options = OpenStruct.new
  36. options.pubk = nil
  37. options.digest = nil
  38. options.signature = nil
  39.  
  40. parser = OptionParser.new do |opts|
  41. opts.banner = "Usage: verify_sig [options]"
  42.  
  43. opts.separator ""
  44. opts.separator "Specific options:"
  45.  
  46. opts.on("-k", "--public-key PUBKEY", "The public key") do |pubk|
  47. options.pubk = pubk
  48. end
  49.  
  50. opts.on("-d", "--digest DIGEST", "The digest") do |digest|
  51. options.digest = digest
  52. end
  53.  
  54. opts.on("-s", "--signature SIGNATURE", "The signature") do |signature|
  55. options.signature = signature
  56. end
  57.  
  58. opts.separator ""
  59. opts.separator "Common options:"
  60.  
  61. opts.on_tail("-h", "--help", "Show this message") do
  62. puts opts
  63. exit
  64. end
  65.  
  66. end
  67.  
  68. parser.parse!(args)
  69.  
  70. [parser, options]
  71. end
  72.  
  73.  
  74. def main
  75. parser, options = parse ARGV
  76.  
  77. unless options.pubk =~ /^04[a-zA-Z0-9]{64}$/
  78. puts "Invalid public key\n"
  79. puts parser.help
  80. exit(-1)
  81. end
  82. unless options.digest =~ /^[a-zA-Z0-9]{14}$/
  83. puts "Invalid digest\n"
  84. puts parser.help
  85. exit(-1)
  86. end
  87. unless options.signature =~ /^[a-zA-Z0-9]{64}$/
  88. puts "Invalid signature\n"
  89. puts parser.help
  90. exit(-1)
  91. end
  92.  
  93. pubk = create_point options.pubk
  94. digest = options.digest.to_i(16)
  95. signature = create_signature options.signature
  96.  
  97. puts "--> PubKey ".ljust(50, "-")
  98. puts "X: #{pubk.x}"
  99. puts "Y: #{pubk.y}"
  100. puts "Valid: #{ECDSA::Group::Secp128r1.valid_public_key?(pubk)}"
  101.  
  102. puts "--> Digest ".ljust(50, "-")
  103. puts "Value: #{digest}"
  104.  
  105. puts "--> Signature ".ljust(50, "-")
  106. puts "R: #{signature.r}"
  107. puts "S: #{signature.s}"
  108. puts "Valid: #{ECDSA.valid_signature?(pubk, digest, signature)}"
  109.  
  110. end
  111.  
  112. main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement