pykcs_info.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. '''Created Feb 24, 2021 Levi'''
  2. # import os
  3. # import ssl
  4. # import urllib.request
  5. # import tempfile
  6. #
  7. # import PyKCS11
  8. # import pkcs11
  9. # import asn1crypto.pem
  10. # from PyKCS11 import *
  11. import platform
  12. import sys
  13. import keyring
  14. from keyring import backends
  15. import PyKCS11
  16. from PyKCS11.LowLevel import CKF_DIGEST
  17. if platform.system() == 'Linux':
  18. keyring.backend._load_plugins()
  19. keyring.set_keyring(backends.SecretService.Keyring())
  20. class getInfo(object):
  21. red = blue = magenta = normal = ""
  22. def colorize(self, text, arg):
  23. print(self.magenta + text + self.blue, arg, self.normal)
  24. def display(self, obj, indent=""):
  25. dico = obj.to_dict()
  26. for key in sorted(dico.keys()):
  27. type_ = obj.fields[key]
  28. left = indent + key + ":"
  29. if type_ == "flags":
  30. self.colorize(left, ", ".join(dico[key]))
  31. elif type_ == "pair":
  32. self.colorize(left, "%d.%d" % dico[key])
  33. else:
  34. self.colorize(left, dico[key])
  35. def __init__(self, lib=None):
  36. if sys.stdout.isatty() and platform.system().lower() != 'windows':
  37. self.red = "\x1b[01;31m"
  38. self.blue = "\x1b[34m"
  39. self.magenta = "\x1b[35m"
  40. self.normal = "\x1b[0m"
  41. self.pkcs11 = PyKCS11.PyKCS11Lib()
  42. self.pkcs11.load(lib)
  43. def getSlotInfo(self, slot, slot_index, nb_slots):
  44. print()
  45. print(self.red + "Slot %d/%d (number %d):" % (slot_index, nb_slots,
  46. slot) + self.normal)
  47. self.display(self.pkcs11.getSlotInfo(slot), " ")
  48. def getTokenInfo(self, slot):
  49. print(" TokenInfo")
  50. self.display(self.pkcs11.getTokenInfo(slot), " ")
  51. def getMechanismInfo(self, slot):
  52. print(" Mechanism list: ")
  53. m = self.pkcs11.getMechanismList(slot)
  54. for x in m:
  55. self.colorize(" ", x)
  56. i = self.pkcs11.getMechanismInfo(slot, x)
  57. if not i.flags & CKF_DIGEST:
  58. if i.ulMinKeySize != PyKCS11.CK_UNAVAILABLE_INFORMATION:
  59. self.colorize(" ulMinKeySize:", i.ulMinKeySize)
  60. if i.ulMaxKeySize != PyKCS11.CK_UNAVAILABLE_INFORMATION:
  61. self.colorize(" ulMaxKeySize:", i.ulMaxKeySize)
  62. self.colorize(" flags:", ", ".join(i.flags2text()))
  63. def getInfo(self):
  64. self.display(self.pkcs11.getInfo())
  65. def getSessionInfo(self, slot, pin=""):
  66. print(" SessionInfo", end=' ')
  67. session = self.pkcs11.openSession(slot)
  68. if pin != "":
  69. if pin is None:
  70. print("(using pinpad)")
  71. else:
  72. print("(using pin: %s)" % pin)
  73. session.login(pin)
  74. else:
  75. print()
  76. self.display(session.getSessionInfo(), " ")
  77. if pin:
  78. session.logout()
  79. def usage():
  80. print("Usage:", sys.argv[0], end=' ')
  81. print("[-a][--all]", end=' ')
  82. print("[-p pin][--pin=pin] (use 'NULL' for pinpad)", end=' ')
  83. print("[-s slot][--slot=slot]", end=' ')
  84. print("[-c lib][--lib=lib]", end=' ')
  85. print("[-m][--mechanisms]", end=' ')
  86. print("[-h][--help]")
  87. if __name__ == '__main__':
  88. import getopt
  89. try:
  90. opts, args = getopt.getopt(sys.argv[1:], "p:s:c:hoam",
  91. ["pin=", "slot=", "lib=", "help", "opensession", "all",
  92. "mechanisms"])
  93. except getopt.GetoptError:
  94. # print help information and exit:
  95. usage()
  96. sys.exit(2)
  97. slot = None
  98. lib = None
  99. pin = keyring.get_password('sig', 'token')
  100. token_present = True
  101. list_mechanisms = False
  102. for o, a in opts:
  103. if o in ("-h", "--help"):
  104. usage()
  105. sys.exit()
  106. if o in ("-p", "--pin"):
  107. pin = a
  108. if pin == "NULL":
  109. pin = None
  110. if o in ("-s", "--slot"):
  111. slot = int(a)
  112. if o in ("-c", "--lib"):
  113. lib = a
  114. if o in ("-a", "--all"):
  115. token_present = False
  116. if o in ("-m", "--mechanisms"):
  117. list_mechanisms = True
  118. gi = getInfo(lib)
  119. gi.getInfo()
  120. slots = gi.pkcs11.getSlotList(token_present)
  121. print("Available Slots:", len(slots), slots)
  122. if len(slots) == 0:
  123. sys.exit(2)
  124. if slot is not None:
  125. slots = [slots[slot]]
  126. print("Using slot:", slots[0])
  127. slot_index = 0
  128. nb_slots = len(slots)
  129. for slot in slots:
  130. slot_index += 1
  131. try:
  132. gi.getSlotInfo(slot, slot_index, nb_slots)
  133. gi.getSessionInfo(slot, pin)
  134. gi.getTokenInfo(slot)
  135. if list_mechanisms:
  136. gi.getMechanismInfo(slot)
  137. except PyKCS11.PyKCS11Error as e:
  138. print("Error:", e)