pykcs_lib.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. '''Created Feb 24, 2021 Levi'''
  2. import os
  3. import ssl
  4. import urllib.request
  5. import tempfile
  6. import platform
  7. import keyring
  8. from keyring import backends
  9. import PyKCS11
  10. import asn1crypto.pem
  11. import binascii
  12. from PyKCS11.LowLevel import (CKF_SERIAL_SESSION, CKF_RW_SESSION,
  13. CKO_PRIVATE_KEY, CKA_ID,
  14. CKA_CLASS, CKM_SHA1_RSA_PKCS,
  15. CKO_PUBLIC_KEY)
  16. if platform.system() == 'Linux':
  17. keyring.backend._load_plugins()
  18. keyring.set_keyring(backends.SecretService.Keyring())
  19. lib = PyKCS11.PyKCS11Lib()
  20. lib.load(os.getenv('PKCS11_MODULE'))
  21. token_present = True
  22. slot = lib.getSlotList(tokenPresent=True)[0]
  23. slots = lib.getSlotList(token_present)
  24. print(lib.getMechanismList(slot))
  25. print("Available Slots:", len(slots), slots)
  26. for s in slots:
  27. try:
  28. i = lib.getSlotInfo(s)
  29. print("Slot no:", s)
  30. print("slotDescription", i.slotDescription.strip())
  31. print("manufacturerID", i.manufacturerID.strip())
  32. t = lib.getTokenInfo(s)
  33. print("TokenInfo")
  34. print("label", t.label.strip())
  35. print("manufacturerID", t.manufacturerID.strip())
  36. print("model", t.model.strip())
  37. except PyKCS11.PyKCS11Error as e:
  38. print("Error:", e)
  39. keyID = (0x38, 0x7b, 0x4b, 0x49, 0xe2, 0xe7, 0x10, 0x4f, 0x60, 0x15, 0xc1, 0x42, 0x38, 0x6c, 0x3d, 0x41, 0x43, 0x5e, 0x91, 0x9b,)
  40. session = lib.openSession(slot, CKF_SERIAL_SESSION | CKF_RW_SESSION)
  41. session.login(keyring.get_password('sig', 'token').strip())
  42. toSign = "48656c6c6f20776f726c640d0a"
  43. privKey = session.findObjects([(CKA_CLASS, CKO_PRIVATE_KEY), (CKA_ID, keyID)])[0]
  44. print(privKey)
  45. signature = session.sign(privKey, binascii.unhexlify(toSign), PyKCS11.Mechanism(CKM_SHA1_RSA_PKCS, None))
  46. # key_dict = privKey.to_dict()
  47. pubKey = session.findObjects([(CKA_CLASS, CKO_PUBLIC_KEY), (CKA_ID, keyID)])[0]
  48. result = session.verify(pubKey, binascii.unhexlify(toSign), signature, PyKCS11.Mechanism(CKM_SHA1_RSA_PKCS, None))
  49. print("\nVerified:", result)
  50. # print(privKey)
  51. session.logout()
  52. session.closeSession()