from __future__ import print_function
from base64 import b64encode
import json
from PyKCS11 import *
import binascii
import time

auth = {}
auth["userid"] = "ramirozambrana"
auth["orgaid"] = "ivnosys"
auth["password"] = "1234"
auth["url"] = "ivsign.net"
auth["log"] = "/tmp/keycontroller.log"
auth["logall"] = "false"
auth["logatribute"] = "false"

userAuth = b64encode(json.dumps(auth).encode('utf-8')).decode('utf-8')
certsData = []
cData = {}
cData['certid'] = "AQDB3ZRAE6HYV5PTMU"
cData['pin'] = "1234"
certsData.append(cData)
data = b64encode(json.dumps(certsData).encode('utf-8')).decode('utf-8')


pkcs11 =PyKCS11Lib()
pkcs11.load(/usr/lib64/libivpkcs11standalone.so)
print("loaded")
slot = pkcs11.getSlotList(tokenPresent=True)[0]
session = pkcs11.openSession(slot,CKF_SERIAL_SESSION | CKF_RW_SESSION)

#pasamos el array con el certid y el pin
print("Login")
session.login(userAuth)

print("SetPins")
session.initPin(data)

#test firma
toSign = "169291d65dd8d8bb1c6cbbf1a9a598f784fa0aa8"
mechanism = Mechanism(CKM_SHA1_RSA_PKCS, None)

#buscamos los objetos
print("findObjects")
objs = session.findObjects([(CKA_CLASS, CKO_CERTIFICATE)])
print("Nb objetcs:", len(objs))
#print(objs)

#pintar atritbutos
print("getAttributeValue")
for o in objs:
    attr = session.getAttributeValue(o, [CKA_LABEL, CKA_CLASS])
    print(attr)

#firmamos con el primer objeto
signature = session.sign(objs[0], binascii.unhexlify(toSign), mechanism)
print("\nsignature: {}".format(binascii.hexlify(bytearray(signature))))


session.logout()
session.closeSession()