1 /***************************************************************************
2  begin       : Thu Aug 01 2019
3  copyright   : (C) 2019 by Martin Preuss
4  email       : martin@libchipcard.de
5 
6  ***************************************************************************
7  * This file is part of the project "AqBanking".                           *
8  * Please see toplevel file COPYING of that project for license details.   *
9  ***************************************************************************/
10 
11 #ifndef AQFINTS_SESSION_H
12 #define AQFINTS_SESSION_H
13 
14 
15 #include "libaqfints/aqfints.h"
16 #include "msg/message.h"
17 #include "msg/keydescr.h"
18 #include "parser/parser.h"
19 #include "transport/transport.h"
20 #include "service/upd/userdata.h"
21 #include "service/bpd/bpd.h"
22 #include "session/cryptparams.h"
23 
24 #include <aqbanking/error.h>
25 
26 #include <gwenhywfar/buffer.h>
27 #include <gwenhywfar/types.h>
28 #include <gwenhywfar/inherit.h>
29 #include <gwenhywfar/cryptkey.h>
30 #include <gwenhywfar/paddalgo.h>
31 
32 #include <ctype.h>
33 
34 
35 typedef struct AQFINTS_SESSION AQFINTS_SESSION;
36 GWEN_INHERIT_FUNCTION_DEFS(AQFINTS_SESSION)
37 
38 
39 enum {
40   AQFINTS_SESSION_CRYPTOP_UNKNOWN=-1,
41   AQFINTS_SESSION_CRYPTOP_NONE,
42   AQFINTS_SESSION_CRYPTOP_SIGN,
43   AQFINTS_SESSION_CRYPTOP_ENCRYPT,
44   AQFINTS_SESSION_CRYPTOP_AUTH,
45 };
46 
47 
48 
49 /** @name Definitions for virtual functions
50  *
51  */
52 /*@{*/
53 
54 
55 /* definitions for virtual functions (post) */
56 typedef AQFINTS_MESSAGE *GWENHYWFAR_CB(*AQFINTS_SESSION_EXCHANGEMESSAGES_FN)(AQFINTS_SESSION *sess,
57                                                                              AQFINTS_MESSAGE *messageOut);
58 
59 typedef int GWENHYWFAR_CB(*AQFINTS_SESSION_FILLOUT_KEYDESCR_FN)(AQFINTS_SESSION *sess, AQFINTS_KEYDESCR *keyDescr,
60                                                                 int mode);
61 
62 
63 typedef int GWENHYWFAR_CB(*AQFINTS_SESSION_DECRYPT_SKEY_FN)(AQFINTS_SESSION *sess,
64                                                             const AQFINTS_KEYDESCR *keyDescr,
65                                                             const AQFINTS_CRYPTPARAMS *cryptParams,
66                                                             const uint8_t *pInData,
67                                                             uint32_t inLen,
68                                                             uint8_t *pOutData,
69                                                             uint32_t *pOutLen);
70 
71 typedef int GWENHYWFAR_CB(*AQFINTS_SESSION_ENCRYPT_SKEY_FN)(AQFINTS_SESSION *sess,
72                                                             const AQFINTS_KEYDESCR *keyDescr,
73                                                             const AQFINTS_CRYPTPARAMS *cryptParams,
74                                                             const uint8_t *pInData,
75                                                             uint32_t inLen,
76                                                             uint8_t *pOutData,
77                                                             uint32_t *pOutLen);
78 
79 typedef int GWENHYWFAR_CB(*AQFINTS_SESSION_SIGN_FN)(AQFINTS_SESSION *sess,
80                                                     const AQFINTS_KEYDESCR *keyDescr,
81                                                     const AQFINTS_CRYPTPARAMS *cryptParams,
82                                                     const uint8_t *pInData,
83                                                     uint32_t inLen,
84                                                     uint8_t *pSignatureData,
85                                                     uint32_t *pSignatureLen);
86 
87 
88 /**
89  * GWEN_ERROR_TRY_AGAIN: retry after handling the message
90  */
91 typedef int GWENHYWFAR_CB(*AQFINTS_SESSION_VERIFY_FN)(AQFINTS_SESSION *sess,
92                                                       const AQFINTS_KEYDESCR *keyDescr,
93                                                       const AQFINTS_CRYPTPARAMS *cryptParams,
94                                                       const uint8_t *pInData,
95                                                       uint32_t inLen,
96                                                       const uint8_t *pSignatureData,
97                                                       uint32_t signatureLen,
98                                                       uint32_t seqCounter);
99 
100 
101 
102 typedef int GWENHYWFAR_CB(*AQFINTS_SESSION_VERIFYPIN_FN)(AQFINTS_SESSION *sess, const AQFINTS_KEYDESCR *keyDescr,
103                                                          const char *pin);
104 
105 /*@}*/
106 
107 
108 
109 
110 /** @name Constructor, destructor
111  *
112  */
113 /*@{*/
114 AQFINTS_SESSION *AQFINTS_Session_new(AQFINTS_PARSER *parser, AQFINTS_TRANSPORT *trans);
115 void AQFINTS_Session_free(AQFINTS_SESSION *sess);
116 
117 void AQFINTS_Session_Attach(AQFINTS_SESSION *sess);
118 /*@}*/
119 
120 
121 
122 
123 /** @name Variables to set before working with sessions
124  *
125  */
126 /*@{*/
127 int AQFINTS_Session_GetHbciVersion(const AQFINTS_SESSION *sess);
128 void AQFINTS_Session_SetHbciVersion(AQFINTS_SESSION *sess, int v);
129 
130 int AQFINTS_Session_GetIsServer(const AQFINTS_SESSION *sess);
131 void AQFINTS_Session_SetIsServer(AQFINTS_SESSION *sess, int v);
132 
133 
134 /*@}*/
135 
136 
137 
138 
139 /** @name Variables set when parsing received messages
140  *
141  */
142 /*@{*/
143 
144 const char *AQFINTS_Session_GetDialogId(const AQFINTS_SESSION *sess);
145 void AQFINTS_Session_SetDialogId(AQFINTS_SESSION *sess, const char *s);
146 
147 /*@}*/
148 
149 
150 
151 
152 /** @name Internal functions to be used by the various session submodules
153  *
154  */
155 /*@{*/
156 
157 AQFINTS_PARSER *AQFINTS_Session_GetParser(const AQFINTS_SESSION *sess);
158 
159 
160 
161 int AQFINTS_Session_GetLastMessageNumSent(const AQFINTS_SESSION *sess);
162 void AQFINTS_Session_SetLastMessageNumSent(AQFINTS_SESSION *sess, int p_src);
163 
164 int AQFINTS_Session_GetLastMessageNumReceived(const AQFINTS_SESSION *sess);
165 void AQFINTS_Session_SetLastMessageNumReceived(AQFINTS_SESSION *sess, int p_src);
166 
167 /*@}*/
168 
169 
170 
171 /** @name Sending, Receiving
172  *
173  */
174 /*@{*/
175 
176 int AQFINTS_Session_Connect(AQFINTS_SESSION *sess);
177 
178 int AQFINTS_Session_Disconnect(AQFINTS_SESSION *sess);
179 
180 /**
181  * @return message received (or NULL on error)
182  * @param sess session pointer
183  * @param messageOut Pointer to a message to be sent
184  */
185 AQFINTS_MESSAGE *AQFINTS_Session_ExchangeMessages(AQFINTS_SESSION *sess, AQFINTS_MESSAGE *messageOut);
186 
187 AQFINTS_MESSAGE *AQFINTS_Session_DirectlyExchangeMessages(AQFINTS_SESSION *sess, AQFINTS_MESSAGE *messageOut);
188 
189 int AQFINTS_Session_SendMessage(AQFINTS_SESSION *sess, const char *ptrBuffer, int lenBuffer);
190 
191 int AQFINTS_Session_ReceiveMessage(AQFINTS_SESSION *sess, GWEN_BUFFER *buffer);
192 
193 /*@}*/
194 
195 
196 
197 /** @name Cryptographic Functions
198  *
199  */
200 /*@{*/
201 
202 int AQFINTS_Session_FilloutKeyname(AQFINTS_SESSION *sess, AQFINTS_KEYDESCR *keyDescr, int mode);
203 
204 int AQFINTS_Session_DecryptSessionKey(AQFINTS_SESSION *sess,
205                                       const AQFINTS_KEYDESCR *keyDescr,
206                                       const AQFINTS_CRYPTPARAMS *cryptParams,
207                                       const uint8_t *pInData,
208                                       uint32_t inLen,
209                                       uint8_t *pOutData,
210                                       uint32_t *pOutLen);
211 
212 int AQFINTS_Session_EncryptSessionKey(AQFINTS_SESSION *sess,
213                                       const AQFINTS_KEYDESCR *keyDescr,
214                                       const AQFINTS_CRYPTPARAMS *cryptParams,
215                                       const uint8_t *pInData,
216                                       uint32_t inLen,
217                                       uint8_t *pOutData,
218                                       uint32_t *pOutLen);
219 
220 int AQFINTS_Session_VerifyPin(AQFINTS_SESSION *sess, const AQFINTS_KEYDESCR *keyDescr, const char *pin);
221 
222 
223 int AQFINTS_Session_Sign(AQFINTS_SESSION *sess,
224                          const AQFINTS_KEYDESCR *keyDescr,
225                          const AQFINTS_CRYPTPARAMS *cryptParams,
226                          const uint8_t *pInData,
227                          uint32_t inLen,
228                          uint8_t *pSignatureData,
229                          uint32_t *pSignatureLen);
230 
231 /**
232  *
233  * @return GWEN_ERROR_TRY_AGAIN if the sign key is not yet available, 0 if okay, error code otherwise
234  */
235 int AQFINTS_Session_Verify(AQFINTS_SESSION *sess,
236                            const AQFINTS_KEYDESCR *keyDescr,
237                            const AQFINTS_CRYPTPARAMS *cryptParams,
238                            const uint8_t *pInData,
239                            uint32_t inLen,
240                            const uint8_t *pSignatureData,
241                            uint32_t signatureLen,
242                            uint32_t seqCounter);
243 
244 /*@}*/
245 
246 
247 
248 /** @name Setters for virtual functions
249  *
250  */
251 /*@{*/
252 
253 AQFINTS_SESSION_EXCHANGEMESSAGES_FN AQFINTS_Session_SetExchangeMessagesFn(AQFINTS_SESSION *sess,
254                                                                           AQFINTS_SESSION_EXCHANGEMESSAGES_FN fn);
255 
256 AQFINTS_SESSION_DECRYPT_SKEY_FN AQFINTS_Session_SetDecryptSessionKeyFn(AQFINTS_SESSION *sess,
257                                                                        AQFINTS_SESSION_DECRYPT_SKEY_FN fn);
258 
259 AQFINTS_SESSION_ENCRYPT_SKEY_FN AQFINTS_Session_SetEncryptSessionKeyFn(AQFINTS_SESSION *sess,
260                                                                        AQFINTS_SESSION_ENCRYPT_SKEY_FN fn);
261 
262 AQFINTS_SESSION_VERIFYPIN_FN AQFINTS_Session_SetVerifyPinFn(AQFINTS_SESSION *sess,
263                                                             AQFINTS_SESSION_VERIFYPIN_FN fn);
264 
265 
266 AQFINTS_SESSION_FILLOUT_KEYDESCR_FN AQFINTS_Session_SetFilloutKeynameFn(AQFINTS_SESSION *sess,
267                                                                         AQFINTS_SESSION_FILLOUT_KEYDESCR_FN fn);
268 
269 AQFINTS_SESSION_SIGN_FN AQFINTS_Session_SetSignFn(AQFINTS_SESSION *sess, AQFINTS_SESSION_SIGN_FN fn);
270 
271 AQFINTS_SESSION_VERIFY_FN AQFINTS_Session_SetVerifyFn(AQFINTS_SESSION *sess, AQFINTS_SESSION_VERIFY_FN fn);
272 
273 
274 /*@}*/
275 
276 
277 
278 /** @name Internal functions
279  *
280  */
281 /*@{*/
282 
283 
284 int AQFINTS_Session_WriteSegmentList(AQFINTS_SESSION *sess, AQFINTS_SEGMENT_LIST *segmentList);
285 
286 int AQFINTS_Session_WriteSegment(AQFINTS_SESSION *sess, AQFINTS_SEGMENT *segment);
287 
288 
289 AQFINTS_BPD *AQFINTS_Session_ExtractBpdFromSegmentList(AQFINTS_SESSION *sess, AQFINTS_SEGMENT_LIST *segmentList);
290 AQFINTS_USERDATA_LIST *AQFINTS_Session_ExtractUpdFromSegmentList(AQFINTS_SESSION *sess,
291                                                                  AQFINTS_SEGMENT_LIST *segmentList);
292 
293 /**
294  * Returns the number of TAN methods added.
295  */
296 int AQFINTS_Session_SampleAllowedTanMethods(int *ptrIntArray, int sizeIntArray, AQFINTS_SEGMENT_LIST *segmentList);
297 
298 
299 int AQFINTS_Session_SampleDataToHash(AQFINTS_SEGMENT *segSigHead,
300                                      AQFINTS_SEGMENT *segFirstToSign,
301                                      AQFINTS_SEGMENT *segLastToSign,
302                                      GWEN_BUFFER *destBuf);
303 
304 
305 void AQFINTS_Session_LogMessage(AQFINTS_SESSION *sess,
306                                 const uint8_t *ptrLogData,
307                                 uint32_t lenLogData,
308                                 int rec,
309                                 int crypt);
310 
311 
312 int AQFINTS_Session_GetAnonBpd(AQFINTS_SESSION *sess, const char *bankCode, AQFINTS_BPD **pBpd);
313 
314 
315 const char *AQFINTS_Session_GetLogFile(const AQFINTS_SESSION *sess);
316 void AQFINTS_Session_SetLogFile(AQFINTS_SESSION *sess, const char *s);
317 
318 const char *AQFINTS_Session_GetAppRegKey(const AQFINTS_SESSION *sess);
319 void AQFINTS_Session_SetAppRegKey(AQFINTS_SESSION *sess, const char *s);
320 
321 const char *AQFINTS_Session_GetAppVersion(const AQFINTS_SESSION *sess);
322 void AQFINTS_Session_SetAppVersion(AQFINTS_SESSION *sess, const char *s);
323 
324 
325 
326 /*@}*/
327 
328 
329 #endif
330 
331