ecchecksig.py 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #!/usr/bin/env python2
  2. import sys
  3. import pywii as wii
  4. if len(sys.argv) != 3:
  5. print "Usage: %s keyfile.[priv|pub] infile"%sys.argv[0]
  6. sys.exit(1)
  7. if sys.argv[1] == "-":
  8. k = sys.stdin.read()
  9. else:
  10. k = open(sys.argv[1],"rb").read()
  11. if len(k) not in (30,60):
  12. print "Failed to read key"
  13. sys.exit(2)
  14. if len(k) == 30:
  15. print "Key is a private key, generating public key..."
  16. q = wii.ec.priv_to_pub(k)
  17. else:
  18. q = k
  19. print "Public key:"
  20. pq = q.encode('hex')
  21. print "X =",pq[:30]
  22. print " ",pq[30:60]
  23. print "Y =",pq[60:90]
  24. print " ",pq[90:]
  25. print
  26. indata = open(sys.argv[2],"rb").read()
  27. if len(indata) < 64 or indata[:4] != "SIG0":
  28. print "Invalid header"
  29. sys.exit(3)
  30. r = indata[4:34]
  31. s = indata[34:64]
  32. sha = wii.SHA.new(indata[64:]).digest()
  33. print "SHA1: %s"%sha.encode('hex')
  34. print
  35. print "Signature:"
  36. print "R =",r[:15].encode('hex')
  37. print " ",r[15:].encode('hex')
  38. print "S =",s[:15].encode('hex')
  39. print " ",s[15:].encode('hex')
  40. print
  41. if wii.ec.check_ecdsa(q,r,s,sha):
  42. print "Signature is VALID"
  43. else:
  44. print "Signature is INVALID"
  45. sys.exit(4)