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 #ifdef HAVE_CONFIG_H
12 # include <config.h>
13 #endif
14
15 #include "./session_p.h"
16 #include "session/s_encode.h"
17 #include "session/s_decode.h"
18 #include "parser/parser.h"
19 #include "parser/parser_dump.h"
20 #include "service/upd/upd_read.h"
21 #include "service/bpd/bpd_read.h"
22
23
24 #include <gwenhywfar/misc.h>
25 #include <gwenhywfar/debug.h>
26 #include <gwenhywfar/text.h>
27
28
29
30 /* ------------------------------------------------------------------------------------------------
31 * forward declarations
32 * ------------------------------------------------------------------------------------------------
33 */
34
35
36 static AQFINTS_MESSAGE *GWENHYWFAR_CB _exchangeMessagesInternal(AQFINTS_SESSION *sess, AQFINTS_MESSAGE *messageOut);
37
38
39
40 /* ------------------------------------------------------------------------------------------------
41 * implementations
42 * ------------------------------------------------------------------------------------------------
43 */
44
45
46
47
GWEN_INHERIT_FUNCTIONS(AQFINTS_SESSION)48 GWEN_INHERIT_FUNCTIONS(AQFINTS_SESSION)
49
50
51
52 AQFINTS_SESSION *AQFINTS_Session_new(AQFINTS_PARSER *parser, AQFINTS_TRANSPORT *trans)
53 {
54 AQFINTS_SESSION *sess;
55
56 GWEN_NEW_OBJECT(AQFINTS_SESSION, sess);
57 sess->_refCount=1;
58 GWEN_INHERIT_INIT(AQFINTS_SESSION, sess);
59 sess->lastMessageNumSent=0;
60 sess->lastMessageNumReceived=0;
61 sess->hbciVersion=300;
62
63 sess->parser=parser;
64 sess->transport=trans;
65
66 sess->exchangeMessagesFn=_exchangeMessagesInternal;
67
68 return sess;
69 }
70
71
72
AQFINTS_Session_free(AQFINTS_SESSION * sess)73 void AQFINTS_Session_free(AQFINTS_SESSION *sess)
74 {
75 if (sess) {
76 assert(sess->_refCount);
77 if (sess->_refCount==1) {
78 GWEN_INHERIT_FINI(AQFINTS_SESSION, sess)
79 sess->_refCount=0;
80
81 free(sess->logFile);
82 free(sess->appRegKey);
83 free(sess->appVersion);
84 free(sess->dialogId);
85
86 if (sess->transport)
87 AQFINTS_Transport_free(sess->transport);
88
89 GWEN_FREE_OBJECT(sess);
90 }
91 else
92 sess->_refCount--;
93 }
94 }
95
96
97
AQFINTS_Session_Attach(AQFINTS_SESSION * sess)98 void AQFINTS_Session_Attach(AQFINTS_SESSION *sess)
99 {
100 assert(sess);
101 assert(sess->_refCount);
102 sess->_refCount++;
103 }
104
105
106
AQFINTS_Session_GetHbciVersion(const AQFINTS_SESSION * sess)107 int AQFINTS_Session_GetHbciVersion(const AQFINTS_SESSION *sess)
108 {
109 assert(sess);
110 return sess->hbciVersion;
111 }
112
113
114
AQFINTS_Session_SetHbciVersion(AQFINTS_SESSION * sess,int v)115 void AQFINTS_Session_SetHbciVersion(AQFINTS_SESSION *sess, int v)
116 {
117 assert(sess);
118 sess->hbciVersion=v;
119 }
120
121
122
AQFINTS_Session_GetIsServer(const AQFINTS_SESSION * sess)123 int AQFINTS_Session_GetIsServer(const AQFINTS_SESSION *sess)
124 {
125 assert(sess);
126 return sess->isServer;
127 }
128
129
130
AQFINTS_Session_SetIsServer(AQFINTS_SESSION * sess,int v)131 void AQFINTS_Session_SetIsServer(AQFINTS_SESSION *sess, int v)
132 {
133 assert(sess);
134 sess->isServer=v?1:0;
135 }
136
137
138
AQFINTS_Session_GetDialogId(const AQFINTS_SESSION * sess)139 const char *AQFINTS_Session_GetDialogId(const AQFINTS_SESSION *sess)
140 {
141 assert(sess);
142 return sess->dialogId;
143 }
144
145
146
AQFINTS_Session_SetDialogId(AQFINTS_SESSION * sess,const char * s)147 void AQFINTS_Session_SetDialogId(AQFINTS_SESSION *sess, const char *s)
148 {
149 assert(sess);
150 if (sess->dialogId)
151 free(sess->dialogId);
152 if (s)
153 sess->dialogId=strdup(s);
154 else
155 sess->dialogId=NULL;
156 }
157
158
159
AQFINTS_Session_GetLastMessageNumSent(const AQFINTS_SESSION * sess)160 int AQFINTS_Session_GetLastMessageNumSent(const AQFINTS_SESSION *sess)
161 {
162 assert(sess);
163 return sess->lastMessageNumSent;
164 }
165
166
167
AQFINTS_Session_SetLastMessageNumSent(AQFINTS_SESSION * sess,int p_src)168 void AQFINTS_Session_SetLastMessageNumSent(AQFINTS_SESSION *sess, int p_src)
169 {
170 assert(sess);
171 sess->lastMessageNumSent=p_src;
172 }
173
174
175
AQFINTS_Session_GetLastMessageNumReceived(const AQFINTS_SESSION * sess)176 int AQFINTS_Session_GetLastMessageNumReceived(const AQFINTS_SESSION *sess)
177 {
178 assert(sess);
179 return sess->lastMessageNumReceived;
180 }
181
182
183
AQFINTS_Session_SetLastMessageNumReceived(AQFINTS_SESSION * sess,int p_src)184 void AQFINTS_Session_SetLastMessageNumReceived(AQFINTS_SESSION *sess, int p_src)
185 {
186 assert(sess);
187 sess->lastMessageNumReceived=p_src;
188 }
189
190
191
AQFINTS_Session_GetParser(const AQFINTS_SESSION * sess)192 AQFINTS_PARSER *AQFINTS_Session_GetParser(const AQFINTS_SESSION *sess)
193 {
194 assert(sess);
195 return sess->parser;
196 }
197
198
AQFINTS_Session_GetLogFile(const AQFINTS_SESSION * sess)199 const char *AQFINTS_Session_GetLogFile(const AQFINTS_SESSION *sess)
200 {
201 assert(sess);
202 return sess->logFile;
203 }
204
205
206
AQFINTS_Session_SetLogFile(AQFINTS_SESSION * sess,const char * s)207 void AQFINTS_Session_SetLogFile(AQFINTS_SESSION *sess, const char *s)
208 {
209 assert(sess);
210 if (sess->logFile)
211 free(sess->logFile);
212 if (s)
213 sess->logFile=strdup(s);
214 else
215 sess->logFile=NULL;
216 }
217
218
219
AQFINTS_Session_GetAppRegKey(const AQFINTS_SESSION * sess)220 const char *AQFINTS_Session_GetAppRegKey(const AQFINTS_SESSION *sess)
221 {
222 assert(sess);
223 return sess->appRegKey;
224 }
225
226
227
AQFINTS_Session_SetAppRegKey(AQFINTS_SESSION * sess,const char * s)228 void AQFINTS_Session_SetAppRegKey(AQFINTS_SESSION *sess, const char *s)
229 {
230 assert(sess);
231 if (sess->appRegKey)
232 free(sess->appRegKey);
233 if (s)
234 sess->appRegKey=strdup(s);
235 else
236 sess->appRegKey=NULL;
237 }
238
239
240
AQFINTS_Session_GetAppVersion(const AQFINTS_SESSION * sess)241 const char *AQFINTS_Session_GetAppVersion(const AQFINTS_SESSION *sess)
242 {
243 assert(sess);
244 return sess->appVersion;
245 }
246
247
248
AQFINTS_Session_SetAppVersion(AQFINTS_SESSION * sess,const char * s)249 void AQFINTS_Session_SetAppVersion(AQFINTS_SESSION *sess, const char *s)
250 {
251 assert(sess);
252 if (sess->appVersion)
253 free(sess->appVersion);
254 if (s)
255 sess->appVersion=strdup(s);
256 else
257 sess->appVersion=NULL;
258 }
259
260
261
262
263
264
265
266
267
268
269
AQFINTS_Session_ExchangeMessages(AQFINTS_SESSION * sess,AQFINTS_MESSAGE * messageOut)270 AQFINTS_MESSAGE *AQFINTS_Session_ExchangeMessages(AQFINTS_SESSION *sess, AQFINTS_MESSAGE *messageOut)
271 {
272 assert(sess);
273 if (sess->exchangeMessagesFn)
274 return sess->exchangeMessagesFn(sess, messageOut);
275 else
276 return NULL;
277 }
278
279
280
_exchangeMessagesInternal(AQFINTS_SESSION * sess,AQFINTS_MESSAGE * messageOut)281 AQFINTS_MESSAGE *_exchangeMessagesInternal(AQFINTS_SESSION *sess, AQFINTS_MESSAGE *messageOut)
282 {
283 return AQFINTS_Session_DirectlyExchangeMessages(sess, messageOut);
284 }
285
286
287
AQFINTS_Session_FilloutKeyname(AQFINTS_SESSION * sess,AQFINTS_KEYDESCR * keyDescr,int mode)288 int AQFINTS_Session_FilloutKeyname(AQFINTS_SESSION *sess, AQFINTS_KEYDESCR *keyDescr, int mode)
289 {
290 assert(sess);
291 if (sess->filloutKeynameFn)
292 return sess->filloutKeynameFn(sess, keyDescr, mode);
293 else
294 return GWEN_ERROR_NOT_IMPLEMENTED;
295 }
296
297
298
AQFINTS_Session_DecryptSessionKey(AQFINTS_SESSION * sess,const AQFINTS_KEYDESCR * keyDescr,const AQFINTS_CRYPTPARAMS * cryptParams,const uint8_t * pInData,uint32_t inLen,uint8_t * pOutData,uint32_t * pOutLen)299 int AQFINTS_Session_DecryptSessionKey(AQFINTS_SESSION *sess,
300 const AQFINTS_KEYDESCR *keyDescr,
301 const AQFINTS_CRYPTPARAMS *cryptParams,
302 const uint8_t *pInData,
303 uint32_t inLen,
304 uint8_t *pOutData,
305 uint32_t *pOutLen)
306 {
307 assert(sess);
308 if (sess->decryptSessionKeyFn)
309 return sess->decryptSessionKeyFn(sess, keyDescr, cryptParams, pInData, inLen, pOutData, pOutLen);
310 else
311 return GWEN_ERROR_NOT_IMPLEMENTED;
312 }
313
314
315
AQFINTS_Session_EncryptSessionKey(AQFINTS_SESSION * sess,const AQFINTS_KEYDESCR * keyDescr,const AQFINTS_CRYPTPARAMS * cryptParams,const uint8_t * pInData,uint32_t inLen,uint8_t * pOutData,uint32_t * pOutLen)316 int AQFINTS_Session_EncryptSessionKey(AQFINTS_SESSION *sess,
317 const AQFINTS_KEYDESCR *keyDescr,
318 const AQFINTS_CRYPTPARAMS *cryptParams,
319 const uint8_t *pInData,
320 uint32_t inLen,
321 uint8_t *pOutData,
322 uint32_t *pOutLen)
323 {
324 assert(sess);
325 if (sess->encryptSessionKeyFn)
326 return sess->encryptSessionKeyFn(sess, keyDescr, cryptParams, pInData, inLen, pOutData, pOutLen);
327 else
328 return GWEN_ERROR_NOT_IMPLEMENTED;
329 }
330
331
332
AQFINTS_Session_VerifyPin(AQFINTS_SESSION * sess,const AQFINTS_KEYDESCR * keyDescr,const char * pin)333 int AQFINTS_Session_VerifyPin(AQFINTS_SESSION *sess, const AQFINTS_KEYDESCR *keyDescr, const char *pin)
334 {
335 assert(sess);
336 if (sess->verifyPinFn)
337 return sess->verifyPinFn(sess, keyDescr, pin);
338 else
339 return GWEN_ERROR_NOT_IMPLEMENTED;
340 }
341
342
343
AQFINTS_Session_Sign(AQFINTS_SESSION * sess,const AQFINTS_KEYDESCR * keyDescr,const AQFINTS_CRYPTPARAMS * cryptParams,const uint8_t * pInData,uint32_t inLen,uint8_t * pSignatureData,uint32_t * pSignatureLen)344 int AQFINTS_Session_Sign(AQFINTS_SESSION *sess,
345 const AQFINTS_KEYDESCR *keyDescr,
346 const AQFINTS_CRYPTPARAMS *cryptParams,
347 const uint8_t *pInData,
348 uint32_t inLen,
349 uint8_t *pSignatureData,
350 uint32_t *pSignatureLen)
351 {
352 assert(sess);
353 if (sess->signFn)
354 return sess->signFn(sess, keyDescr, cryptParams, pInData, inLen, pSignatureData, pSignatureLen);
355 else
356 return GWEN_ERROR_NOT_IMPLEMENTED;
357 }
358
359
360
AQFINTS_Session_Verify(AQFINTS_SESSION * sess,const AQFINTS_KEYDESCR * keyDescr,const AQFINTS_CRYPTPARAMS * cryptParams,const uint8_t * pInData,uint32_t inLen,const uint8_t * pSignatureData,uint32_t signatureLen,uint32_t seqCounter)361 int AQFINTS_Session_Verify(AQFINTS_SESSION *sess,
362 const AQFINTS_KEYDESCR *keyDescr,
363 const AQFINTS_CRYPTPARAMS *cryptParams,
364 const uint8_t *pInData,
365 uint32_t inLen,
366 const uint8_t *pSignatureData,
367 uint32_t signatureLen,
368 uint32_t seqCounter)
369 {
370 assert(sess);
371 if (sess->verifyFn)
372 return sess->verifyFn(sess, keyDescr, cryptParams, pInData, inLen, pSignatureData, signatureLen, seqCounter);
373 else
374 return GWEN_ERROR_NOT_IMPLEMENTED;
375 }
376
377
378
379
380
381
382
383
384
AQFINTS_Session_SetExchangeMessagesFn(AQFINTS_SESSION * sess,AQFINTS_SESSION_EXCHANGEMESSAGES_FN fn)385 AQFINTS_SESSION_EXCHANGEMESSAGES_FN AQFINTS_Session_SetExchangeMessagesFn(AQFINTS_SESSION *sess,
386 AQFINTS_SESSION_EXCHANGEMESSAGES_FN fn)
387 {
388 AQFINTS_SESSION_EXCHANGEMESSAGES_FN oldFn;
389
390 assert(sess);
391 oldFn=sess->exchangeMessagesFn;
392 sess->exchangeMessagesFn=fn;
393 return oldFn;
394 }
395
396
397
AQFINTS_Session_SetFilloutKeynameFn(AQFINTS_SESSION * sess,AQFINTS_SESSION_FILLOUT_KEYDESCR_FN fn)398 AQFINTS_SESSION_FILLOUT_KEYDESCR_FN AQFINTS_Session_SetFilloutKeynameFn(AQFINTS_SESSION *sess,
399 AQFINTS_SESSION_FILLOUT_KEYDESCR_FN fn)
400 {
401 AQFINTS_SESSION_FILLOUT_KEYDESCR_FN oldFn;
402
403 assert(sess);
404 oldFn=sess->filloutKeynameFn;
405 sess->filloutKeynameFn=fn;
406 return oldFn;
407 }
408
409
410
AQFINTS_Session_SetSignFn(AQFINTS_SESSION * sess,AQFINTS_SESSION_SIGN_FN fn)411 AQFINTS_SESSION_SIGN_FN AQFINTS_Session_SetSignFn(AQFINTS_SESSION *sess, AQFINTS_SESSION_SIGN_FN fn)
412 {
413 AQFINTS_SESSION_SIGN_FN oldFn;
414
415 assert(sess);
416 oldFn=sess->signFn;
417 sess->signFn=fn;
418 return oldFn;
419 }
420
421
422
AQFINTS_Session_SetVerifyFn(AQFINTS_SESSION * sess,AQFINTS_SESSION_VERIFY_FN fn)423 AQFINTS_SESSION_VERIFY_FN AQFINTS_Session_SetVerifyFn(AQFINTS_SESSION *sess, AQFINTS_SESSION_VERIFY_FN fn)
424 {
425 AQFINTS_SESSION_VERIFY_FN oldFn;
426
427 assert(sess);
428 oldFn=sess->verifyFn;
429 sess->verifyFn=fn;
430 return oldFn;
431 }
432
433
434
AQFINTS_Session_SetDecryptSessionKeyFn(AQFINTS_SESSION * sess,AQFINTS_SESSION_DECRYPT_SKEY_FN fn)435 AQFINTS_SESSION_DECRYPT_SKEY_FN AQFINTS_Session_SetDecryptSessionKeyFn(AQFINTS_SESSION *sess,
436 AQFINTS_SESSION_DECRYPT_SKEY_FN fn)
437 {
438 AQFINTS_SESSION_DECRYPT_SKEY_FN oldFn;
439
440 assert(sess);
441 oldFn=sess->decryptSessionKeyFn;
442 sess->decryptSessionKeyFn=fn;
443 return oldFn;
444 }
445
446
447
AQFINTS_Session_SetEncryptSessionKeyFn(AQFINTS_SESSION * sess,AQFINTS_SESSION_ENCRYPT_SKEY_FN fn)448 AQFINTS_SESSION_ENCRYPT_SKEY_FN AQFINTS_Session_SetEncryptSessionKeyFn(AQFINTS_SESSION *sess,
449 AQFINTS_SESSION_ENCRYPT_SKEY_FN fn)
450 {
451 AQFINTS_SESSION_ENCRYPT_SKEY_FN oldFn;
452
453 assert(sess);
454 oldFn=sess->encryptSessionKeyFn;
455 sess->encryptSessionKeyFn=fn;
456 return oldFn;
457 }
458
459
460
AQFINTS_Session_SetVerifyPinFn(AQFINTS_SESSION * sess,AQFINTS_SESSION_VERIFYPIN_FN fn)461 AQFINTS_SESSION_VERIFYPIN_FN AQFINTS_Session_SetVerifyPinFn(AQFINTS_SESSION *sess,
462 AQFINTS_SESSION_VERIFYPIN_FN fn)
463 {
464 AQFINTS_SESSION_VERIFYPIN_FN oldFn;
465
466 assert(sess);
467 oldFn=sess->verifyPinFn;
468 sess->verifyPinFn=fn;
469 return oldFn;
470 }
471
472
473
474
475
476
477
AQFINTS_Session_WriteSegmentList(AQFINTS_SESSION * sess,AQFINTS_SEGMENT_LIST * segmentList)478 int AQFINTS_Session_WriteSegmentList(AQFINTS_SESSION *sess, AQFINTS_SEGMENT_LIST *segmentList)
479 {
480 AQFINTS_SEGMENT *segment;
481
482 segment=AQFINTS_Segment_List_First(segmentList);
483 while (segment) {
484 int rv;
485
486 rv=AQFINTS_Session_WriteSegment(sess, segment);
487 if (rv<0) {
488 DBG_INFO(AQFINTS_LOGDOMAIN, "here (%d)", rv);
489 return rv;
490 }
491 segment=AQFINTS_Segment_List_Next(segment);
492 }
493
494 return 0;
495 }
496
497
498
AQFINTS_Session_WriteSegment(AQFINTS_SESSION * sess,AQFINTS_SEGMENT * segment)499 int AQFINTS_Session_WriteSegment(AQFINTS_SESSION *sess, AQFINTS_SEGMENT *segment)
500 {
501 GWEN_DB_NODE *db;
502 GWEN_DB_NODE *dbHead;
503 const char *sCode;
504 int segVersion;
505 int segNum;
506 int refSegNum;
507 int rv;
508
509 sCode=AQFINTS_Segment_GetCode(segment);
510 segVersion=AQFINTS_Segment_GetSegmentVersion(segment);
511 segNum=AQFINTS_Segment_GetSegmentNumber(segment);
512 refSegNum=AQFINTS_Segment_GetRefSegmentNumber(segment);
513
514 db=AQFINTS_Segment_GetDbData(segment);
515 if (db==NULL) {
516 DBG_ERROR(AQFINTS_LOGDOMAIN, "Segment has no DB data");
517 return GWEN_ERROR_INTERNAL;
518 }
519
520 /* prepare segment head */
521 dbHead=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "head");
522 assert(dbHead);
523 GWEN_DB_SetCharValue(dbHead, GWEN_DB_FLAGS_OVERWRITE_VARS, "code", sCode);
524 GWEN_DB_SetIntValue(dbHead, GWEN_DB_FLAGS_OVERWRITE_VARS, "seq", segNum);
525 GWEN_DB_SetIntValue(dbHead, GWEN_DB_FLAGS_OVERWRITE_VARS, "version", segVersion);
526 if (refSegNum)
527 GWEN_DB_SetIntValue(dbHead, GWEN_DB_FLAGS_OVERWRITE_VARS, "ref", refSegNum);
528
529 rv=AQFINTS_Parser_WriteSegment(sess->parser, segment);
530 if (rv<0) {
531 DBG_INFO(AQFINTS_LOGDOMAIN, "Error writing segment [%s] (%d)", AQFINTS_Segment_GetCode(segment), rv);
532 AQFINTS_Parser_DumpSegment(segment, 2);
533 return rv;
534 }
535
536 return 0;
537 }
538
539
540
AQFINTS_Session_SampleAllowedTanMethods(int * ptrIntArray,int sizeIntArray,AQFINTS_SEGMENT_LIST * segmentList)541 int AQFINTS_Session_SampleAllowedTanMethods(int *ptrIntArray, int sizeIntArray, AQFINTS_SEGMENT_LIST *segmentList)
542 {
543 AQFINTS_SEGMENT *segment;
544 int numMethodsAdded=0;
545
546 segment=AQFINTS_Segment_List_First(segmentList);
547 while (segment) {
548 AQFINTS_SEGMENT *nextSegment;
549 const char *sCode;
550
551 nextSegment=AQFINTS_Segment_List_Next(segment);
552
553 sCode=AQFINTS_Segment_GetCode(segment);
554 if (sCode && *sCode && strcasecmp(sCode, "HIRMS")==0) { /* check result */
555 GWEN_DB_NODE *db;
556
557 db=AQFINTS_Segment_GetDbData(segment);
558 if (db) {
559 GWEN_DB_NODE *dbResult;
560
561 dbResult=GWEN_DB_FindFirstGroup(db, "result");
562 while (dbResult) {
563 int resultCode;
564 const char *resultText;
565
566 resultCode=GWEN_DB_GetIntValue(dbResult, "resultcode", 0, 0);
567 resultText=GWEN_DB_GetCharValue(dbResult, "text", 0, 0);
568 DBG_NOTICE(0, "Segment result: %d (%s)", resultCode, resultText?resultText:"<none>");
569 if (resultCode==3920) {
570 int i;
571
572 /* reset array */
573 for (i=0; i<sizeIntArray; i++)
574 ptrIntArray[i]=0;
575
576 for (i=0; i<sizeIntArray; i++) {
577 int j;
578
579 j=GWEN_DB_GetIntValue(dbResult, "param", i, 0);
580 if (j==0)
581 break;
582 DBG_NOTICE(0, "Adding allowed TAN method %d", j);
583 ptrIntArray[i]=j;
584 numMethodsAdded++;
585 } /* for */
586 }
587 dbResult=GWEN_DB_FindNextGroup(dbResult, "result");
588 } /* while dbResult */
589 } /* if db */
590 }
591
592 segment=nextSegment;
593 } /* while segment */
594 if (numMethodsAdded<1) {
595 /* add single step if empty list */
596 DBG_INFO(AQFINTS_LOGDOMAIN, "No allowed TAN method reported, assuming 999");
597 ptrIntArray[0]=999;
598 numMethodsAdded=1;
599 }
600
601 return numMethodsAdded;
602 }
603
604
605
606
607
608
AQFINTS_Session_Connect(AQFINTS_SESSION * sess)609 int AQFINTS_Session_Connect(AQFINTS_SESSION *sess)
610 {
611 assert(sess);
612 return AQFINTS_Transport_Connect(sess->transport);
613 }
614
615
616
AQFINTS_Session_Disconnect(AQFINTS_SESSION * sess)617 int AQFINTS_Session_Disconnect(AQFINTS_SESSION *sess)
618 {
619 assert(sess);
620 return AQFINTS_Transport_Disconnect(sess->transport);
621 }
622
623
624
AQFINTS_Session_SendMessage(AQFINTS_SESSION * sess,const char * ptrBuffer,int lenBuffer)625 int AQFINTS_Session_SendMessage(AQFINTS_SESSION *sess, const char *ptrBuffer, int lenBuffer)
626 {
627 int rv;
628
629 assert(sess);
630 rv=AQFINTS_Transport_SendMessage(sess->transport, ptrBuffer, lenBuffer);
631 sess->lastMessageNumSent++;
632 if (rv<0) {
633 DBG_INFO(AQFINTS_LOGDOMAIN, "here (%d)", rv);
634 return rv;
635 }
636
637 return rv;
638 }
639
640
641
AQFINTS_Session_ReceiveMessage(AQFINTS_SESSION * sess,GWEN_BUFFER * buffer)642 int AQFINTS_Session_ReceiveMessage(AQFINTS_SESSION *sess, GWEN_BUFFER *buffer)
643 {
644 int rv;
645
646 /* TODO: add logging mechanism */
647 rv=AQFINTS_Transport_ReceiveMessage(sess->transport, buffer);
648 if (rv<0) {
649 DBG_ERROR(AQFINTS_LOGDOMAIN, "here (%d)", rv);
650 return rv;
651 }
652
653 sess->lastMessageNumReceived++;
654 return rv;
655 }
656
657
658
659
AQFINTS_Session_ExtractBpdFromSegmentList(AQFINTS_SESSION * sess,AQFINTS_SEGMENT_LIST * segmentList)660 AQFINTS_BPD *AQFINTS_Session_ExtractBpdFromSegmentList(AQFINTS_SESSION *sess, AQFINTS_SEGMENT_LIST *segmentList)
661 {
662 AQFINTS_BPD *bpd;
663
664 bpd=AQFINTS_Bpd_SampleBpdFromSegmentList(sess->parser, segmentList, 1);
665 if (bpd==NULL) {
666 DBG_ERROR(AQFINTS_LOGDOMAIN, "Empty BPD");
667 return NULL;
668 }
669
670 return bpd;
671 }
672
673
674
AQFINTS_Session_ExtractUpdFromSegmentList(AQFINTS_SESSION * sess,AQFINTS_SEGMENT_LIST * segmentList)675 AQFINTS_USERDATA_LIST *AQFINTS_Session_ExtractUpdFromSegmentList(AQFINTS_SESSION *sess,
676 AQFINTS_SEGMENT_LIST *segmentList)
677 {
678 AQFINTS_USERDATA_LIST *userDataList;
679
680 userDataList=AQFINTS_Upd_SampleUpdFromSegmentList(segmentList, 1);
681 if (userDataList==NULL) {
682 DBG_ERROR(AQFINTS_LOGDOMAIN, "Empty userDataList");
683 return NULL;
684 }
685
686 return userDataList;
687 }
688
689
690
691
692
AQFINTS_Session_DirectlyExchangeMessages(AQFINTS_SESSION * sess,AQFINTS_MESSAGE * messageOut)693 AQFINTS_MESSAGE *AQFINTS_Session_DirectlyExchangeMessages(AQFINTS_SESSION *sess, AQFINTS_MESSAGE *messageOut)
694 {
695 GWEN_BUFFER *msgBuffer;
696 AQFINTS_MESSAGE *message;
697 int rv;
698
699
700 msgBuffer=AQFINTS_Session_EncodeMessage(sess, messageOut);
701 if (msgBuffer==NULL) {
702 DBG_INFO(AQFINTS_LOGDOMAIN, "here");
703 return NULL;
704 }
705
706 rv=AQFINTS_Session_SendMessage(sess, GWEN_Buffer_GetStart(msgBuffer), GWEN_Buffer_GetUsedBytes(msgBuffer));
707 if (rv<0) {
708 DBG_INFO(AQFINTS_LOGDOMAIN, "here");
709 GWEN_Buffer_free(msgBuffer);
710 return NULL;
711 }
712 GWEN_Buffer_Reset(msgBuffer);
713
714 rv=AQFINTS_Session_ReceiveMessage(sess, msgBuffer);
715 if (rv<0) {
716 DBG_INFO(AQFINTS_LOGDOMAIN, "here");
717 GWEN_Buffer_free(msgBuffer);
718 return NULL;
719 }
720
721 message=AQFINTS_Session_DecodeMessage(sess, (const uint8_t *) GWEN_Buffer_GetStart(msgBuffer),
722 GWEN_Buffer_GetUsedBytes(msgBuffer));
723 if (message==NULL) {
724 DBG_ERROR(AQFINTS_LOGDOMAIN, "Could not decode this message:");
725 GWEN_Buffer_Dump(msgBuffer, 2);
726 GWEN_Buffer_free(msgBuffer);
727 return NULL;
728 }
729 GWEN_Buffer_free(msgBuffer);
730
731 return message;
732 }
733
734
735
AQFINTS_Session_SampleDataToHash(AQFINTS_SEGMENT * segSigHead,AQFINTS_SEGMENT * segFirstToSign,AQFINTS_SEGMENT * segLastToSign,GWEN_BUFFER * destBuf)736 int AQFINTS_Session_SampleDataToHash(AQFINTS_SEGMENT *segSigHead,
737 AQFINTS_SEGMENT *segFirstToSign,
738 AQFINTS_SEGMENT *segLastToSign,
739 GWEN_BUFFER *destBuf)
740 {
741
742 AQFINTS_SEGMENT *segment;
743 int rv;
744
745 /* add signature head */
746 rv=GWEN_Buffer_AppendBytes(destBuf,
747 (const char *) AQFINTS_Segment_GetDataPointer(segSigHead),
748 AQFINTS_Segment_GetDataLength(segSigHead));
749 if (rv<0) {
750 DBG_INFO(AQFINTS_LOGDOMAIN, "here (%d)", rv);
751 return rv;
752 }
753 /* hash data segments */
754 segment=segFirstToSign;
755 while (segment) {
756 rv=GWEN_Buffer_AppendBytes(destBuf,
757 (const char *) AQFINTS_Segment_GetDataPointer(segment),
758 AQFINTS_Segment_GetDataLength(segment));
759 if (rv<0) {
760 DBG_INFO(AQFINTS_LOGDOMAIN, "here (%d)", rv);
761 return rv;
762 }
763
764 if (segment==segLastToSign)
765 break;
766 segment=AQFINTS_Segment_List_Next(segment);
767 }
768
769 return 0;
770 }
771
772
773
774
775