~esignature/esignature/bdoc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
/*
* FirmaXML
*
* Copyright (C) 2011 Victor Bravo (vbravo@cenditel.gob.ve),
* Antonio Araujo (aaraujo@cenditel.gob.ve),
* Pedro Buitrago (pbuitrago@cenditel.gob.ve),
* Rodolfo Sumoza (rsumoza@cenditel.gob.ve)
*
* CENDITEL Fundacion Centro Nacional de Desarrollo e Investigacion en
* Tecnologias Libres
*
* Este programa es software libre; Usted puede usarlo bajo los terminos de la
* licencia de software GPL version 2.0 de la Free Software Foundation.
*
* Este programa se distribuye con la esperanza de que sea util, pero SIN
* NINGUNA GARANTIA; tampoco las implicitas garantias de MERCANTILIDAD o
* ADECUACION A UN PROPOSITO PARTICULAR.
* Consulte la licencia GPL para mas detalles. Usted debe recibir una copia
* de la GPL junto con este programa; si no, escriba a la Free Software
* Foundation Inc. 51 Franklin Street,5 Piso, Boston, MA 02110-1301, USA.
*
*/


#ifndef SMARTCARD_H
#define SMARTCARD_H

#include <QObject>

#include <QLibrary>

#include "pkcs11.h"
#include <stdio.h>
#include <assert.h>



// funcion que retorna el tipo de error que puede ocurrir cuando se manipula la tarjeta inteligente en la QString x
QString returnErrorToQString(CK_RV rv);


/**
* Clase SmartCard
*
* Representa un objeto SmartCard para manipular elementos de una tarjeta inteligente.
*
*/

class SmartCard : public QObject
{
    Q_OBJECT
public:
    explicit SmartCard(QObject *parent = 0);

    virtual ~SmartCard();



    /**
    * Carga el driver de la tarjeta inteligente
    *
    * @return Retorna si se cargo el driver de la tarjeta correctamente
    *
    */
    bool loadDriver( const QString &driver );

    /**
    * Descarga el driver de la tarjeta inteligente
    *
    */
    void unloadDriver();

    /**
    * Inicializa criptoki
    *
    * @return Retorna si se inicializo correctamente el criptoki
    */
    bool initializeCriptoki();

    /**
    * Finaliza criptoki
    *
    */
    void finalize();

    /**
    * Abre una sesion
    *
    * @param Pin PIN de la tarjeta
    * @param slotID ID de slot
    * @param requiredlogin verdadero si se requiere una sesion con login
    * @return CK_SESSION_HANDLE handle de sesion
    */
    CK_SESSION_HANDLE openSession(const char * Pin, CK_SLOT_ID & slotID, bool requiredlogin = true);


    /**
    * Cierra una sesion
    *
    * @param hSession handle de la sesion abierta
    */
    void  closeSession(CK_SESSION_HANDLE hSession);

    // Reads objects
    /**
    *   Busca Objetos en la tarjeta
    *
    * @param hSession handle de la sesion abierta
    * @return Retorna si se leyeron correctamente los objetos de la tarjeta
    */
    bool readObjects(CK_SESSION_HANDLE hSession);


    /**
    * Busca un certificado
    *
    * @param hSession handle de la sesion abierta
    * @return Retorna si se encontraron certificados
    */
    bool searchCertificate(CK_SESSION_HANDLE hSession);

    /**
    * Funcion para consultar un atributo de un objeto PKCS11
    *
    * @param obj objeto PKCS11 sobre el cual ejecutar la consulta
    * @param type tipo del atributo a consultar
    * @param value puntero para almacenar el valor del atributo
    * @param size tamano del atributo
    * @param hSession manejador de sesion abierta en la tarjeta
    *
    * @return Retorna si consiguio el atributo del objeto
    */
    bool attribute( CK_OBJECT_HANDLE obj, CK_ATTRIBUTE_TYPE type, CK_VOID_PTR value, CK_ULONG &size, CK_SESSION_HANDLE hSession );

    /**
    * Funcion para obtener un atributo de un objeto PKCS11
    *
    * @param obj objeto PKCS11 sobre el cual ejecutar la consulta
    * @param type tipo del atributo a consultar
    * @param hSession manejador de sesion abierta en la tarjeta
    * @return Retorna el atributo del objeto en un QByteArray
    */
    QByteArray attribute( CK_OBJECT_HANDLE obj, CK_ATTRIBUTE_TYPE type, CK_SESSION_HANDLE hSession );

    /**
    * Funcion para encontrar un objeto PKCS11 en la tarjeta inteligente
    *
    * @param hSession manejador de sesion abierta en la tarjeta
    * @param cls clase de objeto
    * @return Retorna el CK_OBJECT_HANDLE del objeto correspondiente; en caso
    * contrario retorna CK_INVALID_HANDLE
    */
    CK_OBJECT_HANDLE findObject( CK_SESSION_HANDLE hSession, CK_OBJECT_CLASS cls );

    /**
    * Funcion para iniciar la operacion de decifrado
    *
    * @param hSession manejador de sesion abierta en la tarjeta
    * @param key clave privada
    * @return Retorna el CKR_OK en caso de ejecutar la operacion correcta
    */
    CK_RV decryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR mechanism, CK_OBJECT_HANDLE privateKey);

    /**
    * Funcion para ejecutar el descifrado de datos
    *
    * @param hSession manejador de sesion abierta en la tarjeta
    * @param data datos cifrados
    * @param dataLen longitud de los datos cifrados
    * @param buffer buffer para almancenar los datos descifrados
    * @param bufferLen longitud del buffer de datos descifrados
    * @return Retorna el CKR_OK en caso de ejecutar la operacion correcta
    */
    CK_RV decrypt(CK_SESSION_HANDLE hSession, CK_BYTE_PTR data, CK_ULONG dataLen, CK_BYTE_PTR buffer, CK_ULONG_PTR bufferLen);


    /**
    * Manejador de la biblioteca que implementa el PKCS11.
    *
    */
    QLibrary		lib;

    /**
    * Lista de funciones disponibles en la biblioteca PKCS11 implementada.
    *
    */
    CK_FUNCTION_LIST *f;

};

#endif // SMARTCARD_H