source: terepaima/signHash/cryptotoken.cpp @ baaf582

Last change on this file since baaf582 was baaf582, checked in by Antonio Araujo <aaraujo@…>, 6 years ago

Modificación en la función getCertificateInformation(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE certificate) para que se retorne el certificado en hexadecimal en la QStringList.

  • Property mode set to 100644
File size: 54.3 KB
Line 
1#include "cryptotoken.h"
2
3#include <QSslCertificate>
4
5#include <assert.h>
6#include <iostream>
7#include <stdexcept>
8
9#define BINARY_SHA1_LENGTH 20
10#define BINARY_SHA224_LENGTH 28
11#define BINARY_SHA256_LENGTH 32
12#define BINARY_SHA384_LENGTH 48
13#define BINARY_SHA512_LENGTH 64
14
15
16CryptoToken::CryptoToken()
17{
18}
19
20
21CryptoToken::~CryptoToken()
22{
23}
24
25
26bool CryptoToken::initializeCriptoki()
27{
28    QString error("");
29    CK_RV rv;
30    rv = C_Initialize(NULL_PTR);
31    if (rv != CKR_OK)
32    {
33        if (rv == CKR_DEVICE_ERROR)
34        {
35            error = returnErrorToQString(rv);
36            qDebug(qPrintable(error));
37            return false;
38        }
39        error = returnErrorToQString(rv);
40        qDebug(qPrintable(error));
41        return false;
42    }
43    else
44    {
45        return true;
46    }
47}
48
49void CryptoToken::finalize() {
50    CK_RV rv;
51    rv = C_Finalize(NULL_PTR);
52    QString error("");
53    if (rv != CKR_OK)
54    {
55        qDebug("** Destruyendo ... ~SmartCard");
56        if (rv == CKR_DEVICE_ERROR)
57        {
58            error = returnErrorToQString(rv);
59            qDebug(qPrintable(error));
60        }
61        error = returnErrorToQString(rv);
62        qDebug(qPrintable(error));
63    }
64}
65
66CK_SESSION_HANDLE CryptoToken::openSession(char * Pin, CK_SLOT_ID & slotID, bool requiredlogin)
67{
68    qDebug("openSession()");
69    QString error("");
70
71    CK_RV rv;
72
73    CK_SLOT_ID SlotList[10];
74    CK_ULONG ulCount = sizeof(SlotList)/sizeof(CK_SLOT_ID);
75
76    CK_SESSION_HANDLE hSession;
77
78    /*
79    ** Find the first slot available that has a token present
80    */
81    rv = C_GetSlotList(TRUE,SlotList,&ulCount);
82    //assert(rv==CKR_OK);
83    //assert(ulCount>0);
84    //if ( (rv != CKR_OK) && (ulCount<=0) )
85    if (rv != CKR_OK)
86    {
87        error = returnErrorToQString(rv);
88        qDebug(qPrintable("Insertar una tarjeta en el lector. " + error));
89        throw std::runtime_error(qPrintable(error));
90        //return CK_INVALID_HANDLE;
91
92    }
93    if ( ulCount<=0 )
94    {
95        error = returnErrorToQString(rv);
96        qDebug(qPrintable("ulCount <= 0"+ error));
97        throw std::runtime_error(qPrintable("Error: no hay dispositivo conectado."));
98        //return CK_INVALID_HANDLE;
99
100    }
101    //slotID = new CK_SLOT_ID() ;
102    slotID = SlotList[0];
103
104    /*
105    ** Log in the User to session
106    */
107    if ( requiredlogin ) {
108
109        /*
110        ** Open a read/write session with this slot's token
111        */
112        //rv = C_OpenSession(slotID,CKF_SERIAL_SESSION|CKF_RW_SESSION,0,0,&hSession);
113        rv = C_OpenSession(slotID, CKF_SERIAL_SESSION|CKF_RW_SESSION, NULL_PTR, (CK_NOTIFY) NULL_PTR, &hSession);
114
115        //assert(rv==CKR_OK);
116        if (rv != CKR_OK)
117        {
118            error = returnErrorToQString(rv);
119            qDebug(qPrintable("C_OpenSession" + error));
120            throw std::runtime_error(qPrintable(error));
121            //return CK_INVALID_HANDLE;
122        }
123
124        rv = C_Login(hSession,CKU_USER, (unsigned char *) Pin,strlen(Pin));
125        //assert(rv==CKR_OK);
126        if (rv != CKR_OK)
127        {
128            error = returnErrorToQString(rv);
129            QString plus("");
130            if ((rv == CKR_PIN_INCORRECT) || (rv == CKR_DATA_LEN_RANGE) || (rv == CKR_ARGUMENTS_BAD))
131                plus = "El PIN introducido es incorrecto!";
132            qDebug(qPrintable("C_login: "  + error + " " +plus));
133            throw std::runtime_error(qPrintable("Error: pin incorrecto."));
134            //return CK_INVALID_HANDLE;
135        }
136
137    } else {
138        rv = C_OpenSession(slotID, CKF_SERIAL_SESSION, NULL_PTR,(CK_NOTIFY) NULL_PTR, &hSession);
139
140        //assert(rv==CKR_OK);
141        if (rv != CKR_OK)
142        {
143            error = returnErrorToQString(rv);
144            qDebug(qPrintable("C_OpenSession" + error));
145            throw std::runtime_error(qPrintable(error));
146            //return CK_INVALID_HANDLE;
147        }
148    }
149    /*
150    ** Return the session handle and exit
151    */
152    return hSession;
153}
154
155
156
157void CryptoToken::closeSession(CK_SESSION_HANDLE hSession)
158{
159    CK_RV rv;
160    rv = C_CloseSession(hSession);
161    QString error("");
162    if (rv != CKR_OK){
163        qDebug("** Destruyendo ... ~SmartCard");
164        if (rv == CKR_DEVICE_ERROR)
165        {
166            error = returnErrorToQString(rv);
167            qDebug(qPrintable("C_Finalize" + error));
168
169        }
170        error = returnErrorToQString(rv);
171        qDebug(qPrintable("C_Finalize" + error));
172    }
173
174}
175
176
177CK_OBJECT_HANDLE CryptoToken::getPrivateKey(CK_SESSION_HANDLE hSession, CK_SLOT_ID slotID, QString id)
178{
179    QString error("");
180
181    CK_RV rv;
182    CK_OBJECT_HANDLE hObject = CK_INVALID_HANDLE;
183    CK_OBJECT_CLASS objClass = CKO_PRIVATE_KEY;
184    CK_ULONG ulCount = 0;
185
186
187    //CK_BYTE keyid[strlen(id)+1];
188    //strcpy((char *)keyid,id);
189    int idLen = strlen(qPrintable(id))+1;
190
191    CK_UTF8CHAR label[idLen];
192
193    strcpy((char *) label, qPrintable(id));
194    qDebug("SmartCard::getPrivateKey label:");
195    qDebug((char *) label);
196
197    //qDebug("VALOR DE keyid");
198    //qDebug((char *)keyid);
199
200    CK_ATTRIBUTE privateKeyTemplate[] = {
201        { CKA_CLASS, &objClass, sizeof (objClass) },
202        { CKA_LABEL, label, sizeof(label)-1 }
203        //{CKA_ID, keyid, sizeof (keyid)}
204    };
205
206    CK_ULONG ulTemplateCount = sizeof (privateKeyTemplate) / sizeof (privateKeyTemplate[0]);
207
208    /* Pre-condition checks. */
209    assert (hSession != NULL_PTR);
210
211    // comienza la busqueda de clave privada
212    qDebug ("Inicia busqueda de clave privada ... \n");
213
214    rv = C_FindObjectsInit(hSession, privateKeyTemplate, ulTemplateCount);
215    qDebug ("C_FindObjectsInit rv = %x",rv);
216    qDebug ("\n");
217    //assert(rv==CKR_OK);
218    if (rv != CKR_OK)
219    {
220        error = returnErrorToQString(rv);
221        qDebug(qPrintable("C_FindObjectsInit: "+error));
222        return CK_INVALID_HANDLE;
223
224    }
225
226
227    // se realiza la busqueda
228    rv = C_FindObjects(hSession, &hObject, 1, &ulCount);
229    qDebug ("C_FindObjects rv = %x",rv);
230    qDebug ("\n");
231    //assert(rv==CKR_OK);
232
233    qDebug("*-*-*-*-*getPrivateKey VALOR DE ulCount %u: ", ulCount);
234    //if (rv != CKR_OK)
235    if ((rv != CKR_OK) )//|| (ulCount == 0))
236    {
237        if (ulCount == 0)
238            qDebug("ulCount == 0");
239
240        error = returnErrorToQString(rv);
241        qDebug(qPrintable("C_FindObjects: "+error));
242        return CK_INVALID_HANDLE;
243
244    }
245
246    rv = C_FindObjectsFinal(hSession);
247    qDebug ("C_FindObjectsFinal rv = %x",rv);
248    qDebug ("\n");
249    //assert(rv==CKR_OK);
250    if (rv != CKR_OK)
251    {
252        error = returnErrorToQString(rv);
253        qDebug(qPrintable("C_FindObjectsFinal: "+error));
254        return CK_INVALID_HANDLE;
255    }
256
257    if (ulCount == 0)
258    {
259        qDebug (" \nNinguna clave privada encontrada!\n");
260        // cerrar la sesion
261        /*rv = C_CloseAllSessions(slotID);
262        qDebug("C_CloseAllSessions rv = %x", rv);
263        qDebug ("\n");
264        assert(rv==CKR_OK);*/
265        return CK_INVALID_HANDLE;
266        }
267    else
268    {
269        //qDebug (" \nObjeto encontrado (object=0x%04X)\n", hObject);
270        qDebug (" \nClave privada encontrada:  (clave = 0x%4X)\n", hObject);
271        return hObject;
272    }
273}
274
275CK_OBJECT_HANDLE CryptoToken::getPrivateKey(CK_SESSION_HANDLE hSession, CK_SLOT_ID slotID, int certificateIndex)
276{
277    QString error("");
278
279    CK_RV rv;
280    CK_OBJECT_HANDLE hObject = CK_INVALID_HANDLE;
281    CK_OBJECT_CLASS objClass = CKO_PRIVATE_KEY;
282    CK_ULONG ulCount = 2;
283
284    std::vector<CK_OBJECT_HANDLE> objectHandle(ulCount);
285
286    //CK_BYTE keyid[strlen(id)+1];
287    //strcpy((char *)keyid,id);
288    //int idLen = strlen(qPrintable(id))+1;
289
290    //CK_UTF8CHAR label[idLen];
291
292    //strcpy((char *) label, qPrintable(id));
293    //qDebug("SmartCard::getPrivateKey label:");
294    //qDebug((char *) label);
295
296    //qDebug("VALOR DE keyid");
297    //qDebug((char *)keyid);
298
299    CK_ATTRIBUTE privateKeyTemplate[] = {
300        { CKA_CLASS, &objClass, sizeof (objClass) },
301        //{ CKA_LABEL, label, sizeof(label)-1 }
302        //{CKA_ID, keyid, sizeof (keyid)}
303    };
304
305    CK_ULONG ulTemplateCount = sizeof (privateKeyTemplate) / sizeof (privateKeyTemplate[0]);
306
307    /* Pre-condition checks. */
308    assert (hSession != NULL_PTR);
309
310    // comienza la busqueda de clave privada
311    qDebug ("Inicia busqueda de clave privada ... \n");
312
313    rv = C_FindObjectsInit(hSession, privateKeyTemplate, ulTemplateCount);
314    qDebug ("C_FindObjectsInit rv = %x",rv);
315    qDebug ("\n");
316    //assert(rv==CKR_OK);
317    if (rv != CKR_OK)
318    {
319        error = returnErrorToQString(rv);
320        qDebug(qPrintable("C_FindObjectsInit: "+error));
321        return CK_INVALID_HANDLE;
322
323    }
324
325
326    // se realiza la busqueda
327    //rv = C_FindObjects(hSession, &hObject, 3, &ulCount);
328    rv = C_FindObjects(hSession, objectHandle.data(), objectHandle.size(), &ulCount);
329    qDebug ("C_FindObjects rv = %x",rv);
330    qDebug ("\n");
331    //assert(rv==CKR_OK);
332
333    qDebug("*-*-*-*-*getPrivateKey VALOR DE ulCount %u: ", ulCount);
334    //if (rv != CKR_OK)
335    if ((rv != CKR_OK) )//|| (ulCount == 0))
336    {
337        if (ulCount == 0)
338            qDebug("ulCount == 0");
339
340        error = returnErrorToQString(rv);
341        qDebug(qPrintable("C_FindObjects: "+error));
342        return CK_INVALID_HANDLE;
343
344    }
345
346    rv = C_FindObjectsFinal(hSession);
347    qDebug ("C_FindObjectsFinal rv = %x",rv);
348    qDebug ("\n");
349    //assert(rv==CKR_OK);
350    if (rv != CKR_OK)
351    {
352        error = returnErrorToQString(rv);
353        qDebug(qPrintable("C_FindObjectsFinal: "+error));
354        return CK_INVALID_HANDLE;
355    }
356
357    if (ulCount == 0)
358    {
359        qDebug (" \nNinguna clave privada encontrada!\n");
360        // cerrar la sesion
361        /*rv = C_CloseAllSessions(slotID);
362        qDebug("C_CloseAllSessions rv = %x", rv);
363        qDebug ("\n");
364        assert(rv==CKR_OK);*/
365        return CK_INVALID_HANDLE;
366        }
367    else
368    {
369        //qDebug (" \nObjeto encontrado (object=0x%04X)\n", hObject);
370        //qDebug (" \nClave privada encontrada:  (clave = 0x%4X)\n", hObject);
371        //return hObject;
372
373        objectHandle.resize(ulCount);
374        qDebug (" \nClave privada encontrada:  (clave = 0x%4X)\n", objectHandle[certificateIndex]);
375        return objectHandle[certificateIndex];
376    }
377}
378
379
380
381bool CryptoToken::signSomeData(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE privateKey, CK_BYTE_PTR someData,
382        CK_ULONG someDataLen, CK_BYTE_PTR sign, CK_ULONG_PTR signLen )
383{
384    CK_RV rv;
385    qDebug (" \nProceso de firma digital de datos con la clave privada que mantiene la tarjeta...\n");
386    qDebug("valor de sign antes de firmar: \n %s\n", sign);
387
388    //CK_ULONG someDataLen, slen;
389    //someDataLen = strlen((char *) someData);
390
391    //CK_ULONG slen;
392    //slen = BUFFERSIZ;
393    //slen = signLen;
394
395    // definicion del algoritmo de firma
396    CK_MECHANISM signMechanism = { CKM_RSA_PKCS /*CKM_SHA1_RSA_PKCS*/, 0 /*NULL_PTR*/, 0};
397
398    rv = C_SignInit(hSession, &signMechanism, privateKey);
399
400    if (rv != CKR_OK) {
401        qDebug("C_SignInit: rv = 0x%.8X\n", rv);
402        rv = C_CloseSession(hSession);
403        qDebug ("C_CloseSession: rv = %x",rv);
404        qDebug ("\n");
405        assert(rv == CKR_OK);
406        rv = C_Finalize(NULL_PTR);
407        qDebug ("C_Finalize: rv = %x",rv);
408        qDebug ("\n");
409        assert(rv == CKR_OK);
410        return false;
411    }
412
413    qDebug("C_SignInit: rv = 0x%.8X\n", rv);
414    qDebug ("\n");
415    assert(rv==CKR_OK);
416
417    rv = C_Sign(hSession, someData, someDataLen, sign, signLen);
418
419    if (rv != CKR_OK) {
420        qDebug("C_Sign: rv = 0x%.8X\n", rv);
421        rv = C_CloseSession(hSession);
422        qDebug ("C_CloseSession: rv = %x",rv);
423        qDebug ("\n");
424        assert(rv == CKR_OK);
425        rv = C_Finalize(NULL_PTR);
426        qDebug ("C_Finalize: rv = %x",rv);
427        qDebug ("\n");
428        assert(rv == CKR_OK);
429        return false;//1;
430    }
431
432    qDebug("Valor de la firma sign: \n%s\n", sign);
433    qDebug("\nValor de signLen: \n%u\n", *signLen);
434
435    qDebug("C_Sign: rv = 0x%.8X\n", rv);
436    qDebug ("\n");
437    assert(rv==CKR_OK);
438
439
440    qDebug("\nMessage was successfully signed with private key!\n");
441    return true;
442
443}
444
445
446std::vector<unsigned char> CryptoToken::signHash(QString hashToSign, QString pin, QString label)
447{
448
449    std::vector<unsigned char> hash = fromHex(hashToSign);
450
451    QString error("");
452    CK_RV rv;
453
454    CK_SESSION_HANDLE hSession = CK_INVALID_HANDLE;
455    CK_SLOT_ID slotID;
456
457    // initialize criptoki
458    rv = C_Initialize(NULL_PTR);
459    if (rv != CKR_OK)
460    {
461        if (rv == CKR_DEVICE_ERROR)
462        {
463            error = returnErrorToQString(rv);
464            qDebug(qPrintable(error));
465            throw std::runtime_error(qPrintable(error));
466        }
467        error = returnErrorToQString(rv);
468        qDebug(qPrintable(error));
469        throw std::runtime_error(qPrintable(error));
470    }
471
472    hSession = openSession((char *) qPrintable(pin), slotID);
473    if (hSession == CK_INVALID_HANDLE)
474    {
475        qDebug("Fallo ptr_SC->openSession");
476        rv = C_Finalize(NULL_PTR);
477        qDebug("C_Finalize: rv = %x",rv);
478        assert(rv == CKR_OK);
479        throw std::runtime_error("Error openning a session");
480    }
481
482    // obtencion de la clave privada para firmar los datos
483    CK_OBJECT_HANDLE privateKey = CK_INVALID_HANDLE;
484
485    //QString label = "New Key aaraujo";
486    privateKey = getPrivateKey(hSession, slotID, label);
487
488    // https://github.com/open-eid/chrome-token-signing/blob/master/host-shared/PKCS11CardManager.h
489
490    if (privateKey == CK_INVALID_HANDLE)
491    {
492        qDebug("Fallo ptr_SC->getPrivateKey");
493        rv = C_CloseSession(hSession);
494        qDebug("C_CloseSession: rv = %x",rv);
495        assert(rv == CKR_OK);
496        rv = C_Finalize(NULL_PTR);
497        qDebug("C_Finalize: rv = %x",rv);
498        assert(rv == CKR_OK);
499        throw std::runtime_error("Error finding private key");
500    }
501
502    CK_MECHANISM mechanism = {CKM_RSA_PKCS, 0, 0};
503
504
505    rv = C_SignInit(hSession, &mechanism, privateKey);
506
507    if (rv != CKR_OK) {
508        qDebug("C_SignInit: rv = 0x%.8X\n", rv);
509        rv = C_CloseSession(hSession);
510        qDebug ("C_CloseSession: rv = %x",rv);
511        qDebug ("\n");
512        assert(rv == CKR_OK);
513        rv = C_Finalize(NULL_PTR);
514        qDebug ("C_Finalize: rv = %x",rv);
515        qDebug ("\n");
516        assert(rv == CKR_OK);
517        throw std::runtime_error("Error C_SignInit");
518    }
519
520    qDebug("C_SignInit: rv = 0x%.8X\n", rv);
521    qDebug ("\n");
522    assert(rv==CKR_OK);
523
524    std::vector<unsigned char> hashWithPadding;
525    switch (hash.size()) {
526        case BINARY_SHA1_LENGTH:
527            hashWithPadding = {0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14};
528            break;
529        case BINARY_SHA224_LENGTH:
530            hashWithPadding = {0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x05, 0x00, 0x04, 0x1c};
531            break;
532        case BINARY_SHA256_LENGTH:
533            hashWithPadding = {0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20};
534            break;
535        case BINARY_SHA384_LENGTH:
536            hashWithPadding = {0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0x04, 0x30};
537            break;
538        case BINARY_SHA512_LENGTH:
539            hashWithPadding = {0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40};
540            break;
541        default:
542            throw std::runtime_error("incorrect digest length, dropping padding");
543    }
544    hashWithPadding.insert(hashWithPadding.end(), hash.begin(), hash.end());
545
546    CK_ULONG signatureLength = 0;
547
548
549    rv = C_Sign(hSession, hashWithPadding.data(), hashWithPadding.size(), nullptr, &signatureLength);
550
551    if (rv != CKR_OK) {
552        qDebug("C_Sign: rv = 0x%.8X\n", rv);
553        rv = C_CloseSession(hSession);
554        qDebug ("C_CloseSession: rv = %x",rv);
555        qDebug ("\n");
556        assert(rv == CKR_OK);
557        rv = C_Finalize(NULL_PTR);
558        qDebug ("C_Finalize: rv = %x",rv);
559        qDebug ("\n");
560        assert(rv == CKR_OK);
561        throw std::runtime_error("Error C_Sign1");
562    }
563
564    std::vector<unsigned char> signature(signatureLength, 0);
565
566    rv = C_Sign(hSession, hashWithPadding.data(), hashWithPadding.size(), signature.data(), &signatureLength);
567
568    if (rv != CKR_OK) {
569        qDebug("C_Sign: rv = 0x%.8X\n", rv);
570        rv = C_CloseSession(hSession);
571        qDebug ("C_CloseSession: rv = %x",rv);
572        qDebug ("\n");
573        assert(rv == CKR_OK);
574        rv = C_Finalize(NULL_PTR);
575        qDebug ("C_Finalize: rv = %x",rv);
576        qDebug ("\n");
577        assert(rv == CKR_OK);
578        throw std::runtime_error("Error C_Sign2");
579    }
580
581
582    qDebug("C_Sign: rv = 0x%.8X\n", rv);
583    qDebug ("\n");
584    assert(rv==CKR_OK);
585
586    closeSession(hSession);
587    finalize();
588
589    return signature;
590
591}
592
593std::vector<unsigned char> CryptoToken::signHash(QString hashToSign, QString pin, int certificateIndex)
594{
595
596    std::vector<unsigned char> hash = fromHex(hashToSign);
597
598    QString error("");
599    CK_RV rv;
600
601    CK_SESSION_HANDLE hSession = CK_INVALID_HANDLE;
602    CK_SLOT_ID slotID;
603
604    // initialize criptoki
605    rv = C_Initialize(NULL_PTR);
606    if (rv != CKR_OK)
607    {
608        if (rv == CKR_DEVICE_ERROR)
609        {
610            error = returnErrorToQString(rv);
611            qDebug(qPrintable(error));
612            throw std::runtime_error(qPrintable(error));
613        }
614        error = returnErrorToQString(rv);
615        qDebug(qPrintable(error));
616        throw std::runtime_error(qPrintable(error));
617    }
618
619    hSession = openSession((char *) qPrintable(pin), slotID);
620    if (hSession == CK_INVALID_HANDLE)
621    {
622        qDebug("Fallo ptr_SC->openSession");
623        rv = C_Finalize(NULL_PTR);
624        qDebug("C_Finalize: rv = %x",rv);
625        assert(rv == CKR_OK);
626        throw std::runtime_error("Error openning a session");
627    }
628
629    // obtencion de la clave privada para firmar los datos
630    CK_OBJECT_HANDLE privateKey = CK_INVALID_HANDLE;
631
632    //QString label = "New Key aaraujo";
633    privateKey = getPrivateKey(hSession, slotID, certificateIndex);
634
635    // https://github.com/open-eid/chrome-token-signing/blob/master/host-shared/PKCS11CardManager.h
636
637    if (privateKey == CK_INVALID_HANDLE)
638    {
639        qDebug("Fallo ptr_SC->getPrivateKey");
640        rv = C_CloseSession(hSession);
641        qDebug("C_CloseSession: rv = %x",rv);
642        assert(rv == CKR_OK);
643        rv = C_Finalize(NULL_PTR);
644        qDebug("C_Finalize: rv = %x",rv);
645        assert(rv == CKR_OK);
646        throw std::runtime_error("Error finding private key");
647    }
648
649    CK_MECHANISM mechanism = {CKM_RSA_PKCS, 0, 0};
650
651
652    rv = C_SignInit(hSession, &mechanism, privateKey);
653
654    if (rv != CKR_OK) {
655        qDebug("C_SignInit: rv = 0x%.8X\n", rv);
656        rv = C_CloseSession(hSession);
657        qDebug ("C_CloseSession: rv = %x",rv);
658        qDebug ("\n");
659        assert(rv == CKR_OK);
660        rv = C_Finalize(NULL_PTR);
661        qDebug ("C_Finalize: rv = %x",rv);
662        qDebug ("\n");
663        assert(rv == CKR_OK);
664        throw std::runtime_error("Error C_SignInit");
665    }
666
667    qDebug("C_SignInit: rv = 0x%.8X\n", rv);
668    qDebug ("\n");
669    assert(rv==CKR_OK);
670
671    std::vector<unsigned char> hashWithPadding;
672    switch (hash.size()) {
673        case BINARY_SHA1_LENGTH:
674            hashWithPadding = {0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14};
675            break;
676        case BINARY_SHA224_LENGTH:
677            hashWithPadding = {0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x05, 0x00, 0x04, 0x1c};
678            break;
679        case BINARY_SHA256_LENGTH:
680            hashWithPadding = {0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20};
681            break;
682        case BINARY_SHA384_LENGTH:
683            hashWithPadding = {0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0x04, 0x30};
684            break;
685        case BINARY_SHA512_LENGTH:
686            hashWithPadding = {0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40};
687            break;
688        default:
689            throw std::runtime_error("incorrect digest length, dropping padding");
690    }
691    hashWithPadding.insert(hashWithPadding.end(), hash.begin(), hash.end());
692
693    CK_ULONG signatureLength = 0;
694
695
696    rv = C_Sign(hSession, hashWithPadding.data(), hashWithPadding.size(), nullptr, &signatureLength);
697
698    if (rv != CKR_OK) {
699        qDebug("C_Sign: rv = 0x%.8X\n", rv);
700        rv = C_CloseSession(hSession);
701        qDebug ("C_CloseSession: rv = %x",rv);
702        qDebug ("\n");
703        assert(rv == CKR_OK);
704        rv = C_Finalize(NULL_PTR);
705        qDebug ("C_Finalize: rv = %x",rv);
706        qDebug ("\n");
707        assert(rv == CKR_OK);
708        throw std::runtime_error("Error C_Sign1");
709    }
710
711    std::vector<unsigned char> signature(signatureLength, 0);
712
713    rv = C_Sign(hSession, hashWithPadding.data(), hashWithPadding.size(), signature.data(), &signatureLength);
714
715    if (rv != CKR_OK) {
716        qDebug("C_Sign: rv = 0x%.8X\n", rv);
717        rv = C_CloseSession(hSession);
718        qDebug ("C_CloseSession: rv = %x",rv);
719        qDebug ("\n");
720        assert(rv == CKR_OK);
721        rv = C_Finalize(NULL_PTR);
722        qDebug ("C_Finalize: rv = %x",rv);
723        qDebug ("\n");
724        assert(rv == CKR_OK);
725        throw std::runtime_error("Error C_Sign2");
726    }
727
728
729    qDebug("C_Sign: rv = 0x%.8X\n", rv);
730    qDebug ("\n");
731    assert(rv==CKR_OK);
732
733    closeSession(hSession);
734    finalize();
735
736    return signature;
737
738}
739
740
741/*
742std::vector<CK_OBJECT_HANDLE> CryptoToken::findObject(CK_OBJECT_CLASS objectClass, CK_ULONG max = 2) const {
743    if (!fl) {
744        throw std::runtime_error("PKCS11 is not loaded");
745    }
746    CK_ATTRIBUTE searchAttribute = {CKA_CLASS, &objectClass, sizeof(objectClass)};
747
748
749
750    C(FindObjectsInit, session, &searchAttribute, 1);
751    CK_ULONG objectCount = max;
752    std::vector<CK_OBJECT_HANDLE> objectHandle(objectCount);
753    C(FindObjects, session, objectHandle.data(), objectHandle.size(), &objectCount);
754    C(FindObjectsFinal, session);
755    objectHandle.resize(objectCount);
756    return objectHandle;
757}
758*/
759
760QStringList CryptoToken::getPrivateKeyLabels(QString pin)
761{
762    qDebug("...CryptoToken::getPrivateKeyLabels");
763    QStringList list;
764
765    QString error("");
766    CK_RV rv;
767
768    CK_SESSION_HANDLE hSession = CK_INVALID_HANDLE;
769    CK_SLOT_ID slotID;
770
771    // initialize criptoki
772    rv = C_Initialize(NULL_PTR);
773    if (rv != CKR_OK)
774    {
775        if (rv == CKR_DEVICE_ERROR)
776        {
777            error = returnErrorToQString(rv);
778            qDebug(qPrintable(error));
779            throw std::runtime_error(qPrintable(error));
780        }
781        error = returnErrorToQString(rv);
782        qDebug(qPrintable(error));
783        throw std::runtime_error(qPrintable(error));
784    }
785
786    hSession = openSession((char *) qPrintable(pin), slotID, false);
787    if (hSession == CK_INVALID_HANDLE)
788    {
789        qDebug("Fallo ptr_SC->openSession");
790        rv = C_Finalize(NULL_PTR);
791        qDebug("C_Finalize: rv = %x",rv);
792        assert(rv == CKR_OK);
793        throw std::runtime_error("Error openning a session");
794    }
795
796    CK_OBJECT_CLASS objectClass = CKO_PRIVATE_KEY;
797    //CK_OBJECT_CLASS objectClass = CKO_PUBLIC_KEY;
798    //CK_OBJECT_CLASS objectClass = CKO_CERTIFICATE;
799
800    CK_OBJECT_HANDLE hObject = CK_INVALID_HANDLE;
801    CK_ATTRIBUTE searchAttribute = {CKA_CLASS, &objectClass, sizeof(objectClass)};
802    CK_ULONG ulCount = 0;
803
804    rv = C_FindObjectsInit(hSession, &searchAttribute, 1);
805    qDebug ("C_FindObjectsInit rv = %x",rv);
806    qDebug ("\n");
807    //assert(rv==CKR_OK);
808    if (rv != CKR_OK)
809    {
810        error = returnErrorToQString(rv);
811        qDebug("%s", qPrintable("C_FindObjectsInit: "+error));
812        //return list;
813        throw std::runtime_error(qPrintable(error));
814    }
815
816    CK_ULONG objectCount = 3;
817    std::vector<CK_OBJECT_HANDLE> objectHandle(objectCount);
818
819    // se realiza la busqueda
820    //rv = C_FindObjects(hSession, &hObject, 2, &ulCount);
821    rv = C_FindObjects(hSession, objectHandle.data(), objectHandle.size(), &objectCount);
822
823    qDebug ("C_FindObjects rv = %x",rv);
824    qDebug ("\n");
825    //assert(rv==CKR_OK);
826
827    qDebug("*-*-*-*-*getPrivateKeyLabels VALOR DE objectCount %u: ", objectCount);
828    //if (rv != CKR_OK)
829    if ((rv != CKR_OK) )//|| (ulCount == 0))
830    {
831        if (ulCount == 0)
832            qDebug("ulCount == 0");
833
834        error = returnErrorToQString(rv);
835        qDebug(qPrintable("C_FindObjects: "+error));
836        //return list;
837        throw std::runtime_error(qPrintable(error));
838    }
839
840    rv = C_FindObjectsFinal(hSession);
841    qDebug ("C_FindObjectsFinal rv = %x",rv);
842    qDebug ("\n");
843    //assert(rv==CKR_OK);
844    if (rv != CKR_OK)
845    {
846        error = returnErrorToQString(rv);
847        qDebug(qPrintable("C_FindObjectsFinal: "+error));
848        //return list;
849        throw std::runtime_error(qPrintable(error));
850    }
851    objectHandle.resize(objectCount);
852
853    //if (ulCount == 0)
854    if (objectHandle.size() == 0)
855    {
856        qDebug (" \nNingun objeto encontrado!\n");
857        // cerrar la sesion
858        /*rv = C_CloseAllSessions(slotID);
859        qDebug("C_CloseAllSessions rv = %x", rv);
860        qDebug ("\n");
861        assert(rv==CKR_OK);*/
862        //return list;
863        throw std::runtime_error(qPrintable(error));
864        }
865    else
866    {
867        //qDebug (" \nObjeto encontrado (object=0x%04X)\n", hObject);
868        qDebug("se econtraron %d objetos", objectHandle.size());
869        //qDebug (" \nClave privada encontrada:  (clave = 0x%4X)\n", hObject);
870        for (int i=0; i< objectHandle.size(); i++)
871        {
872            qDebug("objeto encontrado: 0x%4X", objectHandle[i]);
873            list.append(getKeyLabel(hSession, objectHandle[i]));
874        }
875    }
876
877    closeSession(hSession);
878    finalize();
879
880    return list;
881}
882
883QStringList CryptoToken::getLabel()
884{
885    qDebug("...CryptoToken::getLabel");
886    QStringList list;
887
888    QString error("");
889    CK_RV rv;
890
891    CK_SESSION_HANDLE hSession = CK_INVALID_HANDLE;
892    CK_SLOT_ID slotID;
893
894    // initialize criptoki
895    rv = C_Initialize(NULL_PTR);
896    if (rv != CKR_OK)
897    {
898        if (rv == CKR_DEVICE_ERROR)
899        {
900            error = returnErrorToQString(rv);
901            qDebug(qPrintable(error));
902            throw std::runtime_error(qPrintable(error));
903        }
904        error = returnErrorToQString(rv);
905        qDebug(qPrintable(error));
906        throw std::runtime_error(qPrintable(error));
907    }
908
909    hSession = openSession((char *) qPrintable(/*pin*/ ""), slotID, false);
910    if (hSession == CK_INVALID_HANDLE)
911    {
912        qDebug("Fallo ptr_SC->openSession");
913        rv = C_Finalize(NULL_PTR);
914        qDebug("C_Finalize: rv = %x",rv);
915        assert(rv == CKR_OK);
916        throw std::runtime_error("Error openning a session");
917    }
918
919    //CK_OBJECT_CLASS objectClass = CKO_PRIVATE_KEY;
920    CK_OBJECT_CLASS objectClass = CKO_PUBLIC_KEY;
921    //CK_OBJECT_CLASS objectClass = CKO_CERTIFICATE;
922
923    CK_OBJECT_HANDLE hObject = CK_INVALID_HANDLE;
924    CK_ATTRIBUTE searchAttribute = {CKA_CLASS, &objectClass, sizeof(objectClass)};
925    CK_ULONG ulCount = 0;
926
927    rv = C_FindObjectsInit(hSession, &searchAttribute, 1);
928    qDebug ("C_FindObjectsInit rv = %x",rv);
929    qDebug ("\n");
930    //assert(rv==CKR_OK);
931    if (rv != CKR_OK)
932    {
933        error = returnErrorToQString(rv);
934        qDebug("%s", qPrintable("C_FindObjectsInit: "+error));
935        //return list;
936        throw std::runtime_error(qPrintable(error));
937    }
938
939    CK_ULONG objectCount = 3;
940    std::vector<CK_OBJECT_HANDLE> objectHandle(objectCount);
941
942    // se realiza la busqueda
943    //rv = C_FindObjects(hSession, &hObject, 2, &ulCount);
944    rv = C_FindObjects(hSession, objectHandle.data(), objectHandle.size(), &objectCount);
945
946    qDebug ("C_FindObjects rv = %x",rv);
947    qDebug ("\n");
948    //assert(rv==CKR_OK);
949
950    qDebug("*-*-*-*-*getPrivateKeyLabels VALOR DE objectCount %u: ", objectCount);
951    //if (rv != CKR_OK)
952    if ((rv != CKR_OK) )//|| (ulCount == 0))
953    {
954        if (ulCount == 0)
955            qDebug("ulCount == 0");
956
957        error = returnErrorToQString(rv);
958        qDebug(qPrintable("C_FindObjects: "+error));
959        //return list;
960        throw std::runtime_error(qPrintable(error));
961    }
962
963    rv = C_FindObjectsFinal(hSession);
964    qDebug ("C_FindObjectsFinal rv = %x",rv);
965    qDebug ("\n");
966    //assert(rv==CKR_OK);
967    if (rv != CKR_OK)
968    {
969        error = returnErrorToQString(rv);
970        qDebug(qPrintable("C_FindObjectsFinal: "+error));
971        //return list;
972        throw std::runtime_error(qPrintable(error));
973    }
974    objectHandle.resize(objectCount);
975
976    //if (ulCount == 0)
977    if (objectHandle.size() == 0)
978    {
979        qDebug (" \nNingun objeto encontrado!\n");
980        // cerrar la sesion
981        /*rv = C_CloseAllSessions(slotID);
982        qDebug("C_CloseAllSessions rv = %x", rv);
983        qDebug ("\n");
984        assert(rv==CKR_OK);*/
985        //return list;
986        throw std::runtime_error(qPrintable(error));
987        }
988    else
989    {
990        //qDebug (" \nObjeto encontrado (object=0x%04X)\n", hObject);
991        qDebug("se econtraron %d objetos", objectHandle.size());
992        //qDebug (" \nClave privada encontrada:  (clave = 0x%4X)\n", hObject);
993        for (int i=0; i< objectHandle.size(); i++)
994        {
995            qDebug("objeto encontrado: 0x%4X", objectHandle[i]);
996            list.append(getKeyLabel(hSession, objectHandle[i]));
997            qDebug("label: %s", qPrintable(getKeyLabel(hSession, objectHandle[i])));
998        }
999    }
1000
1001    closeSession(hSession);
1002    finalize();
1003
1004    return list;
1005
1006
1007
1008
1009}
1010
1011
1012QString CryptoToken::getKeyLabel(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE key)
1013{
1014    qDebug("CryptoToken::getKeyLabel");
1015
1016    CK_RV rv = CKR_OK;
1017    CK_ATTRIBUTE keyid_attr[1] = {
1018        { CKA_LABEL, NULL, 0 }
1019        //{ CKA_VALUE, NULL, 0 }
1020    };
1021
1022    if ((rv = C_GetAttributeValue(hSession, key, keyid_attr, 1)) != CKR_OK)
1023    {
1024        //QMessageBox::critical(this,tr("UserAccess"),tr("fallo la obtencion del atributo ID"));
1025        qDebug("fallo la obtencion del atributo ID");
1026        return "";
1027    }
1028
1029    if ((keyid_attr[0].pValue = malloc(keyid_attr[0].ulValueLen)) == NULL)
1030    {
1031        //QMessageBox::critical(this,tr("UserAccess"),tr("fallo la asignacion de memoria del atributo ID"));
1032        qDebug("fallo la asignacion de memoria del atributo ID");
1033        return "";
1034    }
1035    if ((rv = C_GetAttributeValue(hSession, key, keyid_attr, 1)) != CKR_OK)
1036    {
1037        //QMessageBox::critical(this,tr("UserAccess"),tr("fallo la obtencion 2 del atributo ID"));
1038        qDebug("fallo la obtencion 2 del atributo ID");
1039        return "";
1040    }
1041
1042    //qDebug("\n*-** VALOR DE ID: %s\n", keyid_attr[0].pValue);
1043    qDebug("\n*-** VALOR DE atributo: %s\n", keyid_attr[0].pValue);
1044    QString label = (const char *) keyid_attr[0].pValue;
1045
1046    qDebug(qPrintable(label));
1047    qDebug(qPrintable(QString::number(label.size())));
1048
1049    return label;
1050}
1051
1052
1053QList<QStringList> CryptoToken::getCertificateCNandExpirationDate()
1054{
1055    qDebug("...CryptoToken::getCertificateCNandExpirationDate");
1056    QList<QStringList> list;
1057
1058    QString error("");
1059    CK_RV rv;
1060
1061    CK_SESSION_HANDLE hSession = CK_INVALID_HANDLE;
1062    CK_SLOT_ID slotID;
1063
1064    // initialize criptoki
1065    rv = C_Initialize(NULL_PTR);
1066    if (rv != CKR_OK)
1067    {
1068        if (rv == CKR_DEVICE_ERROR)
1069        {
1070            qDebug("CKR_DEVICE_ERROR");
1071            error = returnErrorToQString(rv);
1072            qDebug(qPrintable(error));
1073            throw std::runtime_error(qPrintable(error));
1074        }
1075        qDebug("****");
1076        error = returnErrorToQString(rv);
1077        qDebug(qPrintable(error));
1078        throw std::runtime_error(qPrintable(error));
1079    }
1080
1081    //hSession = openSession((char *) qPrintable(pin), slotID);
1082    hSession = openSession((char *) qPrintable(""), slotID, false);
1083    if (hSession == CK_INVALID_HANDLE)
1084    {
1085        qDebug("Fallo ptr_SC->openSession");
1086        rv = C_Finalize(NULL_PTR);
1087        qDebug("C_Finalize: rv = %x",rv);
1088        assert(rv == CKR_OK);
1089        throw std::runtime_error("Error openning a session inside the device");
1090    }
1091
1092    CK_OBJECT_CLASS objectClass = CKO_CERTIFICATE;
1093
1094    CK_OBJECT_HANDLE hObject = CK_INVALID_HANDLE;
1095    CK_ATTRIBUTE searchAttribute = {CKA_CLASS, &objectClass, sizeof(objectClass)};
1096    CK_ULONG ulCount = 0;
1097
1098    rv = C_FindObjectsInit(hSession, &searchAttribute, 1);
1099    qDebug ("C_FindObjectsInit rv = %x",rv);
1100    qDebug ("\n");
1101    //assert(rv==CKR_OK);
1102    if (rv != CKR_OK)
1103    {
1104        error = returnErrorToQString(rv);
1105        qDebug("%s", qPrintable("C_FindObjectsInit: "+error));
1106        //return list;
1107        throw std::runtime_error(qPrintable(error));
1108    }
1109
1110    CK_ULONG objectCount = 3;
1111    std::vector<CK_OBJECT_HANDLE> objectHandle(objectCount);
1112
1113    // se realiza la busqueda
1114    //rv = C_FindObjects(hSession, &hObject, 2, &ulCount);
1115    rv = C_FindObjects(hSession, objectHandle.data(), objectHandle.size(), &objectCount);
1116
1117    qDebug ("C_FindObjects rv = %x",rv);
1118    qDebug ("\n");
1119    //assert(rv==CKR_OK);
1120
1121    qDebug("*-*-*-*-*getPrivateKeyLabels VALOR DE objectCount %u: ", objectCount);
1122    //if (rv != CKR_OK)
1123    if ((rv != CKR_OK) )//|| (ulCount == 0))
1124    {
1125        if (ulCount == 0)
1126            qDebug("ulCount == 0");
1127
1128        error = returnErrorToQString(rv);
1129        qDebug(qPrintable("C_FindObjects: "+error));
1130        //return list;
1131        throw std::runtime_error(qPrintable(error));
1132    }
1133
1134    rv = C_FindObjectsFinal(hSession);
1135    qDebug ("C_FindObjectsFinal rv = %x",rv);
1136    qDebug ("\n");
1137    //assert(rv==CKR_OK);
1138    if (rv != CKR_OK)
1139    {
1140        error = returnErrorToQString(rv);
1141        qDebug(qPrintable("C_FindObjectsFinal: "+error));
1142        //return list;
1143        throw std::runtime_error(qPrintable(error));
1144    }
1145    objectHandle.resize(objectCount);
1146
1147    //if (ulCount == 0)
1148    if (objectHandle.size() == 0)
1149    {
1150        qDebug (" \nNingun objeto encontrado!\n");
1151        // cerrar la sesion
1152        /*rv = C_CloseAllSessions(slotID);
1153        qDebug("C_CloseAllSessions rv = %x", rv);
1154        qDebug ("\n");
1155        assert(rv==CKR_OK);*/
1156        //return list;
1157        throw std::runtime_error(qPrintable(error));
1158        }
1159    else
1160    {
1161        //qDebug (" \nObjeto encontrado (object=0x%04X)\n", hObject);
1162        qDebug("se econtraron %d objetos", objectHandle.size());
1163        //qDebug (" \nClave privada encontrada:  (clave = 0x%4X)\n", hObject);
1164
1165        for (int i=0; i< objectHandle.size(); i++)
1166        {
1167            QStringList certInformation;
1168            qDebug("objeto encontrado: 0x%4X", objectHandle[i]);
1169            certInformation = getCertificateInformation(hSession, objectHandle[i]);
1170            //list.append(getCertificateInformation(hSession, objectHandle[i])[0]);
1171            //list.append(getCertificateInformation(hSession, objectHandle[i])[0]);
1172            list.append(certInformation);
1173        }
1174    }
1175
1176    closeSession(hSession);
1177    finalize();
1178
1179    return list;
1180}
1181
1182QStringList CryptoToken::getCertificateInformation(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE certificate)
1183{
1184    qDebug("...getCertificateInformation...");
1185
1186    CK_RV rv = CKR_OK;
1187    CK_ATTRIBUTE keyid_attr[2] = {
1188        { CKA_LABEL, NULL, 0 },
1189        { CKA_VALUE, NULL, 0 }
1190    };
1191
1192    QStringList list;
1193
1194
1195    if ((rv = C_GetAttributeValue(hSession, certificate, keyid_attr, 2)) != CKR_OK)
1196    {
1197        //QMessageBox::critical(this,tr("UserAccess"),tr("fallo la obtencion del atributo ID"));
1198        qDebug("fallo la obtencion del atributo ID");
1199        return list;
1200    }
1201
1202    if ((keyid_attr[1].pValue = malloc(keyid_attr[1].ulValueLen)) == NULL)
1203    {
1204        //QMessageBox::critical(this,tr("UserAccess"),tr("fallo la asignacion de memoria del atributo ID"));
1205        qDebug("fallo la asignacion de memoria del atributo ID");
1206        return list;
1207    }
1208    if ((rv = C_GetAttributeValue(hSession, certificate, keyid_attr, 2)) != CKR_OK)
1209    {
1210        //QMessageBox::critical(this,tr("UserAccess"),tr("fallo la obtencion 2 del atributo ID"));
1211        qDebug("fallo la obtencion 2 del atributo ID");
1212        return list;
1213    }
1214
1215    //qDebug("\n*-** VALOR DE ID: %s\n", keyid_attr[0].pValue);
1216    //qDebug("\n*-** VALOR DE atributo: %s\n", keyid_attr[0].pValue);
1217    //QString x = (const char *) keyid_attr[1].pValue;
1218
1219    //qDebug(qPrintable(x));
1220    //qDebug(qPrintable(QString::number(x.size())));
1221
1222
1223    //qDebug("prueba de generar un QSslCertificate");
1224
1225    QSslCertificate qcert(QByteArray((const char *) keyid_attr[1].pValue, (int) keyid_attr[1].ulValueLen), QSsl::Der);
1226
1227    if (qcert.isNull()){
1228        qDebug("qcert es null");
1229    }
1230
1231    qDebug("mira el contenido qcert");
1232
1233    /*
1234    QStringList list = qcert.subjectInfo(QSslCertificate::EmailAddress);
1235    QStringList l2 = qcert.subjectInfo(QSslCertificate::DistinguishedNameQualifier);
1236    QStringList l3 = qcert.subjectInfo( QSslCertificate::CommonName );
1237    QStringList l4 = qcert.subjectInfo( QSslCertificate::Organization );
1238    QStringList l5 = qcert.subjectInfo( QSslCertificate::LocalityName );
1239    QStringList l6 = qcert.subjectInfo( QSslCertificate::OrganizationalUnitName );
1240    QStringList l7 = qcert.subjectInfo( QSslCertificate::StateOrProvinceName );
1241    */
1242    list.append(qcert.subjectInfo( QSslCertificate::CommonName ));
1243    list.append(qcert.subjectInfo( QSslCertificate::Organization ));
1244    list.append(qcert.expiryDate().date().toString("dd.MM.yyyy"));
1245
1246    qDebug("***CERT HEX");
1247    qDebug(qcert.toDer().toHex());
1248    list.append(qcert.toDer().toHex());
1249    qDebug("************");
1250
1251    //qDebug(qPrintable(qcert.effectiveDate().date().toString("dd.MM.yyyy")));
1252    //qDebug(qPrintable(qcert.expiryDate().date().toString("dd.MM.yyyy")));
1253
1254    return list;
1255}
1256
1257
1258QList<QStringList> CryptoToken::getDeviceCertificates()
1259{
1260    qDebug("...getDeviceCertificates");
1261
1262
1263    //QStringList labelList = getPrivateKeyLabels(pin);
1264
1265    QList<QStringList> nameExpirationList = getCertificateCNandExpirationDate();
1266
1267    QList<QStringList> certificateInformationList;
1268
1269    for (int i=0; i<nameExpirationList.size()/*labelList.size()*/; i++)
1270    {
1271        QStringList l;
1272        //qDebug("... antes de insertar label");
1273        //l.append(labelList[i]);
1274        //qDebug("... antes de insertar commonName");
1275        l.append(nameExpirationList[i][0]);
1276        //qDebug("... antes de insertar organizationName");
1277        l.append(nameExpirationList[i][1]);
1278        //qDebug("... antes de insertar expirationDate");
1279        l.append(nameExpirationList[i][2]);
1280
1281        //qDebug("... antes de insertar en certificateInformationList");
1282        certificateInformationList.append(l);
1283    }
1284
1285    return certificateInformationList;
1286}
1287
1288
1289void CryptoToken::getCertificateAttributes(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hCert)
1290{
1291   CK_ATTRIBUTE pTemplate[2] = {
1292       //List your desired attributes here
1293       { CKA_LABEL, NULL, 0 }
1294       //{ CKA_LABEL, NULL, 0 }
1295   };
1296
1297   CK_RV rv = C_GetAttributeValue(hSession, hCert, pTemplate, /*pTemplateLen*/ 2);
1298   if (rv == CKR_OK) {
1299       //here you have your desired certificate attributes
1300       qDebug("chequea los atributos");
1301
1302   }
1303}
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315// slot para obtener informacion del modulo PKCS11
1316QString CryptoToken::getInfoCryptoki()
1317{
1318    // Generales
1319    //if ( !CHECKACCESS_ONE("smartcard information", "execute") ) return;
1320    CK_INFO info;
1321
1322    /* Valor devuelto por las funciones */
1323    CK_RV rv;
1324
1325    QString error("");
1326    QString mensaje;
1327    mensaje.clear();
1328
1329    rv = C_Initialize(NULL_PTR);
1330
1331    //fqDebug(stderr, "C_Initialize: rv = 0x%.8X\n", rv);
1332    //cout << "valor decimal de rv: " << rv ;
1333
1334    //assert(rv == CKR_OK);
1335    //mensaje->append("C_Initialize\n");
1336    if (rv != CKR_OK)
1337    {
1338
1339        if (rv == CKR_DEVICE_ERROR)
1340        {
1341            error = returnErrorToQString(rv);
1342            qDebug("Probablemente el lector no este conectado");
1343            return error;
1344        }
1345        error = returnErrorToQString(rv);
1346        qDebug("valor de x despues de returnError: %s", qPrintable(error));
1347        return error;
1348    }
1349
1350
1351    rv = C_GetInfo(&info);
1352    //fqDebug(stderr, "C_GetInfo: rv = 0x%.8X\n", rv);
1353    //cout << "valor decimal de rv: " << rv ;
1354
1355    if (rv != CKR_OK)
1356    {
1357        error = returnErrorToQString(rv);
1358        return error;
1359    }
1360    //assert(rv == CKR_OK);
1361
1362    QString y("Descripcion: ");
1363    y.append((const char *) info.libraryDescription);
1364    mensaje.append(y);
1365
1366    QString x("Fabricante: ");
1367    x.append((const char *) info.manufacturerID);
1368    mensaje.append(x);
1369
1370    QString cryptokiVersion("Version: ");
1371    cryptokiVersion.append(QString::number(info.cryptokiVersion.major));
1372    cryptokiVersion.append(".");
1373    cryptokiVersion.append(QString::number(info.cryptokiVersion.minor));
1374    qDebug(qPrintable(cryptokiVersion));
1375    mensaje.append(cryptokiVersion);
1376
1377    rv = C_Finalize(NULL_PTR);
1378    if (rv != CKR_OK)
1379    {
1380        error = returnErrorToQString(rv);
1381        return error;
1382    }
1383    assert(rv == CKR_OK);
1384    //mensaje->append("C_Finalize\n");
1385
1386    //qDebug("***********************mensaje:");
1387    //qDebug(qPrintable(mensaje));
1388    return mensaje;
1389}
1390
1391
1392
1393
1394QString CryptoToken::returnErrorToQString(CK_RV rv)
1395{
1396    QString x("");
1397    qDebug("returnErrorToQString");
1398    //qDebug("valor de x: ", x);
1399    //qDebug("valor de rv: "+ QString::number(rv,16));
1400
1401    /* CK_RV is a value that identifies the return value of a
1402    * Cryptoki function */
1403    /* CK_RV was changed from CK_USHORT to CK_ULONG for v2.0 */
1404    //typedef CK_ULONG          CK_RV;
1405
1406    if (rv == CKR_OK) // CKR_OK 0x00000000
1407    {
1408        x = "CKR_OK";
1409    } else if (rv == CKR_CANCEL)  // CKR_CANCEL 0x00000001
1410    {
1411        x = "CKR_CANCEL";
1412    } else if (rv == CKR_HOST_MEMORY) //CKR_HOST_MEMORY 0x00000002
1413    {
1414        x = "CKR_HOST_MEMORY";
1415    } else if (rv == CKR_SLOT_ID_INVALID) //CKR_SLOT_ID_INVALID 0x00000003
1416    {
1417        x = "CKR_SLOT_ID_INVALID";
1418    }
1419    /* CKR_FLAGS_INVALID was removed for v2.0 */
1420    /* CKR_GENERAL_ERROR and CKR_FUNCTION_FAILED are new for v2.0 */
1421    else if (rv == CKR_GENERAL_ERROR)           //CKR_GENERAL_ERROR 0x00000005
1422    {
1423        x = "CKR_GENERAL_ERROR";
1424    } else if (rv == CKR_FUNCTION_FAILED)    //CKR_FUNCTION_FAILED 0x00000006
1425    {
1426        x = "CKR_FUNCTION_FAILED";
1427        return x;
1428    }
1429    /* CKR_ARGUMENTS_BAD, CKR_NO_EVENT, CKR_NEED_TO_CREATE_THREADS,
1430    * and CKR_CANT_LOCK are new for v2.01 */
1431    else if (rv == CKR_ARGUMENTS_BAD)       // CKR_ARGUMENTS_BAD 0x00000007
1432    {
1433        x = "CKR_ARGUMENTS_BAD";
1434    } else if (rv == CKR_NO_EVENT) //CKR_NO_EVENT                          0x00000008
1435    {
1436        x = "CKR_NO_EVENT";
1437    } else if (rv == CKR_NEED_TO_CREATE_THREADS) //CKR_NEED_TO_CREATE_THREADS            0x00000009
1438    {
1439        x = "CKR_NEED_TO_CREATE_THREADS";
1440    } else if (rv == CKR_CANT_LOCK) // CKR_CANT_LOCK                         0x0000000A
1441    {
1442        x = "CKR_CANT_LOCK";
1443    } else if (rv == CKR_ATTRIBUTE_READ_ONLY) // CKR_ATTRIBUTE_READ_ONLY               0x00000010
1444    {
1445        x = "CKR_ATTRIBUTE_READ_ONLY";
1446    } else if (rv == CKR_ATTRIBUTE_SENSITIVE) // CKR_ATTRIBUTE_SENSITIVE               0x00000011
1447    {
1448        x = "CKR_ATTRIBUTE_SENSITIVE";
1449    } else if (rv == CKR_ATTRIBUTE_TYPE_INVALID) // CKR_ATTRIBUTE_TYPE_INVALID            0x00000012
1450    {
1451        x = "CKR_ATTRIBUTE_TYPE_INVALID";
1452        return x;
1453    } else if (rv == CKR_ATTRIBUTE_VALUE_INVALID)// CKR_ATTRIBUTE_VALUE_INVALID           0x00000013
1454    {
1455        x = "CKR_ATTRIBUTE_VALUE_INVALID";
1456    } else if (rv == CKR_DATA_INVALID)//#define CKR_DATA_INVALID                      0x00000020
1457    {
1458        x = "CKR_DATA_INVALID";
1459    } else if (rv == CKR_DATA_LEN_RANGE) //#define CKR_DATA_LEN_RANGE                    0x00000021
1460    {
1461        x = "CKR_DATA_LEN_RANGE";
1462    } else if (rv == CKR_DEVICE_ERROR) //#define CKR_DEVICE_ERROR                      0x00000030
1463    {
1464        x = "CKR_DEVICE_ERROR";
1465        qDebug("FUCK");
1466    } else if (rv == CKR_DEVICE_MEMORY) //#define CKR_DEVICE_MEMORY                     0x00000031
1467    {
1468        x = "CKR_DEVICE_MEMORY";
1469
1470    } else if (rv == CKR_DEVICE_REMOVED) //#define CKR_DEVICE_REMOVED                    0x00000032
1471    {
1472        x = "CKR_DEVICE_REMOVED";
1473    } else if (rv == CKR_ENCRYPTED_DATA_INVALID) //#define CKR_ENCRYPTED_DATA_INVALID            0x00000040
1474    {
1475        x = "CKR_ENCRYPTED_DATA_INVALID";
1476    } else if (rv == CKR_ENCRYPTED_DATA_LEN_RANGE) //#define CKR_ENCRYPTED_DATA_LEN_RANGE          0x00000041
1477    {
1478        x = "CKR_ENCRYPTED_DATA_LEN_RANGE";
1479    } else if (rv == CKR_FUNCTION_CANCELED) //#define CKR_FUNCTION_CANCELED                 0x00000050
1480    {
1481        x = "CKR_FUNCTION_CANCELED";
1482    } else if (rv == CKR_FUNCTION_NOT_PARALLEL) //#define CKR_FUNCTION_NOT_PARALLEL             0x00000051
1483    {
1484        x = "CKR_FUNCTION_NOT_PARALLEL";
1485    }
1486    /* CKR_FUNCTION_NOT_SUPPORTED is new for v2.0 */
1487    else if (rv == CKR_FUNCTION_NOT_SUPPORTED) //#define CKR_FUNCTION_NOT_SUPPORTED            0x00000054
1488    {
1489        x = "CKR_FUNCTION_NOT_SUPPORTED";
1490    } else if (rv == CKR_KEY_HANDLE_INVALID) //#define CKR_KEY_HANDLE_INVALID                0x00000060
1491    {
1492        x = "CKR_KEY_HANDLE_INVALID";
1493    }
1494    /* CKR_KEY_SENSITIVE was removed for v2.0 */
1495    else if (rv == CKR_KEY_SIZE_RANGE)     //#define CKR_KEY_SIZE_RANGE                    0x00000062
1496    {
1497        x = "CKR_KEY_SIZE_RANGE";
1498    } else if (rv == CKR_KEY_TYPE_INCONSISTENT)//#define CKR_KEY_TYPE_INCONSISTENT             0x00000063
1499    {
1500        x = "CKR_KEY_TYPE_INCONSISTENT";
1501    }
1502    /* CKR_KEY_NOT_NEEDED, CKR_KEY_CHANGED, CKR_KEY_NEEDED,
1503    * CKR_KEY_INDIGESTIBLE, CKR_KEY_FUNCTION_NOT_PERMITTED,
1504    * CKR_KEY_NOT_WRAPPABLE, and CKR_KEY_UNEXTRACTABLE are new for
1505    * v2.0 */
1506    else if (rv == CKR_KEY_NOT_NEEDED) //#define CKR_KEY_NOT_NEEDED                    0x00000064
1507    {
1508        x = "CKR_KEY_NOT_NEEDED";
1509    } else if (rv == CKR_KEY_CHANGED) //#define CKR_KEY_CHANGED                       0x00000065
1510    {
1511        x = "CKR_KEY_CHANGED";
1512    } else if (rv == CKR_KEY_NEEDED) //#define CKR_KEY_NEEDED                        0x00000066
1513    {
1514        x = "CKR_KEY_NEEDED";
1515    } else if (rv == CKR_KEY_INDIGESTIBLE)//#define CKR_KEY_INDIGESTIBLE                  0x00000067
1516    {
1517        x = "CKR_KEY_INDIGESTIBLE";
1518    } else if (rv == CKR_KEY_FUNCTION_NOT_PERMITTED)//#define CKR_KEY_FUNCTION_NOT_PERMITTED        0x00000068
1519    {
1520        x = "CKR_KEY_FUNCTION_NOT_PERMITTED";
1521    } else if (rv == CKR_KEY_NOT_WRAPPABLE)//#define CKR_KEY_NOT_WRAPPABLE                 0x00000069
1522    {
1523        x = "CKR_KEY_NOT_WRAPPABLE";
1524    } else if (rv == CKR_KEY_UNEXTRACTABLE)//#define CKR_KEY_UNEXTRACTABLE                 0x0000006A
1525    {
1526        x = "CKR_KEY_UNEXTRACTABLE";
1527    } else if (rv == CKR_MECHANISM_INVALID)//#define CKR_MECHANISM_INVALID                 0x00000070
1528    {
1529        x = "CKR_SLOTCKR_MECHANISM_INVALID";
1530    } else if (rv == CKR_MECHANISM_PARAM_INVALID)//#define CKR_MECHANISM_PARAM_INVALID           0x00000071
1531    {
1532        x = "CKR_MECHANISM_PARAM_INVALID";
1533    }
1534    /* CKR_OBJECT_CLASS_INCONSISTENT and CKR_OBJECT_CLASS_INVALID
1535    * were removed for v2.0 */
1536    else if (rv == CKR_OBJECT_HANDLE_INVALID)//#define CKR_OBJECT_HANDLE_INVALID             0x00000082
1537    {
1538        x = "CKR_OBJECT_HANDLE_INVALID";
1539    } else if (rv == CKR_OPERATION_ACTIVE)//#define CKR_OPERATION_ACTIVE                  0x00000090
1540    {
1541        x = "CKR_OPERATION_ACTIVE";
1542    } else if (rv == CKR_OPERATION_NOT_INITIALIZED)//#define CKR_OPERATION_NOT_INITIALIZED         0x00000091
1543    {
1544        x = "CKR_OPERATION_NOT_INITIALIZED";
1545    } else if (rv == CKR_PIN_INCORRECT)//#define CKR_PIN_INCORRECT                     0x000000A0
1546    {
1547        x = "CKR_PIN_INCORRECT";
1548    } else if (rv == CKR_PIN_INVALID)//#define CKR_PIN_INVALID                       0x000000A1
1549    {
1550        x = "CKR_PIN_INVALID";
1551    } else if (rv == CKR_PIN_LEN_RANGE)//#define CKR_PIN_LEN_RANGE                     0x000000A2
1552    {
1553        x = "CKR_PIN_LEN_RANGE";
1554    } /* CKR_PIN_EXPIRED and CKR_PIN_LOCKED are new for v2.0 */
1555    else if (rv == CKR_PIN_EXPIRED)//#define CKR_PIN_EXPIRED                       0x000000A3
1556    {
1557        x = "CKR_PIN_EXPIRED";
1558    } else if (rv == CKR_PIN_LOCKED)//#define CKR_PIN_LOCKED                        0x000000A4
1559    {
1560        x = "CKR_PIN_LOCKED";
1561    } else if (rv == CKR_SESSION_CLOSED)//#define CKR_SESSION_CLOSED                    0x000000B0
1562    {
1563        x = "CKR_SESSION_CLOSED";
1564    } else if (rv == CKR_SESSION_COUNT)//#define CKR_SESSION_COUNT                     0x000000B1
1565    {
1566        x = "CKR_SESSION_COUNT";
1567    } else if (rv == CKR_SESSION_HANDLE_INVALID)//#define CKR_SESSION_HANDLE_INVALID            0x000000B3
1568    {
1569        x = "CKR_SESSION_HANDLE_INVALID";
1570    } else if (rv == CKR_SESSION_PARALLEL_NOT_SUPPORTED)//#define CKR_SESSION_PARALLEL_NOT_SUPPORTED    0x000000B4
1571    {
1572        x = "CKR_SESSION_PARALLEL_NOT_SUPPORTED";
1573    } else if (rv == CKR_SESSION_READ_ONLY)//#define CKR_SESSION_READ_ONLY                 0x000000B5
1574    {
1575        x = "CKR_SESSION_READ_ONLY";
1576    } else if (rv == CKR_SESSION_EXISTS)//#define CKR_SESSION_EXISTS                    0x000000B6
1577    {
1578        x = "CKR_SESSION_EXISTS";
1579    }
1580    /* CKR_SESSION_READ_ONLY_EXISTS and
1581    * CKR_SESSION_READ_WRITE_SO_EXISTS are new for v2.0 */
1582
1583    else if (rv == CKR_SESSION_READ_ONLY_EXISTS)//#define CKR_SESSION_READ_ONLY_EXISTS          0x000000B7
1584    {
1585        x = "CKR_SESSION_READ_ONLY_EXISTS";
1586    } else if (rv == CKR_SESSION_READ_WRITE_SO_EXISTS)//#define CKR_SESSION_READ_WRITE_SO_EXISTS      0x000000B8
1587    {
1588        x = "CKR_SESSION_READ_WRITE_SO_EXISTS";
1589    } else if (rv == CKR_SIGNATURE_INVALID)//#define CKR_SIGNATURE_INVALID                 0x000000C0
1590    {
1591        x = "CKR_SIGNATURE_INVALID";
1592    } else if (rv == CKR_SIGNATURE_LEN_RANGE)//#define CKR_SIGNATURE_LEN_RANGE               0x000000C1
1593    {
1594        x = "CKR_SIGNATURE_LEN_RANGE";
1595    } else if (rv == CKR_TEMPLATE_INCOMPLETE)//#define CKR_TEMPLATE_INCOMPLETE               0x000000D0
1596    {
1597        x = "CKR_TEMPLATE_INCOMPLETE";
1598    } else if (rv == CKR_TEMPLATE_INCONSISTENT)//#define CKR_TEMPLATE_INCONSISTENT             0x000000D1
1599    {
1600        x = "CKR_TEMPLATE_INCONSISTENT";
1601    } else if (rv == CKR_TOKEN_NOT_PRESENT)//#define CKR_TOKEN_NOT_PRESENT                 0x000000E0
1602    {
1603        x = "CKR_TOKEN_NOT_PRESENT";
1604    } else if (rv == CKR_TOKEN_NOT_RECOGNIZED)//#define CKR_TOKEN_NOT_RECOGNIZED              0x000000E1
1605    {
1606        x = "CKR_TOKEN_NOT_RECOGNIZED";
1607    } else if (rv == CKR_TOKEN_WRITE_PROTECTED)//#define CKR_TOKEN_WRITE_PROTECTED             0x000000E2
1608    {
1609        x = "CKR_TOKEN_WRITE_PROTECTED";
1610    } else if (rv == CKR_UNWRAPPING_KEY_HANDLE_INVALID)//#define CKR_UNWRAPPING_KEY_HANDLE_INVALID     0x000000F0
1611    {
1612        x = "CKR_UNWRAPPING_KEY_HANDLE_INVALID";
1613    } else if (rv == CKR_UNWRAPPING_KEY_SIZE_RANGE)//#define CKR_UNWRAPPING_KEY_SIZE_RANGE         0x000000F1
1614    {
1615        x = "CKR_UNWRAPPING_KEY_SIZE_RANGE";
1616    } else if (rv == CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT)//#define CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT  0x000000F2
1617    {
1618        x = "CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT";
1619    } else if (rv == CKR_USER_ALREADY_LOGGED_IN)//#define CKR_USER_ALREADY_LOGGED_IN            0x00000100
1620    {
1621        x = "CKR_USER_ALREADY_LOGGED_IN";
1622    } else if (rv == CKR_USER_NOT_LOGGED_IN)//#define CKR_USER_NOT_LOGGED_IN                0x00000101
1623    {
1624        x = "CKR_USER_NOT_LOGGED_IN";
1625    } else if (rv == CKR_USER_PIN_NOT_INITIALIZED)//#define CKR_USER_PIN_NOT_INITIALIZED          0x00000102
1626    {
1627        x = "CKR_USER_PIN_NOT_INITIALIZED";
1628    } else if (rv == CKR_USER_TYPE_INVALID)//#define CKR_USER_TYPE_INVALID                 0x00000103
1629    {
1630        x = "CKR_USER_TYPE_INVALID";
1631    }
1632    /* CKR_USER_ANOTHER_ALREADY_LOGGED_IN and CKR_USER_TOO_MANY_TYPES
1633    * are new to v2.01 */
1634    else if (rv == CKR_USER_ANOTHER_ALREADY_LOGGED_IN)//#define CKR_USER_ANOTHER_ALREADY_LOGGED_IN    0x00000104
1635    {
1636        x = "CKR_USER_ANOTHER_ALREADY_LOGGED_IN";
1637    } else if (rv == CKR_USER_TOO_MANY_TYPES)//#define CKR_USER_TOO_MANY_TYPES               0x00000105
1638    {
1639        x = "CKR_USER_TOO_MANY_TYPES";
1640    } else if (rv == CKR_WRAPPED_KEY_INVALID)//#define CKR_WRAPPED_KEY_INVALID               0x00000110
1641    {
1642        x = "CKR_WRAPPED_KEY_INVALID";
1643    } else if (rv == CKR_WRAPPED_KEY_LEN_RANGE)//#define CKR_WRAPPED_KEY_LEN_RANGE             0x00000112
1644    {
1645        x = "CKR_SLOT_CKR_WRAPPED_KEY_LEN_RANGE";
1646    } else if (rv == CKR_WRAPPING_KEY_HANDLE_INVALID)//#define CKR_WRAPPING_KEY_HANDLE_INVALID       0x00000113
1647    {
1648        x = "CKR_WRAPPING_KEY_HANDLE_INVALID";
1649    } else if (rv == CKR_WRAPPING_KEY_SIZE_RANGE)//#define CKR_WRAPPING_KEY_SIZE_RANGE           0x00000114
1650    {
1651        x = "CKR_WRAPPING_KEY_SIZE_RANGE";
1652    } else if (rv == CKR_WRAPPING_KEY_TYPE_INCONSISTENT)//#define CKR_WRAPPING_KEY_TYPE_INCONSISTENT    0x00000115
1653    {
1654        x = "CKR_WRAPPING_KEY_TYPE_INCONSISTENT";
1655    } else if (rv == CKR_RANDOM_SEED_NOT_SUPPORTED)//#define CKR_RANDOM_SEED_NOT_SUPPORTED         0x00000120
1656    {
1657        x = "CKR_RANDOM_SEED_NOT_SUPPORTED";
1658    }
1659    /* These are new to v2.0 */
1660    else if (rv == CKR_RANDOM_NO_RNG)//#define CKR_RANDOM_NO_RNG                     0x00000121
1661    {
1662        x = "CKR_RANDOM_NO_RNG";
1663    }
1664    /* These are new to v2.11 */
1665    else if (rv == CKR_DOMAIN_PARAMS_INVALID)//#define CKR_DOMAIN_PARAMS_INVALID             0x00000130
1666    {
1667        x = "CKR_DOMAIN_PARAMS_INVALID";
1668    }
1669    /* These are new to v2.0 */
1670    else if (rv == CKR_BUFFER_TOO_SMALL)//#define CKR_BUFFER_TOO_SMALL                  0x00000150
1671    {
1672        x = "CKR_BUFFER_TOO_SMALL";
1673    } else if (rv == CKR_SAVED_STATE_INVALID)//#define CKR_SAVED_STATE_INVALID               0x00000160
1674    {
1675        x = "CKR_SAVED_STATE_INVALID";
1676    } else if (rv == CKR_INFORMATION_SENSITIVE)//#define CKR_INFORMATION_SENSITIVE             0x00000170
1677    {
1678        x = "CKR_INFORMATION_SENSITIVE";
1679    } else if (rv == CKR_STATE_UNSAVEABLE)//#define CKR_STATE_UNSAVEABLE                  0x00000180
1680    {
1681        x = "CKR_STATE_UNSAVEABLE";
1682    }
1683    /* These are new to v2.01 */
1684    else if (rv == CKR_CRYPTOKI_NOT_INITIALIZED)//#define CKR_CRYPTOKI_NOT_INITIALIZED          0x00000190
1685    {
1686        x = "CKR_CRYPTOKI_NOT_INITIALIZED";
1687    } else if (rv == CKR_CRYPTOKI_ALREADY_INITIALIZED)    //#define CKR_CRYPTOKI_ALREADY_INITIALIZED      0x00000191
1688    {
1689        x = "CKR_CRYPTOKI_ALREADY_INITIALIZED";
1690    } else if (rv == CKR_MUTEX_BAD)//#define CKR_MUTEX_BAD                         0x000001A0
1691    {
1692        x = "CKR_MUTEX_BAD";
1693    } else if (rv == CKR_MUTEX_NOT_LOCKED)//#define CKR_MUTEX_NOT_LOCKED                  0x000001A1
1694    {
1695        x = "CKR_MUTEX_NOT_LOCKED";
1696
1697    } else if (rv == CKR_VENDOR_DEFINED)//#define CKR_VENDOR_DEFINED                    0x80000000
1698    {
1699        x = "CKR_VENDOR_DEFINED";
1700    } else
1701    {
1702        x = "-1";
1703    }
1704
1705    return x;
1706}
1707
1708
1709QByteArray CryptoToken::toHex(const std::vector<unsigned char> &data)
1710{
1711    return QByteArray((const char*)data.data(), data.size()).toHex();
1712}
1713
1714std::vector<unsigned char> CryptoToken::fromHex(const QString &data)
1715{
1716    QByteArray bin = QByteArray::fromHex(data.toLatin1());
1717    return std::vector<unsigned char>(bin.constData(), bin.constData() + bin.size());
1718}
Note: See TracBrowser for help on using the repository browser.